Commit 962c9911ce280283546d92d0a5d17539f90bdf3f

Andreas Schiffler 2014-07-07T23:33:57

Update audio testautomation: more coverage; added SDL_PauseAudio test /w callback coverage

diff --git a/test/testautomation_audio.c b/test/testautomation_audio.c
index 4a5e9ee..0607156 100644
--- a/test/testautomation_audio.c
+++ b/test/testautomation_audio.c
@@ -3,6 +3,9 @@
  * New/updated tests: aschiffler at ferzkopp dot net
  */
 
+/* quiet windows compiler warnings */
+#define _CRT_SECURE_NO_WARNINGS
+
 #include <stdio.h>
 #include <string.h>
 
@@ -25,11 +28,29 @@ _audioSetUp(void *arg)
         }
 }
 
+void
+_audioTearDown(void *arg)
+{
+    /* Remove a possibly created file from SDL disk writer audio driver; ignore errors */
+    remove("sdlaudio.raw");
+
+    SDLTest_AssertPass("Cleanup of test files completed");
+}
+
+
+/* Global counter for callback invocation */
+int _audio_testCallbackCounter;
+
+/* Global accumulator for total callback length */
+int _audio_testCallbackLength;
+
 
 /* Test callback function */
 void _audio_testCallback(void *userdata, Uint8 *stream, int len)
 {
-   /* TODO: add tracking if callback was called */
+   /* track that callback was called */
+   _audio_testCallbackCounter++;
+   _audio_testCallbackLength += len;
 }
 
 
