tests: add support for tests expected to fail
authorPekka Paalanen <ppaalanen@gmail.com>
Thu, 19 Apr 2012 11:26:51 +0000 (14:26 +0300)
committerPekka Paalanen <ppaalanen@gmail.com>
Thu, 19 Apr 2012 11:26:51 +0000 (14:26 +0300)
Add a new macro FAIL_TEST that can be used to define tests that are
supposed to fail. To distinguish the supposed outcome of a test, add a
field to 'struct test'.

However, simply adding a field to 'struct test' will make all tests past
the first one in an executable to be garbage. Apparently, the variables
of type 'struct test' have different alignment when put into a special
section than otherwise, and the compiler will get the skip from one
'struct test' to the next wrong.

Explicitly specify the alingment of 'struct test' to be 16 bytes, which
is what it seems to be in the special section on x86_64.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
tests/test-runner.c
tests/test-runner.h

index bb07013..24ae317 100644 (file)
@@ -124,6 +124,9 @@ int main(int argc, char *argv[])
                        break;
                }
 
+               if (t->must_fail)
+                       success = !success;
+
                if (success) {
                        pass++;
                        fprintf(stderr, ", pass.\n");
index 253df81..0614101 100644 (file)
@@ -8,14 +8,25 @@
 struct test {
        const char *name;
        void (*run)(void);
-};
+       int must_fail;
+} __attribute__ ((aligned (16)));
 
 #define TEST(name)                                             \
        static void name(void);                                 \
                                                                \
-       const struct test test##name                    \
+       const struct test test##name                            \
                 __attribute__ ((section ("test_section"))) = { \
-               #name, name                                     \
+               #name, name, 0                                  \
+       };                                                      \
+                                                               \
+       static void name(void)
+
+#define FAIL_TEST(name)                                                \
+       static void name(void);                                 \
+                                                               \
+       const struct test test##name                            \
+                __attribute__ ((section ("test_section"))) = { \
+               #name, name, 1                                  \
        };                                                      \
                                                                \
        static void name(void)