Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/libcbor/test/stream_expectations.c
39507 views
1
#include "stream_expectations.h"
2
3
struct test_assertion assertions_queue[MAX_QUEUE_ITEMS];
4
int queue_size = 0;
5
int current_expectation = 0;
6
7
int clean_up_stream_assertions(void **state) {
8
if (queue_size != current_expectation) {
9
return 1; // We have not matched all expectations correctly
10
}
11
queue_size = current_expectation = 0;
12
free(*state);
13
return 0;
14
}
15
16
/* Callbacks */
17
struct test_assertion current(void) {
18
return assertions_queue[current_expectation];
19
}
20
21
/* Assertions builders and matcher callbacks */
22
23
void assert_uint8_eq(uint8_t actual) {
24
assertions_queue[queue_size++] = (struct test_assertion){
25
UINT8_EQ, (union test_expectation_data){.int8 = actual}};
26
}
27
28
void uint8_callback(void *_CBOR_UNUSED(_context), uint8_t actual) {
29
assert_true(current().expectation == UINT8_EQ);
30
assert_true(current().data.int8 == actual);
31
current_expectation++;
32
}
33
34
void assert_uint16_eq(uint16_t actual) {
35
assertions_queue[queue_size++] = (struct test_assertion){
36
UINT16_EQ, (union test_expectation_data){.int16 = actual}};
37
}
38
39
void uint16_callback(void *_CBOR_UNUSED(_context), uint16_t actual) {
40
assert_true(current().expectation == UINT16_EQ);
41
assert_true(current().data.int16 == actual);
42
current_expectation++;
43
}
44
45
void assert_uint32_eq(uint32_t actual) {
46
assertions_queue[queue_size++] = (struct test_assertion){
47
UINT32_EQ, (union test_expectation_data){.int32 = actual}};
48
}
49
50
void uint32_callback(void *_CBOR_UNUSED(_context), uint32_t actual) {
51
assert_true(current().expectation == UINT32_EQ);
52
assert_true(current().data.int32 == actual);
53
current_expectation++;
54
}
55
56
void assert_uint64_eq(uint64_t actual) {
57
assertions_queue[queue_size++] = (struct test_assertion){
58
UINT64_EQ, (union test_expectation_data){.int64 = actual}};
59
}
60
61
void uint64_callback(void *_CBOR_UNUSED(_context), uint64_t actual) {
62
assert_true(current().expectation == UINT64_EQ);
63
assert_true(current().data.int64 == actual);
64
current_expectation++;
65
}
66
67
void assert_negint8_eq(uint8_t actual) {
68
assertions_queue[queue_size++] = (struct test_assertion){
69
NEGINT8_EQ, (union test_expectation_data){.int8 = actual}};
70
}
71
72
void negint8_callback(void *_CBOR_UNUSED(_context), uint8_t actual) {
73
assert_true(current().expectation == NEGINT8_EQ);
74
assert_true(current().data.int8 == actual);
75
current_expectation++;
76
}
77
78
void assert_negint16_eq(uint16_t actual) {
79
assertions_queue[queue_size++] = (struct test_assertion){
80
NEGINT16_EQ, (union test_expectation_data){.int16 = actual}};
81
}
82
83
void negint16_callback(void *_CBOR_UNUSED(_context), uint16_t actual) {
84
assert_true(current().expectation == NEGINT16_EQ);
85
assert_true(current().data.int16 == actual);
86
current_expectation++;
87
}
88
89
void assert_negint32_eq(uint32_t actual) {
90
assertions_queue[queue_size++] = (struct test_assertion){
91
NEGINT32_EQ, (union test_expectation_data){.int32 = actual}};
92
}
93
94
void negint32_callback(void *_CBOR_UNUSED(_context), uint32_t actual) {
95
assert_true(current().expectation == NEGINT32_EQ);
96
assert_true(current().data.int32 == actual);
97
current_expectation++;
98
}
99
100
void assert_negint64_eq(uint64_t actual) {
101
assertions_queue[queue_size++] = (struct test_assertion){
102
NEGINT64_EQ, (union test_expectation_data){.int64 = actual}};
103
}
104
105
void negint64_callback(void *_CBOR_UNUSED(_context), uint64_t actual) {
106
assert_true(current().expectation == NEGINT64_EQ);
107
assert_true(current().data.int64 == actual);
108
current_expectation++;
109
}
110
111
void assert_bstring_mem_eq(cbor_data address, size_t length) {
112
assertions_queue[queue_size++] = (struct test_assertion){
113
BSTRING_MEM_EQ,
114
(union test_expectation_data){.string = {address, length}}};
115
}
116
117
void byte_string_callback(void *_CBOR_UNUSED(_context), cbor_data address,
118
uint64_t length) {
119
assert_true(current().expectation == BSTRING_MEM_EQ);
120
assert_true(current().data.string.address == address);
121
assert_true(current().data.string.length == length);
122
current_expectation++;
123
}
124
125
void assert_bstring_indef_start(void) {
126
assertions_queue[queue_size++] =
127
(struct test_assertion){.expectation = BSTRING_INDEF_START};
128
}
129
130
void byte_string_start_callback(void *_CBOR_UNUSED(_context)) {
131
assert_true(current().expectation == BSTRING_INDEF_START);
132
current_expectation++;
133
}
134
135
void assert_string_mem_eq(cbor_data address, size_t length) {
136
assertions_queue[queue_size++] = (struct test_assertion){
137
STRING_MEM_EQ,
138
(union test_expectation_data){.string = {address, length}}};
139
}
140
141
void string_callback(void *_CBOR_UNUSED(_context), cbor_data address,
142
uint64_t length) {
143
assert_true(current().expectation == STRING_MEM_EQ);
144
assert_true(current().data.string.address == address);
145
assert_true(current().data.string.length == length);
146
current_expectation++;
147
}
148
149
void assert_string_indef_start(void) {
150
assertions_queue[queue_size++] =
151
(struct test_assertion){.expectation = STRING_INDEF_START};
152
}
153
154
void string_start_callback(void *_CBOR_UNUSED(_context)) {
155
assert_true(current().expectation == STRING_INDEF_START);
156
current_expectation++;
157
}
158
159
void assert_indef_break(void) {
160
assertions_queue[queue_size++] =
161
(struct test_assertion){.expectation = INDEF_BREAK};
162
}
163
164
void indef_break_callback(void *_CBOR_UNUSED(_context)) {
165
assert_true(current().expectation == INDEF_BREAK);
166
current_expectation++;
167
}
168
169
void assert_array_start(size_t length) {
170
assertions_queue[queue_size++] =
171
(struct test_assertion){ARRAY_START, {.length = length}};
172
}
173
174
void array_start_callback(void *_CBOR_UNUSED(_context), uint64_t length) {
175
assert_true(current().expectation == ARRAY_START);
176
assert_true(current().data.length == length);
177
current_expectation++;
178
}
179
180
void assert_indef_array_start(void) {
181
assertions_queue[queue_size++] =
182
(struct test_assertion){.expectation = ARRAY_INDEF_START};
183
}
184
185
void indef_array_start_callback(void *_CBOR_UNUSED(_context)) {
186
assert_true(current().expectation == ARRAY_INDEF_START);
187
current_expectation++;
188
}
189
190
void assert_map_start(size_t length) {
191
assertions_queue[queue_size++] =
192
(struct test_assertion){MAP_START, {.length = length}};
193
}
194
195
void map_start_callback(void *_CBOR_UNUSED(_context), uint64_t length) {
196
assert_true(current().expectation == MAP_START);
197
assert_true(current().data.length == length);
198
current_expectation++;
199
}
200
201
void assert_indef_map_start(void) {
202
assertions_queue[queue_size++] =
203
(struct test_assertion){.expectation = MAP_INDEF_START};
204
}
205
206
void indef_map_start_callback(void *_CBOR_UNUSED(_context)) {
207
assert_true(current().expectation == MAP_INDEF_START);
208
current_expectation++;
209
}
210
211
void assert_tag_eq(uint64_t value) {
212
assertions_queue[queue_size++] =
213
(struct test_assertion){TAG_EQ, {.int64 = value}};
214
}
215
216
void tag_callback(void *_CBOR_UNUSED(_context), uint64_t value) {
217
assert_true(current().expectation == TAG_EQ);
218
assert_true(current().data.int64 == value);
219
current_expectation++;
220
}
221
222
void assert_half(float value) {
223
assertions_queue[queue_size++] =
224
(struct test_assertion){HALF_EQ, {.float2 = value}};
225
}
226
227
void half_callback(void *_CBOR_UNUSED(_context), float actual) {
228
assert_true(current().expectation == HALF_EQ);
229
assert_true(current().data.float2 == actual);
230
current_expectation++;
231
}
232
233
void assert_float(float value) {
234
assertions_queue[queue_size++] =
235
(struct test_assertion){FLOAT_EQ, {.float4 = value}};
236
}
237
238
void float_callback(void *_CBOR_UNUSED(_context), float actual) {
239
assert_true(current().expectation == FLOAT_EQ);
240
assert_true(current().data.float4 == actual);
241
current_expectation++;
242
}
243
244
void assert_double(double value) {
245
assertions_queue[queue_size++] =
246
(struct test_assertion){DOUBLE_EQ, {.float8 = value}};
247
}
248
249
void double_callback(void *_CBOR_UNUSED(_context), double actual) {
250
assert_true(current().expectation == DOUBLE_EQ);
251
assert_true(current().data.float8 == actual);
252
current_expectation++;
253
}
254
255
void assert_bool(bool value) {
256
assertions_queue[queue_size++] =
257
(struct test_assertion){BOOL_EQ, {.boolean = value}};
258
}
259
260
void assert_nil(void) {
261
assertions_queue[queue_size++] = (struct test_assertion){.expectation = NIL};
262
}
263
264
void assert_undef(void) {
265
assertions_queue[queue_size++] =
266
(struct test_assertion){.expectation = UNDEF};
267
}
268
269
void bool_callback(void *_CBOR_UNUSED(_context), bool actual) {
270
assert_true(current().expectation == BOOL_EQ);
271
assert_true(current().data.boolean == actual);
272
current_expectation++;
273
}
274
275
void null_callback(void *_CBOR_UNUSED(_context)) {
276
assert_true(current().expectation == NIL);
277
current_expectation++;
278
}
279
280
void undef_callback(void *_CBOR_UNUSED(_context)) {
281
assert_true(current().expectation == UNDEF);
282
current_expectation++;
283
}
284
285
const struct cbor_callbacks asserting_callbacks = {
286
.uint8 = &uint8_callback,
287
.uint16 = &uint16_callback,
288
.uint32 = &uint32_callback,
289
.uint64 = &uint64_callback,
290
291
.negint8 = &negint8_callback,
292
.negint16 = &negint16_callback,
293
.negint32 = &negint32_callback,
294
.negint64 = &negint64_callback,
295
296
.byte_string = &byte_string_callback,
297
.byte_string_start = &byte_string_start_callback,
298
299
.string = &string_callback,
300
.string_start = &string_start_callback,
301
302
.array_start = &array_start_callback,
303
.indef_array_start = &indef_array_start_callback,
304
305
.map_start = &map_start_callback,
306
.indef_map_start = &indef_map_start_callback,
307
308
.tag = &tag_callback,
309
310
.float2 = &half_callback,
311
.float4 = &float_callback,
312
.float8 = &double_callback,
313
314
.undefined = &undef_callback,
315
.boolean = &bool_callback,
316
.null = &null_callback,
317
.indef_break = &indef_break_callback};
318
319
struct cbor_decoder_result decode(cbor_data source, size_t source_size) {
320
int last_expectation = current_expectation;
321
struct cbor_decoder_result result =
322
cbor_stream_decode(source, source_size, &asserting_callbacks, NULL);
323
if (result.status == CBOR_DECODER_FINISHED) {
324
// Check that we have matched an expectation from the queue
325
assert_true(last_expectation + 1 == current_expectation);
326
}
327
return result;
328
}
329
330