blob: 6894a5ff5d57c81324d9ff93b1efcf144b80e83a [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 Lundblade1f8b5b02019-01-01 22:27:38 -08004 Created on 9/30/18
5
6 Copyright (c) 2018-2019, Laurence Lundblade.
Laurence Lundbladed92a6162018-11-01 11:38:35 +07007 All rights reserved.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08008
Laurence Lundblade0dbc9172018-11-01 14:17:21 +07009Redistribution and use in source and binary forms, with or without
10modification, are permitted provided that the following conditions are
11met:
12 * Redistributions of source code must retain the above copyright
13 notice, this list of conditions and the following disclaimer.
14 * Redistributions in binary form must reproduce the above
15 copyright notice, this list of conditions and the following
16 disclaimer in the documentation and/or other materials provided
17 with the distribution.
18 * The name "Laurence Lundblade" may not be used to
19 endorse or promote products derived from this software without
20 specific prior written permission.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080021
Laurence Lundblade0dbc9172018-11-01 14:17:21 +070022THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
23WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
24MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
25ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
26BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
29BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
31OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
Laurence Lundblade88b6ece2018-12-04 12:27:19 +090032IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 ==============================================================================*/
Laurence Lundbladef156fb82018-10-01 09:47:03 -070034
35
36#include "run_tests.h"
37#include "UsefulBuf.h"
38#include <stdbool.h>
39
Laurence Lundblade2d85ce42018-10-12 14:12:47 +080040#include "float_tests.h"
Laurence Lundblade9e3651c2018-10-10 11:49:55 +080041#include "qcbor_decode_tests.h"
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053042#include "qcbor_encode_tests.h"
43#include "UsefulBuf_Tests.h"
Laurence Lundbladef156fb82018-10-01 09:47:03 -070044
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080045
46
47// Used to test RunTests
Laurence Lundbladef156fb82018-10-01 09:47:03 -070048int fail_test()
49{
50 return -44;
51}
52
53
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080054
55
Laurence Lundbladef156fb82018-10-01 09:47:03 -070056/*
57 Convert a number up to 999999999 to a string. This is so sprintf doesn't
58 have to be linked in so as to minimized dependencies even in test code.
Laurence Lundblade1544c482018-12-05 20:52:35 +090059 */
Laurence Lundbladef156fb82018-10-01 09:47:03 -070060const char *NumToString(int32_t nNum, UsefulBuf StringMem)
61{
Laurence Lundblade570fab52018-10-13 18:28:27 +080062 const int32_t nMax = 1000000000;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080063
Laurence Lundbladef156fb82018-10-01 09:47:03 -070064 UsefulOutBuf OutBuf;
65 UsefulOutBuf_Init(&OutBuf, StringMem);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080066
Laurence Lundbladef156fb82018-10-01 09:47:03 -070067 if(nNum < 0) {
68 UsefulOutBuf_AppendByte(&OutBuf, '-');
69 nNum = -nNum;
70 }
Laurence Lundblade570fab52018-10-13 18:28:27 +080071 if(nNum > nMax-1) {
Laurence Lundbladef156fb82018-10-01 09:47:03 -070072 return "XXX";
73 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080074
Laurence Lundbladef156fb82018-10-01 09:47:03 -070075 bool bDidSomeOutput = false;
Laurence Lundblade570fab52018-10-13 18:28:27 +080076 for(int n = nMax; n > 0; n/=10) {
Laurence Lundbladef156fb82018-10-01 09:47:03 -070077 int x = nNum/n;
78 if(x || bDidSomeOutput){
79 bDidSomeOutput = true;
80 UsefulOutBuf_AppendByte(&OutBuf, '0' + x);
81 nNum -= x * n;
82 }
83 }
84 if(!bDidSomeOutput){
85 UsefulOutBuf_AppendByte(&OutBuf, '0');
86 }
87 UsefulOutBuf_AppendByte(&OutBuf, '\0');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080088
Laurence Lundbladef156fb82018-10-01 09:47:03 -070089 return UsefulOutBuf_GetError(&OutBuf) ? "" : StringMem.ptr;
90}
91
92
93
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080094
Laurence Lundbladef156fb82018-10-01 09:47:03 -070095typedef int (test_fun_t)(void);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053096typedef const char * (test_fun2_t)(void);
97
Laurence Lundbladef156fb82018-10-01 09:47:03 -070098
Laurence Lundbladea2e29072018-12-30 09:20:06 -080099#define TEST_ENTRY(test_name) {#test_name, test_name, true}
100#define TEST_ENTRY_DISABLED(test_name) {#test_name, test_name, false}
101
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700102typedef struct {
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800103 const char *szTestName;
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700104 test_fun_t *test_fun;
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800105 bool bEnabled;
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700106} test_entry;
107
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530108typedef struct {
109 const char *szTestName;
110 test_fun2_t *test_fun;
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800111 bool bEnabled;
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530112} test_entry2;
113
114test_entry2 s_tests2[] = {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800115 TEST_ENTRY(UBUTest_CopyUtil),
116 TEST_ENTRY(UOBTest_NonAdversarial),
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530117 TEST_ENTRY(TestBasicSanity),
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800118 TEST_ENTRY(UOBTest_BoundaryConditionsTest),
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530119 TEST_ENTRY(UBMacroConversionsTest),
120 TEST_ENTRY(UBUtilTests),
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800121 TEST_ENTRY(UIBTest_IntegerFormat)
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530122};
123
124
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700125test_entry s_tests[] = {
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900126 TEST_ENTRY(ParseMapAsArrayTest),
Laurence Lundbladea44d5062018-10-17 18:45:12 +0530127 TEST_ENTRY(AllocAllStringsTest),
128 TEST_ENTRY(IndefiniteLengthNestTest),
129 TEST_ENTRY(NestedMapTestIndefLen),
130 TEST_ENTRY(ParseSimpleTest),
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +0800131 TEST_ENTRY(EncodeRawTest),
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530132 TEST_ENTRY(RTICResultsTest),
133 TEST_ENTRY(MapEncodeTest),
134 TEST_ENTRY(ArrayNestingTest1),
135 TEST_ENTRY(ArrayNestingTest2),
136 TEST_ENTRY(ArrayNestingTest3),
137 TEST_ENTRY(EncodeDateTest),
138 TEST_ENTRY(SimpleValuesTest1),
139 TEST_ENTRY(IntegerValuesTest1),
140 TEST_ENTRY(AllAddMethodsTest),
Laurence Lundblade9e3651c2018-10-10 11:49:55 +0800141 TEST_ENTRY(ParseTooDeepArrayTest),
142 TEST_ENTRY(ComprehensiveInputTest),
143 TEST_ENTRY(ParseMapTest),
Laurence Lundbladea44d5062018-10-17 18:45:12 +0530144 TEST_ENTRY(IndefiniteLengthArrayMapTest),
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530145 TEST_ENTRY(BasicEncodeTest),
Laurence Lundblade9e3651c2018-10-10 11:49:55 +0800146 TEST_ENTRY(NestedMapTest),
147 TEST_ENTRY(BignumParseTest),
148 TEST_ENTRY(OptTagParseTest),
149 TEST_ENTRY(DateParseTest),
Laurence Lundblade9e3651c2018-10-10 11:49:55 +0800150 TEST_ENTRY(ShortBufferParseTest2),
151 TEST_ENTRY(ShortBufferParseTest),
152 TEST_ENTRY(ParseDeepArrayTest),
153 TEST_ENTRY(SimpleArrayTest),
154 TEST_ENTRY(IntegerValuesParseTest),
Laurence Lundbladea44d5062018-10-17 18:45:12 +0530155 TEST_ENTRY(MemPoolTest),
156 TEST_ENTRY(IndefiniteLengthStringTest),
Laurence Lundbladebb474be2018-10-22 11:53:21 +0530157 TEST_ENTRY(HalfPrecisionDecodeBasicTests),
Laurence Lundbladebb474be2018-10-22 11:53:21 +0530158 TEST_ENTRY(DoubleAsSmallestTest),
159 TEST_ENTRY(HalfPrecisionAgainstRFCCodeTest),
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530160 TEST_ENTRY(BstrWrapTest),
161 TEST_ENTRY(BstrWrapErrorTest),
162 TEST_ENTRY(BstrWrapNestTest),
163 TEST_ENTRY(CoseSign1TBSTest),
Laurence Lundbladeea567ac2018-12-09 14:03:21 -0800164 TEST_ENTRY(StringDecoderModeFailTest),
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800165 TEST_ENTRY_DISABLED(BigComprehensiveInputTest),
Laurence Lundblade1ef8b2d2018-12-14 23:13:34 -0800166 TEST_ENTRY(EncodeErrorTests),
Laurence Lundblade1d7eb632019-02-17 17:23:38 -0800167 TEST_ENTRY(SetUpAllocatorTest),
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700168 //TEST_ENTRY(fail_test),
169};
170
171
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800172int RunTests(const char *szTestNames[], OutputStringCB pfOutput, void *poutCtx, int *pNumTestsRun)
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700173{
174 int nTestsFailed = 0;
175 int nTestsRun = 0;
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530176 UsefulBuf_MAKE_STACK_UB(StringStorage, 5);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530177
178 test_entry2 *t2;
179 const test_entry2 *s_tests2_end = s_tests2 + sizeof(s_tests2)/sizeof(test_entry2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800180
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530181 for(t2 = s_tests2; t2 < s_tests2_end; t2++) {
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800182 if(szTestNames[0]) {
183 // Some tests have been named
184 const char **szRequestedNames;
185 for(szRequestedNames = szTestNames; *szRequestedNames; szRequestedNames++) {
186 if(!strcmp(t2->szTestName, *szRequestedNames)) {
187 break; // Name matched
188 }
189 }
190 if(*szRequestedNames == NULL) {
191 // Didn't match this test
192 continue;
193 }
194 } else {
195 // no tests named, but don't run "disabled" tests
196 if(!t2->bEnabled) {
197 // Don't run disabled tests when all tests are being run
198 // as indicated by no specific test names being given
199 continue;
200 }
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800201 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800202
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800203 const char * szTestResult = (t2->test_fun)();
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530204 nTestsRun++;
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800205 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800206 (*pfOutput)(t2->szTestName, poutCtx, 0);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530207 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800208
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800209 if(szTestResult) {
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800210 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800211 (*pfOutput)(" FAILED (returned ", poutCtx, 0);
212 (*pfOutput)(szTestResult, poutCtx, 0);
213 (*pfOutput)(")\n", poutCtx, 1);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530214 }
215 nTestsFailed++;
216 } else {
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800217 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800218 (*pfOutput)( " PASSED", poutCtx, 1);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530219 }
220 }
221 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800222
223
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700224 test_entry *t;
225 const test_entry *s_tests_end = s_tests + sizeof(s_tests)/sizeof(test_entry);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800226
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700227 for(t = s_tests; t < s_tests_end; t++) {
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800228 if(szTestNames[0]) {
229 // Some tests have been named
230 const char **szRequestedNames;
231 for(szRequestedNames = szTestNames; *szRequestedNames; szRequestedNames++) {
232 if(!strcmp(t->szTestName, *szRequestedNames)) {
233 break; // Name matched
234 }
235 }
236 if(*szRequestedNames == NULL) {
237 // Didn't match this test
238 continue;
239 }
240 } else {
241 // no tests named, but don't run "disabled" tests
242 if(!t->bEnabled) {
243 // Don't run disabled tests when all tests are being run
244 // as indicated by no specific test names being given
245 continue;
246 }
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800247 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800248
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800249 int nTestResult = (t->test_fun)();
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700250 nTestsRun++;
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800251 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800252 (*pfOutput)(t->szTestName, poutCtx, 0);
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700253 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800254
Laurence Lundbladea2e29072018-12-30 09:20:06 -0800255 if(nTestResult) {
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800256 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800257 (*pfOutput)(" FAILED (returned ", poutCtx, 0);
258 (*pfOutput)(NumToString(nTestResult, StringStorage), poutCtx, 0);
259 (*pfOutput)(")", poutCtx, 1);
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700260 }
261 nTestsFailed++;
262 } else {
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800263 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800264 (*pfOutput)( " PASSED", poutCtx, 1);
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700265 }
266 }
267 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800268
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700269 if(pNumTestsRun) {
270 *pNumTestsRun = nTestsRun;
271 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800272
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800273 if(pfOutput) {
Laurence Lundbladed396f622019-01-12 17:12:29 -0800274 (*pfOutput)( "SUMMARY: ", poutCtx, 0);
275 (*pfOutput)( NumToString(nTestsRun, StringStorage), poutCtx, 0);
276 (*pfOutput)( " tests run; ", poutCtx, 0);
277 (*pfOutput)( NumToString(nTestsFailed, StringStorage), poutCtx, 0);
278 (*pfOutput)( " tests failed", poutCtx, 1);
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700279 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800280
Laurence Lundbladef156fb82018-10-01 09:47:03 -0700281 return nTestsFailed;
282}
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800283
284
285
286
287static void PrintSize(const char *szWhat, uint32_t uSize, OutputStringCB pfOutput, void *pOutCtx)
288{
Laurence Lundbladed396f622019-01-12 17:12:29 -0800289 UsefulBuf_MAKE_STACK_UB(buffer, 20);
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800290
Laurence Lundbladed396f622019-01-12 17:12:29 -0800291 (*pfOutput)(szWhat, pOutCtx, 0);
292 (*pfOutput)(" ", pOutCtx, 0);
293 (*pfOutput)(NumToString(uSize, buffer), pOutCtx, 0);
294 (*pfOutput)("", pOutCtx, 1);
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800295}
296
297void PrintSizes(OutputStringCB pfOutput, void *pOutCtx)
298{
Laurence Lundbladed396f622019-01-12 17:12:29 -0800299 // Type and size of return from sizeof() varies. These will never be large so cast is safe
300 PrintSize("sizeof(QCBORTrackNesting)", (uint32_t)sizeof(QCBORTrackNesting), pfOutput, pOutCtx);
301 PrintSize("sizeof(QCBOREncodeContext)", (uint32_t)sizeof(QCBOREncodeContext), pfOutput, pOutCtx);
302 PrintSize("sizeof(QCBORDecodeNesting)", (uint32_t)sizeof(QCBORDecodeNesting), pfOutput, pOutCtx);
303 PrintSize("sizeof(QCBORDecodeContext)", (uint32_t)sizeof(QCBORDecodeContext), pfOutput, pOutCtx);
304 PrintSize("sizeof(QCBORItem)", (uint32_t)sizeof(QCBORItem), pfOutput, pOutCtx);
Laurence Lundbladed396f622019-01-12 17:12:29 -0800305 PrintSize("sizeof(QCBORTagListIn)", (uint32_t)sizeof(QCBORTagListIn), pfOutput, pOutCtx);
306 PrintSize("sizeof(QCBORTagListOut)", (uint32_t)sizeof(QCBORTagListOut), pfOutput, pOutCtx);
307 (*pfOutput)("", pOutCtx, 1);
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800308}