diff options
author | Steve Dower <steve.dower@microsoft.com> | 2017-01-02 04:25:03 (GMT) |
---|---|---|
committer | Steve Dower <steve.dower@microsoft.com> | 2017-01-02 04:25:03 (GMT) |
commit | ea74f0cd4a11c86f256b2c7d550bc317d80c9fc5 (patch) | |
tree | d2f25a6fdf94d2b7d594667a3213dfd26870875f /Programs | |
parent | 4fb5e76dcae03c2930e61207b4b32b7987ba302f (diff) | |
download | cpython-ea74f0cd4a11c86f256b2c7d550bc317d80c9fc5.zip cpython-ea74f0cd4a11c86f256b2c7d550bc317d80c9fc5.tar.gz cpython-ea74f0cd4a11c86f256b2c7d550bc317d80c9fc5.tar.bz2 |
Issue #24932: Use proper command line parsing in _testembed
Diffstat (limited to 'Programs')
-rw-r--r-- | Programs/_testembed.c | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 3968399..a68d4fa 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -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; } |