Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_main_sqlite3_initialize.c145 linesDownload Raw Back to tests
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}