From e721b882e9daf3ad3599eef5a9ccf3847b694228 Mon Sep 17 00:00:00 2001 From: Joe Hershberger Date: Wed, 20 May 2015 14:27:27 -0500 Subject: test: Generalize the unit test framework Separate the ability to define tests and assert status of test functions from the dm tests so they can be used more consistently throughout all tests. Signed-off-by: Joe Hershberger Reviewed-by: Simon Glass --- include/dm/test.h | 35 ++++------------- include/dm/ut.h | 107 ---------------------------------------------------- include/test/test.h | 47 +++++++++++++++++++++++ include/test/ut.h | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 161 insertions(+), 135 deletions(-) delete mode 100644 include/dm/ut.h create mode 100644 include/test/test.h create mode 100644 include/test/ut.h (limited to 'include') diff --git a/include/dm/test.h b/include/dm/test.h index f03fbcb1cd..98f2b9e996 100644 --- a/include/dm/test.h +++ b/include/dm/test.h @@ -8,7 +8,7 @@ #define __DM_TEST_H #include -#include +#include /** * struct dm_test_cdata - configuration data for test instance @@ -124,7 +124,7 @@ struct dm_test_perdev_uc_pdata { */ extern int dm_testdrv_op_count[DM_TEST_OP_COUNT]; -extern struct dm_test_state global_test_state; +extern struct unit_test_state global_dm_test_state; /* * struct dm_test_state - Entire state of dm test system @@ -133,7 +133,6 @@ extern struct dm_test_state global_test_state; * * @root: Root device * @testdev: Test device - * @fail_count: Number of tests that failed * @force_fail_alloc: Force all memory allocs to fail * @skip_post_probe: Skip uclass post-probe processing * @removed: Used to keep track of a device that was removed @@ -141,11 +140,9 @@ extern struct dm_test_state global_test_state; struct dm_test_state { struct udevice *root; struct udevice *testdev; - int fail_count; int force_fail_alloc; int skip_post_probe; struct udevice *removed; - struct mallinfo start; }; /* Test flags for each test */ @@ -155,26 +152,8 @@ enum { DM_TESTF_SCAN_FDT = 1 << 2, /* scan device tree */ }; -/** - * struct dm_test - Information about a driver model test - * - * @name: Name of test - * @func: Function to call to perform test - * @flags: Flags indicated pre-conditions for test - */ -struct dm_test { - const char *name; - int (*func)(struct dm_test_state *dms); - int flags; -}; - /* Declare a new driver model test */ -#define DM_TEST(_name, _flags) \ - ll_entry_declare(struct dm_test, _name, dm_test) = { \ - .name = #_name, \ - .flags = _flags, \ - .func = _name, \ - } +#define DM_TEST(_name, _flags) UNIT_TEST(_name, _flags, dm_test) /* Declare ping methods for the drivers */ int test_ping(struct udevice *dev, int pingval, int *pingret); @@ -191,7 +170,7 @@ int testfdt_ping(struct udevice *dev, int pingval, int *pingret); * @priv: Pointer to private test information * @return 0 if OK, -ve on error */ -int dm_check_operations(struct dm_test_state *dms, struct udevice *dev, +int dm_check_operations(struct unit_test_state *uts, struct udevice *dev, uint32_t base, struct dm_test_priv *priv); /** @@ -201,7 +180,7 @@ int dm_check_operations(struct dm_test_state *dms, struct udevice *dev, * @num_devices: Number of test devices to check * @return 0 if OK, -ve on error */ -int dm_check_devices(struct dm_test_state *dms, int num_devices); +int dm_check_devices(struct unit_test_state *uts, int num_devices); /** * dm_leak_check_start() - Prepare to check for a memory leak @@ -211,7 +190,7 @@ int dm_check_devices(struct dm_test_state *dms, int num_devices); * * @dms: Overall test state */ -void dm_leak_check_start(struct dm_test_state *dms); +void dm_leak_check_start(struct unit_test_state *uts); /** * dm_leak_check_end() - Check that no memory has leaked @@ -221,7 +200,7 @@ void dm_leak_check_start(struct dm_test_state *dms); * it sees a different amount of total memory allocated than before. * * @dms: Overall test state - */int dm_leak_check_end(struct dm_test_state *dms); + */int dm_leak_check_end(struct unit_test_state *uts); /** diff --git a/include/dm/ut.h b/include/dm/ut.h deleted file mode 100644 index ec6146545b..0000000000 --- a/include/dm/ut.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Simple unit test library for driver model - * - * Copyright (c) 2013 Google, Inc - * - * SPDX-License-Identifier: GPL-2.0+ - */ - -#ifndef __DM_UT_H -#define __DM_UT_H - -struct dm_test_state; - -/** - * ut_fail() - Record failure of a unit test - * - * @dms: Test state - * @fname: Filename where the error occured - * @line: Line number where the error occured - * @func: Function name where the error occured - * @cond: The condition that failed - */ -void ut_fail(struct dm_test_state *dms, const char *fname, int line, - const char *func, const char *cond); - -/** - * ut_failf() - Record failure of a unit test - * - * @dms: Test state - * @fname: Filename where the error occured - * @line: Line number where the error occured - * @func: Function name where the error occured - * @cond: The condition that failed - * @fmt: printf() format string for the error, followed by args - */ -void ut_failf(struct dm_test_state *dms, const char *fname, int line, - const char *func, const char *cond, const char *fmt, ...) - __attribute__ ((format (__printf__, 6, 7))); - - -/* Assert that a condition is non-zero */ -#define ut_assert(cond) \ - if (!(cond)) { \ - ut_fail(dms, __FILE__, __LINE__, __func__, #cond); \ - return -1; \ - } - -/* Assert that a condition is non-zero, with printf() string */ -#define ut_assertf(cond, fmt, args...) \ - if (!(cond)) { \ - ut_failf(dms, __FILE__, __LINE__, __func__, #cond, \ - fmt, ##args); \ - return -1; \ - } - -/* Assert that two int expressions are equal */ -#define ut_asserteq(expr1, expr2) { \ - unsigned int val1 = (expr1), val2 = (expr2); \ - \ - if (val1 != val2) { \ - ut_failf(dms, __FILE__, __LINE__, __func__, \ - #expr1 " == " #expr2, \ - "Expected %d, got %d", val1, val2); \ - return -1; \ - } \ -} - -/* Assert that two string expressions are equal */ -#define ut_asserteq_str(expr1, expr2) { \ - const char *val1 = (expr1), *val2 = (expr2); \ - \ - if (strcmp(val1, val2)) { \ - ut_failf(dms, __FILE__, __LINE__, __func__, \ - #expr1 " = " #expr2, \ - "Expected \"%s\", got \"%s\"", val1, val2); \ - return -1; \ - } \ -} - -/* Assert that two pointers are equal */ -#define ut_asserteq_ptr(expr1, expr2) { \ - const void *val1 = (expr1), *val2 = (expr2); \ - \ - if (val1 != val2) { \ - ut_failf(dms, __FILE__, __LINE__, __func__, \ - #expr1 " = " #expr2, \ - "Expected %p, got %p", val1, val2); \ - return -1; \ - } \ -} - -/* Assert that a pointer is not NULL */ -#define ut_assertnonnull(expr) { \ - const void *val = (expr); \ - \ - if (val == NULL) { \ - ut_failf(dms, __FILE__, __LINE__, __func__, \ - #expr " = NULL", \ - "Expected non-null, got NULL"); \ - return -1; \ - } \ -} - -/* Assert that an operation succeeds (returns 0) */ -#define ut_assertok(cond) ut_asserteq(0, cond) - -#endif diff --git a/include/test/test.h b/include/test/test.h new file mode 100644 index 0000000000..b7e1ae2dec --- /dev/null +++ b/include/test/test.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2013 Google, Inc. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef __TEST_TEST_H +#define __TEST_TEST_H + +#include + +/* + * struct unit_test_state - Entire state of test system + * + * @fail_count: Number of tests that failed + * @start: Store the starting mallinfo when doing leak test + * @priv: A pointer to some other info some suites want to track + */ +struct unit_test_state { + int fail_count; + struct mallinfo start; + void *priv; +}; + +/** + * struct unit_test - Information about a unit test + * + * @name: Name of test + * @func: Function to call to perform test + * @flags: Flags indicated pre-conditions for test + */ +struct unit_test { + const char *name; + int (*func)(struct unit_test_state *state); + int flags; +}; + +/* Declare a new unit test */ +#define UNIT_TEST(_name, _flags, _suite) \ + ll_entry_declare(struct unit_test, _name, _suite) = { \ + .name = #_name, \ + .flags = _flags, \ + .func = _name, \ + } + + +#endif /* __TEST_TEST_H */ diff --git a/include/test/ut.h b/include/test/ut.h new file mode 100644 index 0000000000..275f27ffea --- /dev/null +++ b/include/test/ut.h @@ -0,0 +1,107 @@ +/* + * Simple unit test library + * + * Copyright (c) 2013 Google, Inc + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef __TEST_UT_H +#define __TEST_UT_H + +struct unit_test_state; + +/** + * ut_fail() - Record failure of a unit test + * + * @uts: Test state + * @fname: Filename where the error occured + * @line: Line number where the error occured + * @func: Function name where the error occured + * @cond: The condition that failed + */ +void ut_fail(struct unit_test_state *uts, const char *fname, int line, + const char *func, const char *cond); + +/** + * ut_failf() - Record failure of a unit test + * + * @uts: Test state + * @fname: Filename where the error occured + * @line: Line number where the error occured + * @func: Function name where the error occured + * @cond: The condition that failed + * @fmt: printf() format string for the error, followed by args + */ +void ut_failf(struct unit_test_state *uts, const char *fname, int line, + const char *func, const char *cond, const char *fmt, ...) + __attribute__ ((format (__printf__, 6, 7))); + + +/* Assert that a condition is non-zero */ +#define ut_assert(cond) \ + if (!(cond)) { \ + ut_fail(uts, __FILE__, __LINE__, __func__, #cond); \ + return -1; \ + } + +/* Assert that a condition is non-zero, with printf() string */ +#define ut_assertf(cond, fmt, args...) \ + if (!(cond)) { \ + ut_failf(uts, __FILE__, __LINE__, __func__, #cond, \ + fmt, ##args); \ + return -1; \ + } + +/* Assert that two int expressions are equal */ +#define ut_asserteq(expr1, expr2) { \ + unsigned int val1 = (expr1), val2 = (expr2); \ + \ + if (val1 != val2) { \ + ut_failf(uts, __FILE__, __LINE__, __func__, \ + #expr1 " == " #expr2, \ + "Expected %d, got %d", val1, val2); \ + return -1; \ + } \ +} + +/* Assert that two string expressions are equal */ +#define ut_asserteq_str(expr1, expr2) { \ + const char *val1 = (expr1), *val2 = (expr2); \ + \ + if (strcmp(val1, val2)) { \ + ut_failf(uts, __FILE__, __LINE__, __func__, \ + #expr1 " = " #expr2, \ + "Expected \"%s\", got \"%s\"", val1, val2); \ + return -1; \ + } \ +} + +/* Assert that two pointers are equal */ +#define ut_asserteq_ptr(expr1, expr2) { \ + const void *val1 = (expr1), *val2 = (expr2); \ + \ + if (val1 != val2) { \ + ut_failf(uts, __FILE__, __LINE__, __func__, \ + #expr1 " = " #expr2, \ + "Expected %p, got %p", val1, val2); \ + return -1; \ + } \ +} + +/* Assert that a pointer is not NULL */ +#define ut_assertnonnull(expr) { \ + const void *val = (expr); \ + \ + if (val == NULL) { \ + ut_failf(uts, __FILE__, __LINE__, __func__, \ + #expr " = NULL", \ + "Expected non-null, got NULL"); \ + return -1; \ + } \ +} + +/* Assert that an operation succeeds (returns 0) */ +#define ut_assertok(cond) ut_asserteq(0, cond) + +#endif -- cgit v1.2.1