1414#include <direct.h>
1515#define mkdir_p (path ) _mkdir(path)
1616#define rmdir_p (path ) _rmdir(path)
17+ #ifndef TEST_TMP_DIR
18+ #define TEST_TMP_DIR "build/test_tmp" // Windows: native APIs don't understand /tmp
19+ #endif
1720#else
1821#include <unistd.h>
1922#define mkdir_p (path ) mkdir(path, 0755)
2023#define rmdir_p (path ) rmdir(path)
24+ #ifndef TEST_TMP_DIR
25+ #define TEST_TMP_DIR "/tmp"
26+ #endif
2127#endif
2228
2329#include "dbmem-utils.h"
@@ -1041,7 +1047,7 @@ static int path_contains(scan_ctx_t *ctx, const char *substring) {
10411047
10421048TEST (dbmem_dir_scan_empty_dir ) {
10431049 // Create empty test directory
1044- const char * test_dir = "/tmp /dbmem_test_empty" ;
1050+ const char * test_dir = TEST_TMP_DIR " /dbmem_test_empty" ;
10451051 rmdir_p (test_dir ); // Remove if exists
10461052 mkdir_p (test_dir );
10471053
@@ -1057,8 +1063,8 @@ TEST(dbmem_dir_scan_empty_dir) {
10571063
10581064TEST (dbmem_dir_scan_single_file ) {
10591065 // Create test directory with one file
1060- const char * test_dir = "/tmp /dbmem_test_single" ;
1061- const char * test_file = "/tmp /dbmem_test_single/file.txt" ;
1066+ const char * test_dir = TEST_TMP_DIR " /dbmem_test_single" ;
1067+ const char * test_file = TEST_TMP_DIR " /dbmem_test_single/file.txt" ;
10621068
10631069 rmdir_p (test_dir );
10641070 remove_test_file (test_file );
@@ -1079,18 +1085,18 @@ TEST(dbmem_dir_scan_single_file) {
10791085
10801086TEST (dbmem_dir_scan_multiple_files ) {
10811087 // Create test directory with multiple files
1082- const char * test_dir = "/tmp /dbmem_test_multi" ;
1088+ const char * test_dir = TEST_TMP_DIR " /dbmem_test_multi" ;
10831089
10841090 // Clean up first
1085- remove ("/tmp /dbmem_test_multi/a.txt" );
1086- remove ("/tmp /dbmem_test_multi/b.txt" );
1087- remove ("/tmp /dbmem_test_multi/c.md" );
1091+ remove (TEST_TMP_DIR " /dbmem_test_multi/a.txt" );
1092+ remove (TEST_TMP_DIR " /dbmem_test_multi/b.txt" );
1093+ remove (TEST_TMP_DIR " /dbmem_test_multi/c.md" );
10881094 rmdir_p (test_dir );
10891095
10901096 mkdir_p (test_dir );
1091- create_test_file ("/tmp /dbmem_test_multi/a.txt" , "a" );
1092- create_test_file ("/tmp /dbmem_test_multi/b.txt" , "b" );
1093- create_test_file ("/tmp /dbmem_test_multi/c.md" , "c" );
1097+ create_test_file (TEST_TMP_DIR " /dbmem_test_multi/a.txt" , "a" );
1098+ create_test_file (TEST_TMP_DIR " /dbmem_test_multi/b.txt" , "b" );
1099+ create_test_file (TEST_TMP_DIR " /dbmem_test_multi/c.md" , "c" );
10941100
10951101 scan_ctx_t ctx = {0 };
10961102 int rc = dbmem_dir_scan (test_dir , scan_callback , & ctx );
@@ -1102,24 +1108,24 @@ TEST(dbmem_dir_scan_multiple_files) {
11021108 ASSERT (path_contains (& ctx , "c.md" ));
11031109
11041110 free_scan_ctx (& ctx );
1105- remove ("/tmp /dbmem_test_multi/a.txt" );
1106- remove ("/tmp /dbmem_test_multi/b.txt" );
1107- remove ("/tmp /dbmem_test_multi/c.md" );
1111+ remove (TEST_TMP_DIR " /dbmem_test_multi/a.txt" );
1112+ remove (TEST_TMP_DIR " /dbmem_test_multi/b.txt" );
1113+ remove (TEST_TMP_DIR " /dbmem_test_multi/c.md" );
11081114 rmdir_p (test_dir );
11091115}
11101116
11111117TEST (dbmem_dir_scan_recursive ) {
11121118 // Create nested directory structure
1113- const char * base = "/tmp /dbmem_test_recursive" ;
1114- const char * sub1 = "/tmp /dbmem_test_recursive/sub1" ;
1115- const char * sub2 = "/tmp /dbmem_test_recursive/sub2" ;
1116- const char * subsub = "/tmp /dbmem_test_recursive/sub1/subsub" ;
1119+ const char * base = TEST_TMP_DIR " /dbmem_test_recursive" ;
1120+ const char * sub1 = TEST_TMP_DIR " /dbmem_test_recursive/sub1" ;
1121+ const char * sub2 = TEST_TMP_DIR " /dbmem_test_recursive/sub2" ;
1122+ const char * subsub = TEST_TMP_DIR " /dbmem_test_recursive/sub1/subsub" ;
11171123
11181124 // Clean up first
1119- remove ("/tmp /dbmem_test_recursive/root.txt" );
1120- remove ("/tmp /dbmem_test_recursive/sub1/file1.txt" );
1121- remove ("/tmp /dbmem_test_recursive/sub1/subsub/deep.txt" );
1122- remove ("/tmp /dbmem_test_recursive/sub2/file2.txt" );
1125+ remove (TEST_TMP_DIR " /dbmem_test_recursive/root.txt" );
1126+ remove (TEST_TMP_DIR " /dbmem_test_recursive/sub1/file1.txt" );
1127+ remove (TEST_TMP_DIR " /dbmem_test_recursive/sub1/subsub/deep.txt" );
1128+ remove (TEST_TMP_DIR " /dbmem_test_recursive/sub2/file2.txt" );
11231129 rmdir_p (subsub );
11241130 rmdir_p (sub1 );
11251131 rmdir_p (sub2 );
@@ -1131,10 +1137,10 @@ TEST(dbmem_dir_scan_recursive) {
11311137 mkdir_p (sub2 );
11321138 mkdir_p (subsub );
11331139
1134- create_test_file ("/tmp /dbmem_test_recursive/root.txt" , "root" );
1135- create_test_file ("/tmp /dbmem_test_recursive/sub1/file1.txt" , "file1" );
1136- create_test_file ("/tmp /dbmem_test_recursive/sub2/file2.txt" , "file2" );
1137- create_test_file ("/tmp /dbmem_test_recursive/sub1/subsub/deep.txt" , "deep" );
1140+ create_test_file (TEST_TMP_DIR " /dbmem_test_recursive/root.txt" , "root" );
1141+ create_test_file (TEST_TMP_DIR " /dbmem_test_recursive/sub1/file1.txt" , "file1" );
1142+ create_test_file (TEST_TMP_DIR " /dbmem_test_recursive/sub2/file2.txt" , "file2" );
1143+ create_test_file (TEST_TMP_DIR " /dbmem_test_recursive/sub1/subsub/deep.txt" , "deep" );
11381144
11391145 scan_ctx_t ctx = {0 };
11401146 int rc = dbmem_dir_scan (base , scan_callback , & ctx );
@@ -1153,10 +1159,10 @@ TEST(dbmem_dir_scan_recursive) {
11531159 free_scan_ctx (& ctx );
11541160
11551161 // Cleanup
1156- remove ("/tmp /dbmem_test_recursive/root.txt" );
1157- remove ("/tmp /dbmem_test_recursive/sub1/file1.txt" );
1158- remove ("/tmp /dbmem_test_recursive/sub1/subsub/deep.txt" );
1159- remove ("/tmp /dbmem_test_recursive/sub2/file2.txt" );
1162+ remove (TEST_TMP_DIR " /dbmem_test_recursive/root.txt" );
1163+ remove (TEST_TMP_DIR " /dbmem_test_recursive/sub1/file1.txt" );
1164+ remove (TEST_TMP_DIR " /dbmem_test_recursive/sub1/subsub/deep.txt" );
1165+ remove (TEST_TMP_DIR " /dbmem_test_recursive/sub2/file2.txt" );
11601166 rmdir_p (subsub );
11611167 rmdir_p (sub1 );
11621168 rmdir_p (sub2 );
@@ -1165,15 +1171,15 @@ TEST(dbmem_dir_scan_recursive) {
11651171
11661172TEST (dbmem_dir_scan_skips_hidden ) {
11671173 // Create directory with hidden files (dot files)
1168- const char * test_dir = "/tmp /dbmem_test_hidden" ;
1174+ const char * test_dir = TEST_TMP_DIR " /dbmem_test_hidden" ;
11691175
1170- remove ("/tmp /dbmem_test_hidden/visible.txt" );
1171- remove ("/tmp /dbmem_test_hidden/.hidden" );
1176+ remove (TEST_TMP_DIR " /dbmem_test_hidden/visible.txt" );
1177+ remove (TEST_TMP_DIR " /dbmem_test_hidden/.hidden" );
11721178 rmdir_p (test_dir );
11731179
11741180 mkdir_p (test_dir );
1175- create_test_file ("/tmp /dbmem_test_hidden/visible.txt" , "visible" );
1176- create_test_file ("/tmp /dbmem_test_hidden/.hidden" , "hidden" );
1181+ create_test_file (TEST_TMP_DIR " /dbmem_test_hidden/visible.txt" , "visible" );
1182+ create_test_file (TEST_TMP_DIR " /dbmem_test_hidden/.hidden" , "hidden" );
11771183
11781184 scan_ctx_t ctx = {0 };
11791185 int rc = dbmem_dir_scan (test_dir , scan_callback , & ctx );
@@ -1184,25 +1190,25 @@ TEST(dbmem_dir_scan_skips_hidden) {
11841190 ASSERT (!path_contains (& ctx , ".hidden" ));
11851191
11861192 free_scan_ctx (& ctx );
1187- remove ("/tmp /dbmem_test_hidden/visible.txt" );
1188- remove ("/tmp /dbmem_test_hidden/.hidden" );
1193+ remove (TEST_TMP_DIR " /dbmem_test_hidden/visible.txt" );
1194+ remove (TEST_TMP_DIR " /dbmem_test_hidden/.hidden" );
11891195 rmdir_p (test_dir );
11901196}
11911197
11921198TEST (dbmem_dir_scan_skips_hidden_dirs ) {
11931199 // Create directory with hidden subdirectory
1194- const char * test_dir = "/tmp /dbmem_test_hidden_dir" ;
1195- const char * hidden_dir = "/tmp /dbmem_test_hidden_dir/.hidden_dir" ;
1200+ const char * test_dir = TEST_TMP_DIR " /dbmem_test_hidden_dir" ;
1201+ const char * hidden_dir = TEST_TMP_DIR " /dbmem_test_hidden_dir/.hidden_dir" ;
11961202
1197- remove ("/tmp /dbmem_test_hidden_dir/visible.txt" );
1198- remove ("/tmp /dbmem_test_hidden_dir/.hidden_dir/secret.txt" );
1203+ remove (TEST_TMP_DIR " /dbmem_test_hidden_dir/visible.txt" );
1204+ remove (TEST_TMP_DIR " /dbmem_test_hidden_dir/.hidden_dir/secret.txt" );
11991205 rmdir_p (hidden_dir );
12001206 rmdir_p (test_dir );
12011207
12021208 mkdir_p (test_dir );
12031209 mkdir_p (hidden_dir );
1204- create_test_file ("/tmp /dbmem_test_hidden_dir/visible.txt" , "visible" );
1205- create_test_file ("/tmp /dbmem_test_hidden_dir/.hidden_dir/secret.txt" , "secret" );
1210+ create_test_file (TEST_TMP_DIR " /dbmem_test_hidden_dir/visible.txt" , "visible" );
1211+ create_test_file (TEST_TMP_DIR " /dbmem_test_hidden_dir/.hidden_dir/secret.txt" , "secret" );
12061212
12071213 scan_ctx_t ctx = {0 };
12081214 int rc = dbmem_dir_scan (test_dir , scan_callback , & ctx );
@@ -1213,8 +1219,8 @@ TEST(dbmem_dir_scan_skips_hidden_dirs) {
12131219 ASSERT (!path_contains (& ctx , "secret.txt" ));
12141220
12151221 free_scan_ctx (& ctx );
1216- remove ("/tmp /dbmem_test_hidden_dir/visible.txt" );
1217- remove ("/tmp /dbmem_test_hidden_dir/.hidden_dir/secret.txt" );
1222+ remove (TEST_TMP_DIR " /dbmem_test_hidden_dir/visible.txt" );
1223+ remove (TEST_TMP_DIR " /dbmem_test_hidden_dir/.hidden_dir/secret.txt" );
12181224 rmdir_p (hidden_dir );
12191225 rmdir_p (test_dir );
12201226}
@@ -1227,13 +1233,13 @@ TEST(dbmem_dir_scan_null_path) {
12271233}
12281234
12291235TEST (dbmem_dir_scan_null_callback ) {
1230- int rc = dbmem_dir_scan ("/tmp " , NULL , NULL );
1236+ int rc = dbmem_dir_scan (". " , NULL , NULL ); // Use current dir (exists on all platforms)
12311237 ASSERT_EQ (rc , -1 );
12321238}
12331239
12341240TEST (dbmem_dir_scan_nonexistent ) {
12351241 scan_ctx_t ctx = {0 };
1236- int rc = dbmem_dir_scan ("/tmp /nonexistent_dir_12345" , scan_callback , & ctx );
1242+ int rc = dbmem_dir_scan (TEST_TMP_DIR " /nonexistent_dir_12345" , scan_callback , & ctx );
12371243 ASSERT_EQ (rc , -1 );
12381244 free_scan_ctx (& ctx );
12391245}
@@ -1248,49 +1254,49 @@ static int abort_scan_callback(const char *path, void *data) {
12481254
12491255TEST (dbmem_dir_scan_callback_abort ) {
12501256 // Create directory with multiple files
1251- const char * test_dir = "/tmp /dbmem_test_abort" ;
1257+ const char * test_dir = TEST_TMP_DIR " /dbmem_test_abort" ;
12521258
1253- remove ("/tmp /dbmem_test_abort/a.txt" );
1254- remove ("/tmp /dbmem_test_abort/b.txt" );
1255- remove ("/tmp /dbmem_test_abort/c.txt" );
1259+ remove (TEST_TMP_DIR " /dbmem_test_abort/a.txt" );
1260+ remove (TEST_TMP_DIR " /dbmem_test_abort/b.txt" );
1261+ remove (TEST_TMP_DIR " /dbmem_test_abort/c.txt" );
12561262 rmdir_p (test_dir );
12571263
12581264 mkdir_p (test_dir );
1259- create_test_file ("/tmp /dbmem_test_abort/a.txt" , "a" );
1260- create_test_file ("/tmp /dbmem_test_abort/b.txt" , "b" );
1261- create_test_file ("/tmp /dbmem_test_abort/c.txt" , "c" );
1265+ create_test_file (TEST_TMP_DIR " /dbmem_test_abort/a.txt" , "a" );
1266+ create_test_file (TEST_TMP_DIR " /dbmem_test_abort/b.txt" , "b" );
1267+ create_test_file (TEST_TMP_DIR " /dbmem_test_abort/c.txt" , "c" );
12621268
12631269 int count = 0 ;
12641270 int rc = dbmem_dir_scan (test_dir , abort_scan_callback , & count );
12651271
12661272 ASSERT_EQ (rc , -1 ); // Should return error when callback aborts
12671273 ASSERT_EQ (count , 2 ); // Should have stopped after 2 files
12681274
1269- remove ("/tmp /dbmem_test_abort/a.txt" );
1270- remove ("/tmp /dbmem_test_abort/b.txt" );
1271- remove ("/tmp /dbmem_test_abort/c.txt" );
1275+ remove (TEST_TMP_DIR " /dbmem_test_abort/a.txt" );
1276+ remove (TEST_TMP_DIR " /dbmem_test_abort/b.txt" );
1277+ remove (TEST_TMP_DIR " /dbmem_test_abort/c.txt" );
12721278 rmdir_p (test_dir );
12731279}
12741280
12751281TEST (dbmem_dir_scan_trailing_slash ) {
12761282 // Test with trailing slash in path
1277- const char * test_dir = "/tmp /dbmem_test_slash" ;
1283+ const char * test_dir = TEST_TMP_DIR " /dbmem_test_slash" ;
12781284
1279- remove ("/tmp /dbmem_test_slash/file.txt" );
1285+ remove (TEST_TMP_DIR " /dbmem_test_slash/file.txt" );
12801286 rmdir_p (test_dir );
12811287
12821288 mkdir_p (test_dir );
1283- create_test_file ("/tmp /dbmem_test_slash/file.txt" , "test" );
1289+ create_test_file (TEST_TMP_DIR " /dbmem_test_slash/file.txt" , "test" );
12841290
12851291 scan_ctx_t ctx = {0 };
1286- int rc = dbmem_dir_scan ("/tmp /dbmem_test_slash/" , scan_callback , & ctx );
1292+ int rc = dbmem_dir_scan (TEST_TMP_DIR " /dbmem_test_slash/" , scan_callback , & ctx );
12871293
12881294 ASSERT_EQ (rc , 0 );
12891295 ASSERT_EQ (ctx .count , 1 );
12901296 ASSERT (path_contains (& ctx , "file.txt" ));
12911297
12921298 free_scan_ctx (& ctx );
1293- remove ("/tmp /dbmem_test_slash/file.txt" );
1299+ remove (TEST_TMP_DIR " /dbmem_test_slash/file.txt" );
12941300 rmdir_p (test_dir );
12951301}
12961302
0 commit comments