blob: ce4d52b1867df000d7ed9c7b639ec5e3dcaf403f [file] [log] [blame]
Laurence Lundbladef156fb82018-10-01 09:47:03 -07001/*==============================================================================
2 run_tests.c -- test aggregator and results reporting
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003
Laurence Lundbladea3fd49f2019-01-21 10:16:22 -08004 Copyright (c) 2018-2019, Laurence Lundblade. All rights reserved.
Laurence Lundblade035bd782019-01-21 17:01:31 -08005
Laurence Lundbladea3fd49f2019-01-21 10:16:22 -08006 SPDX-License-Identifier: BSD-3-Clause
Laurence Lundblade035bd782019-01-21 17:01:31 -08007
Laurence Lundbladea3fd49f2019-01-21 10:16:22 -08008 See BSD-3-Clause license in README.md
Laurence Lundbladef156fb82018-10-01 09:47:03 -07009
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080010 Created on 9/30/18
Laurence Lundblade88b6ece2018-12-04 12:27:19 +090011 ==============================================================================*/
Laurence Lundbladef156fb82018-10-01 09:47:03 -070012
Laurence Lundbladef156fb82018-10-01 09:47:03 -070013#include "run_tests.h"
14#include "UsefulBuf.h"
15#include <stdbool.h>
16
Laurence Lundblade2d85ce42018-10-12 14:12:47 +080017#include "float_tests.h"
Laurence Lundblade9e3651c2018-10-10 11:49:55 +080018#include "qcbor_decode_tests.h"
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053019#include "qcbor_encode_tests.h"
20#include "UsefulBuf_Tests.h"
Laurence Lundbladef156fb82018-10-01 09:47:03 -070021
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080022
Laurence Lundbladef156fb82018-10-01 09:47:03 -070023/*
Laurence Lundbladea65b4822019-09-08 12:17:03 -070024 Test configuration
25 */
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080026
Laurence Lundbladef156fb82018-10-01 09:47:03 -070027typedef int (test_fun_t)(void);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053028typedef const char * (test_fun2_t)(void);
29
Laurence Lundbladef156fb82018-10-01 09:47:03 -070030
Laurence Lundbladea2e29072018-12-30 09:20:06 -080031#define TEST_ENTRY(test_name) {#test_name, test_name, true}
32#define TEST_ENTRY_DISABLED(test_name) {#test_name, test_name, false}
33
Laurence Lundbladef156fb82018-10-01 09:47:03 -070034typedef struct {
Laurence Lundbladea2e29072018-12-30 09:20:06 -080035 const char *szTestName;
Laurence Lundbladef156fb82018-10-01 09:47:03 -070036 test_fun_t *test_fun;
Laurence Lundbladea2e29072018-12-30 09:20:06 -080037 bool bEnabled;
Laurence Lundbladef156fb82018-10-01 09:47:03 -070038} test_entry;
39
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053040typedef struct {
41 const char *szTestName;
42 test_fun2_t *test_fun;
Laurence Lundbladea2e29072018-12-30 09:20:06 -080043 bool bEnabled;
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053044} test_entry2;
45
Laurence Lundbladea65b4822019-09-08 12:17:03 -070046
47static test_entry2 s_tests2[] = {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +080048 TEST_ENTRY(UBUTest_CopyUtil),
49 TEST_ENTRY(UOBTest_NonAdversarial),
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053050 TEST_ENTRY(TestBasicSanity),
Laurence Lundblade7566b9f2018-10-12 09:13:32 +080051 TEST_ENTRY(UOBTest_BoundaryConditionsTest),
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053052 TEST_ENTRY(UBMacroConversionsTest),
53 TEST_ENTRY(UBUtilTests),
Laurence Lundblade7566b9f2018-10-12 09:13:32 +080054 TEST_ENTRY(UIBTest_IntegerFormat)
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053055};
56
57
Laurence Lundbladea65b4822019-09-08 12:17:03 -070058static test_entry s_tests[] = {
Laurence Lundblade9916b1b2019-09-07 22:33:25 -070059 TEST_ENTRY(EmptyMapsAndArraysTest),
Laurence Lundbladebb1062e2019-08-12 23:28:54 -070060 TEST_ENTRY(NotWellFormedTests),
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +090061 TEST_ENTRY(ParseMapAsArrayTest),
Laurence Lundbladea44d5062018-10-17 18:45:12 +053062 TEST_ENTRY(AllocAllStringsTest),
63 TEST_ENTRY(IndefiniteLengthNestTest),
64 TEST_ENTRY(NestedMapTestIndefLen),
65 TEST_ENTRY(ParseSimpleTest),
Laurence Lundblade3a6042e2019-06-28 19:58:04 -070066 TEST_ENTRY(DecodeFailureTests),
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +080067 TEST_ENTRY(EncodeRawTest),
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053068 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),
Laurence Lundblade9e3651c2018-10-10 11:49:55 +080077 TEST_ENTRY(ParseTooDeepArrayTest),
78 TEST_ENTRY(ComprehensiveInputTest),
79 TEST_ENTRY(ParseMapTest),
Laurence Lundbladea44d5062018-10-17 18:45:12 +053080 TEST_ENTRY(IndefiniteLengthArrayMapTest),
Laurence Lundblade369b90a2018-10-22 02:04:37 +053081 TEST_ENTRY(BasicEncodeTest),
Laurence Lundblade9e3651c2018-10-10 11:49:55 +080082 TEST_ENTRY(NestedMapTest),
83 TEST_ENTRY(BignumParseTest),
84 TEST_ENTRY(OptTagParseTest),
85 TEST_ENTRY(DateParseTest),
Laurence Lundblade9e3651c2018-10-10 11:49:55 +080086 TEST_ENTRY(ShortBufferParseTest2),
87 TEST_ENTRY(ShortBufferParseTest),
88 TEST_ENTRY(ParseDeepArrayTest),
89 TEST_ENTRY(SimpleArrayTest),
90 TEST_ENTRY(IntegerValuesParseTest),
Laurence Lundbladea44d5062018-10-17 18:45:12 +053091 TEST_ENTRY(MemPoolTest),
92 TEST_ENTRY(IndefiniteLengthStringTest),
Laurence Lundbladebb474be2018-10-22 11:53:21 +053093 TEST_ENTRY(HalfPrecisionDecodeBasicTests),
Laurence Lundbladebb474be2018-10-22 11:53:21 +053094 TEST_ENTRY(DoubleAsSmallestTest),
95 TEST_ENTRY(HalfPrecisionAgainstRFCCodeTest),
Laurence Lundblade369b90a2018-10-22 02:04:37 +053096 TEST_ENTRY(BstrWrapTest),
97 TEST_ENTRY(BstrWrapErrorTest),
98 TEST_ENTRY(BstrWrapNestTest),
99 TEST_ENTRY(CoseSign1TBSTest),
Laurence Lundbladeea567ac2018-12-09 14:03:21 -0800100 TEST_ENTRY(StringDecoderModeFailTest),
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800101 TEST_ENTRY_DISABLED(BigComprehensiveInputTest),
Laurence Lundblade1ef8b2d2018-12-14 23:13:34 -0800102 TEST_ENTRY(EncodeErrorTests),
Laurence Lundblade1d7eb632019-02-17 17:23:38 -0800103 TEST_ENTRY(SetUpAllocatorTest),
Jan Jongboom47d86c52019-07-25 08:54:16 +0200104 TEST_ENTRY(SimpleValuesIndefiniteLengthTest1),
Jan Jongboom5d827882019-08-07 12:51:15 +0200105 TEST_ENTRY(EncodeLengthThirtyoneTest),
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700106};
107
108
Laurence Lundbladea65b4822019-09-08 12:17:03 -0700109
110
111/*
112 Convert a number up to 999999999 to a string. This is so sprintf doesn't
113 have to be linked in so as to minimized dependencies even in test code.
114 */
115static const char *NumToString(int32_t nNum, UsefulBuf StringMem)
116{
117 const int32_t nMax = 1000000000;
118
119 UsefulOutBuf OutBuf;
120 UsefulOutBuf_Init(&OutBuf, StringMem);
121
122 if(nNum < 0) {
123 UsefulOutBuf_AppendByte(&OutBuf, '-');
124 nNum = -nNum;
125 }
126 if(nNum > nMax-1) {
127 return "XXX";
128 }
129
130 bool bDidSomeOutput = false;
131 for(int n = nMax; n > 0; n/=10) {
132 int x = nNum/n;
133 if(x || bDidSomeOutput){
134 bDidSomeOutput = true;
135 UsefulOutBuf_AppendByte(&OutBuf, '0' + x);
136 nNum -= x * n;
137 }
138 }
139 if(!bDidSomeOutput){
140 UsefulOutBuf_AppendByte(&OutBuf, '0');
141 }
142 UsefulOutBuf_AppendByte(&OutBuf, '\0');
143
144 return UsefulOutBuf_GetError(&OutBuf) ? "" : StringMem.ptr;
145}
146
147
148/*
149 Public function. See run_test.h.
150 */
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800151int RunTests(const char *szTestNames[], OutputStringCB pfOutput, void *poutCtx, int *pNumTestsRun)
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700152{
153 int nTestsFailed = 0;
154 int nTestsRun = 0;
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530155 UsefulBuf_MAKE_STACK_UB(StringStorage, 5);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530156
157 test_entry2 *t2;
158 const test_entry2 *s_tests2_end = s_tests2 + sizeof(s_tests2)/sizeof(test_entry2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800159
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530160 for(t2 = s_tests2; t2 < s_tests2_end; t2++) {
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800161 if(szTestNames[0]) {
162 // Some tests have been named
163 const char **szRequestedNames;
164 for(szRequestedNames = szTestNames; *szRequestedNames; szRequestedNames++) {
165 if(!strcmp(t2->szTestName, *szRequestedNames)) {
166 break; // Name matched
167 }
168 }
169 if(*szRequestedNames == NULL) {
170 // Didn't match this test
171 continue;
172 }
173 } else {
174 // no tests named, but don't run "disabled" tests
175 if(!t2->bEnabled) {
176 // Don't run disabled tests when all tests are being run
177 // as indicated by no specific test names being given
178 continue;
179 }
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800180 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800181
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800182 const char * szTestResult = (t2->test_fun)();
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530183 nTestsRun++;
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800184 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800185 (*pfOutput)(t2->szTestName, poutCtx, 0);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530186 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800187
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800188 if(szTestResult) {
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800189 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800190 (*pfOutput)(" FAILED (returned ", poutCtx, 0);
191 (*pfOutput)(szTestResult, poutCtx, 0);
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -0800192 (*pfOutput)(")", poutCtx, 1);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530193 }
194 nTestsFailed++;
195 } else {
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800196 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800197 (*pfOutput)( " PASSED", poutCtx, 1);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530198 }
199 }
200 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800201
202
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700203 test_entry *t;
204 const test_entry *s_tests_end = s_tests + sizeof(s_tests)/sizeof(test_entry);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800205
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700206 for(t = s_tests; t < s_tests_end; t++) {
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800207 if(szTestNames[0]) {
208 // Some tests have been named
209 const char **szRequestedNames;
210 for(szRequestedNames = szTestNames; *szRequestedNames; szRequestedNames++) {
211 if(!strcmp(t->szTestName, *szRequestedNames)) {
212 break; // Name matched
213 }
214 }
215 if(*szRequestedNames == NULL) {
216 // Didn't match this test
217 continue;
218 }
219 } else {
220 // no tests named, but don't run "disabled" tests
221 if(!t->bEnabled) {
222 // Don't run disabled tests when all tests are being run
223 // as indicated by no specific test names being given
224 continue;
225 }
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800226 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800227
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800228 int nTestResult = (t->test_fun)();
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700229 nTestsRun++;
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800230 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800231 (*pfOutput)(t->szTestName, poutCtx, 0);
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700232 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800233
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800234 if(nTestResult) {
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800235 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800236 (*pfOutput)(" FAILED (returned ", poutCtx, 0);
237 (*pfOutput)(NumToString(nTestResult, StringStorage), poutCtx, 0);
238 (*pfOutput)(")", poutCtx, 1);
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700239 }
240 nTestsFailed++;
241 } else {
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800242 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800243 (*pfOutput)( " PASSED", poutCtx, 1);
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700244 }
245 }
246 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800247
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700248 if(pNumTestsRun) {
249 *pNumTestsRun = nTestsRun;
250 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800251
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800252 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800253 (*pfOutput)( "SUMMARY: ", poutCtx, 0);
254 (*pfOutput)( NumToString(nTestsRun, StringStorage), poutCtx, 0);
255 (*pfOutput)( " tests run; ", poutCtx, 0);
256 (*pfOutput)( NumToString(nTestsFailed, StringStorage), poutCtx, 0);
257 (*pfOutput)( " tests failed", poutCtx, 1);
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700258 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800259
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700260 return nTestsFailed;
261}
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800262
263
Laurence Lundbladea65b4822019-09-08 12:17:03 -0700264#include "qcbor.h" // For size printing
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800265
Laurence Lundbladea65b4822019-09-08 12:17:03 -0700266/*
267 Public function. See run_test.h.
268 */
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800269static void PrintSize(const char *szWhat, uint32_t uSize, OutputStringCB pfOutput, void *pOutCtx)
270{
Laurence Lundbladed396f622019-01-12 17:12:29 -0800271 UsefulBuf_MAKE_STACK_UB(buffer, 20);
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800272
Laurence Lundbladed396f622019-01-12 17:12:29 -0800273 (*pfOutput)(szWhat, pOutCtx, 0);
274 (*pfOutput)(" ", pOutCtx, 0);
275 (*pfOutput)(NumToString(uSize, buffer), pOutCtx, 0);
276 (*pfOutput)("", pOutCtx, 1);
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800277}
278
Laurence Lundbladea65b4822019-09-08 12:17:03 -0700279
280/*
281 Public function. See run_test.h.
282 */
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800283void PrintSizes(OutputStringCB pfOutput, void *pOutCtx)
284{
Laurence Lundbladed396f622019-01-12 17:12:29 -0800285 // Type and size of return from sizeof() varies. These will never be large so cast is safe
286 PrintSize("sizeof(QCBORTrackNesting)", (uint32_t)sizeof(QCBORTrackNesting), pfOutput, pOutCtx);
287 PrintSize("sizeof(QCBOREncodeContext)", (uint32_t)sizeof(QCBOREncodeContext), pfOutput, pOutCtx);
288 PrintSize("sizeof(QCBORDecodeNesting)", (uint32_t)sizeof(QCBORDecodeNesting), pfOutput, pOutCtx);
289 PrintSize("sizeof(QCBORDecodeContext)", (uint32_t)sizeof(QCBORDecodeContext), pfOutput, pOutCtx);
290 PrintSize("sizeof(QCBORItem)", (uint32_t)sizeof(QCBORItem), pfOutput, pOutCtx);
Laurence Lundbladed396f622019-01-12 17:12:29 -0800291 PrintSize("sizeof(QCBORTagListIn)", (uint32_t)sizeof(QCBORTagListIn), pfOutput, pOutCtx);
292 PrintSize("sizeof(QCBORTagListOut)", (uint32_t)sizeof(QCBORTagListOut), pfOutput, pOutCtx);
293 (*pfOutput)("", pOutCtx, 1);
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800294}