Branch data MC/DC data Line data Source code
1 : : : #include <sys/stat.h>
2 : : : #include <stdbool.h>
3 : : : #include "unity.h"
4 : : : #include "mq_utils.h"
5 : : :
6 : : : static bool wrap_mq_open_fail = false;
7 : : : static bool wrap_mq_unlink_fail = false;
8 : : : static bool wrap_perror_called = false;
9 : : :
10 : : : char *mq_name = "/test_mq"; // this could be any name
11 : : : int mq_max_messages = 10;
12 : : : mqd_t mqd;
13 : : :
14 : : : mqd_t __real_mq_open(const char *name, int oflag, ...);
15 : : 12 : mqd_t __wrap_mq_open(const char *name, int oflag, ...)
16 : : : {
17 [ + + ]: [ T F ]: 12 : if (wrap_mq_open_fail)
18 : : 2 : return (mqd_t)-1;
19 : : 10 : return __real_mq_open(name, oflag);
20 : : : }
21 : : :
22 : : : int __real_mq_unlink(const char *name);
23 : : 8 : int __wrap_mq_unlink(const char *name)
24 : : : {
25 [ + + ]: [ T F ]: 8 : if (wrap_mq_unlink_fail)
26 : : 1 : return -1;
27 : : 7 : return __real_mq_unlink(name);
28 : : : }
29 : : :
30 : : : void __real_perror(const char *s);
31 : : 20 : void __wrap_perror(const char *s)
32 : : : {
33 : : 20 : wrap_perror_called = true;
34 : : 20 : __real_perror(s);
35 : : 20 : }
36 : : :
37 : : 11 : void setUp()
38 : : : {
39 : : 11 : wrap_mq_open_fail = false;
40 : : 11 : wrap_perror_called = false;
41 : : 11 : close_mq(mqd, mq_name);
42 : : 11 : }
43 : : :
44 : : 11 : void tearDown()
45 : : : {
46 : : : // clean stuff up here
47 : : 11 : }
48 : : :
49 : : : /**
50 : : : * @test
51 : : : * @brief Verifies if the helper function test_get_mq_attr() returns the correct attributes for the message queue.
52 : : : *
53 : : : * \anchor test_get_mq_attr
54 : : : * test ID [TC_MQ_UTILS_001](@ref TC_MQ_UTILS_001)
55 : : : */
56 : : 1 : void test_get_mq_attr()
57 : : : {
58 : : 1 : struct mq_attr attr = get_mq_attr();
59 : : 1 : TEST_ASSERT_EQUAL(O_NONBLOCK, attr.mq_flags);
60 : : 1 : TEST_ASSERT_EQUAL(0, attr.mq_curmsgs);
61 : : 1 : TEST_ASSERT_EQUAL(10, attr.mq_maxmsg);
62 : : 1 : TEST_ASSERT_EQUAL(12, attr.mq_msgsize);
63 : : 1 : }
64 : : :
65 : : : /**
66 : : : * @test
67 : : : * @brief Tests the creation and closing of a message queue by checking if it exists in /dev/mqueue.
68 : : : *
69 : : : * \anchor test_create_and_close_mq
70 : : : * test ID [TC_MQ_UTILS_002](@ref TC_MQ_UTILS_002)
71 : : : */
72 : : 1 : void test_create_and_close_mq()
73 : : : {
74 : : 1 : char *mq_name = "/test_mq";
75 : : : struct stat buffer;
76 : : :
77 : : 1 : int exists = stat("/dev/mqueue/test_mq", &buffer);
78 : : 1 : TEST_ASSERT_EQUAL_MESSAGE(-1, exists, "Queue exists but should not");
79 : : :
80 : : 1 : mqd_t mqd = create_mq(mq_name);
81 : : :
82 : : 1 : exists = stat("/dev/mqueue/test_mq", &buffer);
83 : : 1 : TEST_ASSERT_EQUAL_MESSAGE(0, exists, "Queue does not exist but should");
84 [ - + ]: [ T f ]: 1 : TEST_ASSERT_NOT_EQUAL((mqd_t)-1, mqd);
85 : : :
86 : : 1 : close_mq(mqd, mq_name);
87 : : 1 : exists = stat("/dev/mqueue/test_mq", &buffer);
88 : : 1 : TEST_ASSERT_EQUAL_MESSAGE(-1, exists, "Queue exists but should have been deleted");
89 : : 1 : }
90 : : :
91 : : : /**
92 : : : * @test
93 : : : * @brief Tests failure of message queue creation.
94 : : : *
95 : : : * \anchor test_create_mq_fail
96 : : : * test ID [TC_MQ_UTILS_003](@ref TC_MQ_UTILS_003)
97 : : : */
98 : : 1 : void test_create_mq_fail()
99 : : : {
100 : : 1 : wrap_mq_open_fail = true;
101 : : 1 : wrap_perror_called = false;
102 : : :
103 : : 1 : mqd_t mqd = create_mq(mq_name);
104 : : 1 : TEST_ASSERT_EQUAL((mqd_t)-1, mqd);
105 [ - + ]: [ T f ]: 1 : TEST_ASSERT_TRUE(wrap_perror_called);
106 : : 1 : }
107 : : :
108 : : : /**
109 : : : * @test
110 : : : * @brief Tests failure of message queue closing.
111 : : : *
112 : : : * \anchor test_close_unopened_mq_fail
113 : : : * test ID [TC_MQ_UTILS_004](@ref TC_MQ_UTILS_004)
114 : : : */
115 : : 1 : void test_close_unopened_mq_fail()
116 : : : {
117 : : 1 : mqd = (mqd_t)-1; // Uninitialized mqd
118 : : : struct stat buffer;
119 : : :
120 : : 1 : int exists = stat("/dev/mqueue/test_mq", &buffer);
121 : : 1 : TEST_ASSERT_EQUAL_MESSAGE(-1, exists, "Queue exists but should not");
122 : : :
123 : : 1 : close_mq(mqd, mq_name);
124 [ - + ]: [ T f ]: 1 : TEST_ASSERT_TRUE(wrap_perror_called);
125 : : 1 : }
126 : : :
127 : : : /**
128 : : : * @test
129 : : : * @brief Tests failure of message queue unlink.
130 : : : *
131 : : : * \anchor test_close_mq_fail_unlink
132 : : : * test ID [TC_MQ_UTILS_005](@ref TC_MQ_UTILS_005)
133 : : : */
134 : : 1 : void test_close_mq_fail_unlink()
135 : : : {
136 : : 1 : mqd = create_mq(mq_name);
137 : : :
138 : : 1 : wrap_mq_unlink_fail = true;
139 : : 1 : close_mq(mqd, mq_name);
140 [ - + ]: [ T f ]: 1 : TEST_ASSERT_TRUE(wrap_perror_called);
141 : : :
142 : : 1 : wrap_mq_unlink_fail = false;
143 : : 1 : mq_unlink(mq_name);
144 : : 1 : }
145 : : :
146 : : : /**
147 : : : * @test
148 : : : * @brief Test open_mq() success.
149 : : : *
150 : : : * \anchor test_open_mq
151 : : : * test ID [TC_MQ_UTILS_006](@ref TC_MQ_UTILS_006)
152 : : : */
153 : : 1 : void test_open_mq()
154 : : : {
155 : : 1 : mqd = create_mq(mq_name);
156 : : 1 : mqd_t mq_test = open_mq(mq_name);
157 [ + - ]: [ t F ]: 1 : TEST_ASSERT_NOT_EQUAL(-1, mq_test);
158 : : 0 : close_mq(mqd, mq_name);
159 : : 0 : }
160 : : :
161 : : : /**
162 : : : * @test
163 : : : * @brief Tests failure of message queue opening.
164 : : : *
165 : : : * \anchor test_open_mq_fail
166 : : : * test ID [TC_MQ_UTILS_007](@ref TC_MQ_UTILS_007)
167 : : : */
168 : : 1 : void test_open_mq_fail()
169 : : : {
170 : : 1 : wrap_mq_open_fail = true;
171 : : 1 : wrap_perror_called = false;
172 : : :
173 : : 1 : mqd_t mq_test = open_mq(mq_name);
174 : : 1 : TEST_ASSERT_EQUAL((mqd_t)-1, mq_test);
175 [ - + ]: [ T f ]: 1 : TEST_ASSERT_TRUE(wrap_perror_called);
176 : : 1 : }
177 : : :
178 : : : /**
179 : : : * @test
180 : : : * @brief Tests read_mq() when the queue is empty.
181 : : : *
182 : : : * \anchor test_read_mq_empty_queue
183 : : : * test ID [TC_MQ_UTILS_008](@ref TC_MQ_UTILS_008)
184 : : : */
185 : : 1 : void test_read_mq_empty_queue()
186 : : : {
187 : : 1 : mqd = create_mq(mq_name);
188 : : : can_msg msg_read;
189 : : 1 : TEST_ASSERT_EQUAL(-1, read_mq(mqd, &msg_read));
190 : : 1 : close_mq(mqd, mq_name);
191 : : 1 : }
192 : : :
193 : : : /**
194 : : : * @test
195 : : : * @brief Tests write_mq() when the queue is full.
196 : : : *
197 : : : * \anchor test_write_mq_full_queue
198 : : : * test ID [TC_MQ_UTILS_009](@ref TC_MQ_UTILS_009)
199 : : : */
200 : : 1 : void test_write_mq_full_queue()
201 : : : {
202 : : 1 : mqd = create_mq(mq_name);
203 : : 1 : can_msg msg_to_write = {0};
204 [ + + ]: [ T F ]: 11 : for (int i = 0; i < mq_max_messages; i++)
205 : : : {
206 : : 10 : write_mq(mqd, &msg_to_write);
207 : : : }
208 : : 1 : TEST_ASSERT_EQUAL(-1, write_mq(mqd, &msg_to_write));
209 : : 1 : close_mq(mqd, mq_name);
210 : : 1 : }
211 : : :
212 : : : /**
213 : : : * @test
214 : : : * @brief Tests reading and writing a message to the queue with an empty can_msg.
215 : : : *
216 : : : * \anchor test_read_and_write_mq_empty_can_msg
217 : : : * test ID [TC_MQ_UTILS_010](@ref TC_MQ_UTILS_010)
218 : : : */
219 : : 1 : void test_read_and_write_mq_empty_can_msg()
220 : : : {
221 : : 1 : mqd = create_mq(mq_name);
222 : : 1 : mqd_t mq_write = open_mq(mq_name);
223 : : 1 : can_msg msg_to_write = {0};
224 : : 1 : write_mq(mq_write, &msg_to_write);
225 : : :
226 : : : can_msg msg_read;
227 : : 1 : read_mq(mqd, &msg_read);
228 : : :
229 : : 1 : TEST_ASSERT_EQUAL(msg_to_write.identifier, msg_read.identifier);
230 : : 1 : close_mq(mqd, mq_name);
231 : : 1 : }
232 : : :
233 : : : /**
234 : : : * @test
235 : : : * @brief Tests reading and writing a message to the queue with a valid can_msg.
236 : : : *
237 : : : * \anchor test_read_and_write_mq_valid_can_msg
238 : : : * test ID [TC_MQ_UTILS_011](@ref TC_MQ_UTILS_011)
239 : : : */
240 : : 1 : void test_read_and_write_mq_valid_can_msg()
241 : : : {
242 : : 1 : mqd = create_mq(mq_name);
243 : : 1 : mqd_t mq_write = open_mq(mq_name);
244 : : 1 : can_msg msg_to_write = {
245 : : : .identifier = 12345,
246 : : : .dataFrame = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}};
247 : : 1 : write_mq(mq_write, &msg_to_write);
248 : : :
249 : : : can_msg msg_read;
250 : : 1 : read_mq(mqd, &msg_read);
251 : : :
252 : : 1 : TEST_ASSERT_EQUAL(msg_to_write.identifier, msg_read.identifier);
253 [ # # ]: [ t f ]: 0 : for (int i = 0; i < 8; i++)
254 : : : {
255 : : 0 : TEST_ASSERT_EQUAL(msg_to_write.dataFrame[i], msg_read.dataFrame[i]);
256 : : : }
257 : : 0 : close_mq(mqd, mq_name);
258 : : 0 : }
259 : : :
260 : : 1 : int main()
261 : : : {
262 : : 1 : UNITY_BEGIN();
263 : : 1 : RUN_TEST(test_get_mq_attr);
264 : : 1 : RUN_TEST(test_create_and_close_mq);
265 : : 1 : RUN_TEST(test_create_mq_fail);
266 : : 1 : RUN_TEST(test_close_unopened_mq_fail);
267 : : 1 : RUN_TEST(test_close_mq_fail_unlink);
268 : : 1 : RUN_TEST(test_open_mq);
269 : : 1 : RUN_TEST(test_open_mq_fail);
270 : : 1 : RUN_TEST(test_read_mq_empty_queue);
271 : : 1 : RUN_TEST(test_write_mq_full_queue);
272 : : 1 : RUN_TEST(test_read_and_write_mq_empty_can_msg);
273 : : 1 : RUN_TEST(test_read_and_write_mq_valid_can_msg);
274 : : 1 : return UNITY_END();
275 : : : }
|