#include "TestLib.h"
#ifdef _WIN32
#include <windows.h>
#else
#include <limits.h>
#include <spawn.h>
#include <sys/wait.h>
extern char **environ;
#endif
#define NUM_EXECUTABLES 34
static const char *dpiTestNames[NUM_EXECUTABLES] = {
"test_1000_context",
"test_1100_numbers",
"test_1200_conn",
"test_1300_conn_properties",
"test_1400_pool",
"test_1500_pool_properties",
"test_1600_queries",
"test_1700_transactions",
"test_1800_misc",
"test_1900_variables",
"test_2000_statements",
"test_2100_data_types",
"test_2200_object_types",
"test_2300_objects",
"test_2400_enq_options",
"test_2500_deq_options",
"test_2600_msg_props",
"test_2700_aq",
"test_2800_lobs",
"test_2900_implicit_results",
"test_3000_scroll_cursors",
"test_3100_subscriptions",
"test_3200_batch_errors",
"test_3300_dml_returning",
"test_3400_soda_db",
"test_3500_soda_coll",
"test_3600_soda_coll_cursor",
"test_3700_soda_doc",
"test_3800_soda_doc_cursor",
"test_3900_sess_tags",
"test_4000_queue",
"test_4100_binds",
"test_4200_rowids",
"test_4300_json"
};
int dpiTest_runExecutable(const char *runnerName, const char *name)
{
#ifdef _WIN32
PROCESS_INFORMATION processInfo;
STARTUPINFO startupInfo;
DWORD result;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
ZeroMemory(&processInfo, sizeof(processInfo));
if (!CreateProcess(NULL, (char*) name, NULL, NULL, FALSE, 0, NULL, NULL,
&startupInfo, &processInfo)) {
fprintf(stderr, "Unable to create process\n");
return -1;
}
WaitForSingleObject(processInfo.hProcess, INFINITE);
GetExitCodeProcess(processInfo.hProcess, &result);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
if (result != 0)
return -1;
#else
char executableName[PATH_MAX + 1], *temp;
char * const argv[2] = { executableName, NULL };
int status;
pid_t pid;
strcpy(executableName, runnerName);
temp = strrchr(executableName, '/');
if (temp)
strcpy(temp + 1, name);
else strcpy(executableName, name);
status = posix_spawn(&pid, executableName, NULL, NULL, argv, environ);
if (status != 0) {
perror("Failed to spawn executable");
return -1;
}
if (waitpid(pid, &status, 0) < 0) {
perror("Failed to wait for child process");
return -1;
}
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
return -1;
#endif
return 0;
}
int main(int argc, char **argv)
{
int testResults[NUM_EXECUTABLES], i, someTestsFailed;
dpiTestSuite_initialize(0);
someTestsFailed = 0;
for (i = 0; i < NUM_EXECUTABLES; i++) {
fprintf(stderr, "Running cases in %s\n", dpiTestNames[i]);
fflush(stderr);
testResults[i] = dpiTest_runExecutable(argv[0], dpiTestNames[i]);
fprintf(stderr, "\n");
fflush(stderr);
if (testResults[i] < 0)
someTestsFailed = 1;
}
if (someTestsFailed) {
fprintf(stderr, "Cases in the following tests failed:\n");
for (i = 0; i < NUM_EXECUTABLES; i++) {
if (testResults[i] < 0)
fprintf(stderr, " %s\n", dpiTestNames[i]);
}
return 1;
}
fprintf(stderr, "All tests passed!\n");
fflush(stderr);
return 0;
}