diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/SConstruct | 9 | ||||
-rw-r--r-- | tests/alltypes_pointer/SConscript | 14 | ||||
-rw-r--r-- | tests/alltypes_pointer/decode_alltypes_pointer.c | 78 |
3 files changed, 81 insertions, 20 deletions
diff --git a/tests/SConstruct b/tests/SConstruct index abc6e7cb..eedb694e 100644 --- a/tests/SConstruct +++ b/tests/SConstruct @@ -58,7 +58,12 @@ if not env.GetOption('clean'): if stdint: conf.env.Append(CPPDEFINES = {'HAVE_STDINT_H': 1}) if stddef: conf.env.Append(CPPDEFINES = {'HAVE_STDDEF_H': 1}) if string: conf.env.Append(CPPDEFINES = {'HAVE_STRING_H': 1}) - + + # Check if we have mallinfo for memory leak tests + mallinfo = conf.CheckFunc('mallinfo', '#include <malloc.h>\n') + if mallinfo: + conf.env.Append(CPPDEFINES = {'HAVE_MALLINFO': 1}) + # Check if we can use pkg-config to find protobuf include path status, output = conf.TryAction('pkg-config protobuf --variable=includedir > $TARGET') if status: @@ -70,7 +75,7 @@ if not env.GetOption('clean'): if 'gcc' in env['CC']: if conf.CheckLib('mudflap'): conf.env.Append(CCFLAGS = '-fmudflap') - conf.env.Append(LINKFLAGS = '-lmudflap -fmudflap') + conf.env.Append(LINKFLAGS = '-fmudflap') # Check if we can use extra strict warning flags (only with GCC) extra = '-Wcast-qual -Wlogical-op -Wconversion' diff --git a/tests/alltypes_pointer/SConscript b/tests/alltypes_pointer/SConscript index 05b4e52d..45985ff5 100644 --- a/tests/alltypes_pointer/SConscript +++ b/tests/alltypes_pointer/SConscript @@ -4,16 +4,26 @@ Import("env") # We need our own pb_decode.o for the malloc support +env = env.Clone() +env.Append(CPPDEFINES = {'PB_ENABLE_MALLOC': 1}); + +# Disable libmudflap, because it will confuse e.g. valgrind +# and other memory leak detection tools. +if '-fmudflap' in env["CCFLAGS"]: + env["CCFLAGS"].remove("-fmudflap") + env["LINKFLAGS"].remove("-fmudflap") + env["LIBS"].remove("mudflap") + strict = env.Clone() strict.Append(CFLAGS = strict['CORECFLAGS']) -strict.Append(CPPDEFINES = {'PB_ENABLE_MALLOC': 1}); strict.Object("pb_decode_with_malloc.o", "$NANOPB/pb_decode.c") +strict.Object("pb_encode_with_malloc.o", "$NANOPB/pb_encode.c") c = Copy("$TARGET", "$SOURCE") env.Command("alltypes.proto", "#alltypes/alltypes.proto", c) env.NanopbProto(["alltypes", "alltypes.options"]) -enc = env.Program(["encode_alltypes_pointer.c", "alltypes.pb.c", "$COMMON/pb_encode.o"]) +enc = env.Program(["encode_alltypes_pointer.c", "alltypes.pb.c", "pb_encode_with_malloc.o"]) dec = env.Program(["decode_alltypes_pointer.c", "alltypes.pb.c", "pb_decode_with_malloc.o"]) refdec = "$BUILD/alltypes/decode_alltypes$PROGSUFFIX" diff --git a/tests/alltypes_pointer/decode_alltypes_pointer.c b/tests/alltypes_pointer/decode_alltypes_pointer.c index 3db48114..29495ac4 100644 --- a/tests/alltypes_pointer/decode_alltypes_pointer.c +++ b/tests/alltypes_pointer/decode_alltypes_pointer.c @@ -5,8 +5,12 @@ #include "alltypes.pb.h" #include "test_helpers.h" +#ifdef HAVE_MALLINFO +#include <malloc.h> +#endif + #define TEST(x) if (!(x)) { \ - printf("Test " #x " failed.\n"); \ + fprintf(stderr, "Test " #x " failed.\n"); \ status = false; \ } @@ -21,7 +25,10 @@ bool check_alltypes(pb_istream_t *stream, int mode) memset(&alltypes, 0xAA, sizeof(alltypes)); if (!pb_decode(stream, AllTypes_fields, &alltypes)) + { + pb_release(AllTypes_fields, &alltypes); return false; + } TEST(alltypes.req_int32 && *alltypes.req_int32 == -1001); TEST(alltypes.req_int64 && *alltypes.req_int64 == -1002); @@ -184,31 +191,70 @@ bool check_alltypes(pb_istream_t *stream, int mode) TEST(alltypes.end == 1099); #endif + pb_release(AllTypes_fields, &alltypes); + return status; } int main(int argc, char **argv) { - uint8_t buffer[1024]; - size_t count; - pb_istream_t stream; - - /* Whether to expect the optional values or the default values. */ - int mode = (argc > 1) ? atoi(argv[1]) : 0; + bool status; + int orig_allocations; - /* Read the data into buffer */ - SET_BINARY_MODE(stdin); - count = fread(buffer, 1, sizeof(buffer), stdin); +#ifdef HAVE_MALLINFO + /* Dynamic library loader etc. may have some malloc()ed memory also. */ + { + struct mallinfo m = mallinfo(); + orig_allocations = m.uordblks; + } +#endif + + { + uint8_t buffer[1024]; + size_t count; + pb_istream_t stream; + + /* Whether to expect the optional values or the default values. */ + int mode = (argc > 1) ? atoi(argv[1]) : 0; + + /* Read the data into buffer */ + SET_BINARY_MODE(stdin); + count = fread(buffer, 1, sizeof(buffer), stdin); + + /* Construct a pb_istream_t for reading from the buffer */ + stream = pb_istream_from_buffer(buffer, count); + + /* Decode and verify the message */ + status = check_alltypes(&stream, mode); + + if (!status) + fprintf(stderr, "Parsing failed: %s\n", PB_GET_ERROR(&stream)); + } - /* Construct a pb_istream_t for reading from the buffer */ - stream = pb_istream_from_buffer(buffer, count); +#ifdef HAVE_MALLINFO + /* Check for memory leaks */ + { + struct mallinfo m = mallinfo(); + int leak = m.uordblks - orig_allocations; + + if (leak > 0) + { + fprintf(stderr, "Memory leak: %d bytes\n", leak); + return 1; + } + else + { + fprintf(stderr, "Ok, no memory leaks\n"); + } + } +#endif - /* Decode and print out the stuff */ - if (!check_alltypes(&stream, mode)) + if (!status) { - printf("Parsing failed: %s\n", PB_GET_ERROR(&stream)); return 1; - } else { + } + else + { return 0; } } |