void TestSuite_Init (TestSuite *suite, const char *name, int argc, char **argv) { const char *filename; int i; memset (suite, 0, sizeof *suite); suite->name = bson_strdup (name); suite->flags = 0; suite->prgname = bson_strdup (argv [0]); for (i = 0; i < argc; i++) { if (0 == strcmp ("-v", argv [i])) { suite->flags |= TEST_VERBOSE; } else if (0 == strcmp ("-d", argv [i])) { suite->flags |= TEST_DEBUGOUTPUT; } else if (0 == strcmp ("--no-fork", argv [i])) { suite->flags |= TEST_NOFORK; } else if (0 == strcmp ("--threads", argv [i])) { suite->flags |= TEST_THREADS; } else if (0 == strcmp ("-F", argv [i])) { if (argc - 1 == i) { _Print_StdErr ("-F requires a filename argument.\n"); exit (EXIT_FAILURE); } filename = argv [++i]; if (0 != strcmp ("-", filename)) { #ifdef _WIN32 if (0 != fopen_s (&suite->outfile, filename, "w")) { suite->outfile = NULL; } #else suite->outfile = fopen (filename, "w"); #endif if (!suite->outfile) { _Print_StdErr ("Failed to open log file: %s\n", filename); } } } else if ((0 == strcmp ("-h", argv [i])) || (0 == strcmp ("--help", argv [i]))) { suite->flags |= TEST_HELPONLY; } else if ((0 == strcmp ("-l", argv [i]))) { if (argc - 1 == i) { _Print_StdErr ("-l requires an argument.\n"); exit (EXIT_FAILURE); } suite->testname = bson_strdup (argv [++i]); } } /* HACK: copy flags to global var */ test_flags = suite->flags; }
static int TestSuite_RunFuncInChild (TestSuite *suite, /* IN */ Test *test) /* IN */ { STARTUPINFO si; PROCESS_INFORMATION pi; char *cmdline; DWORD exit_code = -1; ZeroMemory (&si, sizeof (si)); si.cb = sizeof (si); ZeroMemory (&pi, sizeof (pi)); cmdline = bson_strdup_printf ("%s --silent --no-fork -l %s", suite->prgname, test->name); if (!CreateProcess (NULL, cmdline, NULL, /* Process handle not inheritable */ NULL, /* Thread handle not inheritable */ FALSE, /* Set handle inheritance to FALSE */ 0, /* No creation flags */ NULL, /* Use parent's environment block */ NULL, /* Use parent's starting directory */ &si, &pi)) { _Print_StdErr ("CreateProcess failed (%d).\n", GetLastError ()); bson_free (cmdline); return -1; } if (WaitForSingleObject (pi.hProcess, INFINITE) != WAIT_OBJECT_0) { _print_getlasterror_win ("Couldn't await process"); goto done; } if (!GetExitCodeProcess (pi.hProcess, &exit_code)) { _print_getlasterror_win ("Couldn't get exit code"); goto done; } done: CloseHandle (pi.hProcess); CloseHandle (pi.hThread); bson_free (cmdline); return exit_code; }
static void _print_getlasterror_win (const char *msg) { LPTSTR err_msg; FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError (), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), &err_msg, 0, NULL); _Print_StdErr ("%s: %s\n", msg, err_msg); LocalFree (err_msg); }
static void TestSuite_RunParallel (TestSuite *suite) /* IN */ { ParallelInfo *info; Thread *threads; Mutex mutex; Test *test; int count = 0; int i; ASSERT (suite); Mutex_Init (&mutex); for (test = suite->tests; test; test = test->next) { count++; } threads = (Thread *)calloc (count, sizeof *threads); Memory_Barrier (); for (test = suite->tests, i = 0; test; test = test->next, i++) { info = (ParallelInfo *)calloc (1, sizeof *info); info->suite = suite; info->test = test; info->count = &count; info->mutex = &mutex; Thread_Create (&threads [i], TestSuite_ParallelWorker, info); } #ifdef _WIN32 Sleep (30000); #else sleep (30); #endif _Print_StdErr ("Timed out, aborting!\n"); abort (); }
void TestSuite_Init (TestSuite *suite, const char *name, int argc, char **argv) { const char *filename; int i; memset (suite, 0, sizeof *suite); suite->name = strdup (name); suite->flags = 0; suite->prgname = strdup (argv [0]); suite->silent = false; for (i = 0; i < argc; i++) { if (0 == strcmp ("-v", argv [i])) { suite->flags |= TEST_VERBOSE; } else if (0 == strcmp ("-d", argv [i])) { suite->flags |= TEST_DEBUGOUTPUT; } else if ((0 == strcmp ("-f", argv [i])) || (0 == strcmp ("--no-fork", argv [i]))) { suite->flags |= TEST_NOFORK; } else if ((0 == strcmp ("-t", argv [i])) || (0 == strcmp ("--trace", argv [i]))) { #ifdef MONGOC_TRACE suite->flags |= TEST_TRACE; #else _Print_StdErr ("-t requires mongoc compiled with --enable-tracing.\n"); exit (EXIT_FAILURE); #endif } else if (0 == strcmp ("-F", argv [i])) { if (argc - 1 == i) { _Print_StdErr ("-F requires a filename argument.\n"); exit (EXIT_FAILURE); } filename = argv [++i]; if (0 != strcmp ("-", filename)) { #ifdef _WIN32 if (0 != fopen_s (&suite->outfile, filename, "w")) { suite->outfile = NULL; } #else suite->outfile = fopen (filename, "w"); #endif if (!suite->outfile) { _Print_StdErr ("Failed to open log file: %s\n", filename); } } } else if ((0 == strcmp ("-h", argv [i])) || (0 == strcmp ("--help", argv [i]))) { suite->flags |= TEST_HELPONLY; } else if ((0 == strcmp ("-s", argv [i])) || (0 == strcmp ("--silent", argv [i]))) { suite->silent = true; } else if ((0 == strcmp ("-l", argv [i]))) { if (argc - 1 == i) { _Print_StdErr ("-l requires an argument.\n"); exit (EXIT_FAILURE); } suite->testname = strdup (argv [++i]); } } if (test_framework_getenv_bool ("MONGOC_TEST_VALGRIND")) { suite->flags |= TEST_VALGRIND; } if (suite->silent) { if (suite->outfile) { _Print_StdErr ("Cannot combine -F with --silent\n"); abort (); } suite->flags &= ~(TEST_DEBUGOUTPUT | TEST_VERBOSE); } /* HACK: copy flags to global var */ test_flags = suite->flags; }
void TestSuite_Init (TestSuite *suite, const char *name, int argc, char **argv) { const char *filename; int i; memset (suite, 0, sizeof *suite); suite->name = strdup (name); suite->flags = 0; suite->prgname = strdup (argv [0]); for (i = 0; i < argc; i++) { if (0 == strcmp ("-v", argv [i])) { suite->flags |= TEST_VERBOSE; } else if (0 == strcmp ("-d", argv [i])) { suite->flags |= TEST_DEBUGOUTPUT; } else if (0 == strcmp ("-f", argv [i])) { suite->flags |= TEST_NOFORK; } else if (0 == strcmp ("-p", argv [i])) { suite->flags |= TEST_NOTHREADS; } else if ((0 == strcmp ("-t", argv [i])) || (0 == strcmp ("--trace", argv [i]))) { #ifdef MONGOC_TRACE suite->flags |= TEST_TRACE; #else _Print_StdErr ("-t requires mongoc compiled with --enable-tracing.\n"); exit (EXIT_FAILURE); #endif } else if (0 == strcmp ("-F", argv [i])) { if (argc - 1 == i) { _Print_StdErr ("-F requires a filename argument.\n"); exit (EXIT_FAILURE); } filename = argv [++i]; if (0 != strcmp ("-", filename)) { #ifdef _WIN32 if (0 != fopen_s (&suite->outfile, filename, "w")) { suite->outfile = NULL; } #else suite->outfile = fopen (filename, "w"); #endif if (!suite->outfile) { _Print_StdErr ("Failed to open log file: %s\n", filename); } } } else if ((0 == strcmp ("-h", argv [i])) || (0 == strcmp ("--help", argv [i]))) { suite->flags |= TEST_HELPONLY; } else if ((0 == strcmp ("-l", argv [i]))) { if (argc - 1 == i) { _Print_StdErr ("-l requires an argument.\n"); exit (EXIT_FAILURE); } suite->testname = strdup (argv [++i]); } } }