AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdio.h>5 6/* Unity setup/teardown */7void setUp(void) {8 /* Ensure we start each test in a known state if needed. */9}10 11void tearDown(void) {12 /* Cleanup after tests if needed. */13}14 15/* Helper: check internal init flags when available */16static void assert_isInit_eq(int expected){17#ifndef SQLITE_OMIT_WSD18 TEST_ASSERT_EQUAL_INT(expected, sqlite3GlobalConfig.isInit);19#else20 (void)expected; /* No-op if WSD is omitted */21#endif22}23 24static void assert_init_mutex_clean(void){25#ifndef SQLITE_OMIT_WSD26 TEST_ASSERT_EQUAL_INT(0, sqlite3GlobalConfig.nRefInitMutex);27 TEST_ASSERT_NULL(sqlite3GlobalConfig.pInitMutex);28#endif29}30 31/* Test 1: Fresh initialization succeeds and sets expected state */32void test_sqlite3_initialize_fresh_ok(void){33 int rc;34 35 /* Ensure fresh state */36 (void)sqlite3_shutdown();37 38#ifndef SQLITE_OMIT_WSD39 /* After shutdown, SQLite should not be initialized */40 TEST_ASSERT_EQUAL_INT(0, sqlite3GlobalConfig.isInit);41 TEST_ASSERT_NULL(sqlite3GlobalConfig.pInitMutex);42 TEST_ASSERT_EQUAL_INT(0, sqlite3GlobalConfig.nRefInitMutex);43#endif44 45 rc = sqlite3_initialize();46 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);47 48 /* After initialization, SQLite should be marked initialized */49 assert_isInit_eq(1);50 51 /* pInitMutex should be cleaned up and not leaked after the call */52 assert_init_mutex_clean();53 54 /* VFS should be available after initialization */55 TEST_ASSERT_NOT_NULL(sqlite3_vfs_find(NULL));56 57 /* Cleanup: return to a shutdown state for isolation */58 (void)sqlite3_shutdown();59}60 61/* Test 2: Idempotent behavior - second call is a no-op returning SQLITE_OK */62void test_sqlite3_initialize_idempotent_noop(void){63 int rc;64 65 (void)sqlite3_shutdown();66 67 rc = sqlite3_initialize();68 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);69 assert_isInit_eq(1);70 assert_init_mutex_clean();71 72 /* Second call should be a fast no-op with SQLITE_OK */73 rc = sqlite3_initialize();74 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);75 assert_isInit_eq(1);76 assert_init_mutex_clean();77 78 (void)sqlite3_shutdown();79}80 81/* Test 3: Multiple shutdown/init cycles should work consistently */82void test_sqlite3_initialize_shutdown_reinit_cycle(void){83 int rc;84 int i;85 86 for(i = 0; i < 3; i++){87 (void)sqlite3_shutdown();88 assert_isInit_eq(0);89#ifndef SQLITE_OMIT_WSD90 TEST_ASSERT_NULL(sqlite3GlobalConfig.pInitMutex);91 TEST_ASSERT_EQUAL_INT(0, sqlite3GlobalConfig.nRefInitMutex);92#endif93 94 rc = sqlite3_initialize();95 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);96 assert_isInit_eq(1);97 assert_init_mutex_clean();98 99 /* Basic sanity: VFS should be present each time after init */100 TEST_ASSERT_NOT_NULL(sqlite3_vfs_find(NULL));101 }102 103 (void)sqlite3_shutdown();104 assert_isInit_eq(0);105#ifndef SQLITE_OMIT_WSD106 TEST_ASSERT_NULL(sqlite3GlobalConfig.pInitMutex);107 TEST_ASSERT_EQUAL_INT(0, sqlite3GlobalConfig.nRefInitMutex);108#endif109}110 111/* Test 4: Explicitly verify init-mutex cleanup invariant after init */112void test_sqlite3_initialize_mutex_cleanup_invariant(void){113 int rc;114 115 (void)sqlite3_shutdown();116 117#ifndef SQLITE_OMIT_WSD118 /* Ensure no leftover state from prior tests */119 sqlite3GlobalConfig.pInitMutex = 0;120 sqlite3GlobalConfig.nRefInitMutex = 0;121#endif122 123 rc = sqlite3_initialize();124 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);125 126 /* The initialization should not leave the internal init mutex held/allocated */127 assert_init_mutex_clean();128 129 (void)sqlite3_shutdown();130 assert_isInit_eq(0);131#ifndef SQLITE_OMIT_WSD132 TEST_ASSERT_NULL(sqlite3GlobalConfig.pInitMutex);133 TEST_ASSERT_EQUAL_INT(0, sqlite3GlobalConfig.nRefInitMutex);134#endif135}136 137/* Unity main */138int main(void){139 UNITY_BEGIN();140 RUN_TEST(test_sqlite3_initialize_fresh_ok);141 RUN_TEST(test_sqlite3_initialize_idempotent_noop);142 RUN_TEST(test_sqlite3_initialize_shutdown_reinit_cycle);143 RUN_TEST(test_sqlite3_initialize_mutex_cleanup_invariant);144 return UNITY_END();145}