Add pb_release() function
[apps/agl-service-can-low-level.git] / tests / alltypes_pointer / decode_alltypes_pointer.c
index 32e34c5..29495ac 100644 (file)
@@ -5,45 +5,56 @@
 #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"); \
-    return false; \
+    fprintf(stderr, "Test " #x " failed.\n"); \
+    status = false; \
     }
 
 /* This function is called once from main(), it handles
    the decoding and checks the fields. */
 bool check_alltypes(pb_istream_t *stream, int mode)
 {
+    bool status = true;
     AllTypes alltypes;
     
     /* Fill with garbage to better detect initialization errors */
     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);
+    TEST(alltypes.req_uint32    && *alltypes.req_uint32        == 1003);
+    TEST(alltypes.req_uint64    && *alltypes.req_uint64        == 1004);
+    TEST(alltypes.req_sint32    && *alltypes.req_sint32        == -1005);
+    TEST(alltypes.req_sint64    && *alltypes.req_sint64        == -1006);
+    TEST(alltypes.req_bool      && *alltypes.req_bool          == true);
+    
+    TEST(alltypes.req_fixed32   && *alltypes.req_fixed32       == 1008);
+    TEST(alltypes.req_sfixed32  && *alltypes.req_sfixed32      == -1009);
+    TEST(alltypes.req_float     && *alltypes.req_float         == 1010.0f);
+    
+    TEST(alltypes.req_fixed64   && *alltypes.req_fixed64       == 1011);
+    TEST(alltypes.req_sfixed64  && *alltypes.req_sfixed64      == -1012);
+    TEST(alltypes.req_double    && *alltypes.req_double        == 1013.0f);
     
-    TEST(*alltypes.req_int32         == -1001);
-    TEST(*alltypes.req_int64         == -1002);
-    TEST(*alltypes.req_uint32        == 1003);
-    TEST(*alltypes.req_uint64        == 1004);
-    TEST(*alltypes.req_sint32        == -1005);
-    TEST(*alltypes.req_sint64        == -1006);
-    TEST(*alltypes.req_bool          == true);
-    
-    TEST(*alltypes.req_fixed32       == 1008);
-    TEST(*alltypes.req_sfixed32      == -1009);
-    TEST(*alltypes.req_float         == 1010.0f);
-    
-    TEST(*alltypes.req_fixed64       == 1011);
-    TEST(*alltypes.req_sfixed64      == -1012);
-    TEST(*alltypes.req_double        == 1013.0f);
-    
-    TEST(strcmp(alltypes.req_string, "1014") == 0);
-    TEST(alltypes.req_bytes->size == 4);
-    TEST(memcmp(alltypes.req_bytes->bytes, "1015", 4) == 0);
-    TEST(strcmp(alltypes.req_submsg->substuff1, "1016") == 0);
-    TEST(*alltypes.req_submsg->substuff2 == 1016);
-    TEST(*alltypes.req_submsg->substuff3 == 3);
+    TEST(alltypes.req_string    && strcmp(alltypes.req_string, "1014") == 0);
+    TEST(alltypes.req_bytes     && alltypes.req_bytes->size == 4);
+    TEST(alltypes.req_bytes     && alltypes.req_bytes->bytes
+                                && memcmp(alltypes.req_bytes->bytes, "1015", 4) == 0);
+    TEST(alltypes.req_submsg    && alltypes.req_submsg->substuff1
+                                && strcmp(alltypes.req_submsg->substuff1, "1016") == 0);
+    TEST(alltypes.req_submsg    && alltypes.req_submsg->substuff2
+                                && *alltypes.req_submsg->substuff2 == 1016);
+    /* TEST(*alltypes.req_submsg->substuff3 == 3); Default values are not currently supported for pointer fields */
     TEST(*alltypes.req_enum == MyEnum_Truth);
 
 #if 0
@@ -180,31 +191,70 @@ bool check_alltypes(pb_istream_t *stream, int mode)
     TEST(alltypes.end == 1099);
 #endif
 
-    return true;
+    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;
     }
 }