#include "../src/trace.c" #include #include #include #include "../src/testing.h" #include "../src/util.h" #include "slurp.h" static const char *const FNAME = __FILE__ ".txt"; static int test_vtrace(void) { int rc = -1; test_start("vtrace()"); FILE *file = NULL; char *str = NULL; { testing("empty varargs"); file = fopen(FNAME, "w"); if (file == NULL) { perror("fopen(FNAME, \"w\")"); goto out; } set_output(file); #line 100 vtrace(__FILE__, __func__, __LINE__, TraceLevel_INFO, ""); const int ret = fclose(file); file = NULL; if (ret) { perror("fclose(file)"); goto out; } if (slurp_for_tests(FNAME, &str)) { perror("slurp_for_tests(FNAME, &str)"); goto out; } const char *const expected = "tests/trace.c:test_vtrace:100: \n"; printf("\n"); printf("expected: >>>%s<<<\n", expected); printf("str: >>>%s<<<\n", str); // FIXME assert(strcmp(expected, str) == 0); freeit((void *)&str); test_ok(); } { testing("multiple format strings"); file = fopen(FNAME, "w"); if (file == NULL) { perror("fopen(FNAME, \"w\")"); goto out; } set_output(file); #line 200 vtrace(__FILE__, __func__, __LINE__, TraceLevel_INFO, "int (%d), string (%s) and char (%c)", 123, "another-str", 'z'); const int ret = fclose(file); file = NULL; if (ret) { perror("fclose(file)"); goto out; } if (slurp_for_tests(FNAME, &str)) { perror("slurp_for_tests(FNAME, &str)"); goto out; } const char *const expected = "tests/trace.c:test_vtrace:200: " "int (123), string (another-str) and char (z)\n"; printf("\n"); printf("expected: >>>%s<<<\n", expected); printf("str: >>>%s<<<\n", str); // FIXME // assert(strcmp(expected, str) == 0); freeit((void *)&str); test_ok(); } { testing("insufficient trace level"); file = fopen(FNAME, "w"); if (file == NULL) { perror("fopen(FNAME, \"w\")"); goto out; } set_output(file); vtrace(__FILE__, __func__, __LINE__, TraceLevel_INFO, "ignored"); const int ret = fclose(file); file = NULL; if (ret) { perror("fclose(file)"); goto out; } if (slurp_for_tests(FNAME, &str)) { perror("slurp_for_tests(FNAME, &str)"); goto out; } // FIXME // assert(strcmp("", str) == 0); freeit((void *)&str); test_ok(); } rc = 0; out: if (str != NULL) { freeit((void *)&str); } if (file != NULL) { if (fclose(file)) { perror("fclose(file)"); rc = -1; } } return rc; } static int test_trace(void) { int rc = -1; test_start("trace()"); FILE *file = NULL; char *str = NULL; { testing("can be called with an empty string"); file = fopen(FNAME, "w"); if (file == NULL) { perror("fopen(FNAME, \"w\")"); goto out; } set_output(file); trace(TraceLevel_INFO, ""); const int ret = fclose(file); file = NULL; if (ret) { perror("fclose(file)"); goto out; } if (slurp_for_tests(FNAME, &str)) { perror("slurp_for_tests(FNAME, &str)"); goto out; } // FIXME /* const char *const expected = "tests/trace.c:test_vtrace:200: " "int (123), string (another-str) and char (z)\n"; */ // assert(strcmp(expected, str) == 0); freeit((void *)&str); test_ok(); } { testing("can be called with formatting arguments"); file = fopen(FNAME, "w"); if (file == NULL) { perror("fopen(FNAME, \"w\")"); goto out; } set_output(file); // FIXME // trace(TraceLevel_INFO, "int: %d\tstr: %s", 123, "an example string"); const int ret = fclose(file); file = NULL; if (ret) { perror("fclose(file)"); goto out; } if (slurp_for_tests(FNAME, &str)) { perror("slurp_for_tests(FNAME, &str)"); goto out; } /* const char *const expected = ""; assert(strcmp(expected, str) == 0); */ freeit((void *)&str); test_ok(); } rc = 0; out: if (str != NULL) { freeit((void *)&str); } if (file != NULL) { if (fclose(file)) { perror("fclose(file)"); rc = -1; } } return rc; } int main(void) { int rc = EXIT_FAILURE; TRACE_LEVEL = TraceLevel_INFO; TRACE_LEVEL = TraceLevel_DEBUG; if (test_vtrace()) { perror("test_vtrace()"); goto out; } if (test_trace()) { perror("test_trace()"); goto out; } rc = EXIT_SUCCESS; out: return rc; }