@@ -38,8 +59,8 @@ void _audio_testCallback(void *userdata, Uint8 *stream, int len)
 /**
  * \brief Stop and restart audio subsystem
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_QuitSubSystem
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_InitSubSystem
+ * \sa https://wiki.libsdl.org/SDL_QuitSubSystem
+ * \sa https://wiki.libsdl.org/SDL_InitSubSystem
  */
 int audio_quitInitAudioSubSystem()
 {
@@ -56,8 +77,8 @@ int audio_quitInitAudioSubSystem()
 /**
  * \brief Start and stop audio directly
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_InitAudio
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_QuitAudio
+ * \sa https://wiki.libsdl.org/SDL_InitAudio
+ * \sa https://wiki.libsdl.org/SDL_QuitAudio
  */
 int audio_initQuitAudio()
 {
@@ -110,15 +131,104 @@ int audio_initQuitAudio()
 /**
  * \brief Start, open, close and stop audio
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_InitAudio
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_OpenAudio
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_CloseAudio
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_QuitAudio
+ * \sa https://wiki.libsdl.org/SDL_InitAudio
+ * \sa https://wiki.libsdl.org/SDL_OpenAudio
+ * \sa https://wiki.libsdl.org/SDL_CloseAudio
+ * \sa https://wiki.libsdl.org/SDL_QuitAudio
  */
 int audio_initOpenCloseQuitAudio()
 {
+    int result, expectedResult;
+    int i, iMax, j, k;
+    const char* audioDriver;
+    SDL_AudioSpec desired;
+
+    /* Stop SDL audio subsystem */
+    SDL_QuitSubSystem( SDL_INIT_AUDIO );
+        SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_AUDIO)");
+
+        /* Loop over all available audio drivers */
+        iMax = SDL_GetNumAudioDrivers();
+        SDLTest_AssertPass("Call to SDL_GetNumAudioDrivers");
+        SDLTest_AssertCheck(iMax > 0, "Validate number of audio drivers; expected: >0 got: %d", iMax);
+        for (i = 0; i < iMax; i++) {
+            audioDriver = SDL_GetAudioDriver(i);
+            SDLTest_AssertPass("Call to SDL_GetAudioDriver(%d)", i);
+            SDLTest_AssertCheck(audioDriver != NULL, "Audio driver name is not NULL");
+            SDLTest_AssertCheck(audioDriver[0] != '\0', "Audio driver name is not empty; got: %s", audioDriver);
+
+            /* Change specs */
+            for (j = 0; j < 2; j++) {
+
+                /* Call Init */
+                result = SDL_AudioInit(audioDriver);
+                SDLTest_AssertPass("Call to SDL_AudioInit('%s')", audioDriver);
+                SDLTest_AssertCheck(result == 0, "Validate result value; expected: 0 got: %d", result);
+
+                /* Set spec */
+                SDL_memset(&desired, 0, sizeof(desired));
+                switch (j) {
+                    case 0:
+                    /* Set standard desired spec */
+                    desired.freq = 22050;
+                    desired.format = AUDIO_S16SYS;
+                    desired.channels = 2;
+                    desired.samples = 4096;
+                    desired.callback = _audio_testCallback;
+                    desired.userdata = NULL;
+
+                    case 1:
+                    /* Set custom desired spec */
+                    desired.freq = 48000;
+                    desired.format = AUDIO_F32SYS;
+                    desired.channels = 2;
+                    desired.samples = 2048;
+                    desired.callback = _audio_testCallback;
+                    desired.userdata = NULL;
+                    break;
+            }
+
+            /* Call Open (maybe multiple times) */
+            for (k=0; k <= j; k++) {
+                result = SDL_OpenAudio(&desired, NULL);
+                SDLTest_AssertPass("Call to SDL_OpenAudio(desired_spec_%d, NULL), call %d", j, k+1);
+                expectedResult = (k==0) ? 0 : -1;
+                SDLTest_AssertCheck(result == expectedResult, "Verify return value; expected: %d, got: %d", expectedResult, result);
+            }
+
+            /* Call Close (maybe multiple times) */
+            for (k=0; k <= j; k++) {
+                SDL_CloseAudio();
+                SDLTest_AssertPass("Call to SDL_CloseAudio(), call %d", k+1);
+            }
+
+            /* Call Quit (maybe multiple times) */
+            for (k=0; k <= j; k++) {
+                SDL_AudioQuit();
+                SDLTest_AssertPass("Call to SDL_AudioQuit(), call %d", k+1);
+            }
+
+        } /* spec loop */
+    } /* driver loop */
+
+        /* Restart audio again */
+        _audioSetUp(NULL);
+
+    return TEST_COMPLETED;
+}
+
+/**
+ * \brief Pause and unpause audio
+ *
+ * \sa https://wiki.libsdl.org/SDL_PauseAudio
+ */
+int audio_pauseUnpauseAudio()
+{
     int result;
-    int i, iMax, j;
+    int i, iMax, j, k, l;
+    int totalDelay;
+    int pause_on;
+    int originalCounter;
     const char* audioDriver;
     SDL_AudioSpec desired;
 
@@ -172,9 +282,47 @@ int audio_initOpenCloseQuitAudio()
             SDLTest_AssertPass("Call to SDL_OpenAudio(desired_spec_%d, NULL)", j);
             SDLTest_AssertCheck(result == 0, "Verify return value; expected: 0 got: %d", result);
 
+            /* Start and stop audio multiple times */
+            for (l=0; l<3; l++) {
+                SDLTest_Log("Pause/Unpause iteration: %d", l+1);
+            
+                /* Reset callback counters */
+                _audio_testCallbackCounter = 0;
+                _audio_testCallbackLength = 0;
+
+                /* Un-pause audio to start playing (maybe multiple times) */
+                pause_on = 0;
+                for (k=0; k <= j; k++) {
+                    SDL_PauseAudio(pause_on);
+                    SDLTest_AssertPass("Call to SDL_PauseAudio(%d), call %d", pause_on, k+1);
+                }
+            
+                /* Wait for callback */
+                totalDelay = 0;
+                do {
+                    SDL_Delay(10);
+                    totalDelay += 10;
+                } 
+                while (_audio_testCallbackCounter == 0 && totalDelay < 1000);
+                SDLTest_AssertCheck(_audio_testCallbackCounter > 0, "Verify callback counter; expected: >0 got: %d", _audio_testCallbackCounter);
+                SDLTest_AssertCheck(_audio_testCallbackLength > 0, "Verify callback length; expected: >0 got: %d", _audio_testCallbackLength);
+
+                /* Pause audio to stop playing (maybe multiple times) */
+                for (k=0; k <= j; k++) {
+                    pause_on = (k==0) ? 1 : SDLTest_RandomIntegerInRange(99, 9999);
+                    SDL_PauseAudio(pause_on);
+                    SDLTest_AssertPass("Call to SDL_PauseAudio(%d), call %d", pause_on, k+1);
+                }
+            
+                /* Ensure callback is not called again */
+                originalCounter = _audio_testCallbackCounter;
+                SDL_Delay(totalDelay + 10);
+                SDLTest_AssertCheck(originalCounter == _audio_testCallbackCounter, "Verify callback counter; expected: %d, got: %d", originalCounter, _audio_testCallbackCounter);
+            }
+
             /* Call Close */
-                    SDL_CloseAudio();
-                    SDLTest_AssertPass("Call to SDL_CloseAudio()");
+            SDL_CloseAudio();
+            SDLTest_AssertPass("Call to SDL_CloseAudio()");
 
             /* Call Quit */
             SDL_AudioQuit();
@@ -183,8 +331,8 @@ int audio_initOpenCloseQuitAudio()
         } /* spec loop */
     } /* driver loop */
 
-        /* Restart audio again */
-        _audioSetUp(NULL);
+    /* Restart audio again */
+    _audioSetUp(NULL);
 
     return TEST_COMPLETED;
 }
