Skip to content

Commit 0327403

Browse files
authored
Merge pull request #113 from clar-test/ethomson/tempdirs
Use random sandbox names (by default)
2 parents fac823c + 18c6e26 commit 0327403

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

Diff for: CMakeLists.txt

+7
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
include(CheckFunctionExists)
2+
13
cmake_minimum_required(VERSION 3.16..3.29)
24

35
project(clar LANGUAGES C)
46

57
option(BUILD_EXAMPLE "Build the example." ON)
68

9+
check_function_exists(realpath CLAR_HAS_REALPATH)
10+
if(CLAR_HAS_REALPATH)
11+
add_compile_definitions(-DCLAR_HAS_REALPATH)
12+
endif()
13+
714
add_library(clar INTERFACE)
815
target_sources(clar INTERFACE
916
clar.c

Diff for: clar/sandbox.h

+39-2
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ static int canonicalize_tmp_path(char *buffer)
104104
*p = '/';
105105

106106
return 0;
107-
#elif defined(__APPLE__) || defined(HAS_REALPATH)
107+
#elif defined(CLAR_HAS_REALPATH)
108108
char tmp[CLAR_MAX_PATH];
109109

110110
if (realpath(buffer, tmp) == NULL)
@@ -187,6 +187,12 @@ static void clar_tempdir_init(void)
187187
if (chdir(_clar_tempdir) != 0)
188188
clar_abort("Failed to change into tempdir '%s': %s.\n",
189189
_clar_tempdir, strerror(errno));
190+
191+
#if !defined(CLAR_SANDBOX_TEST_NAMES) && defined(_WIN32)
192+
srand(clock() ^ (unsigned int)time(NULL) ^ GetCurrentProcessId() ^ GetCurrentThreadId());
193+
#elif !defined(CLAR_SANDBOX_TEST_NAMES)
194+
srand(clock() ^ time(NULL) ^ (getpid() << 16));
195+
#endif
190196
}
191197

192198
static void append(char *dst, const char *src)
@@ -208,9 +214,20 @@ static void append(char *dst, const char *src)
208214

209215
static int clar_sandbox_create(const char *suite_name, const char *test_name)
210216
{
217+
#ifndef CLAR_SANDBOX_TEST_NAMES
218+
char alpha[] = "0123456789abcdef";
219+
int num = rand();
220+
#endif
221+
211222
cl_assert(_clar_sandbox[0] == '\0');
212223

213-
cl_assert(strlen(_clar_tempdir) + strlen(suite_name) + strlen(test_name) + 2 < CLAR_MAX_PATH);
224+
/*
225+
* We may want to use test names as sandbox directory names for
226+
* readability, _however_ on platforms with restrictions for short
227+
* file / folder names (eg, Windows), this may be too long.
228+
*/
229+
#ifdef CLAR_SANDBOX_TEST_NAMES
230+
cl_assert(strlen(_clar_tempdir) + strlen(suite_name) + strlen(test_name) + 3 < CLAR_MAX_PATH);
214231

215232
strcpy(_clar_sandbox, _clar_tempdir);
216233
_clar_sandbox[_clar_tempdir_len] = '/';
@@ -219,6 +236,26 @@ static int clar_sandbox_create(const char *suite_name, const char *test_name)
219236
append(_clar_sandbox, suite_name);
220237
append(_clar_sandbox, "__");
221238
append(_clar_sandbox, test_name);
239+
#else
240+
((void)suite_name);
241+
((void)test_name);
242+
((void)append);
243+
244+
cl_assert(strlen(_clar_tempdir) + 9 < CLAR_MAX_PATH);
245+
246+
strcpy(_clar_sandbox, _clar_tempdir);
247+
_clar_sandbox[_clar_tempdir_len] = '/';
248+
249+
_clar_sandbox[_clar_tempdir_len + 1] = alpha[(num & 0xf0000000) >> 28];
250+
_clar_sandbox[_clar_tempdir_len + 2] = alpha[(num & 0x0f000000) >> 24];
251+
_clar_sandbox[_clar_tempdir_len + 3] = alpha[(num & 0x00f00000) >> 20];
252+
_clar_sandbox[_clar_tempdir_len + 4] = alpha[(num & 0x000f0000) >> 16];
253+
_clar_sandbox[_clar_tempdir_len + 5] = alpha[(num & 0x0000f000) >> 12];
254+
_clar_sandbox[_clar_tempdir_len + 6] = alpha[(num & 0x00000f00) >> 8];
255+
_clar_sandbox[_clar_tempdir_len + 7] = alpha[(num & 0x000000f0) >> 4];
256+
_clar_sandbox[_clar_tempdir_len + 8] = alpha[(num & 0x0000000f) >> 0];
257+
_clar_sandbox[_clar_tempdir_len + 9] = '\0';
258+
#endif
222259

223260
if (mkdir(_clar_sandbox, 0700) != 0)
224261
return -1;

0 commit comments

Comments
 (0)