Home | History | Annotate | Download | only in unit
      1 /***************************************************************************
      2  *                                  _   _ ____  _
      3  *  Project                     ___| | | |  _ \| |
      4  *                             / __| | | | |_) | |
      5  *                            | (__| |_| |  _ <| |___
      6  *                             \___|\___/|_| \_\_____|
      7  *
      8  * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel (at) haxx.se>, et al.
      9  *
     10  * This software is licensed as described in the file COPYING, which
     11  * you should have received as part of this distribution. The terms
     12  * are also available at https://curl.haxx.se/docs/copyright.html.
     13  *
     14  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
     15  * copies of the Software, and permit persons to whom the Software is
     16  * furnished to do so, under the terms of the COPYING file.
     17  *
     18  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
     19  * KIND, either express or implied.
     20  *
     21  ***************************************************************************/
     22 #include "test.h"
     23 
     24 /* The fail macros mark the current test step as failed, and continue */
     25 #define fail_if(expr, msg)                              \
     26   if(expr) {                                            \
     27     fprintf(stderr, "%s:%d Assertion '%s' met: %s\n",   \
     28             __FILE__, __LINE__, #expr, msg);            \
     29     unitfail++;                                         \
     30   }
     31 
     32 #define fail_unless(expr, msg)                           \
     33   if(!(expr)) {                                          \
     34     fprintf(stderr, "%s:%d Assertion '%s' failed: %s\n", \
     35             __FILE__, __LINE__, #expr, msg);             \
     36     unitfail++;                                          \
     37   }
     38 
     39 #define verify_memory(dynamic, check, len)                                  \
     40   if(dynamic && memcmp(dynamic, check, len)) {                              \
     41     fprintf(stderr, "%s:%d Memory buffer mismatch size %d. '%s' is not\n",  \
     42             __FILE__, __LINE__, len, hexdump((unsigned char *)check, len)); \
     43     fprintf(stderr, "%s:%d the same as '%s'\n",                             \
     44             __FILE__, __LINE__, hexdump((unsigned char *)dynamic, len));    \
     45     unitfail++;                                                             \
     46   }
     47 
     48 /* fail() is for when the test case figured out by itself that a check
     49    proved a failure */
     50 #define fail(msg) do {                                                 \
     51     fprintf(stderr, "%s:%d test failed: '%s'\n",                       \
     52             __FILE__, __LINE__, msg);                                  \
     53     unitfail++;                                                        \
     54   } WHILE_FALSE
     55 
     56 
     57 /* The abort macros mark the current test step as failed, and exit the test */
     58 #define abort_if(expr, msg)                                   \
     59   if(expr) {                                                  \
     60     fprintf(stderr, "%s:%d Abort assertion '%s' met: %s\n",   \
     61             __FILE__, __LINE__, #expr, msg);                  \
     62     unitfail++;                                               \
     63     goto unit_test_abort;                                     \
     64   }
     65 
     66 #define abort_unless(expr, msg)                                \
     67   if(!(expr)) {                                                \
     68     fprintf(stderr, "%s:%d Abort assertion '%s' failed: %s\n", \
     69             __FILE__, __LINE__, #expr, msg);                   \
     70     unitfail++;                                                \
     71     goto unit_test_abort;                                      \
     72   }
     73 
     74 #define abort_test(msg) do {                                  \
     75     fprintf(stderr, "%s:%d test aborted: '%s'\n",             \
     76             __FILE__, __LINE__, msg);                         \
     77     unitfail++;                                               \
     78     goto unit_test_abort;                                     \
     79   } WHILE_FALSE
     80 
     81 
     82 
     83 extern int unitfail;
     84 
     85 #define UNITTEST_START                          \
     86   int test(char *arg)                           \
     87   {                                             \
     88     (void)arg;                                  \
     89     if(unit_setup()) {                          \
     90       fail("unit_setup() failure");             \
     91     }                                           \
     92     else {
     93 
     94 #define UNITTEST_STOP                           \
     95     goto unit_test_abort; /* avoid warning */   \
     96 unit_test_abort:                                \
     97     unit_stop();                                \
     98   }                                             \
     99   return unitfail;                              \
    100   }
    101 
    102