SDL: tests: add --no-threads argument to disable threads

From 50f50df8b190d1d659ae07e859170e3ed1a671b9 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Fri, 31 May 2024 02:55:50 +0200
Subject: [PATCH] tests: add --no-threads argument to disable threads

This is useful for Emscripten that can be built without threads support
---
 test/testatomic.c | 28 +++++++++++++++++++++++++---
 test/testerror.c  | 44 +++++++++++++++++++++++++++++++++-----------
 test/testsem.c    | 37 ++++++++++++++++++++++++-------------
 3 files changed, 82 insertions(+), 27 deletions(-)

diff --git a/test/testatomic.c b/test/testatomic.c
index e2c3dda2b8fb3..9350d6c99359e 100644
--- a/test/testatomic.c
+++ b/test/testatomic.c
@@ -703,6 +703,8 @@ static void RunFIFOTest(SDL_bool lock_free)
 int main(int argc, char *argv[])
 {
     SDLTest_CommonState *state;
+    int i;
+    SDL_bool enable_threads = SDL_TRUE;
 
     /* Initialize test framework */
     state = SDLTest_CommonCreateState(argv, 0);
@@ -714,8 +716,26 @@ int main(int argc, char *argv[])
     SDL_SetLogPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
 
     /* Parse commandline */
-    if (!SDLTest_CommonDefaultArgs(state, argc, argv)) {
-        return 1;
+    for (i = 1; i < argc;) {
+        int consumed;
+
+        consumed = SDLTest_CommonArg(state, i);
+        if (consumed == 0) {
+            consumed = -1;
+            if (SDL_strcasecmp(argv[i], "--no-threads") == 0) {
+                enable_threads = SDL_FALSE;
+                consumed = 1;
+            }
+        }
+        if (consumed < 0) {
+            static const char *options[] = {
+                "[--no-threads]",
+                NULL
+            };
+            SDLTest_CommonLogUsage(state, argv[0], options);
+            return 1;
+        }
+        i += consumed;
     }
 
     RunBasicTest();
@@ -725,7 +745,9 @@ int main(int argc, char *argv[])
         return 0;
     }
 
-    RunEpicTest();
+    if (enable_threads) {
+        RunEpicTest();
+    }
 /* This test is really slow, so don't run it by default */
 #if 0
     RunFIFOTest(SDL_FALSE);
diff --git a/test/testerror.c b/test/testerror.c
index 5ceca0a3eb803..780369b8d33bb 100644
--- a/test/testerror.c
+++ b/test/testerror.c
@@ -49,6 +49,8 @@ int main(int argc, char *argv[])
 {
     SDL_Thread *thread;
     SDLTest_CommonState *state;
+    int i;
+    SDL_bool enable_threads = SDL_TRUE;
 
     /* Initialize test framework */
     state = SDLTest_CommonCreateState(argv, 0);
@@ -60,8 +62,26 @@ int main(int argc, char *argv[])
     SDL_SetLogPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
 
     /* Parse commandline */
-    if (!SDLTest_CommonDefaultArgs(state, argc, argv)) {
-        return 1;
+    for (i = 1; i < argc;) {
+        int consumed;
+
+        consumed = SDLTest_CommonArg(state, i);
+        if (consumed == 0) {
+            consumed = -1;
+            if (SDL_strcasecmp(argv[i], "--no-threads") == 0) {
+                enable_threads = SDL_FALSE;
+                consumed = 1;
+            }
+        }
+        if (consumed < 0) {
+            static const char *options[] = {
+                "[--no-threads]",
+                NULL
+            };
+            SDLTest_CommonLogUsage(state, argv[0], options);
+            return 1;
+        }
+        i += consumed;
     }
 
     /* Load the SDL library */
@@ -79,16 +99,18 @@ int main(int argc, char *argv[])
         return 0;
     }
 
-    alive = 1;
-    thread = SDL_CreateThread(ThreadFunc, NULL, "#1");
-    if (!thread) {
-        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create thread: %s\n", SDL_GetError());
-        quit(1);
+    if (enable_threads) {
+        alive = 1;
+        thread = SDL_CreateThread(ThreadFunc, NULL, "#1");
+        if (!thread) {
+            SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create thread: %s\n", SDL_GetError());
+            quit(1);
+        }
+        SDL_Delay(5 * 1000);
+        SDL_Log("Waiting for thread #1\n");
+        alive = 0;
+        SDL_WaitThread(thread, NULL);
     }
-    SDL_Delay(5 * 1000);
-    SDL_Log("Waiting for thread #1\n");
-    alive = 0;
-    SDL_WaitThread(thread, NULL);
 
     SDL_Log("Main thread error string: %s\n", SDL_GetError());
 
diff --git a/test/testsem.c b/test/testsem.c
index e7f0dd0eb11b6..359c532a3e8d4 100644
--- a/test/testsem.c
+++ b/test/testsem.c
@@ -37,7 +37,7 @@ typedef struct Thread_State
 } Thread_State;
 
 static void log_usage(char *progname, SDLTest_CommonState *state) {
-    static const char *options[] = { "init_value", NULL };
+    static const char *options[] = { "[--no-threads]", "init_value", NULL };
     SDLTest_CommonLogUsage(state, progname, options);
 }
 
@@ -120,8 +120,8 @@ TestWaitTimeout(void)
     duration = end_ticks - start_ticks;
 
     /* Accept a little offset in the effective wait */
-    SDL_assert(duration > 1900 && duration < 2050);
     SDL_Log("Wait took %" SDL_PRIu64 " milliseconds\n\n", duration);
+    SDL_assert(duration > 1900 && duration < 2050);
 
     /* Check to make sure the return value indicates timed out */
     if (retval != SDL_MUTEX_TIMEDOUT) {
@@ -257,6 +257,7 @@ int main(int argc, char **argv)
     int arg_count = 0;
     int i;
     int init_sem = 0;
+    SDL_bool enable_threads = SDL_TRUE;
     SDLTest_CommonState *state;
 
     /* Initialize test framework */
@@ -273,12 +274,18 @@ int main(int argc, char **argv)
         int consumed;
 
         consumed = SDLTest_CommonArg(state, i);
-        if (arg_count == 0) {
-            char *endptr;
-            init_sem = SDL_strtol(argv[i], &endptr, 0);
-            if (endptr != argv[i] && *endptr == '\0') {
-                arg_count++;
+        if (consumed == 0) {
+            consumed = -1;
+            if (SDL_strcasecmp(argv[i], "--no-threads") == 0) {
+                enable_threads = SDL_FALSE;
                 consumed = 1;
+            } else if (arg_count == 0) {
+                char *endptr;
+                init_sem = SDL_strtol(argv[i], &endptr, 0);
+                if (endptr != argv[i] && *endptr == '\0') {
+                    arg_count++;
+                    consumed = 1;
+                }
             }
         }
         if (consumed <= 0) {
@@ -302,17 +309,21 @@ int main(int argc, char **argv)
     (void)signal(SIGTERM, killed);
     (void)signal(SIGINT, killed);
 
-    if (init_sem > 0) {
-        TestRealWorld(init_sem);
-    }
+    if (enable_threads) {
+        if (init_sem > 0) {
+            TestRealWorld(init_sem);
+        }
 
-    TestWaitTimeout();
+        TestWaitTimeout();
+    }
 
     TestOverheadUncontended();
 
-    TestOverheadContended(SDL_FALSE);
+    if (enable_threads) {
+        TestOverheadContended(SDL_FALSE);
 
-    TestOverheadContended(SDL_TRUE);
+        TestOverheadContended(SDL_TRUE);
+    }
 
     SDL_Quit();
     SDLTest_CommonDestroyState(state);