diff options
| author | Edward Thomson <ethomson@edwardthomson.com> | 2021-11-16 23:29:22 -0500 |
|---|---|---|
| committer | Edward Thomson <ethomson@edwardthomson.com> | 2022-02-22 22:07:45 -0500 |
| commit | 3344fddc97bbdea9c1b6ebb6f7fb6dbd70b41dfb (patch) | |
| tree | fd6368a72944571c51627b40c592e7d58e0036e1 /tests/libgit2/trace | |
| parent | 91ba089663f5efc3bd4ba14a5099372cf5ce57a6 (diff) | |
| download | libgit2-3344fddc97bbdea9c1b6ebb6f7fb6dbd70b41dfb.tar.gz | |
refactor: `tests` is now `tests/libgit2`
Like we want to separate libgit2 and utility source code, we want to
separate libgit2 and utility tests. Start by moving all the tests into
libgit2.
Diffstat (limited to 'tests/libgit2/trace')
| -rw-r--r-- | tests/libgit2/trace/trace.c | 106 | ||||
| -rw-r--r-- | tests/libgit2/trace/windows/stacktrace.c | 152 |
2 files changed, 258 insertions, 0 deletions
diff --git a/tests/libgit2/trace/trace.c b/tests/libgit2/trace/trace.c new file mode 100644 index 000000000..097208bff --- /dev/null +++ b/tests/libgit2/trace/trace.c @@ -0,0 +1,106 @@ +#include "clar_libgit2.h" +#include "clar_libgit2_trace.h" +#include "trace.h" + +static int written = 0; + +static void trace_callback(git_trace_level_t level, const char *message) +{ + GIT_UNUSED(level); + + cl_assert(strcmp(message, "Hello world!") == 0); + + written = 1; +} + +void test_trace_trace__initialize(void) +{ + /* If global tracing is enabled, disable for the duration of this test. */ + cl_global_trace_disable(); + + git_trace_set(GIT_TRACE_INFO, trace_callback); + written = 0; +} + +void test_trace_trace__cleanup(void) +{ + git_trace_set(GIT_TRACE_NONE, NULL); + + /* If global tracing was enabled, restart it. */ + cl_global_trace_register(); +} + +void test_trace_trace__sets(void) +{ +#ifdef GIT_TRACE + cl_assert(git_trace_level() == GIT_TRACE_INFO); +#else + cl_skip(); +#endif +} + +void test_trace_trace__can_reset(void) +{ +#ifdef GIT_TRACE + cl_assert(git_trace_level() == GIT_TRACE_INFO); + cl_git_pass(git_trace_set(GIT_TRACE_ERROR, trace_callback)); + + cl_assert(written == 0); + git_trace(GIT_TRACE_INFO, "Hello %s!", "world"); + cl_assert(written == 0); + + git_trace(GIT_TRACE_ERROR, "Hello %s!", "world"); + cl_assert(written == 1); +#else + cl_skip(); +#endif +} + +void test_trace_trace__can_unset(void) +{ +#ifdef GIT_TRACE + cl_assert(git_trace_level() == GIT_TRACE_INFO); + cl_git_pass(git_trace_set(GIT_TRACE_NONE, NULL)); + + cl_assert(git_trace_level() == GIT_TRACE_NONE); + + cl_assert(written == 0); + git_trace(GIT_TRACE_FATAL, "Hello %s!", "world"); + cl_assert(written == 0); +#else + cl_skip(); +#endif +} + +void test_trace_trace__skips_higher_level(void) +{ +#ifdef GIT_TRACE + cl_assert(written == 0); + git_trace(GIT_TRACE_DEBUG, "Hello %s!", "world"); + cl_assert(written == 0); +#else + cl_skip(); +#endif +} + +void test_trace_trace__writes(void) +{ +#ifdef GIT_TRACE + cl_assert(written == 0); + git_trace(GIT_TRACE_INFO, "Hello %s!", "world"); + cl_assert(written == 1); +#else + cl_skip(); +#endif +} + +void test_trace_trace__writes_lower_level(void) +{ +#ifdef GIT_TRACE + cl_assert(written == 0); + git_trace(GIT_TRACE_ERROR, "Hello %s!", "world"); + cl_assert(written == 1); +#else + cl_skip(); +#endif +} diff --git a/tests/libgit2/trace/windows/stacktrace.c b/tests/libgit2/trace/windows/stacktrace.c new file mode 100644 index 000000000..0a77ef99d --- /dev/null +++ b/tests/libgit2/trace/windows/stacktrace.c @@ -0,0 +1,152 @@ +#include "clar_libgit2.h" +#include "win32/w32_leakcheck.h" + +#if defined(GIT_WIN32_LEAKCHECK) +static void a(void) +{ + char buf[10000]; + + cl_assert(git_win32_leakcheck_stack(buf, sizeof(buf), 0, NULL, NULL) == 0); + +#if 0 + fprintf(stderr, "Stacktrace from [%s:%d]:\n%s\n", __FILE__, __LINE__, buf); +#endif +} + +static void b(void) +{ + a(); +} + +static void c(void) +{ + b(); +} +#endif + +void test_trace_windows_stacktrace__basic(void) +{ +#if defined(GIT_WIN32_LEAKCHECK) + c(); +#endif +} + + +void test_trace_windows_stacktrace__leaks(void) +{ +#if defined(GIT_WIN32_LEAKCHECK) + void * p1; + void * p2; + void * p3; + void * p4; + int before, after; + int leaks; + int error; + + /* remember outstanding leaks due to set setup + * and set mark/checkpoint. + */ + before = git_win32_leakcheck_stacktrace_dump( + GIT_WIN32_LEAKCHECK_STACKTRACE_QUIET | + GIT_WIN32_LEAKCHECK_STACKTRACE_LEAKS_TOTAL | + GIT_WIN32_LEAKCHECK_STACKTRACE_SET_MARK, + NULL); + + p1 = git__malloc(5); + leaks = git_win32_leakcheck_stacktrace_dump( + GIT_WIN32_LEAKCHECK_STACKTRACE_QUIET | + GIT_WIN32_LEAKCHECK_STACKTRACE_LEAKS_SINCE_MARK, + "p1"); + cl_assert_equal_i(1, leaks); + + p2 = git__malloc(5); + leaks = git_win32_leakcheck_stacktrace_dump( + GIT_WIN32_LEAKCHECK_STACKTRACE_QUIET | + GIT_WIN32_LEAKCHECK_STACKTRACE_LEAKS_SINCE_MARK, + "p1,p2"); + cl_assert_equal_i(2, leaks); + + p3 = git__malloc(5); + leaks = git_win32_leakcheck_stacktrace_dump( + GIT_WIN32_LEAKCHECK_STACKTRACE_QUIET | + GIT_WIN32_LEAKCHECK_STACKTRACE_LEAKS_SINCE_MARK, + "p1,p2,p3"); + cl_assert_equal_i(3, leaks); + + git__free(p2); + leaks = git_win32_leakcheck_stacktrace_dump( + GIT_WIN32_LEAKCHECK_STACKTRACE_QUIET | + GIT_WIN32_LEAKCHECK_STACKTRACE_LEAKS_SINCE_MARK, + "p1,p3"); + cl_assert_equal_i(2, leaks); + + /* move the mark. only new leaks should appear afterwards */ + error = git_win32_leakcheck_stacktrace_dump( + GIT_WIN32_LEAKCHECK_STACKTRACE_SET_MARK, + NULL); + /* cannot use cl_git_pass() since that may allocate memory. */ + cl_assert_equal_i(0, error); + + leaks = git_win32_leakcheck_stacktrace_dump( + GIT_WIN32_LEAKCHECK_STACKTRACE_QUIET | + GIT_WIN32_LEAKCHECK_STACKTRACE_LEAKS_SINCE_MARK, + "not_p1,not_p3"); + cl_assert_equal_i(0, leaks); + + p4 = git__malloc(5); + leaks = git_win32_leakcheck_stacktrace_dump( + GIT_WIN32_LEAKCHECK_STACKTRACE_QUIET | + GIT_WIN32_LEAKCHECK_STACKTRACE_LEAKS_SINCE_MARK, + "p4,not_p1,not_p3"); + cl_assert_equal_i(1, leaks); + + git__free(p1); + git__free(p3); + leaks = git_win32_leakcheck_stacktrace_dump( + GIT_WIN32_LEAKCHECK_STACKTRACE_QUIET | + GIT_WIN32_LEAKCHECK_STACKTRACE_LEAKS_SINCE_MARK, + "p4"); + cl_assert_equal_i(1, leaks); + + git__free(p4); + leaks = git_win32_leakcheck_stacktrace_dump( + GIT_WIN32_LEAKCHECK_STACKTRACE_QUIET | + GIT_WIN32_LEAKCHECK_STACKTRACE_LEAKS_SINCE_MARK, + "end"); + cl_assert_equal_i(0, leaks); + + /* confirm current absolute leaks count matches beginning value. */ + after = git_win32_leakcheck_stacktrace_dump( + GIT_WIN32_LEAKCHECK_STACKTRACE_QUIET | + GIT_WIN32_LEAKCHECK_STACKTRACE_LEAKS_TOTAL, + "total"); + cl_assert_equal_i(before, after); +#endif +} + +#if defined(GIT_WIN32_LEAKCHECK) +static void aux_cb_alloc__1(unsigned int *aux_id) +{ + static unsigned int aux_counter = 0; + + *aux_id = aux_counter++; +} + +static void aux_cb_lookup__1(unsigned int aux_id, char *aux_msg, size_t aux_msg_len) +{ + p_snprintf(aux_msg, aux_msg_len, "\tQQ%08x\n", aux_id); +} + +#endif + +void test_trace_windows_stacktrace__aux1(void) +{ +#if defined(GIT_WIN32_LEAKCHECK) + git_win32_leakcheck_stack_set_aux_cb(aux_cb_alloc__1, aux_cb_lookup__1); + c(); + c(); + c(); + c(); + git_win32_leakcheck_stack_set_aux_cb(NULL, NULL); +#endif +} |
