AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5 6/* Global database handle for tests */7static sqlite3 *gDb = NULL;8 9/* Sample callbacks to use in tests */10static void collNeededA(void *pArg, sqlite3 *db, int eTextRep, const char *zName){11 /* No-op; presence of this function serves as unique function pointer */12 (void)pArg; (void)db; (void)eTextRep; (void)zName;13}14static void collNeededB(void *pArg, sqlite3 *db, int eTextRep, const char *zName){15 /* No-op; presence of this function serves as unique function pointer */16 (void)pArg; (void)db; (void)eTextRep; (void)zName;17}18 19void setUp(void) {20 int rc = sqlite3_open(":memory:", &gDb);21 TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "Failed to open in-memory SQLite DB");22 TEST_ASSERT_NOT_NULL_MESSAGE(gDb, "sqlite3_open returned NULL db");23}24 25void tearDown(void) {26 if( gDb ){27 int rc = sqlite3_close(gDb);28 TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "Failed to close SQLite DB");29 gDb = NULL;30 }31}32 33/* Test: setting callback and argument, and clearing any prior xCollNeeded16 */34void test_sqlite3_collation_needed_sets_callback_and_arg_clears_16(void) {35 /* Pre-set xCollNeeded16 to a non-NULL value to verify it is cleared */36 gDb->xCollNeeded = NULL;37 gDb->xCollNeeded16 = (void*)0x1;38 gDb->pCollNeededArg = NULL;39 40 void *arg = (void*)0x1234;41 int rc = sqlite3_collation_needed(gDb, arg, collNeededA);42 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);43 TEST_ASSERT_EQUAL_PTR(collNeededA, gDb->xCollNeeded);44 TEST_ASSERT_NULL(gDb->xCollNeeded16);45 TEST_ASSERT_EQUAL_PTR(arg, gDb->pCollNeededArg);46}47 48/* Test: replacing an existing callback and argument */49void test_sqlite3_collation_needed_replaces_existing_values(void) {50 void *arg1 = (void*)0x1111;51 void *arg2 = (void*)0x2222;52 53 int rc1 = sqlite3_collation_needed(gDb, arg1, collNeededA);54 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc1);55 TEST_ASSERT_EQUAL_PTR(collNeededA, gDb->xCollNeeded);56 TEST_ASSERT_NULL(gDb->xCollNeeded16);57 TEST_ASSERT_EQUAL_PTR(arg1, gDb->pCollNeededArg);58 59 int rc2 = sqlite3_collation_needed(gDb, arg2, collNeededB);60 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc2);61 TEST_ASSERT_EQUAL_PTR(collNeededB, gDb->xCollNeeded);62 TEST_ASSERT_NULL(gDb->xCollNeeded16);63 TEST_ASSERT_EQUAL_PTR(arg2, gDb->pCollNeededArg);64}65 66/* Test: setting a NULL callback still clears 16-bit callback and sets arg */67void test_sqlite3_collation_needed_allows_null_callback(void) {68 /* Pre-set different values to ensure they are overwritten/cleared */69 gDb->xCollNeeded = collNeededA;70 gDb->xCollNeeded16 = (void*)0x1;71 gDb->pCollNeededArg = (void*)0xDEAD;72 73 void *arg = (void*)0xBEEF;74 int rc = sqlite3_collation_needed(gDb, arg, NULL);75 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);76 TEST_ASSERT_NULL(gDb->xCollNeeded);77 TEST_ASSERT_NULL(gDb->xCollNeeded16);78 TEST_ASSERT_EQUAL_PTR(arg, gDb->pCollNeededArg);79}80 81#ifdef SQLITE_ENABLE_API_ARMOR82/* Test: With API armor, passing a NULL db should return SQLITE_MISUSE_BKPT */83void test_sqlite3_collation_needed_null_db_returns_misuse_with_armor(void) {84 int rc = sqlite3_collation_needed(NULL, (void*)0x1, collNeededA);85 TEST_ASSERT_EQUAL_INT(SQLITE_MISUSE_BKPT, rc);86}87#endif88 89int main(void) {90 UNITY_BEGIN();91 RUN_TEST(test_sqlite3_collation_needed_sets_callback_and_arg_clears_16);92 RUN_TEST(test_sqlite3_collation_needed_replaces_existing_values);93 RUN_TEST(test_sqlite3_collation_needed_allows_null_callback);94 #ifdef SQLITE_ENABLE_API_ARMOR95 RUN_TEST(test_sqlite3_collation_needed_null_db_returns_misuse_with_armor);96 #endif97 return UNITY_END();98}