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