mirror of
https://github.com/libsdl-org/SDL.git
synced 2024-11-28 06:13:28 +08:00
0e45984fa0
The internal function SDL_EGL_LoadLibrary() did not delete and remove a mostly uninitialized data structure if loading the library first failed. A later try to use EGL then skipped initialization and assumed it was previously successful because the data structure now already existed. This led to at least one crash in the internal function SDL_EGL_ChooseConfig() because a NULL pointer was dereferenced to make a call to eglBindAPI().
280 lines
11 KiB
C
280 lines
11 KiB
C
/**
|
|
* Standard C library routine test suite
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "SDL.h"
|
|
#include "SDL_test.h"
|
|
|
|
|
|
/* Test case functions */
|
|
|
|
/**
|
|
* @brief Call to SDL_strlcpy
|
|
*/
|
|
#undef SDL_strlcpy
|
|
int
|
|
stdlib_strlcpy(void *arg)
|
|
{
|
|
size_t result;
|
|
char text[1024];
|
|
const char *expected;
|
|
|
|
result = SDL_strlcpy(text, "foo", sizeof(text));
|
|
expected = "foo";
|
|
SDLTest_AssertPass("Call to SDL_strlcpy(\"foo\")");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
|
|
SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
|
|
|
|
result = SDL_strlcpy(text, "foo", 2);
|
|
expected = "f";
|
|
SDLTest_AssertPass("Call to SDL_strlcpy(\"foo\") with buffer size 2");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
|
|
SDLTest_AssertCheck(result == 3, "Check result value, expected: 3, got: %d", result);
|
|
|
|
return TEST_COMPLETED;
|
|
}
|
|
|
|
/**
|
|
* @brief Call to SDL_snprintf
|
|
*/
|
|
#undef SDL_snprintf
|
|
int
|
|
stdlib_snprintf(void *arg)
|
|
{
|
|
int result;
|
|
char text[1024];
|
|
const char *expected;
|
|
|
|
result = SDL_snprintf(text, sizeof(text), "%s", "foo");
|
|
expected = "foo";
|
|
SDLTest_AssertPass("Call to SDL_snprintf(\"%%s\", \"foo\")");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
|
|
SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
|
|
|
|
result = SDL_snprintf(text, 2, "%s", "foo");
|
|
expected = "f";
|
|
SDLTest_AssertPass("Call to SDL_snprintf(\"%%s\", \"foo\") with buffer size 2");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
|
|
SDLTest_AssertCheck(result == 3, "Check result value, expected: 3, got: %d", result);
|
|
|
|
result = SDL_snprintf(NULL, 0, "%s", "foo");
|
|
SDLTest_AssertCheck(result == 3, "Check result value, expected: 3, got: %d", result);
|
|
|
|
result = SDL_snprintf(text, sizeof(text), "%f", 1.0);
|
|
expected = "1.000000";
|
|
SDLTest_AssertPass("Call to SDL_snprintf(\"%%f\", 1.0)");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
|
|
SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
|
|
|
|
result = SDL_snprintf(text, sizeof(text), "%.f", 1.0);
|
|
expected = "1";
|
|
SDLTest_AssertPass("Call to SDL_snprintf(\"%%.f\", 1.0)");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
|
|
SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
|
|
|
|
result = SDL_snprintf(text, sizeof(text), "%#.f", 1.0);
|
|
expected = "1.";
|
|
SDLTest_AssertPass("Call to SDL_snprintf(\"%%#.f\", 1.0)");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
|
|
SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
|
|
|
|
result = SDL_snprintf(text, sizeof(text), "%f", 1.0 + 1.0 / 3.0);
|
|
expected = "1.333333";
|
|
SDLTest_AssertPass("Call to SDL_snprintf(\"%%f\", 1.0 + 1.0 / 3.0)");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
|
|
SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
|
|
|
|
result = SDL_snprintf(text, sizeof(text), "%+f", 1.0 + 1.0 / 3.0);
|
|
expected = "+1.333333";
|
|
SDLTest_AssertPass("Call to SDL_snprintf(\"%%+f\", 1.0 + 1.0 / 3.0)");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
|
|
SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
|
|
|
|
result = SDL_snprintf(text, sizeof(text), "%.2f", 1.0 + 1.0 / 3.0);
|
|
expected = "1.33";
|
|
SDLTest_AssertPass("Call to SDL_snprintf(\"%%.2f\", 1.0 + 1.0 / 3.0)");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
|
|
SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
|
|
|
|
result = SDL_snprintf(text, sizeof(text), "%6.2f", 1.0 + 1.0 / 3.0);
|
|
expected = " 1.33";
|
|
SDLTest_AssertPass("Call to SDL_snprintf(\"%%6.2f\", 1.0 + 1.0 / 3.0)");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
|
|
SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
|
|
|
|
result = SDL_snprintf(text, sizeof(text), "%06.2f", 1.0 + 1.0 / 3.0);
|
|
expected = "001.33";
|
|
SDLTest_AssertPass("Call to SDL_snprintf(\"%%06.2f\", 1.0 + 1.0 / 3.0)");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
|
|
SDLTest_AssertCheck(result == SDL_strlen(text), "Check result value, expected: %d, got: %d", SDL_strlen(text), result);
|
|
|
|
result = SDL_snprintf(text, 5, "%06.2f", 1.0 + 1.0 / 3.0);
|
|
expected = "001.";
|
|
SDLTest_AssertPass("Call to SDL_snprintf(\"%%06.2f\", 1.0 + 1.0 / 3.0) with buffer size 5");
|
|
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
|
|
SDLTest_AssertCheck(result == 6, "Check result value, expected: 6, got: %d", result);
|
|
|
|
return TEST_COMPLETED;
|
|
}
|
|
|
|
/**
|
|
* @brief Call to SDL_getenv and SDL_setenv
|
|
*/
|
|
int
|
|
stdlib_getsetenv(void *arg)
|
|
{
|
|
const int nameLen = 16;
|
|
char name[17];
|
|
int counter;
|
|
int result;
|
|
char * value1;
|
|
char * value2;
|
|
char * expected;
|
|
int overwrite;
|
|
char * text;
|
|
|
|
/* Create a random name. This tests SDL_getenv, since we need to */
|
|
/* make sure the variable is not set yet (it shouldn't). */
|
|
do {
|
|
for(counter = 0; counter < nameLen; counter++) {
|
|
name[counter] = (char)SDLTest_RandomIntegerInRange(65, 90);
|
|
}
|
|
name[nameLen] = '\0';
|
|
|
|
text = SDL_getenv(name);
|
|
SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
|
|
if (text != NULL) {
|
|
SDLTest_Log("Expected: NULL, Got: '%s' (%i)", text, SDL_strlen(text));
|
|
}
|
|
} while (text != NULL);
|
|
|
|
/* Create random values to set */
|
|
value1 = SDLTest_RandomAsciiStringOfSize(10);
|
|
value2 = SDLTest_RandomAsciiStringOfSize(10);
|
|
|
|
/* Set value 1 without overwrite */
|
|
overwrite = 0;
|
|
expected = value1;
|
|
result = SDL_setenv(name, value1, overwrite);
|
|
SDLTest_AssertPass("Call to SDL_setenv('%s','%s', %i)", name, value1, overwrite);
|
|
SDLTest_AssertCheck(result == 0, "Check result, expected: 0, got: %i", result);
|
|
|
|
/* Check value */
|
|
text = SDL_getenv(name);
|
|
SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
|
|
SDLTest_AssertCheck(text != NULL, "Verify returned text is not NULL");
|
|
if (text != NULL) {
|
|
SDLTest_AssertCheck(
|
|
SDL_strcmp(text, expected) == 0,
|
|
"Verify returned text, expected: %s, got: %s",
|
|
expected,
|
|
text);
|
|
}
|
|
|
|
/* Set value 2 with overwrite */
|
|
overwrite = 1;
|
|
expected = value2;
|
|
result = SDL_setenv(name, value2, overwrite);
|
|
SDLTest_AssertPass("Call to SDL_setenv('%s','%s', %i)", name, value2, overwrite);
|
|
SDLTest_AssertCheck(result == 0, "Check result, expected: 0, got: %i", result);
|
|
|
|
/* Check value */
|
|
text = SDL_getenv(name);
|
|
SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
|
|
SDLTest_AssertCheck(text != NULL, "Verify returned text is not NULL");
|
|
if (text != NULL) {
|
|
SDLTest_AssertCheck(
|
|
SDL_strcmp(text, expected) == 0,
|
|
"Verify returned text, expected: %s, got: %s",
|
|
expected,
|
|
text);
|
|
}
|
|
|
|
/* Set value 1 without overwrite */
|
|
overwrite = 0;
|
|
expected = value2;
|
|
result = SDL_setenv(name, value1, overwrite);
|
|
SDLTest_AssertPass("Call to SDL_setenv('%s','%s', %i)", name, value1, overwrite);
|
|
SDLTest_AssertCheck(result == 0, "Check result, expected: 0, got: %i", result);
|
|
|
|
/* Check value */
|
|
text = SDL_getenv(name);
|
|
SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
|
|
SDLTest_AssertCheck(text != NULL, "Verify returned text is not NULL");
|
|
if (text != NULL) {
|
|
SDLTest_AssertCheck(
|
|
SDL_strcmp(text, expected) == 0,
|
|
"Verify returned text, expected: %s, got: %s",
|
|
expected,
|
|
text);
|
|
}
|
|
|
|
/* Set value 1 without overwrite */
|
|
overwrite = 1;
|
|
expected = value1;
|
|
result = SDL_setenv(name, value1, overwrite);
|
|
SDLTest_AssertPass("Call to SDL_setenv('%s','%s', %i)", name, value1, overwrite);
|
|
SDLTest_AssertCheck(result == 0, "Check result, expected: 0, got: %i", result);
|
|
|
|
/* Check value */
|
|
text = SDL_getenv(name);
|
|
SDLTest_AssertPass("Call to SDL_getenv('%s')", name);
|
|
SDLTest_AssertCheck(text != NULL, "Verify returned text is not NULL");
|
|
if (text != NULL) {
|
|
SDLTest_AssertCheck(
|
|
SDL_strcmp(text, expected) == 0,
|
|
"Verify returned text, expected: %s, got: %s",
|
|
expected,
|
|
text);
|
|
}
|
|
|
|
/* Negative cases */
|
|
for (overwrite=0; overwrite <= 1; overwrite++) {
|
|
result = SDL_setenv(NULL, value1, overwrite);
|
|
SDLTest_AssertPass("Call to SDL_setenv(NULL,'%s', %i)", value1, overwrite);
|
|
SDLTest_AssertCheck(result == -1, "Check result, expected: -1, got: %i", result);
|
|
result = SDL_setenv("", value1, overwrite);
|
|
SDLTest_AssertPass("Call to SDL_setenv('','%s', %i)", value1, overwrite);
|
|
SDLTest_AssertCheck(result == -1, "Check result, expected: -1, got: %i", result);
|
|
result = SDL_setenv("=", value1, overwrite);
|
|
SDLTest_AssertPass("Call to SDL_setenv('=','%s', %i)", value1, overwrite);
|
|
SDLTest_AssertCheck(result == -1, "Check result, expected: -1, got: %i", result);
|
|
result = SDL_setenv(name, NULL, overwrite);
|
|
SDLTest_AssertPass("Call to SDL_setenv('%s', NULL, %i)", name, overwrite);
|
|
SDLTest_AssertCheck(result == -1, "Check result, expected: -1, got: %i", result);
|
|
}
|
|
|
|
/* Clean up */
|
|
SDL_free(value1);
|
|
SDL_free(value2);
|
|
|
|
return TEST_COMPLETED;
|
|
}
|
|
|
|
/* ================= Test References ================== */
|
|
|
|
/* Standard C routine test cases */
|
|
static const SDLTest_TestCaseReference stdlibTest1 =
|
|
{ (SDLTest_TestCaseFp)stdlib_strlcpy, "stdlib_strlcpy", "Call to SDL_strlcpy", TEST_ENABLED };
|
|
|
|
static const SDLTest_TestCaseReference stdlibTest2 =
|
|
{ (SDLTest_TestCaseFp)stdlib_snprintf, "stdlib_snprintf", "Call to SDL_snprintf", TEST_ENABLED };
|
|
|
|
static const SDLTest_TestCaseReference stdlibTest3 =
|
|
{ (SDLTest_TestCaseFp)stdlib_getsetenv, "stdlib_getsetenv", "Call to SDL_getenv and SDL_setenv", TEST_ENABLED };
|
|
|
|
/* Sequence of Standard C routine test cases */
|
|
static const SDLTest_TestCaseReference *stdlibTests[] = {
|
|
&stdlibTest1, &stdlibTest2, &stdlibTest3, NULL
|
|
};
|
|
|
|
/* Timer test suite (global) */
|
|
SDLTest_TestSuiteReference stdlibTestSuite = {
|
|
"Stdlib",
|
|
NULL,
|
|
stdlibTests,
|
|
NULL
|
|
};
|