From ffe4f5e0840c1879e974b2463384b0a461bba468 Mon Sep 17 00:00:00 2001 From: ncteisen Date: Wed, 1 Mar 2017 12:12:24 -0800 Subject: Fix mem leak in error_test --- test/core/iomgr/error_test.c | 82 +++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 40 deletions(-) (limited to 'test') diff --git a/test/core/iomgr/error_test.c b/test/core/iomgr/error_test.c index 5137ef9758..0452e4576a 100644 --- a/test/core/iomgr/error_test.c +++ b/test/core/iomgr/error_test.c @@ -43,91 +43,93 @@ #include "test/core/util/test_config.h" -static void test_set_get_int() -{ +static void test_set_get_int() { grpc_error* error = GRPC_ERROR_CREATE("Test"); + GPR_ASSERT(error); intptr_t i = 0; GPR_ASSERT(grpc_error_get_int(error, GRPC_ERROR_INT_FILE_LINE, &i)); - GPR_ASSERT(i); // line set will never be 0 + GPR_ASSERT(i); // line set will never be 0 GPR_ASSERT(!grpc_error_get_int(error, GRPC_ERROR_INT_ERRNO, &i)); GPR_ASSERT(!grpc_error_get_int(error, GRPC_ERROR_INT_SIZE, &i)); - intptr_t errno = 314; - error = grpc_error_set_int(error, GRPC_ERROR_INT_ERRNO, errno); + intptr_t errnumber = 314; + error = grpc_error_set_int(error, GRPC_ERROR_INT_ERRNO, errnumber); GPR_ASSERT(grpc_error_get_int(error, GRPC_ERROR_INT_ERRNO, &i)); - GPR_ASSERT(i == errno); + GPR_ASSERT(i == errnumber); - intptr_t line = 555; - error = grpc_error_set_int(error, GRPC_ERROR_INT_FILE_LINE, line); - GPR_ASSERT(grpc_error_get_int(error, GRPC_ERROR_INT_FILE_LINE, &i)); - GPR_ASSERT(i == line); + intptr_t http = 2; + error = grpc_error_set_int(error, GRPC_ERROR_INT_HTTP2_ERROR, http); + GPR_ASSERT(grpc_error_get_int(error, GRPC_ERROR_INT_HTTP2_ERROR, &i)); + GPR_ASSERT(i == http); + + GRPC_ERROR_UNREF(error); } -static void test_set_get_str() -{ +static void test_set_get_str() { grpc_error* error = GRPC_ERROR_CREATE("Test"); + GPR_ASSERT(!grpc_error_get_str(error, GRPC_ERROR_STR_SYSCALL)); GPR_ASSERT(!grpc_error_get_str(error, GRPC_ERROR_STR_TSI_ERROR)); const char* c = grpc_error_get_str(error, GRPC_ERROR_STR_FILE); GPR_ASSERT(c); - GPR_ASSERT(!strcmp(c, "test/core/iomgr/error_test.c")); + GPR_ASSERT(strstr(c, "error_test.c")); // __FILE__ expands differently on + // Windows. All should at least + // contain error_test.c c = grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION); GPR_ASSERT(c); GPR_ASSERT(!strcmp(c, "Test")); - error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, "message"); + error = + grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, "longer message"); c = grpc_error_get_str(error, GRPC_ERROR_STR_GRPC_MESSAGE); GPR_ASSERT(c); - GPR_ASSERT(!strcmp(c, "message")); + GPR_ASSERT(!strcmp(c, "longer message")); - error = grpc_error_set_str(error, GRPC_ERROR_STR_DESCRIPTION, "new desc"); - c = grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION); - GPR_ASSERT(c); - GPR_ASSERT(!strcmp(c, "new desc")); + GRPC_ERROR_UNREF(error); } -static void test_copy_and_unref() -{ - grpc_error* error1 = GRPC_ERROR_CREATE("Test"); - grpc_error* error2 = grpc_error_set_str(error1, GRPC_ERROR_STR_GRPC_MESSAGE, "message"); +static void test_copy_and_unref() { + // error1 has one ref + grpc_error* error1 = grpc_error_set_str( + GRPC_ERROR_CREATE("Test"), GRPC_ERROR_STR_GRPC_MESSAGE, "message"); const char* c = grpc_error_get_str(error1, GRPC_ERROR_STR_GRPC_MESSAGE); GPR_ASSERT(c); GPR_ASSERT(!strcmp(c, "message")); - c = grpc_error_get_str(error2, GRPC_ERROR_STR_GRPC_MESSAGE); - GPR_ASSERT(c); - GPR_ASSERT(!strcmp(c, "message")); - GPR_ASSERT(error1 == error2); + // error 1 has two refs GRPC_ERROR_REF(error1); - grpc_error* error3 = grpc_error_set_str(error1, GRPC_ERROR_STR_DESCRIPTION, "reset"); - GPR_ASSERT(error3 != error1); // should not be the same because of extra ref + // this gives error3 a ref to the new error, and decrements error1 to one ref + grpc_error* error3 = + grpc_error_set_str(error1, GRPC_ERROR_STR_SYSCALL, "syscall"); + GPR_ASSERT(error3 != error1); // should not be the same because of extra ref c = grpc_error_get_str(error3, GRPC_ERROR_STR_GRPC_MESSAGE); GPR_ASSERT(c); GPR_ASSERT(!strcmp(c, "message")); - c = grpc_error_get_str(error1, GRPC_ERROR_STR_DESCRIPTION); + // error 1 should not have a syscall but 3 should + GPR_ASSERT(!grpc_error_get_str(error1, GRPC_ERROR_STR_SYSCALL)); + c = grpc_error_get_str(error3, GRPC_ERROR_STR_SYSCALL); GPR_ASSERT(c); - GPR_ASSERT(!strcmp(c, "Test")); + GPR_ASSERT(!strcmp(c, "syscall")); - c = grpc_error_get_str(error3, GRPC_ERROR_STR_DESCRIPTION); - GPR_ASSERT(c); - GPR_ASSERT(!strcmp(c, "reset")); + GRPC_ERROR_UNREF(error1); + GRPC_ERROR_UNREF(error3); } -static void print_error_strings() -{ - grpc_error* error = grpc_error_set_int(GRPC_ERROR_CREATE("Error"), - GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_UNIMPLEMENTED); +static void print_error_strings() { + grpc_error* error = + grpc_error_set_int(GRPC_ERROR_CREATE("Error"), GRPC_ERROR_INT_GRPC_STATUS, + GRPC_STATUS_UNIMPLEMENTED); error = grpc_error_set_int(error, GRPC_ERROR_INT_GRPC_STATUS, 0); error = grpc_error_set_int(error, GRPC_ERROR_INT_SIZE, 666); error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, "message"); gpr_log(GPR_DEBUG, "%s", grpc_error_string(error)); + GRPC_ERROR_UNREF(error); } -int main(int argc, char **argv) { +int main(int argc, char** argv) { grpc_test_init(argc, argv); grpc_init(); test_set_get_int(); -- cgit v1.2.3