summaryrefslogtreecommitdiff
path: root/tests/libgit2/trace/windows/stacktrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/libgit2/trace/windows/stacktrace.c')
-rw-r--r--tests/libgit2/trace/windows/stacktrace.c152
1 files changed, 152 insertions, 0 deletions
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
+}