blob: f8ed83b78f28507b44c4d9da68426f2e5053e11c [file] [log] [blame]
Laurence Lundblade6ed34222018-12-18 09:46:23 -08001/*==============================================================================
2 run_tests.c -- test aggregator and results reporting
3
Laurence Lundbladeac515e52020-01-30 10:44:06 -08004 Copyright (c) 2018-2020, Laurence Lundblade. All rights reserved.
Laurence Lundblade6ed34222018-12-18 09:46:23 -08005
6 SPDX-License-Identifier: BSD-3-Clause
7
8 See BSD-3-Clause license in README.md
9
10 Created on 9/30/18
Laurence Lundbladeac515e52020-01-30 10:44:06 -080011 =============================================================================*/
Laurence Lundblade6ed34222018-12-18 09:46:23 -080012
13#include "run_tests.h"
14#include "UsefulBuf.h"
15#include <stdbool.h>
16
17#include "float_tests.h"
18#include "qcbor_decode_tests.h"
19#include "qcbor_encode_tests.h"
20#include "UsefulBuf_Tests.h"
21
22
Laurence Lundblade6ed34222018-12-18 09:46:23 -080023/*
Laurence Lundblade234fe422019-12-02 13:04:34 -080024 Test configuration
25 */
Laurence Lundblade6ed34222018-12-18 09:46:23 -080026
Laurence Lundbladeac515e52020-01-30 10:44:06 -080027typedef int32_t (test_fun_t)(void);
Laurence Lundblade6ed34222018-12-18 09:46:23 -080028typedef const char * (test_fun2_t)(void);
29
30
31#define TEST_ENTRY(test_name) {#test_name, test_name, true}
32#define TEST_ENTRY_DISABLED(test_name) {#test_name, test_name, false}
33
34typedef struct {
35 const char *szTestName;
36 test_fun_t *test_fun;
37 bool bEnabled;
38} test_entry;
39
40typedef struct {
41 const char *szTestName;
42 test_fun2_t *test_fun;
43 bool bEnabled;
44} test_entry2;
45
Laurence Lundblade234fe422019-12-02 13:04:34 -080046
47static test_entry2 s_tests2[] = {
Laurence Lundblade6ed34222018-12-18 09:46:23 -080048 TEST_ENTRY(UBUTest_CopyUtil),
49 TEST_ENTRY(UOBTest_NonAdversarial),
50 TEST_ENTRY(TestBasicSanity),
51 TEST_ENTRY(UOBTest_BoundaryConditionsTest),
52 TEST_ENTRY(UBMacroConversionsTest),
53 TEST_ENTRY(UBUtilTests),
54 TEST_ENTRY(UIBTest_IntegerFormat)
55};
56
57
Laurence Lundblade234fe422019-12-02 13:04:34 -080058static test_entry s_tests[] = {
59 TEST_ENTRY(EmptyMapsAndArraysTest),
60 TEST_ENTRY(NotWellFormedTests),
Laurence Lundblade6ed34222018-12-18 09:46:23 -080061 TEST_ENTRY(ParseMapAsArrayTest),
Laurence Lundbladed425fb32019-02-18 10:56:18 -080062 TEST_ENTRY(AllocAllStringsTest),
Laurence Lundblade6ed34222018-12-18 09:46:23 -080063 TEST_ENTRY(IndefiniteLengthNestTest),
64 TEST_ENTRY(NestedMapTestIndefLen),
65 TEST_ENTRY(ParseSimpleTest),
Laurence Lundblade234fe422019-12-02 13:04:34 -080066 TEST_ENTRY(DecodeFailureTests),
Laurence Lundblade6ed34222018-12-18 09:46:23 -080067 TEST_ENTRY(EncodeRawTest),
68 TEST_ENTRY(RTICResultsTest),
69 TEST_ENTRY(MapEncodeTest),
70 TEST_ENTRY(ArrayNestingTest1),
71 TEST_ENTRY(ArrayNestingTest2),
72 TEST_ENTRY(ArrayNestingTest3),
73 TEST_ENTRY(EncodeDateTest),
74 TEST_ENTRY(SimpleValuesTest1),
75 TEST_ENTRY(IntegerValuesTest1),
76 TEST_ENTRY(AllAddMethodsTest),
77 TEST_ENTRY(ParseTooDeepArrayTest),
78 TEST_ENTRY(ComprehensiveInputTest),
79 TEST_ENTRY(ParseMapTest),
Laurence Lundbladed425fb32019-02-18 10:56:18 -080080 TEST_ENTRY(IndefiniteLengthArrayMapTest),
Laurence Lundblade6ed34222018-12-18 09:46:23 -080081 TEST_ENTRY(BasicEncodeTest),
82 TEST_ENTRY(NestedMapTest),
83 TEST_ENTRY(BignumParseTest),
84 TEST_ENTRY(OptTagParseTest),
85 TEST_ENTRY(DateParseTest),
86 TEST_ENTRY(ShortBufferParseTest2),
87 TEST_ENTRY(ShortBufferParseTest),
88 TEST_ENTRY(ParseDeepArrayTest),
89 TEST_ENTRY(SimpleArrayTest),
90 TEST_ENTRY(IntegerValuesParseTest),
Laurence Lundbladed425fb32019-02-18 10:56:18 -080091 TEST_ENTRY(MemPoolTest),
92 TEST_ENTRY(IndefiniteLengthStringTest),
Laurence Lundblade6ed34222018-12-18 09:46:23 -080093 TEST_ENTRY(HalfPrecisionDecodeBasicTests),
94 TEST_ENTRY(DoubleAsSmallestTest),
95 TEST_ENTRY(HalfPrecisionAgainstRFCCodeTest),
96 TEST_ENTRY(BstrWrapTest),
97 TEST_ENTRY(BstrWrapErrorTest),
98 TEST_ENTRY(BstrWrapNestTest),
99 TEST_ENTRY(CoseSign1TBSTest),
100 TEST_ENTRY(StringDecoderModeFailTest),
101 TEST_ENTRY_DISABLED(BigComprehensiveInputTest),
102 TEST_ENTRY(EncodeErrorTests),
Laurence Lundbladed425fb32019-02-18 10:56:18 -0800103 TEST_ENTRY(SetUpAllocatorTest),
Laurence Lundblade234fe422019-12-02 13:04:34 -0800104 TEST_ENTRY(SimpleValuesIndefiniteLengthTest1),
105 TEST_ENTRY(EncodeLengthThirtyoneTest),
Laurence Lundbladeac515e52020-01-30 10:44:06 -0800106#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
107 TEST_ENTRY(EncodeLengthThirtyoneTest),
108 TEST_ENTRY(ExponentAndMantissaDecodeTests),
109 TEST_ENTRY(ExponentAndMantissaDecodeFailTests),
110 TEST_ENTRY(ExponentAndMantissaEncodeTests),
111#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800112};
113
114
Laurence Lundblade234fe422019-12-02 13:04:34 -0800115
116
117/*
118 Convert a number up to 999999999 to a string. This is so sprintf doesn't
119 have to be linked in so as to minimized dependencies even in test code.
120
121 StringMem should be 12 bytes long, 9 for digits, 1 for minus and
122 1 for \0 termination.
123 */
124static const char *NumToString(int32_t nNum, UsefulBuf StringMem)
125{
126 const int32_t nMax = 1000000000;
127
128 UsefulOutBuf OutBuf;
129 UsefulOutBuf_Init(&OutBuf, StringMem);
130
131 if(nNum < 0) {
132 UsefulOutBuf_AppendByte(&OutBuf, '-');
133 nNum = -nNum;
134 }
135 if(nNum > nMax-1) {
136 return "XXX";
137 }
138
139 bool bDidSomeOutput = false;
Laurence Lundbladeac515e52020-01-30 10:44:06 -0800140 for(int32_t n = nMax; n > 0; n/=10) {
141 int nDigitValue = nNum/n;
142 if(nDigitValue || bDidSomeOutput){
Laurence Lundblade234fe422019-12-02 13:04:34 -0800143 bDidSomeOutput = true;
Laurence Lundbladeac515e52020-01-30 10:44:06 -0800144 UsefulOutBuf_AppendByte(&OutBuf, (uint8_t)('0' + nDigitValue));
145 nNum -= nDigitValue * n;
Laurence Lundblade234fe422019-12-02 13:04:34 -0800146 }
147 }
148 if(!bDidSomeOutput){
149 UsefulOutBuf_AppendByte(&OutBuf, '0');
150 }
151 UsefulOutBuf_AppendByte(&OutBuf, '\0');
152
153 return UsefulOutBuf_GetError(&OutBuf) ? "" : StringMem.ptr;
154}
155
156
157/*
158 Public function. See run_test.h.
159 */
Laurence Lundbladeac515e52020-01-30 10:44:06 -0800160int RunTestsQCBOR(const char *szTestNames[],
161 OutputStringCB pfOutput,
162 void *poutCtx,
163 int *pNumTestsRun)
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800164{
165 int nTestsFailed = 0;
166 int nTestsRun = 0;
Laurence Lundbladeac515e52020-01-30 10:44:06 -0800167
Laurence Lundblade234fe422019-12-02 13:04:34 -0800168 UsefulBuf_MAKE_STACK_UB(StringStorage, 12);
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800169
170 test_entry2 *t2;
171 const test_entry2 *s_tests2_end = s_tests2 + sizeof(s_tests2)/sizeof(test_entry2);
172
173 for(t2 = s_tests2; t2 < s_tests2_end; t2++) {
174 if(szTestNames[0]) {
175 // Some tests have been named
176 const char **szRequestedNames;
177 for(szRequestedNames = szTestNames; *szRequestedNames; szRequestedNames++) {
178 if(!strcmp(t2->szTestName, *szRequestedNames)) {
179 break; // Name matched
180 }
181 }
182 if(*szRequestedNames == NULL) {
183 // Didn't match this test
184 continue;
185 }
186 } else {
187 // no tests named, but don't run "disabled" tests
188 if(!t2->bEnabled) {
189 // Don't run disabled tests when all tests are being run
190 // as indicated by no specific test names being given
191 continue;
192 }
193 }
194
195 const char * szTestResult = (t2->test_fun)();
196 nTestsRun++;
197 if(pfOutput) {
198 (*pfOutput)(t2->szTestName, poutCtx, 0);
199 }
200
201 if(szTestResult) {
202 if(pfOutput) {
203 (*pfOutput)(" FAILED (returned ", poutCtx, 0);
204 (*pfOutput)(szTestResult, poutCtx, 0);
205 (*pfOutput)(")", poutCtx, 1);
206 }
207 nTestsFailed++;
208 } else {
209 if(pfOutput) {
210 (*pfOutput)( " PASSED", poutCtx, 1);
211 }
212 }
213 }
214
215
216 test_entry *t;
217 const test_entry *s_tests_end = s_tests + sizeof(s_tests)/sizeof(test_entry);
218
219 for(t = s_tests; t < s_tests_end; t++) {
220 if(szTestNames[0]) {
221 // Some tests have been named
222 const char **szRequestedNames;
223 for(szRequestedNames = szTestNames; *szRequestedNames; szRequestedNames++) {
224 if(!strcmp(t->szTestName, *szRequestedNames)) {
225 break; // Name matched
226 }
227 }
228 if(*szRequestedNames == NULL) {
229 // Didn't match this test
230 continue;
231 }
232 } else {
233 // no tests named, but don't run "disabled" tests
234 if(!t->bEnabled) {
235 // Don't run disabled tests when all tests are being run
236 // as indicated by no specific test names being given
237 continue;
238 }
239 }
240
Laurence Lundbladeac515e52020-01-30 10:44:06 -0800241 int32_t nTestResult = (t->test_fun)();
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800242 nTestsRun++;
243 if(pfOutput) {
244 (*pfOutput)(t->szTestName, poutCtx, 0);
245 }
246
247 if(nTestResult) {
248 if(pfOutput) {
249 (*pfOutput)(" FAILED (returned ", poutCtx, 0);
250 (*pfOutput)(NumToString(nTestResult, StringStorage), poutCtx, 0);
251 (*pfOutput)(")", poutCtx, 1);
252 }
253 nTestsFailed++;
254 } else {
255 if(pfOutput) {
256 (*pfOutput)( " PASSED", poutCtx, 1);
257 }
258 }
259 }
260
261 if(pNumTestsRun) {
262 *pNumTestsRun = nTestsRun;
263 }
264
265 if(pfOutput) {
266 (*pfOutput)( "SUMMARY: ", poutCtx, 0);
267 (*pfOutput)( NumToString(nTestsRun, StringStorage), poutCtx, 0);
268 (*pfOutput)( " tests run; ", poutCtx, 0);
269 (*pfOutput)( NumToString(nTestsFailed, StringStorage), poutCtx, 0);
270 (*pfOutput)( " tests failed", poutCtx, 1);
271 }
272
273 return nTestsFailed;
274}
275
276
Laurence Lundblade234fe422019-12-02 13:04:34 -0800277#include "qcbor.h" // For size printing
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800278
Laurence Lundblade234fe422019-12-02 13:04:34 -0800279/*
280 Public function. See run_test.h.
281 */
Laurence Lundbladeac515e52020-01-30 10:44:06 -0800282static void PrintSize(const char *szWhat,
283 uint32_t uSize,
284 OutputStringCB pfOutput,
285 void *pOutCtx)
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800286{
287 UsefulBuf_MAKE_STACK_UB(buffer, 20);
288
289 (*pfOutput)(szWhat, pOutCtx, 0);
290 (*pfOutput)(" ", pOutCtx, 0);
Laurence Lundbladeac515e52020-01-30 10:44:06 -0800291 (*pfOutput)(NumToString((int32_t)uSize, buffer), pOutCtx, 0);
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800292 (*pfOutput)("", pOutCtx, 1);
293}
294
Laurence Lundblade234fe422019-12-02 13:04:34 -0800295
296/*
297 Public function. See run_test.h.
298 */
Laurence Lundbladeac515e52020-01-30 10:44:06 -0800299void PrintSizesQCBOR(OutputStringCB pfOutput, void *pOutCtx)
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800300{
Laurence Lundbladeac515e52020-01-30 10:44:06 -0800301 // These will never be large so cast is safe
302 PrintSize("sizeof(QCBORTrackNesting)", (uint32_t)sizeof(QCBORTrackNesting), pfOutput, pOutCtx);
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800303 PrintSize("sizeof(QCBOREncodeContext)", (uint32_t)sizeof(QCBOREncodeContext), pfOutput, pOutCtx);
304 PrintSize("sizeof(QCBORDecodeNesting)", (uint32_t)sizeof(QCBORDecodeNesting), pfOutput, pOutCtx);
305 PrintSize("sizeof(QCBORDecodeContext)", (uint32_t)sizeof(QCBORDecodeContext), pfOutput, pOutCtx);
Laurence Lundbladeac515e52020-01-30 10:44:06 -0800306 PrintSize("sizeof(QCBORItem)", (uint32_t)sizeof(QCBORItem), pfOutput, pOutCtx);
307 PrintSize("sizeof(QCBORTagListIn)", (uint32_t)sizeof(QCBORTagListIn), pfOutput, pOutCtx);
308 PrintSize("sizeof(QCBORTagListOut)", (uint32_t)sizeof(QCBORTagListOut), pfOutput, pOutCtx);
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800309 (*pfOutput)("", pOutCtx, 1);
310}