1 /* Make sure that all fields are freed in various scenarios. */
5 #include <malloc_wrappers.h>
7 #include <test_helpers.h>
8 #include "mem_release.pb.h"
10 #define TEST(x) if (!(x)) { \
11 fprintf(stderr, "Test " #x " on line %d failed.\n", __LINE__); \
15 static char *test_str_arr[] = {"1", "2", ""};
16 static SubMessage test_msg_arr[] = {SubMessage_init_zero, SubMessage_init_zero};
23 /* Construct a message with various fields filled in */
25 TestMessage msg = TestMessage_init_zero;
26 pb_extension_t ext1, ext2;
28 msg.static_req_submsg.dynamic_str = "12345";
29 msg.static_req_submsg.dynamic_str_arr_count = 3;
30 msg.static_req_submsg.dynamic_str_arr = test_str_arr;
31 msg.static_req_submsg.dynamic_submsg_count = 2;
32 msg.static_req_submsg.dynamic_submsg = test_msg_arr;
33 msg.static_req_submsg.dynamic_submsg[1].dynamic_str = "abc";
34 msg.static_opt_submsg.dynamic_str = "abc";
35 msg.has_static_opt_submsg = true;
36 msg.dynamic_submsg = &msg.static_req_submsg;
38 msg.extensions = &ext1;
39 ext1.type = &dynamic_ext;
40 ext1.dest = &msg.static_req_submsg;
42 ext2.type = &static_ext;
43 ext2.dest = &msg.static_req_submsg;
46 stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
47 if (!pb_encode(&stream, TestMessage_fields, &msg))
49 fprintf(stderr, "Encode failed: %s\n", PB_GET_ERROR(&stream));
52 msgsize = stream.bytes_written;
55 /* Output encoded message for debug */
56 SET_BINARY_MODE(stdout);
57 fwrite(buffer, 1, msgsize, stdout);
59 /* Decode memory using dynamic allocation */
61 TestMessage msg = TestMessage_init_zero;
64 pb_extension_t ext1, ext2;
66 msg.extensions = &ext1;
67 ext1.type = &dynamic_ext;
70 ext2.type = &static_ext;
71 ext2.dest = &ext2_dest;
74 stream = pb_istream_from_buffer(buffer, msgsize);
75 if (!pb_decode(&stream, TestMessage_fields, &msg))
77 fprintf(stderr, "Decode failed: %s\n", PB_GET_ERROR(&stream));
81 /* Make sure it encodes back to same data */
84 pb_ostream_t ostream = pb_ostream_from_buffer(buffer2, sizeof(buffer2));
85 TEST(pb_encode(&ostream, TestMessage_fields, &msg));
86 TEST(ostream.bytes_written == msgsize);
87 TEST(memcmp(buffer, buffer2, msgsize) == 0);
90 /* Make sure that malloc counters work */
91 TEST(get_alloc_count() > 0);
93 /* Make sure that pb_release releases everything */
94 pb_release(TestMessage_fields, &msg);
95 TEST(get_alloc_count() == 0);
97 /* Check that double-free is a no-op */
98 pb_release(TestMessage_fields, &msg);
99 TEST(get_alloc_count() == 0);