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

This commit is contained in:
Andreas Schiffler 2014-07-07 23:33:57 -07:00
parent d23d9c88e5
commit 962c9911ce
1 changed files with 183 additions and 32 deletions

View File

@ -3,6 +3,9 @@
* New/updated tests: aschiffler at ferzkopp dot net * New/updated tests: aschiffler at ferzkopp dot net
*/ */
/* quiet windows compiler warnings */
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> #include <stdio.h>
#include <string.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 */ /* Test callback function */
void _audio_testCallback(void *userdata, Uint8 *stream, int len) 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 * \brief Stop and restart audio subsystem
* *
* \sa http://wiki.libsdl.org/moin.cgi/SDL_QuitSubSystem * \sa https://wiki.libsdl.org/SDL_QuitSubSystem
* \sa http://wiki.libsdl.org/moin.cgi/SDL_InitSubSystem * \sa https://wiki.libsdl.org/SDL_InitSubSystem
*/ */
int audio_quitInitAudioSubSystem() int audio_quitInitAudioSubSystem()
{ {
@ -56,8 +77,8 @@ int audio_quitInitAudioSubSystem()
/** /**
* \brief Start and stop audio directly * \brief Start and stop audio directly
* *
* \sa http://wiki.libsdl.org/moin.cgi/SDL_InitAudio * \sa https://wiki.libsdl.org/SDL_InitAudio
* \sa http://wiki.libsdl.org/moin.cgi/SDL_QuitAudio * \sa https://wiki.libsdl.org/SDL_QuitAudio
*/ */
int audio_initQuitAudio() int audio_initQuitAudio()
{ {
@ -110,15 +131,104 @@ int audio_initQuitAudio()
/** /**
* \brief Start, open, close and stop audio * \brief Start, open, close and stop audio
* *
* \sa http://wiki.libsdl.org/moin.cgi/SDL_InitAudio * \sa https://wiki.libsdl.org/SDL_InitAudio
* \sa http://wiki.libsdl.org/moin.cgi/SDL_OpenAudio * \sa https://wiki.libsdl.org/SDL_OpenAudio
* \sa http://wiki.libsdl.org/moin.cgi/SDL_CloseAudio * \sa https://wiki.libsdl.org/SDL_CloseAudio
* \sa http://wiki.libsdl.org/moin.cgi/SDL_QuitAudio * \sa https://wiki.libsdl.org/SDL_QuitAudio
*/ */
int audio_initOpenCloseQuitAudio() 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 result;
int i, iMax, j; int i, iMax, j, k, l;
int totalDelay;
int pause_on;
int originalCounter;
const char* audioDriver; const char* audioDriver;
SDL_AudioSpec desired; SDL_AudioSpec desired;
@ -172,9 +282,47 @@ int audio_initOpenCloseQuitAudio()
SDLTest_AssertPass("Call to SDL_OpenAudio(desired_spec_%d, NULL)", j); SDLTest_AssertPass("Call to SDL_OpenAudio(desired_spec_%d, NULL)", j);
SDLTest_AssertCheck(result == 0, "Verify return value; expected: 0 got: %d", result); 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 */ /* Call Close */
SDL_CloseAudio(); SDL_CloseAudio();
SDLTest_AssertPass("Call to SDL_CloseAudio()"); SDLTest_AssertPass("Call to SDL_CloseAudio()");
/* Call Quit */ /* Call Quit */
SDL_AudioQuit(); SDL_AudioQuit();
@ -183,8 +331,8 @@ int audio_initOpenCloseQuitAudio()
} /* spec loop */ } /* spec loop */
} /* driver loop */ } /* driver loop */
/* Restart audio again */ /* Restart audio again */
_audioSetUp(NULL); _audioSetUp(NULL);
return TEST_COMPLETED; return TEST_COMPLETED;
} }
@ -192,8 +340,8 @@ int audio_initOpenCloseQuitAudio()
/** /**
* \brief Enumerate and name available audio devices (output and capture). * \brief Enumerate and name available audio devices (output and capture).
* *
* \sa http://wiki.libsdl.org/moin.cgi/SDL_GetNumAudioDevices * \sa https://wiki.libsdl.org/SDL_GetNumAudioDevices
* \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioDeviceName * \sa https://wiki.libsdl.org/SDL_GetAudioDeviceName
*/ */
int audio_enumerateAndNameAudioDevices() int audio_enumerateAndNameAudioDevices()
{ {
@ -250,8 +398,8 @@ int audio_enumerateAndNameAudioDevices()
/** /**
* \brief Negative tests around enumeration and naming of audio devices. * \brief Negative tests around enumeration and naming of audio devices.
* *
* \sa http://wiki.libsdl.org/moin.cgi/SDL_GetNumAudioDevices * \sa https://wiki.libsdl.org/SDL_GetNumAudioDevices
* \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioDeviceName * \sa https://wiki.libsdl.org/SDL_GetAudioDeviceName
*/ */
int audio_enumerateAndNameAudioDevicesNegativeTests() int audio_enumerateAndNameAudioDevicesNegativeTests()
{ {
@ -297,8 +445,8 @@ int audio_enumerateAndNameAudioDevicesNegativeTests()
/** /**
* \brief Checks available audio driver names. * \brief Checks available audio driver names.
* *
* \sa http://wiki.libsdl.org/moin.cgi/SDL_GetNumAudioDrivers * \sa https://wiki.libsdl.org/SDL_GetNumAudioDrivers
* \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioDriver * \sa https://wiki.libsdl.org/SDL_GetAudioDriver
*/ */
int audio_printAudioDrivers() int audio_printAudioDrivers()
{ {
@ -330,7 +478,7 @@ int audio_printAudioDrivers()
/** /**
* \brief Checks current audio driver name with initialized audio. * \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() int audio_printCurrentAudioDriver()
{ {
@ -362,7 +510,7 @@ int _audioFrequencies[] = { 11025, 22050, 44100, 48000 };
/** /**
* \brief Builds various audio conversion structures * \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() int audio_buildAudioCVT()
{ {
@ -426,7 +574,7 @@ int audio_buildAudioCVT()
/** /**
* \brief Checkes calls with invalid input to SDL_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() int audio_buildAudioCVTNegative()
{ {
@ -521,7 +669,7 @@ int audio_buildAudioCVTNegative()
/** /**
* \brief Checks current audio status. * \brief Checks current audio status.
* *
* \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioStatus * \sa https://wiki.libsdl.org/SDL_GetAudioStatus
*/ */
int audio_getAudioStatus() int audio_getAudioStatus()
{ {
@ -542,7 +690,7 @@ int audio_getAudioStatus()
/** /**
* \brief Opens, checks current audio status, and closes a device. * \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() int audio_openCloseAndGetAudioStatus()
{ {
@ -600,8 +748,8 @@ int audio_openCloseAndGetAudioStatus()
/** /**
* \brief Locks and unlocks open audio device. * \brief Locks and unlocks open audio device.
* *
* \sa http://wiki.libsdl.org/moin.cgi/SDL_LockAudioDevice * \sa https://wiki.libsdl.org/SDL_LockAudioDevice
* \sa http://wiki.libsdl.org/moin.cgi/SDL_UnlockAudioDevice * \sa https://wiki.libsdl.org/SDL_UnlockAudioDevice
*/ */
int audio_lockUnlockOpenAudioDevice() int audio_lockUnlockOpenAudioDevice()
{ {
@ -663,8 +811,8 @@ int audio_lockUnlockOpenAudioDevice()
/** /**
* \brief Convert audio using various conversion structures * \brief Convert audio using various conversion structures
* *
* \sa http://wiki.libsdl.org/moin.cgi/SDL_BuildAudioCVT * \sa https://wiki.libsdl.org/SDL_BuildAudioCVT
* \sa http://wiki.libsdl.org/moin.cgi/SDL_ConvertAudio * \sa https://wiki.libsdl.org/SDL_ConvertAudio
*/ */
int audio_convertAudio() int audio_convertAudio()
{ {
@ -762,7 +910,7 @@ int audio_convertAudio()
/** /**
* \brief Opens, checks current connected status, and closes a device. * \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() int audio_openCloseAudioDeviceConnected()
{ {
@ -871,11 +1019,14 @@ static const SDLTest_TestCaseReference audioTest13 =
static const SDLTest_TestCaseReference audioTest14 = static const SDLTest_TestCaseReference audioTest14 =
{ (SDLTest_TestCaseFp)audio_initOpenCloseQuitAudio, "audio_initOpenCloseQuitAudio", "Cycle through init, open, close and quit with various audio specs.", TEST_ENABLED }; { (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 */ /* Sequence of Audio test cases */
static const SDLTest_TestCaseReference *audioTests[] = { static const SDLTest_TestCaseReference *audioTests[] = {
&audioTest1, &audioTest2, &audioTest3, &audioTest4, &audioTest5, &audioTest6, &audioTest1, &audioTest2, &audioTest3, &audioTest4, &audioTest5, &audioTest6,
&audioTest7, &audioTest8, &audioTest9, &audioTest10, &audioTest11, &audioTest7, &audioTest8, &audioTest9, &audioTest10, &audioTest11,
&audioTest12, &audioTest13, &audioTest14, NULL &audioTest12, &audioTest13, &audioTest14, &audioTest15, NULL
}; };
/* Audio test suite (global) */ /* Audio test suite (global) */
@ -883,5 +1034,5 @@ SDLTest_TestSuiteReference audioTestSuite = {
"Audio", "Audio",
_audioSetUp, _audioSetUp,
audioTests, audioTests,
NULL _audioTearDown
}; };