blob: 9a51290f89ebb6d38771a3918789f06aae15e976 [file] [log] [blame]
Laurence Lundblade6ed34222018-12-18 09:46:23 -08001/*==============================================================================
2 run_tests.c -- test aggregator and results reporting
3
4 Copyright (c) 2018-2019, Laurence Lundblade. All rights reserved.
5
6 SPDX-License-Identifier: BSD-3-Clause
7
8 See BSD-3-Clause license in README.md
9
10 Created on 9/30/18
11 ==============================================================================*/
12
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
23
24// Used to test RunTests
25int fail_test()
26{
27 return -44;
28}
29
30
31
32
33/*
34 Convert a number up to 999999999 to a string. This is so sprintf doesn't
35 have to be linked in so as to minimized dependencies even in test code.
36 */
37const char *NumToString(int32_t nNum, UsefulBuf StringMem)
38{
39 const int32_t nMax = 1000000000;
40
41 UsefulOutBuf OutBuf;
42 UsefulOutBuf_Init(&OutBuf, StringMem);
43
44 if(nNum < 0) {
45 UsefulOutBuf_AppendByte(&OutBuf, '-');
46 nNum = -nNum;
47 }
48 if(nNum > nMax-1) {
49 return "XXX";
50 }
51
52 bool bDidSomeOutput = false;
53 for(int n = nMax; n > 0; n/=10) {
54 int x = nNum/n;
55 if(x || bDidSomeOutput){
56 bDidSomeOutput = true;
57 UsefulOutBuf_AppendByte(&OutBuf, '0' + x);
58 nNum -= x * n;
59 }
60 }
61 if(!bDidSomeOutput){
62 UsefulOutBuf_AppendByte(&OutBuf, '0');
63 }
64 UsefulOutBuf_AppendByte(&OutBuf, '\0');
65
66 return UsefulOutBuf_GetError(&OutBuf) ? "" : StringMem.ptr;
67}
68
69
70
71
72typedef int (test_fun_t)(void);
73typedef const char * (test_fun2_t)(void);
74
75
76#define TEST_ENTRY(test_name) {#test_name, test_name, true}
77#define TEST_ENTRY_DISABLED(test_name) {#test_name, test_name, false}
78
79typedef struct {
80 const char *szTestName;
81 test_fun_t *test_fun;
82 bool bEnabled;
83} test_entry;
84
85typedef struct {
86 const char *szTestName;
87 test_fun2_t *test_fun;
88 bool bEnabled;
89} test_entry2;
90
91test_entry2 s_tests2[] = {
92 TEST_ENTRY(UBUTest_CopyUtil),
93 TEST_ENTRY(UOBTest_NonAdversarial),
94 TEST_ENTRY(TestBasicSanity),
95 TEST_ENTRY(UOBTest_BoundaryConditionsTest),
96 TEST_ENTRY(UBMacroConversionsTest),
97 TEST_ENTRY(UBUtilTests),
98 TEST_ENTRY(UIBTest_IntegerFormat)
99};
100
101
102test_entry s_tests[] = {
103 TEST_ENTRY(ParseMapAsArrayTest),
Laurence Lundbladed425fb32019-02-18 10:56:18 -0800104 TEST_ENTRY(AllocAllStringsTest),
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800105 TEST_ENTRY(IndefiniteLengthNestTest),
106 TEST_ENTRY(NestedMapTestIndefLen),
107 TEST_ENTRY(ParseSimpleTest),
108 TEST_ENTRY(EncodeRawTest),
109 TEST_ENTRY(RTICResultsTest),
110 TEST_ENTRY(MapEncodeTest),
111 TEST_ENTRY(ArrayNestingTest1),
112 TEST_ENTRY(ArrayNestingTest2),
113 TEST_ENTRY(ArrayNestingTest3),
114 TEST_ENTRY(EncodeDateTest),
115 TEST_ENTRY(SimpleValuesTest1),
116 TEST_ENTRY(IntegerValuesTest1),
117 TEST_ENTRY(AllAddMethodsTest),
118 TEST_ENTRY(ParseTooDeepArrayTest),
119 TEST_ENTRY(ComprehensiveInputTest),
120 TEST_ENTRY(ParseMapTest),
Laurence Lundbladed425fb32019-02-18 10:56:18 -0800121 TEST_ENTRY(IndefiniteLengthArrayMapTest),
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800122 TEST_ENTRY(BasicEncodeTest),
123 TEST_ENTRY(NestedMapTest),
124 TEST_ENTRY(BignumParseTest),
125 TEST_ENTRY(OptTagParseTest),
126 TEST_ENTRY(DateParseTest),
127 TEST_ENTRY(ShortBufferParseTest2),
128 TEST_ENTRY(ShortBufferParseTest),
129 TEST_ENTRY(ParseDeepArrayTest),
130 TEST_ENTRY(SimpleArrayTest),
131 TEST_ENTRY(IntegerValuesParseTest),
Laurence Lundbladed425fb32019-02-18 10:56:18 -0800132 TEST_ENTRY(MemPoolTest),
133 TEST_ENTRY(IndefiniteLengthStringTest),
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800134 TEST_ENTRY(HalfPrecisionDecodeBasicTests),
135 TEST_ENTRY(DoubleAsSmallestTest),
136 TEST_ENTRY(HalfPrecisionAgainstRFCCodeTest),
137 TEST_ENTRY(BstrWrapTest),
138 TEST_ENTRY(BstrWrapErrorTest),
139 TEST_ENTRY(BstrWrapNestTest),
140 TEST_ENTRY(CoseSign1TBSTest),
141 TEST_ENTRY(StringDecoderModeFailTest),
142 TEST_ENTRY_DISABLED(BigComprehensiveInputTest),
143 TEST_ENTRY(EncodeErrorTests),
Laurence Lundbladed425fb32019-02-18 10:56:18 -0800144 TEST_ENTRY(SetUpAllocatorTest),
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800145 //TEST_ENTRY(fail_test),
146};
147
148
149int RunTests(const char *szTestNames[], OutputStringCB pfOutput, void *poutCtx, int *pNumTestsRun)
150{
151 int nTestsFailed = 0;
152 int nTestsRun = 0;
153 UsefulBuf_MAKE_STACK_UB(StringStorage, 5);
154
155 test_entry2 *t2;
156 const test_entry2 *s_tests2_end = s_tests2 + sizeof(s_tests2)/sizeof(test_entry2);
157
158 for(t2 = s_tests2; t2 < s_tests2_end; t2++) {
159 if(szTestNames[0]) {
160 // Some tests have been named
161 const char **szRequestedNames;
162 for(szRequestedNames = szTestNames; *szRequestedNames; szRequestedNames++) {
163 if(!strcmp(t2->szTestName, *szRequestedNames)) {
164 break; // Name matched
165 }
166 }
167 if(*szRequestedNames == NULL) {
168 // Didn't match this test
169 continue;
170 }
171 } else {
172 // no tests named, but don't run "disabled" tests
173 if(!t2->bEnabled) {
174 // Don't run disabled tests when all tests are being run
175 // as indicated by no specific test names being given
176 continue;
177 }
178 }
179
180 const char * szTestResult = (t2->test_fun)();
181 nTestsRun++;
182 if(pfOutput) {
183 (*pfOutput)(t2->szTestName, poutCtx, 0);
184 }
185
186 if(szTestResult) {
187 if(pfOutput) {
188 (*pfOutput)(" FAILED (returned ", poutCtx, 0);
189 (*pfOutput)(szTestResult, poutCtx, 0);
190 (*pfOutput)(")", poutCtx, 1);
191 }
192 nTestsFailed++;
193 } else {
194 if(pfOutput) {
195 (*pfOutput)( " PASSED", poutCtx, 1);
196 }
197 }
198 }
199
200
201 test_entry *t;
202 const test_entry *s_tests_end = s_tests + sizeof(s_tests)/sizeof(test_entry);
203
204 for(t = s_tests; t < s_tests_end; t++) {
205 if(szTestNames[0]) {
206 // Some tests have been named
207 const char **szRequestedNames;
208 for(szRequestedNames = szTestNames; *szRequestedNames; szRequestedNames++) {
209 if(!strcmp(t->szTestName, *szRequestedNames)) {
210 break; // Name matched
211 }
212 }
213 if(*szRequestedNames == NULL) {
214 // Didn't match this test
215 continue;
216 }
217 } else {
218 // no tests named, but don't run "disabled" tests
219 if(!t->bEnabled) {
220 // Don't run disabled tests when all tests are being run
221 // as indicated by no specific test names being given
222 continue;
223 }
224 }
225
226 int nTestResult = (t->test_fun)();
227 nTestsRun++;
228 if(pfOutput) {
229 (*pfOutput)(t->szTestName, poutCtx, 0);
230 }
231
232 if(nTestResult) {
233 if(pfOutput) {
234 (*pfOutput)(" FAILED (returned ", poutCtx, 0);
235 (*pfOutput)(NumToString(nTestResult, StringStorage), poutCtx, 0);
236 (*pfOutput)(")", poutCtx, 1);
237 }
238 nTestsFailed++;
239 } else {
240 if(pfOutput) {
241 (*pfOutput)( " PASSED", poutCtx, 1);
242 }
243 }
244 }
245
246 if(pNumTestsRun) {
247 *pNumTestsRun = nTestsRun;
248 }
249
250 if(pfOutput) {
251 (*pfOutput)( "SUMMARY: ", poutCtx, 0);
252 (*pfOutput)( NumToString(nTestsRun, StringStorage), poutCtx, 0);
253 (*pfOutput)( " tests run; ", poutCtx, 0);
254 (*pfOutput)( NumToString(nTestsFailed, StringStorage), poutCtx, 0);
255 (*pfOutput)( " tests failed", poutCtx, 1);
256 }
257
258 return nTestsFailed;
259}
260
261
262
263
264static void PrintSize(const char *szWhat, uint32_t uSize, OutputStringCB pfOutput, void *pOutCtx)
265{
266 UsefulBuf_MAKE_STACK_UB(buffer, 20);
267
268 (*pfOutput)(szWhat, pOutCtx, 0);
269 (*pfOutput)(" ", pOutCtx, 0);
270 (*pfOutput)(NumToString(uSize, buffer), pOutCtx, 0);
271 (*pfOutput)("", pOutCtx, 1);
272}
273
274void PrintSizes(OutputStringCB pfOutput, void *pOutCtx)
275{
276 // Type and size of return from sizeof() varies. These will never be large so cast is safe
277 PrintSize("sizeof(QCBORTrackNesting)", (uint32_t)sizeof(QCBORTrackNesting), pfOutput, pOutCtx);
278 PrintSize("sizeof(QCBOREncodeContext)", (uint32_t)sizeof(QCBOREncodeContext), pfOutput, pOutCtx);
279 PrintSize("sizeof(QCBORDecodeNesting)", (uint32_t)sizeof(QCBORDecodeNesting), pfOutput, pOutCtx);
280 PrintSize("sizeof(QCBORDecodeContext)", (uint32_t)sizeof(QCBORDecodeContext), pfOutput, pOutCtx);
281 PrintSize("sizeof(QCBORItem)", (uint32_t)sizeof(QCBORItem), pfOutput, pOutCtx);
Laurence Lundblade6ed34222018-12-18 09:46:23 -0800282 PrintSize("sizeof(QCBORTagListIn)", (uint32_t)sizeof(QCBORTagListIn), pfOutput, pOutCtx);
283 PrintSize("sizeof(QCBORTagListOut)", (uint32_t)sizeof(QCBORTagListOut), pfOutput, pOutCtx);
284 (*pfOutput)("", pOutCtx, 1);
285}