@@ -192,8 +340,8 @@ int audio_initOpenCloseQuitAudio()
 /**
  * \brief Enumerate and name available audio devices (output and capture).
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetNumAudioDevices
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioDeviceName
+ * \sa https://wiki.libsdl.org/SDL_GetNumAudioDevices
+ * \sa https://wiki.libsdl.org/SDL_GetAudioDeviceName
  */
 int audio_enumerateAndNameAudioDevices()
 {
@@ -250,8 +398,8 @@ int audio_enumerateAndNameAudioDevices()
 /**
  * \brief Negative tests around enumeration and naming of audio devices.
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetNumAudioDevices
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioDeviceName
+ * \sa https://wiki.libsdl.org/SDL_GetNumAudioDevices
+ * \sa https://wiki.libsdl.org/SDL_GetAudioDeviceName
  */
 int audio_enumerateAndNameAudioDevicesNegativeTests()
 {
@@ -297,8 +445,8 @@ int audio_enumerateAndNameAudioDevicesNegativeTests()
 /**
  * \brief Checks available audio driver names.
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetNumAudioDrivers
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioDriver
+ * \sa https://wiki.libsdl.org/SDL_GetNumAudioDrivers
+ * \sa https://wiki.libsdl.org/SDL_GetAudioDriver
  */
 int audio_printAudioDrivers()
 {
@@ -330,7 +478,7 @@ int audio_printAudioDrivers()
 /**
  * \brief Checks current audio driver name with initialized audio.
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetCurrentAudioDriver
+ * \sa https://wiki.libsdl.org/SDL_GetCurrentAudioDriver
  */
 int audio_printCurrentAudioDriver()
 {
@@ -362,7 +510,7 @@ int _audioFrequencies[] = { 11025, 22050, 44100, 48000 };
 /**
  * \brief Builds various audio conversion structures
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_BuildAudioCVT
+ * \sa https://wiki.libsdl.org/SDL_BuildAudioCVT
  */
 int audio_buildAudioCVT()
 {
@@ -426,7 +574,7 @@ int audio_buildAudioCVT()
 /**
  * \brief Checkes calls with invalid input to SDL_BuildAudioCVT
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_BuildAudioCVT
+ * \sa https://wiki.libsdl.org/SDL_BuildAudioCVT
  */
 int audio_buildAudioCVTNegative()
 {
@@ -521,7 +669,7 @@ int audio_buildAudioCVTNegative()
 /**
  * \brief Checks current audio status.
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioStatus
+ * \sa https://wiki.libsdl.org/SDL_GetAudioStatus
  */
 int audio_getAudioStatus()
 {
@@ -542,7 +690,7 @@ int audio_getAudioStatus()
 /**
  * \brief Opens, checks current audio status, and closes a device.
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioStatus
+ * \sa https://wiki.libsdl.org/SDL_GetAudioStatus
  */
 int audio_openCloseAndGetAudioStatus()
 {
@@ -600,8 +748,8 @@ int audio_openCloseAndGetAudioStatus()
 /**
  * \brief Locks and unlocks open audio device.
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_LockAudioDevice
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_UnlockAudioDevice
+ * \sa https://wiki.libsdl.org/SDL_LockAudioDevice
+ * \sa https://wiki.libsdl.org/SDL_UnlockAudioDevice
  */
 int audio_lockUnlockOpenAudioDevice()
 {
@@ -663,8 +811,8 @@ int audio_lockUnlockOpenAudioDevice()
 /**
  * \brief Convert audio using various conversion structures
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_BuildAudioCVT
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_ConvertAudio
+ * \sa https://wiki.libsdl.org/SDL_BuildAudioCVT
+ * \sa https://wiki.libsdl.org/SDL_ConvertAudio
  */
 int audio_convertAudio()
 {
@@ -762,7 +910,7 @@ int audio_convertAudio()
 /**
  * \brief Opens, checks current connected status, and closes a device.
  *
- * \sa http://wiki.libsdl.org/moin.cgi/SDL_AudioDeviceConnected
+ * \sa https://wiki.libsdl.org/SDL_AudioDeviceConnected
  */
 int audio_openCloseAudioDeviceConnected()
 {
@@ -871,11 +1019,14 @@ static const SDLTest_TestCaseReference audioTest13 =
 static const SDLTest_TestCaseReference audioTest14 =
         { (SDLTest_TestCaseFp)audio_initOpenCloseQuitAudio, "audio_initOpenCloseQuitAudio", "Cycle through init, open, close and quit with various audio specs.", TEST_ENABLED };
 
+static const SDLTest_TestCaseReference audioTest15 =
+        { (SDLTest_TestCaseFp)audio_pauseUnpauseAudio, "audio_pauseUnpauseAudio", "Pause and Unpause audio for various audio specs while testing callback.", TEST_ENABLED };
+
 /* Sequence of Audio test cases */
 static const SDLTest_TestCaseReference *audioTests[] =  {
     &audioTest1, &audioTest2, &audioTest3, &audioTest4, &audioTest5, &audioTest6,
     &audioTest7, &audioTest8, &audioTest9, &audioTest10, &audioTest11,
-    &audioTest12, &audioTest13, &audioTest14, NULL
+    &audioTest12, &audioTest13, &audioTest14, &audioTest15, NULL
 };
 
 /* Audio test suite (global) */
@@ -883,5 +1034,5 @@ SDLTest_TestSuiteReference audioTestSuite = {
     "Audio",
     _audioSetUp,
     audioTests,
-    NULL
+    _audioTearDown
 };