|
|
|
@ -33,7 +33,7 @@ static void print_subinterp(void) |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
static void test_repeated_init_and_subinterpreters(void) |
|
|
|
static int test_repeated_init_and_subinterpreters(void) |
|
|
|
{ |
|
|
|
PyThreadState *mainstate, *substate; |
|
|
|
#ifdef WITH_THREAD |
|
|
|
@ -70,6 +70,7 @@ static void test_repeated_init_and_subinterpreters(void) |
|
|
|
PyEval_RestoreThread(mainstate); |
|
|
|
Py_Finalize(); |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
/***************************************************** |
|
|
|
@ -103,7 +104,7 @@ static void check_stdio_details(const char *encoding, const char * errors) |
|
|
|
Py_Finalize(); |
|
|
|
} |
|
|
|
|
|
|
|
static void test_forced_io_encoding(void) |
|
|
|
static int test_forced_io_encoding(void) |
|
|
|
{ |
|
|
|
/* Check various combinations */ |
|
|
|
printf("--- Use defaults ---\n"); |
|
|
|
@ -122,19 +123,51 @@ static void test_forced_io_encoding(void) |
|
|
|
printf("Unexpected success calling Py_SetStandardStreamEncoding"); |
|
|
|
} |
|
|
|
Py_Finalize(); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
/* Different embedding tests */ |
|
|
|
int main(int argc, char *argv[]) |
|
|
|
/* ********************************************************* |
|
|
|
* List of test cases and the function that implements it. |
|
|
|
* |
|
|
|
* Names are compared case-sensitively with the first |
|
|
|
* argument. If no match is found, or no first argument was |
|
|
|
* provided, the names of all test cases are printed and |
|
|
|
* the exit code will be -1. |
|
|
|
* |
|
|
|
* The int returned from test functions is used as the exit |
|
|
|
* code, and test_capi treats all non-zero exit codes as a |
|
|
|
* failed test. |
|
|
|
*********************************************************/ |
|
|
|
struct TestCase |
|
|
|
{ |
|
|
|
const char *name; |
|
|
|
int (*func)(void); |
|
|
|
}; |
|
|
|
|
|
|
|
static struct TestCase TestCases[] = { |
|
|
|
{ "forced_io_encoding", test_forced_io_encoding }, |
|
|
|
{ "repeated_init_and_subinterpreters", test_repeated_init_and_subinterpreters }, |
|
|
|
{ NULL, NULL } |
|
|
|
}; |
|
|
|
|
|
|
|
/* TODO: Check the argument string to allow for more test cases */ |
|
|
|
int main(int argc, char *argv[]) |
|
|
|
{ |
|
|
|
if (argc > 1) { |
|
|
|
/* For now: assume "forced_io_encoding */ |
|
|
|
test_forced_io_encoding(); |
|
|
|
} else { |
|
|
|
/* Run the original embedding test case by default */ |
|
|
|
test_repeated_init_and_subinterpreters(); |
|
|
|
for (struct TestCase *tc = TestCases; tc && tc->name; tc++) { |
|
|
|
if (strcmp(argv[1], tc->name) == 0) |
|
|
|
return (*tc->func)(); |
|
|
|
} |
|
|
|
} |
|
|
|
return 0; |
|
|
|
|
|
|
|
/* No match found, or no test name provided, so display usage */ |
|
|
|
printf("Python " PY_VERSION " _testembed executable for embedded interpreter tests\n" |
|
|
|
"Normally executed via 'EmbeddingTests' in Lib/test/test_capi.py\n\n" |
|
|
|
"Usage: %s TESTNAME\n\nAll available tests:\n", argv[0]); |
|
|
|
for (struct TestCase *tc = TestCases; tc && tc->name; tc++) { |
|
|
|
printf(" %s\n", tc->name); |
|
|
|
} |
|
|
|
|
|
|
|
/* Non-zero exit code will cause test_capi.py tests to fail. |
|
|
|
This is intentional. */ |
|
|
|
return -1; |
|
|
|
} |