LCOV - code coverage report
Current view: top level - app/test - test.h (source / functions) Hit Total Coverage
Test: Code coverage Lines: 2 2 100.0 %
Date: 2025-01-02 22:41:34 Functions: 0 0 -
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 50 284 17.6 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright(c) 2010-2014 Intel Corporation
       3                 :            :  */
       4                 :            : 
       5                 :            : #ifndef _TEST_H_
       6                 :            : #define _TEST_H_
       7                 :            : 
       8                 :            : #include <errno.h>
       9                 :            : #include <stddef.h>
      10                 :            : #include <stdlib.h>
      11                 :            : #include <sys/queue.h>
      12                 :            : 
      13                 :            : #include <rte_hexdump.h>
      14                 :            : #include <rte_common.h>
      15                 :            : #include <rte_os_shim.h>
      16                 :            : 
      17                 :            : #define TEST_SUCCESS EXIT_SUCCESS
      18                 :            : #define TEST_FAILED  -1
      19                 :            : #define TEST_SKIPPED  77
      20                 :            : 
      21                 :            : /* Before including test.h file you can define
      22                 :            :  * TEST_TRACE_FAILURE(_file, _line, _func) macro to better trace/debug test
      23                 :            :  * failures. Mostly useful in test development phase. */
      24                 :            : #ifndef TEST_TRACE_FAILURE
      25                 :            : # define TEST_TRACE_FAILURE(_file, _line, _func)
      26                 :            : #endif
      27                 :            : 
      28                 :            : #include <rte_test.h>
      29                 :            : 
      30                 :            : #define TEST_ASSERT RTE_TEST_ASSERT
      31                 :            : 
      32                 :            : #define TEST_ASSERT_EQUAL RTE_TEST_ASSERT_EQUAL
      33                 :            : 
      34                 :            : /* Compare two buffers (length in bytes) */
      35                 :            : #define TEST_ASSERT_BUFFERS_ARE_EQUAL(a, b, len,  msg, ...) do {        \
      36                 :            :         if (memcmp(a, b, len)) {                                        \
      37                 :            :                 printf("TestCase %s() line %d failed: "              \
      38                 :            :                         msg "\n", __func__, __LINE__, ##__VA_ARGS__);    \
      39                 :            :                 TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__);    \
      40                 :            :                 return TEST_FAILED;                                  \
      41                 :            :         }                                                        \
      42                 :            : } while (0)
      43                 :            : 
      44                 :            : /* Compare two buffers with offset (length and offset in bytes) */
      45                 :            : #define TEST_ASSERT_BUFFERS_ARE_EQUAL_OFFSET(a, b, len, off, msg, ...) do { \
      46                 :            :         const uint8_t *_a_with_off = (const uint8_t *)a + off;              \
      47                 :            :         const uint8_t *_b_with_off = (const uint8_t *)b + off;              \
      48                 :            :         TEST_ASSERT_BUFFERS_ARE_EQUAL(_a_with_off, _b_with_off, len, msg);  \
      49                 :            : } while (0)
      50                 :            : 
      51                 :            : /* Compare two buffers (length in bits) */
      52                 :            : #define TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(a, b, len, msg, ...) do {     \
      53                 :            :         uint8_t _last_byte_a, _last_byte_b;                       \
      54                 :            :         uint8_t _last_byte_mask, _last_byte_bits;                  \
      55                 :            :         TEST_ASSERT_BUFFERS_ARE_EQUAL(a, b, (len >> 3), msg);     \
      56                 :            :         if (len % 8) {                                              \
      57                 :            :                 _last_byte_bits = len % 8;                   \
      58                 :            :                 _last_byte_mask = ~((1 << (8 - _last_byte_bits)) - 1); \
      59                 :            :                 _last_byte_a = ((const uint8_t *)a)[len >> 3];            \
      60                 :            :                 _last_byte_b = ((const uint8_t *)b)[len >> 3];            \
      61                 :            :                 _last_byte_a &= _last_byte_mask;                     \
      62                 :            :                 _last_byte_b &= _last_byte_mask;                    \
      63                 :            :                 if (_last_byte_a != _last_byte_b) {                  \
      64                 :            :                         printf("TestCase %s() line %d failed: "              \
      65                 :            :                                 msg "\n", __func__, __LINE__, ##__VA_ARGS__);\
      66                 :            :                         TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__);    \
      67                 :            :                         return TEST_FAILED;                                  \
      68                 :            :                 }                                                        \
      69                 :            :         }                                                            \
      70                 :            : } while (0)
      71                 :            : 
      72                 :            : /* Compare two buffers with offset (length and offset in bits) */
      73                 :            : #define TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(a, b, len, off, msg, ...) do { \
      74                 :            :         uint8_t _first_byte_a, _first_byte_b;                                 \
      75                 :            :         uint8_t _first_byte_mask, _first_byte_bits;                           \
      76                 :            :         uint32_t _len_without_first_byte = (off % 8) ?                       \
      77                 :            :                                 len - (8 - (off % 8)) :                       \
      78                 :            :                                 len;                                          \
      79                 :            :         uint32_t _off_in_bytes = (off % 8) ? (off >> 3) + 1 : (off >> 3);     \
      80                 :            :         const uint8_t *_a_with_off = (const uint8_t *)a + _off_in_bytes;      \
      81                 :            :         const uint8_t *_b_with_off = (const uint8_t *)b + _off_in_bytes;      \
      82                 :            :         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(_a_with_off, _b_with_off,           \
      83                 :            :                                 _len_without_first_byte, msg);                \
      84                 :            :         if (off % 8) {                                                        \
      85                 :            :                 _first_byte_bits = 8 - (off % 8);                             \
      86                 :            :                 _first_byte_mask = (1 << _first_byte_bits) - 1;               \
      87                 :            :                 _first_byte_a = *(_a_with_off - 1);                           \
      88                 :            :                 _first_byte_b = *(_b_with_off - 1);                           \
      89                 :            :                 _first_byte_a &= _first_byte_mask;                            \
      90                 :            :                 _first_byte_b &= _first_byte_mask;                            \
      91                 :            :                 if (_first_byte_a != _first_byte_b) {                         \
      92                 :            :                         printf("TestCase %s() line %d failed: "               \
      93                 :            :                                 msg "\n", __func__, __LINE__, ##__VA_ARGS__); \
      94                 :            :                         TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__);     \
      95                 :            :                         return TEST_FAILED;                                   \
      96                 :            :                 }                                                             \
      97                 :            :         }                                                                     \
      98                 :            : } while (0)
      99                 :            : 
     100                 :            : #define TEST_ASSERT_NOT_EQUAL RTE_TEST_ASSERT_NOT_EQUAL
     101                 :            : 
     102                 :            : #define TEST_ASSERT_SUCCESS RTE_TEST_ASSERT_SUCCESS
     103                 :            : 
     104                 :            : #define TEST_ASSERT_FAIL RTE_TEST_ASSERT_FAIL
     105                 :            : 
     106                 :            : #define TEST_ASSERT_NULL RTE_TEST_ASSERT_NULL
     107                 :            : 
     108                 :            : #define TEST_ASSERT_NOT_NULL RTE_TEST_ASSERT_NOT_NULL
     109                 :            : 
     110                 :            : struct unit_test_case {
     111                 :            :         int (*setup)(void);
     112                 :            :         void (*teardown)(void);
     113                 :            :         int (*testcase)(void);
     114                 :            :         int (*testcase_with_data)(const void *data);
     115                 :            :         const char *name;
     116                 :            :         unsigned enabled;
     117                 :            :         const void *data;
     118                 :            : };
     119                 :            : 
     120                 :            : #define TEST_CASE(fn) { NULL, NULL, fn, NULL, #fn, 1, NULL }
     121                 :            : 
     122                 :            : #define TEST_CASE_NAMED(name, fn) { NULL, NULL, fn, NULL, name, 1, NULL }
     123                 :            : 
     124                 :            : #define TEST_CASE_ST(setup, teardown, testcase) \
     125                 :            :                 { setup, teardown, testcase, NULL, #testcase, 1, NULL }
     126                 :            : 
     127                 :            : #define TEST_CASE_WITH_DATA(setup, teardown, testcase, data) \
     128                 :            :                 { setup, teardown, NULL, testcase, #testcase, 1, data }
     129                 :            : 
     130                 :            : #define TEST_CASE_NAMED_ST(name, setup, teardown, testcase) \
     131                 :            :                 { setup, teardown, testcase, NULL, name, 1, NULL }
     132                 :            : 
     133                 :            : #define TEST_CASE_NAMED_WITH_DATA(name, setup, teardown, testcase, data) \
     134                 :            :                 { setup, teardown, NULL, testcase, name, 1, data }
     135                 :            : 
     136                 :            : #define TEST_CASE_DISABLED(fn) { NULL, NULL, fn, NULL, #fn, 0, NULL }
     137                 :            : 
     138                 :            : #define TEST_CASE_ST_DISABLED(setup, teardown, testcase) \
     139                 :            :                 { setup, teardown, testcase, NULL, #testcase, 0, NULL }
     140                 :            : 
     141                 :            : #define TEST_CASES_END() { NULL, NULL, NULL, NULL, NULL, 0, NULL }
     142                 :            : 
     143                 :            : static inline void
     144                 :            : debug_hexdump(FILE *file, const char *title, const void *buf, size_t len)
     145                 :            : {
     146   [ +  -  +  -  :       1000 :         if (rte_log_get_global_level() == RTE_LOG_DEBUG)
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          -  -  +  -  +  
          -  +  -  -  -  
          -  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  +  -  +  -  
          -  -  +  -  +  
             -  -  -  -  
                      - ]
     147                 :       1000 :                 rte_hexdump(file, title, buf, len);
     148                 :            : }
     149                 :            : 
     150                 :            : struct unit_test_suite {
     151                 :            :         const char *suite_name;
     152                 :            :         int (*setup)(void);
     153                 :            :         void (*teardown)(void);
     154                 :            :         unsigned int total;
     155                 :            :         unsigned int executed;
     156                 :            :         unsigned int succeeded;
     157                 :            :         unsigned int skipped;
     158                 :            :         unsigned int failed;
     159                 :            :         unsigned int unsupported;
     160                 :            :         struct unit_test_suite **unit_test_suites;
     161                 :            :         struct unit_test_case unit_test_cases[];
     162                 :            : };
     163                 :            : 
     164                 :            : int unit_test_suite_runner(struct unit_test_suite *suite);
     165                 :            : extern int last_test_result;
     166                 :            : 
     167                 :            : #define RECURSIVE_ENV_VAR "RTE_TEST_RECURSIVE"
     168                 :            : 
     169                 :            : #include <cmdline_parse.h>
     170                 :            : #include <cmdline_parse_string.h>
     171                 :            : 
     172                 :            : extern const char *prgname;
     173                 :            : 
     174                 :            : int commands_init(void);
     175                 :            : int command_valid(const char *cmd);
     176                 :            : 
     177                 :            : int test_mp_secondary(void);
     178                 :            : int test_timer_secondary(void);
     179                 :            : 
     180                 :            : int test_set_rxtx_conf(cmdline_fixed_string_t mode);
     181                 :            : int test_set_rxtx_anchor(cmdline_fixed_string_t type);
     182                 :            : int test_set_rxtx_sc(cmdline_fixed_string_t type);
     183                 :            : 
     184                 :            : typedef int (test_callback)(void);
     185                 :            : TAILQ_HEAD(test_commands_list, test_command);
     186                 :            : struct test_command {
     187                 :            :         TAILQ_ENTRY(test_command) next;
     188                 :            :         const char *command;
     189                 :            :         test_callback *callback;
     190                 :            : };
     191                 :            : 
     192                 :            : void add_test_command(struct test_command *t);
     193                 :            : 
     194                 :            : /* Register a test function with its command string. Should not be used directly */
     195                 :            : #define REGISTER_TEST_COMMAND(cmd, func) \
     196                 :            :         static struct test_command test_struct_##cmd = { \
     197                 :            :                 .command = RTE_STR(cmd), \
     198                 :            :                 .callback = func, \
     199                 :            :         }; \
     200                 :            :         RTE_INIT(test_register_##cmd) \
     201                 :            :         { \
     202                 :            :                 add_test_command(&test_struct_##cmd); \
     203                 :            :         }
     204                 :            : 
     205                 :            : /* Register a test function as a particular type.
     206                 :            :  * These can be used to build up test suites automatically
     207                 :            :  */
     208                 :            : #define REGISTER_FAST_TEST(cmd, no_huge, ASan, func)  REGISTER_TEST_COMMAND(cmd, func)
     209                 :            : #define REGISTER_PERF_TEST REGISTER_TEST_COMMAND
     210                 :            : #define REGISTER_DRIVER_TEST REGISTER_TEST_COMMAND
     211                 :            : 
     212                 :            : #endif

Generated by: LCOV version 1.14