diff options
Diffstat (limited to 'tiler/testlib.c')
-rw-r--r-- | tiler/testlib.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/tiler/testlib.c b/tiler/testlib.c new file mode 100644 index 0000000..63d1298 --- /dev/null +++ b/tiler/testlib.c @@ -0,0 +1,163 @@ +/* + * testlib.c + * + * Unit test interface. + * + * Copyright (C) 2009-2011 Texas Instruments, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* retrieve type definitions */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "testlib.h" + +#include <utils.h> +#include <debug_utils.h> + +#define TESTLIB_OK 0 +#define TESTLIB_FAIL 1 + +/** Returns TRUE iff str is a whole unsigned int */ +#define is_uint(str) \ + ({ unsigned i; char c; sscanf(str, "%u%c", &i, &c) == 1; }) + +extern int __internal__TestLib_DoList(int id); + +/** + * Prints test result and returns summary result + * + * @author a0194118 (9/7/2009) + * + * @param res Test result + * + * @return TEST_RESULT_OK on success, TEST_RESULT_FAIL on + * failure, TEST_RESULT_UNAVAILABLE if test is not + * available + */ +int __internal__TestLib_Report(int res) +{ + switch (res) + { + case TESTLIB_UNAVAILABLE: + printf("==> TEST NOT AVAILABLE\n"); + fflush(stdout); + return TESTLIB_UNAVAILABLE; + case 0: + printf("==> TEST OK\n"); + fflush(stdout); + return TESTLIB_OK; + default: + printf("==> TEST FAIL(%d)\n", res); + fflush(stdout); + return TESTLIB_FAIL; + } +} + +void __internal__TestLib_NullFn(void *ptr) +{ +} + +int TestLib_Run(int argc, char **argv, void(*init_fn)(void *), + void(*exit_fn)(void *), void *ptr) +{ + int start, end, res, failed = 0, succeeded = 0, unavailable = 0; + + /* all tests */ + if (argc == 1) + { + start = 1; end = -1; + } + /* test list */ + else if (argc == 2 && !strcmp(argv[1], "list")) + { + __internal__TestLib_DoList(0); + return -1; + } + /* single test */ + else if (argc == 2 && is_uint(argv[1])) + { + start = end = atoi(argv[1]); + } + /* open range .. b */ + else if (argc == 3 && !strcmp(argv[1], "..") && is_uint(argv[2])) + { + start = 1; + end = atoi(argv[2]); + } + /* open range a .. */ + else if (argc == 3 && !strcmp(argv[2], "..") && is_uint(argv[1])) + { + start = atoi(argv[1]); + end = -1; + } + else if (argc == 4 && !strcmp(argv[2], "..") && is_uint(argv[1]) && is_uint(argv[3])) + { + start = atoi(argv[1]); + end = atoi(argv[3]); + } + else + { + fprintf(stderr, "Usage: %s [<range>], where <range> is\n" + " empty: run all tests\n" + " list: list tests\n" + " ix: run test #ix\n" + " a ..: run tests #a, #a+1, ...\n" + " .. b: run tests #1, #2, .. #b\n" + " a .. b: run tests #a, #a+1, .. #b\n", argv[0]); + fflush(stderr); + return -1; + } + + /* execute tests */ + init_fn(ptr); + + do + { + res = __internal__TestLib_DoList(start++); + if (res == TESTLIB_FAIL) failed++; + else if (res == TESTLIB_OK) succeeded++; + else if (res == TESTLIB_UNAVAILABLE) unavailable++; + printf("so far FAILED: %d, SUCCEEDED: %d, UNAVAILABLE: %d\n", failed, succeeded, + unavailable); + fflush(stdout); + } while (res != TESTLIB_INVALID && (end < 0 || start <= end)); + + printf("FAILED: %d, SUCCEEDED: %d, UNAVAILABLE: %d\n", failed, succeeded, + unavailable); + fflush(stdout); + + /* also execute internal unit tests - this also verifies that we did not + keep any references */ + exit_fn(ptr); + + return failed; +} + |