Line data Source code
1 : #include <stdio.h>
2 : #include <string.h>
3 : #include <pb_decode.h>
4 : #include <pb_encode.h>
5 : #include <malloc_wrappers.h>
6 : #include "unittests.h"
7 : #include "fixed_count.pb.h"
8 :
9 1 : int main()
10 : {
11 1 : int status = 0;
12 :
13 : {
14 : pb_byte_t buffer[Message1_size];
15 1 : Message1 msg_a = Message1_init_zero;
16 1 : Message1 msg_b = Message1_init_zero;
17 :
18 : pb_ostream_t ostream;
19 : pb_istream_t istream;
20 : size_t message_length;
21 :
22 1 : msg_a.data[0] = 1;
23 1 : msg_a.data[0] = 2;
24 1 : msg_a.data[0] = 3;
25 :
26 1 : COMMENT("Test encode and decode with three entries");
27 :
28 1 : ostream = pb_ostream_from_buffer(buffer, Message1_size);
29 1 : TEST(pb_encode(&ostream, Message1_fields, &msg_a));
30 1 : message_length = ostream.bytes_written;
31 :
32 1 : istream = pb_istream_from_buffer(buffer, message_length);
33 1 : TEST(pb_decode(&istream, Message1_fields, &msg_b));
34 :
35 1 : TEST(istream.bytes_left == 0);
36 1 : TEST(memcmp(&msg_b, &msg_a, sizeof(msg_a)) == 0);
37 : }
38 :
39 : {
40 1 : pb_byte_t input[] = {0x08, 0x00, 0x08, 0x01, 0x08, 0x02, 0x08, 0x03};
41 : pb_istream_t stream;
42 1 : Message1 msg = Message1_init_zero;
43 :
44 1 : COMMENT("Test wrong number of entries");
45 :
46 1 : stream = pb_istream_from_buffer(input, 6);
47 1 : TEST(pb_decode(&stream, Message1_fields, &msg));
48 1 : TEST(msg.data[0] == 0 && msg.data[1] == 1 && msg.data[2] == 2);
49 :
50 1 : stream = pb_istream_from_buffer(input, 8);
51 1 : TEST(!pb_decode(&stream, Message1_fields, &msg));
52 1 : TEST(strcmp(stream.errmsg, "array overflow") == 0);
53 :
54 1 : stream = pb_istream_from_buffer(input, 4);
55 1 : TEST(!pb_decode(&stream, Message1_fields, &msg));
56 1 : TEST(strcmp(stream.errmsg, "wrong size for fixed count field") == 0);
57 : }
58 :
59 : {
60 : pb_byte_t buffer[Message2_size];
61 1 : Message2 msg_a = Message2_init_zero;
62 1 : Message2 msg_b = Message2_init_zero;
63 :
64 : pb_ostream_t ostream;
65 : pb_istream_t istream;
66 : size_t message_length;
67 :
68 1 : COMMENT("Test encode and decode with nested messages");
69 :
70 1 : msg_a.data[0].data[0] = 1;
71 1 : msg_a.data[0].data[1] = 2;
72 1 : msg_a.data[0].data[2] = 3;
73 1 : msg_a.data[1].data[0] = 4;
74 1 : msg_a.data[1].data[1] = 5;
75 1 : msg_a.data[1].data[2] = 6;
76 :
77 1 : ostream = pb_ostream_from_buffer(buffer, Message2_size);
78 1 : TEST(pb_encode(&ostream, Message2_fields, &msg_a));
79 1 : message_length = ostream.bytes_written;
80 :
81 1 : istream = pb_istream_from_buffer(buffer, message_length);
82 1 : TEST(pb_decode(&istream, Message2_fields, &msg_b));
83 :
84 1 : TEST(istream.bytes_left == 0);
85 1 : TEST(memcmp(&msg_b, &msg_a, sizeof(msg_a)) == 0);
86 : }
87 :
88 : {
89 : pb_byte_t buffer[Message3_size];
90 1 : Message3 msg_a = Message3_init_zero;
91 1 : Message3 msg_b = Message3_init_zero;
92 :
93 : pb_ostream_t ostream;
94 : pb_istream_t istream;
95 : size_t message_length;
96 :
97 1 : COMMENT("Test encode and decode with two nested messages");
98 :
99 1 : msg_a.data1[0].data[0].data[0] = 1;
100 1 : msg_a.data1[0].data[0].data[1] = 2;
101 1 : msg_a.data1[0].data[0].data[2] = 3;
102 1 : msg_a.data1[0].data[1].data[0] = 4;
103 1 : msg_a.data1[0].data[1].data[1] = 5;
104 1 : msg_a.data1[0].data[1].data[2] = 6;
105 :
106 1 : msg_a.data1[1].data[0].data[0] = 7;
107 1 : msg_a.data1[1].data[0].data[1] = 8;
108 1 : msg_a.data1[1].data[0].data[2] = 9;
109 1 : msg_a.data1[1].data[1].data[0] = 10;
110 1 : msg_a.data1[1].data[1].data[1] = 11;
111 1 : msg_a.data1[1].data[1].data[2] = 12;
112 :
113 1 : msg_a.data2[0].data[0].data[0] = 11;
114 1 : msg_a.data2[0].data[0].data[1] = 12;
115 1 : msg_a.data2[0].data[0].data[2] = 13;
116 1 : msg_a.data2[0].data[1].data[0] = 14;
117 1 : msg_a.data2[0].data[1].data[1] = 15;
118 1 : msg_a.data2[0].data[1].data[2] = 16;
119 :
120 1 : msg_a.data2[1].data[0].data[0] = 17;
121 1 : msg_a.data2[1].data[0].data[1] = 18;
122 1 : msg_a.data2[1].data[0].data[2] = 19;
123 1 : msg_a.data2[1].data[1].data[0] = 110;
124 1 : msg_a.data2[1].data[1].data[1] = 111;
125 1 : msg_a.data2[1].data[1].data[2] = 112;
126 :
127 1 : ostream = pb_ostream_from_buffer(buffer, Message3_size);
128 1 : TEST(pb_encode(&ostream, Message3_fields, &msg_a));
129 1 : message_length = ostream.bytes_written;
130 :
131 1 : istream = pb_istream_from_buffer(buffer, message_length);
132 1 : TEST(pb_decode(&istream, Message3_fields, &msg_b));
133 :
134 1 : TEST(istream.bytes_left == 0);
135 1 : TEST(memcmp(&msg_b, &msg_a, sizeof(msg_a)) == 0);
136 : }
137 :
138 : {
139 : pb_byte_t buffer[256];
140 1 : Message4 msg_a = Message4_init_zero;
141 1 : Message4 msg_b = Message4_init_zero;
142 :
143 : pb_ostream_t ostream;
144 : pb_istream_t istream;
145 : size_t message_length;
146 :
147 1 : COMMENT("Test encode and decode with pointer type fixarray");
148 :
149 1 : SubMessage submsgs[pb_arraysize(Message4, submsgs[0])] = {SubMessage_init_zero};
150 1 : submsgs[0].a = 1;
151 1 : submsgs[1].a = 5;
152 1 : submsgs[2].a = 999;
153 :
154 1 : char a[5] = "a";
155 1 : char b[5] = "b";
156 1 : char abc[5] = "abc";
157 1 : char *strings[pb_arraysize(Message4, strings[0])] = {a, b, abc};
158 :
159 1 : msg_a.submsgs = &submsgs;
160 1 : msg_a.strings = &strings;
161 :
162 1 : ostream = pb_ostream_from_buffer(buffer, Message3_size);
163 1 : TEST(pb_encode(&ostream, Message4_fields, &msg_a));
164 1 : message_length = ostream.bytes_written;
165 :
166 1 : TEST(get_alloc_count() == 0);
167 :
168 1 : istream = pb_istream_from_buffer(buffer, message_length);
169 1 : TEST(pb_decode(&istream, Message4_fields, &msg_b));
170 :
171 1 : TEST(istream.bytes_left == 0);
172 :
173 1 : TEST((*msg_b.submsgs)[0].a == 1);
174 1 : TEST((*msg_b.submsgs)[1].a == 5);
175 1 : TEST((*msg_b.submsgs)[2].a == 999);
176 :
177 1 : TEST(strcmp((*msg_b.strings)[0], "a") == 0);
178 1 : TEST(strcmp((*msg_b.strings)[1], "b") == 0);
179 1 : TEST(strcmp((*msg_b.strings)[2], "abc") == 0);
180 :
181 1 : pb_release(Message4_fields, &msg_b);
182 :
183 1 : TEST(get_alloc_count() == 0);
184 : }
185 :
186 1 : if (status != 0)
187 0 : fprintf(stdout, "\n\nSome tests FAILED!\n");
188 :
189 1 : return status;
190 : }
|