LCOV - code coverage report
Current view: top level - test - test_mq_utils.c (source / functions) Coverage Total Hit
Test: combined.info Lines: 95.0 % 120 114
Test Date: 2025-05-05 14:46:49 Functions: 100.0 % 17 17
Branches: 60.0 % 20 12
MC/DC: 60.0 % 20 12

             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                 :              :             : }
        

Generated by: LCOV version 2.3.1-beta