xref: /netbsd-src/external/bsd/ntp/dist/sntp/unity/unity_fixture.c (revision cdfa2a7ef92791ba9db70a584a1d904730e6fb46)
1*cdfa2a7eSchristos /*	$NetBSD: unity_fixture.c,v 1.2 2020/05/25 20:47:36 christos Exp $	*/
2067f5680Schristos 
3f17b710fSchristos //- Copyright (c) 2010 James Grenning and Contributed to Unity Project
4f17b710fSchristos /* ==========================================
5f17b710fSchristos     Unity Project - A Test Framework for C
6f17b710fSchristos     Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
7f17b710fSchristos     [Released under MIT License. Please refer to license.txt for details]
8f17b710fSchristos ========================================== */
9f17b710fSchristos 
10f17b710fSchristos #include <string.h>
11f17b710fSchristos #include <stdio.h>
12f17b710fSchristos #include "unity_fixture.h"
13f17b710fSchristos #include "unity_internals.h"
14f17b710fSchristos 
15f17b710fSchristos UNITY_FIXTURE_T UnityFixture;
16f17b710fSchristos 
17f17b710fSchristos //If you decide to use the function pointer approach.
18f17b710fSchristos int (*outputChar)(int) = putchar;
19f17b710fSchristos 
20f17b710fSchristos int verbose = 0;
21f17b710fSchristos 
22f17b710fSchristos 
announceTestRun(unsigned int runNumber)23f17b710fSchristos static void announceTestRun(unsigned int runNumber)
24f17b710fSchristos {
25f17b710fSchristos     UnityPrint("Unity test run ");
26f17b710fSchristos     UnityPrintNumber(runNumber+1);
27f17b710fSchristos     UnityPrint(" of ");
28f17b710fSchristos     UnityPrintNumber(UnityFixture.RepeatCount);
29f17b710fSchristos     UNITY_OUTPUT_CHAR('\n');
30f17b710fSchristos }
31f17b710fSchristos 
UnityMain(int argc,const char * argv[],void (* runAllTests)(void))32f17b710fSchristos int UnityMain(int argc, const char* argv[], void (*runAllTests)(void))
33f17b710fSchristos {
34f17b710fSchristos     int result = UnityGetCommandLineOptions(argc, argv);
35f17b710fSchristos     unsigned int r;
36f17b710fSchristos     if (result != 0)
37f17b710fSchristos         return result;
38f17b710fSchristos 
39f17b710fSchristos     for (r = 0; r < UnityFixture.RepeatCount; r++)
40f17b710fSchristos     {
41f17b710fSchristos         UnityBegin(argv[0]);
42f17b710fSchristos         announceTestRun(r);
43f17b710fSchristos         runAllTests();
44f17b710fSchristos         UNITY_OUTPUT_CHAR('\n');
45f17b710fSchristos         UnityEnd();
46f17b710fSchristos     }
47f17b710fSchristos 
48f17b710fSchristos     return UnityFailureCount();
49f17b710fSchristos }
50f17b710fSchristos 
selected(const char * filter,const char * name)51f17b710fSchristos static int selected(const char * filter, const char * name)
52f17b710fSchristos {
53f17b710fSchristos     if (filter == 0)
54f17b710fSchristos         return 1;
55f17b710fSchristos     return strstr(name, filter) ? 1 : 0;
56f17b710fSchristos }
57f17b710fSchristos 
testSelected(const char * test)58f17b710fSchristos static int testSelected(const char* test)
59f17b710fSchristos {
60f17b710fSchristos     return selected(UnityFixture.NameFilter, test);
61f17b710fSchristos }
62f17b710fSchristos 
groupSelected(const char * group)63f17b710fSchristos static int groupSelected(const char* group)
64f17b710fSchristos {
65f17b710fSchristos     return selected(UnityFixture.GroupFilter, group);
66f17b710fSchristos }
67f17b710fSchristos 
runTestCase(void)68f17b710fSchristos static void runTestCase(void)
69f17b710fSchristos {
70f17b710fSchristos 
71f17b710fSchristos }
72f17b710fSchristos 
UnityTestRunner(unityfunction * setup,unityfunction * testBody,unityfunction * teardown,const char * printableName,const char * group,const char * name,const char * file,int line)73f17b710fSchristos void UnityTestRunner(unityfunction* setup,
74f17b710fSchristos         unityfunction* testBody,
75f17b710fSchristos         unityfunction* teardown,
76f17b710fSchristos         const char * printableName,
77f17b710fSchristos         const char * group,
78f17b710fSchristos         const char * name,
79f17b710fSchristos         const char * file, int line)
80f17b710fSchristos {
81f17b710fSchristos     if (testSelected(name) && groupSelected(group))
82f17b710fSchristos     {
83f17b710fSchristos         Unity.CurrentTestFailed = 0;
84f17b710fSchristos         Unity.TestFile = file;
85f17b710fSchristos         Unity.CurrentTestName = printableName;
86f17b710fSchristos         Unity.CurrentTestLineNumber = line;
87f17b710fSchristos         if (!UnityFixture.Verbose)
88f17b710fSchristos             UNITY_OUTPUT_CHAR('.');
89f17b710fSchristos         else
90f17b710fSchristos             UnityPrint(printableName);
91f17b710fSchristos 
92f17b710fSchristos         Unity.NumberOfTests++;
93f17b710fSchristos         UnityMalloc_StartTest();
94f17b710fSchristos         UnityPointer_Init();
95f17b710fSchristos 
96f17b710fSchristos         runTestCase();
97f17b710fSchristos         if (TEST_PROTECT())
98f17b710fSchristos         {
99f17b710fSchristos             setup();
100f17b710fSchristos             testBody();
101f17b710fSchristos         }
102f17b710fSchristos         if (TEST_PROTECT())
103f17b710fSchristos         {
104f17b710fSchristos             teardown();
105f17b710fSchristos         }
106f17b710fSchristos         if (TEST_PROTECT())
107f17b710fSchristos         {
108f17b710fSchristos             UnityPointer_UndoAllSets();
109f17b710fSchristos             if (!Unity.CurrentTestFailed)
110f17b710fSchristos                 UnityMalloc_EndTest();
111f17b710fSchristos         }
112f17b710fSchristos         UnityConcludeFixtureTest();
113f17b710fSchristos     }
114f17b710fSchristos }
115f17b710fSchristos 
UnityIgnoreTest(const char * printableName)116f17b710fSchristos void UnityIgnoreTest(const char * printableName)
117f17b710fSchristos {
118f17b710fSchristos     Unity.NumberOfTests++;
119f17b710fSchristos     Unity.CurrentTestIgnored = 1;
120f17b710fSchristos     if (!UnityFixture.Verbose)
121f17b710fSchristos         UNITY_OUTPUT_CHAR('!');
122f17b710fSchristos     else
123f17b710fSchristos         UnityPrint(printableName);
124f17b710fSchristos     UnityConcludeFixtureTest();
125f17b710fSchristos }
126f17b710fSchristos 
127f17b710fSchristos 
128f17b710fSchristos //-------------------------------------------------
129f17b710fSchristos //Malloc and free stuff
130f17b710fSchristos //
131f17b710fSchristos #define MALLOC_DONT_FAIL -1
132f17b710fSchristos static int malloc_count;
133f17b710fSchristos static int malloc_fail_countdown = MALLOC_DONT_FAIL;
134f17b710fSchristos 
UnityMalloc_StartTest(void)135f17b710fSchristos void UnityMalloc_StartTest(void)
136f17b710fSchristos {
137f17b710fSchristos     malloc_count = 0;
138f17b710fSchristos     malloc_fail_countdown = MALLOC_DONT_FAIL;
139f17b710fSchristos }
140f17b710fSchristos 
UnityMalloc_EndTest(void)141f17b710fSchristos void UnityMalloc_EndTest(void)
142f17b710fSchristos {
143f17b710fSchristos     malloc_fail_countdown = MALLOC_DONT_FAIL;
144f17b710fSchristos     if (malloc_count != 0)
145f17b710fSchristos     {
146f17b710fSchristos         TEST_FAIL_MESSAGE("This test leaks!");
147f17b710fSchristos     }
148f17b710fSchristos }
149f17b710fSchristos 
UnityMalloc_MakeMallocFailAfterCount(int countdown)150f17b710fSchristos void UnityMalloc_MakeMallocFailAfterCount(int countdown)
151f17b710fSchristos {
152f17b710fSchristos     malloc_fail_countdown = countdown;
153f17b710fSchristos }
154f17b710fSchristos 
155f17b710fSchristos #ifdef malloc
156f17b710fSchristos #undef malloc
157f17b710fSchristos #endif
158f17b710fSchristos 
159f17b710fSchristos #ifdef free
160f17b710fSchristos #undef free
161f17b710fSchristos #endif
162f17b710fSchristos 
163f17b710fSchristos #ifdef calloc
164f17b710fSchristos #undef calloc
165f17b710fSchristos #endif
166f17b710fSchristos 
167f17b710fSchristos #ifdef realloc
168f17b710fSchristos #undef realloc
169f17b710fSchristos #endif
170f17b710fSchristos 
171f17b710fSchristos #include <stdlib.h>
172f17b710fSchristos #include <string.h>
173f17b710fSchristos 
174f17b710fSchristos typedef struct GuardBytes
175f17b710fSchristos {
176f17b710fSchristos     size_t size;
177f17b710fSchristos     char guard[sizeof(size_t)];
178f17b710fSchristos } Guard;
179f17b710fSchristos 
180f17b710fSchristos 
181f17b710fSchristos static const char * end = "END";
182f17b710fSchristos 
unity_malloc(size_t size)183f17b710fSchristos void * unity_malloc(size_t size)
184f17b710fSchristos {
185f17b710fSchristos     char* mem;
186f17b710fSchristos     Guard* guard;
187f17b710fSchristos 
188f17b710fSchristos     if (malloc_fail_countdown != MALLOC_DONT_FAIL)
189f17b710fSchristos     {
190f17b710fSchristos         if (malloc_fail_countdown == 0)
191f17b710fSchristos             return 0;
192f17b710fSchristos         malloc_fail_countdown--;
193f17b710fSchristos     }
194f17b710fSchristos 
195f17b710fSchristos     malloc_count++;
196f17b710fSchristos 
197f17b710fSchristos     guard = (Guard*)malloc(size + sizeof(Guard) + 4);
198f17b710fSchristos     guard->size = size;
199f17b710fSchristos     mem = (char*)&(guard[1]);
200f17b710fSchristos     memcpy(&mem[size], end, strlen(end) + 1);
201f17b710fSchristos 
202f17b710fSchristos     return (void*)mem;
203f17b710fSchristos }
204f17b710fSchristos 
isOverrun(void * mem)205f17b710fSchristos static int isOverrun(void * mem)
206f17b710fSchristos {
207f17b710fSchristos     Guard* guard = (Guard*)mem;
208f17b710fSchristos     char* memAsChar = (char*)mem;
209f17b710fSchristos     guard--;
210f17b710fSchristos 
211f17b710fSchristos     return strcmp(&memAsChar[guard->size], end) != 0;
212f17b710fSchristos }
213f17b710fSchristos 
release_memory(void * mem)214f17b710fSchristos static void release_memory(void * mem)
215f17b710fSchristos {
216f17b710fSchristos     Guard* guard = (Guard*)mem;
217f17b710fSchristos     guard--;
218f17b710fSchristos 
219f17b710fSchristos     malloc_count--;
220f17b710fSchristos     free(guard);
221f17b710fSchristos }
222f17b710fSchristos 
unity_free(void * mem)223f17b710fSchristos void unity_free(void * mem)
224f17b710fSchristos {
225f17b710fSchristos     int overrun = isOverrun(mem);//strcmp(&memAsChar[guard->size], end) != 0;
226f17b710fSchristos     release_memory(mem);
227f17b710fSchristos     if (overrun)
228f17b710fSchristos     {
229f17b710fSchristos         TEST_FAIL_MESSAGE("Buffer overrun detected during free()");
230f17b710fSchristos     }
231f17b710fSchristos }
232f17b710fSchristos 
unity_calloc(size_t num,size_t size)233f17b710fSchristos void* unity_calloc(size_t num, size_t size)
234f17b710fSchristos {
235f17b710fSchristos     void* mem = unity_malloc(num * size);
236f17b710fSchristos     memset(mem, 0, num*size);
237f17b710fSchristos     return mem;
238f17b710fSchristos }
239f17b710fSchristos 
unity_realloc(void * oldMem,size_t size)240f17b710fSchristos void* unity_realloc(void * oldMem, size_t size)
241f17b710fSchristos {
242f17b710fSchristos     Guard* guard = (Guard*)oldMem;
243f17b710fSchristos //    char* memAsChar = (char*)oldMem;
244f17b710fSchristos     void* newMem;
245f17b710fSchristos 
246f17b710fSchristos     if (oldMem == 0)
247f17b710fSchristos         return unity_malloc(size);
248f17b710fSchristos 
249f17b710fSchristos     guard--;
250f17b710fSchristos     if (isOverrun(oldMem))
251f17b710fSchristos     {
252f17b710fSchristos         release_memory(oldMem);
253f17b710fSchristos         TEST_FAIL_MESSAGE("Buffer overrun detected during realloc()");
254f17b710fSchristos     }
255f17b710fSchristos 
256f17b710fSchristos     if (size == 0)
257f17b710fSchristos     {
258f17b710fSchristos         release_memory(oldMem);
259f17b710fSchristos         return 0;
260f17b710fSchristos     }
261f17b710fSchristos 
262f17b710fSchristos     if (guard->size >= size)
263f17b710fSchristos         return oldMem;
264f17b710fSchristos 
265f17b710fSchristos     newMem = unity_malloc(size);
266f17b710fSchristos     memcpy(newMem, oldMem, guard->size);
267f17b710fSchristos     unity_free(oldMem);
268f17b710fSchristos     return newMem;
269f17b710fSchristos }
270f17b710fSchristos 
271f17b710fSchristos 
272f17b710fSchristos //--------------------------------------------------------
273f17b710fSchristos //Automatic pointer restoration functions
274f17b710fSchristos typedef struct _PointerPair
275f17b710fSchristos {
276f17b710fSchristos     struct _PointerPair * next;
277f17b710fSchristos     void ** pointer;
278f17b710fSchristos     void * old_value;
279f17b710fSchristos } PointerPair;
280f17b710fSchristos 
281f17b710fSchristos enum {MAX_POINTERS=50};
282f17b710fSchristos static PointerPair pointer_store[MAX_POINTERS];
283f17b710fSchristos static int pointer_index = 0;
284f17b710fSchristos 
UnityPointer_Init(void)285f17b710fSchristos void UnityPointer_Init(void)
286f17b710fSchristos {
287f17b710fSchristos     pointer_index = 0;
288f17b710fSchristos }
289f17b710fSchristos 
UnityPointer_Set(void ** pointer,void * newValue)290f17b710fSchristos void UnityPointer_Set(void ** pointer, void * newValue)
291f17b710fSchristos {
292f17b710fSchristos     if (pointer_index >= MAX_POINTERS)
293f17b710fSchristos         TEST_FAIL_MESSAGE("Too many pointers set");
294f17b710fSchristos 
295f17b710fSchristos     pointer_store[pointer_index].pointer = pointer;
296f17b710fSchristos     pointer_store[pointer_index].old_value = *pointer;
297f17b710fSchristos     *pointer = newValue;
298f17b710fSchristos     pointer_index++;
299f17b710fSchristos }
300f17b710fSchristos 
UnityPointer_UndoAllSets(void)301f17b710fSchristos void UnityPointer_UndoAllSets(void)
302f17b710fSchristos {
303f17b710fSchristos     while (pointer_index > 0)
304f17b710fSchristos     {
305f17b710fSchristos         pointer_index--;
306f17b710fSchristos         *(pointer_store[pointer_index].pointer) =
307f17b710fSchristos         pointer_store[pointer_index].old_value;
308f17b710fSchristos 
309f17b710fSchristos     }
310f17b710fSchristos }
311f17b710fSchristos 
UnityFailureCount(void)312f17b710fSchristos int UnityFailureCount(void)
313f17b710fSchristos {
314f17b710fSchristos     return Unity.TestFailures;
315f17b710fSchristos }
316f17b710fSchristos 
UnityGetCommandLineOptions(int argc,const char * argv[])317f17b710fSchristos int UnityGetCommandLineOptions(int argc, const char* argv[])
318f17b710fSchristos {
319f17b710fSchristos     int i;
320f17b710fSchristos     UnityFixture.Verbose = 0;
321f17b710fSchristos     UnityFixture.GroupFilter = 0;
322f17b710fSchristos     UnityFixture.NameFilter = 0;
323f17b710fSchristos     UnityFixture.RepeatCount = 1;
324f17b710fSchristos 
325f17b710fSchristos     if (argc == 1)
326f17b710fSchristos         return 0;
327f17b710fSchristos 
328f17b710fSchristos     for (i = 1; i < argc; )
329f17b710fSchristos     {
330f17b710fSchristos         if (strcmp(argv[i], "-v") == 0)
331f17b710fSchristos         {
332f17b710fSchristos             UnityFixture.Verbose = 1;
333f17b710fSchristos             i++;
334f17b710fSchristos         }
335f17b710fSchristos         else if (strcmp(argv[i], "-g") == 0)
336f17b710fSchristos         {
337f17b710fSchristos             i++;
338f17b710fSchristos             if (i >= argc)
339f17b710fSchristos                 return 1;
340f17b710fSchristos             UnityFixture.GroupFilter = argv[i];
341f17b710fSchristos             i++;
342f17b710fSchristos         }
343f17b710fSchristos         else if (strcmp(argv[i], "-n") == 0)
344f17b710fSchristos         {
345f17b710fSchristos             i++;
346f17b710fSchristos             if (i >= argc)
347f17b710fSchristos                 return 1;
348f17b710fSchristos             UnityFixture.NameFilter = argv[i];
349f17b710fSchristos             i++;
350f17b710fSchristos         }
351f17b710fSchristos         else if (strcmp(argv[i], "-r") == 0)
352f17b710fSchristos         {
353f17b710fSchristos             UnityFixture.RepeatCount = 2;
354f17b710fSchristos             i++;
355f17b710fSchristos             if (i < argc)
356f17b710fSchristos             {
357f17b710fSchristos                 if (*(argv[i]) >= '0' && *(argv[i]) <= '9')
358f17b710fSchristos                 {
359f17b710fSchristos                     UnityFixture.RepeatCount = atoi(argv[i]);
360f17b710fSchristos                     i++;
361f17b710fSchristos                 }
362f17b710fSchristos             }
363f17b710fSchristos         } else {
364f17b710fSchristos             // ignore unknown parameter
365f17b710fSchristos             i++;
366f17b710fSchristos         }
367f17b710fSchristos     }
368f17b710fSchristos     return 0;
369f17b710fSchristos }
370f17b710fSchristos 
UnityConcludeFixtureTest(void)371f17b710fSchristos void UnityConcludeFixtureTest(void)
372f17b710fSchristos {
373f17b710fSchristos     if (Unity.CurrentTestIgnored)
374f17b710fSchristos     {
375f17b710fSchristos         if (UnityFixture.Verbose)
376f17b710fSchristos         {
377f17b710fSchristos             UNITY_OUTPUT_CHAR('\n');
378f17b710fSchristos         }
379f17b710fSchristos         Unity.TestIgnores++;
380f17b710fSchristos     }
381f17b710fSchristos     else if (!Unity.CurrentTestFailed)
382f17b710fSchristos     {
383f17b710fSchristos         if (UnityFixture.Verbose)
384f17b710fSchristos         {
385f17b710fSchristos             UnityPrint(" PASS");
386f17b710fSchristos             UNITY_OUTPUT_CHAR('\n');
387f17b710fSchristos         }
388f17b710fSchristos     }
389f17b710fSchristos     else if (Unity.CurrentTestFailed)
390f17b710fSchristos     {
391f17b710fSchristos         Unity.TestFailures++;
392f17b710fSchristos     }
393f17b710fSchristos 
394f17b710fSchristos     Unity.CurrentTestFailed = 0;
395f17b710fSchristos     Unity.CurrentTestIgnored = 0;
396f17b710fSchristos }
397