diff --git a/src/test/test_util.c b/src/test/test_util.c index eaf5e0dd89..d30cc11161 100644 --- a/src/test/test_util.c +++ b/src/test/test_util.c @@ -1425,24 +1425,55 @@ run_util_spawn_background(const char *argv[], const char *expected_out, ; } +static char* +get_windows_path(const char *process_name, const char **dest) +{ +#ifdef MS_WINDOWS + char fn[MAX_PATH]; + DWORD retval; + char *new_fn = NULL; + int i; + + /* Get the file name of the current module */ + retval = GetModuleFileName(NULL, fn, sizeof(fn)); + if (retval >= sizeof(fn)) { + log_warn(LD_GENERAL, "Executable path name was longer than maximum (%d)", sizeof(fn)); + return NULL; + } + + /* Remove the filename component */ + for (i = retval - 1; i >= 0; i--) { + /* \0 terminate at first path separator from end */ + if ('\\' == fn[i] || '/' == fn[i]) { + fn[i] = '\0'; + break; + } + } + + tor_asprintf(&new_fn, "%s\\%s", fn, process_name); + *dest = new_fn; + return new_fn; +#else + (void)process_name; + (void)dest; + return NULL; +#endif +} + /** Check that we can launch a process and read the output */ static void test_util_spawn_background_ok(void *ptr) { - char *filename=NULL; #ifdef MS_WINDOWS - const char *argv[] = {BUILDDIR "/src/test/test-child.exe", "--test", NULL}; + const char *argv[] = {NULL, "--test", NULL}; const char *expected_out = "OUT\r\n--test\r\nSLEEPING\r\nDONE\r\n"; const char *expected_err = "ERR\r\n"; + char *filename; - if (argv[0][0] == '/') { - /* We have a fake path, e.g. /c/foo, make it c:/foo */ - filename = tor_strdup(argv[0]); - filename[0] = filename[1]; - filename[1] = ':'; - argv[0] = filename; - log_warn(LD_GENERAL, "%s", argv[0]); - } + /* Find path to test-child.exe (same directory as this executable */ + filename = get_windows_path("test-child.exe", argv); + tt_assert(filename != NULL); + log_warn(LD_GENERAL, "Using %s as path", filename); #else const char *argv[] = {BUILDDIR "/src/test/test-child", "--test", NULL}; const char *expected_out = "OUT\n--test\nSLEEPING\nDONE\n"; @@ -1452,7 +1483,12 @@ test_util_spawn_background_ok(void *ptr) (void)ptr; run_util_spawn_background(argv, expected_out, expected_err, 0, 1); + done: +#ifdef MS_WINDOWS tor_free(filename); +#else + ; +#endif } /** Check that failing to find the executable works as expected */ @@ -1483,7 +1519,6 @@ test_util_spawn_background_fail(void *ptr) static void test_util_spawn_background_partial_read(void *ptr) { - char *filename=NULL; const int expected_exit = 0; const int expected_status = 1; @@ -1492,21 +1527,18 @@ test_util_spawn_background_partial_read(void *ptr) process_handle_t process_handle; char stdout_buf[100], stderr_buf[100]; #ifdef MS_WINDOWS - const char *argv[] = {BUILDDIR "/src/test/test-child.exe", "--test", NULL}; + const char *argv[] = {NULL, "--test", NULL}; const char *expected_out[] = { "OUT\r\n--test\r\nSLEEPING\r\n", "DONE\r\n", NULL }; const char *expected_err = "ERR\r\n"; int expected_out_ctr; + char *filename; - if (argv[0][0] == '/') { - /* We have a fake path, e.g. /c/foo, make it c:/foo */ - filename = tor_strdup(argv[0]); - filename[0] = filename[1]; - filename[1] = ':'; - argv[0] = filename; - log_warn(LD_GENERAL, "%s", argv[0]); - } + /* Find path to test-child.exe (same directory as this executable */ + filename = get_windows_path("test-child.exe", argv); + tt_assert(filename != NULL); + log_warn(LD_GENERAL, "Using %s as path", filename); #else const char *argv[] = {BUILDDIR "/src/test/test-child", "--test", NULL}; const char *expected_out = "OUT\n--test\nSLEEPING\nDONE\n"; @@ -1565,7 +1597,11 @@ test_util_spawn_background_partial_read(void *ptr) tt_int_op(pos, ==, strlen(expected_err)); done: +#ifdef MS_WINDOWS + tor_free(filename); +#else ; +#endif } static void