AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4 5static sqlite3 *gDb = NULL;6static Btree *gBt = NULL;7 8void setUp(void) {9 int rc = sqlite3_open(":memory:", &gDb);10 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);11 TEST_ASSERT_NOT_NULL(gDb);12 13 /* Get the internal Btree for the main database */14 TEST_ASSERT_TRUE(gDb->nDb > 0);15 gBt = gDb->aDb[0].pBt;16 TEST_ASSERT_NOT_NULL(gBt);17 18 /* Begin a write transaction */19 rc = sqlite3BtreeBeginTrans(gBt, 1, 0);20 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);21}22 23void tearDown(void) {24 /* Close the database connection (ends any open transactions) */25 if (gDb) {26 sqlite3_close(gDb);27 gDb = NULL;28 }29 gBt = NULL;30}31 32/* Helper to read a meta slot */33static u32 read_meta(int idx){34 u32 v = 0xFFFFFFFF;35 sqlite3BtreeGetMeta(gBt, idx, &v);36 return v;37}38 39void test_sqlite3BtreeUpdateMeta_basic_updates(void) {40 int rc;41 u32 idx = 15; /* Any valid meta index in 1..15 */42 u32 val = 0x12345678;43 44 rc = sqlite3BtreeUpdateMeta(gBt, (int)idx, val);45 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);46 47 u32 got = read_meta((int)idx);48 TEST_ASSERT_EQUAL_HEX32(val, got);49}50 51void test_sqlite3BtreeUpdateMeta_multiple_indices(void) {52 int rc;53 u32 idxA = 5;54 u32 idxB = 15;55 u32 valA = 0x0ABCDEF0u;56 u32 valB = 0x00FEDCBAu;57 58 rc = sqlite3BtreeUpdateMeta(gBt, (int)idxA, valA);59 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);60 rc = sqlite3BtreeUpdateMeta(gBt, (int)idxB, valB);61 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);62 63 u32 gotA = read_meta((int)idxA);64 u32 gotB = read_meta((int)idxB);65 TEST_ASSERT_EQUAL_HEX32(valA, gotA);66 TEST_ASSERT_EQUAL_HEX32(valB, gotB);67}68 69void test_sqlite3BtreeUpdateMeta_incrvacuum_updates_flag(void) {70 /* idx 7 is BTREE_INCR_VACUUM according to the code usage:71 pBt->incrVacuum = (get4byte(&zDbHeader[36 + 7*4])?1:0);72 We'll set it to 0 (always allowed). */73 int rc;74 u32 idxIncrVac = 7;75 u32 val = 0; /* Safe even if auto-vacuum is disabled */76 77 rc = sqlite3BtreeUpdateMeta(gBt, (int)idxIncrVac, val);78 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);79 80 /* Meta content should reflect val */81 u32 got = read_meta((int)idxIncrVac);82 TEST_ASSERT_EQUAL_HEX32(val, got);83 84#ifndef SQLITE_OMIT_AUTOVACUUM85 /* If autovacuum is compiled in, pBt->incrVacuum should be updated */86 TEST_ASSERT_NOT_NULL(gBt->pBt);87 /* val==0 implies incrVacuum==0 */88 TEST_ASSERT_EQUAL_INT(0, gBt->pBt->incrVacuum);89#endif90}91 92void test_sqlite3BtreeUpdateMeta_persists_across_commit(void) {93 int rc;94 u32 idx = 12;95 u32 val = 0xCAFEBABE;96 97 rc = sqlite3BtreeUpdateMeta(gBt, (int)idx, val);98 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);99 100 /* Commit the write transaction */101 rc = sqlite3BtreeCommit(gBt);102 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);103 104 /* Open a read transaction and verify the value persists */105 rc = sqlite3BtreeBeginTrans(gBt, 0, 0);106 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);107 108 u32 got = read_meta((int)idx);109 TEST_ASSERT_EQUAL_HEX32(val, got);110}111 112int main(void) {113 UNITY_BEGIN();114 RUN_TEST(test_sqlite3BtreeUpdateMeta_basic_updates);115 RUN_TEST(test_sqlite3BtreeUpdateMeta_multiple_indices);116 RUN_TEST(test_sqlite3BtreeUpdateMeta_incrvacuum_updates_flag);117 RUN_TEST(test_sqlite3BtreeUpdateMeta_persists_across_commit);118 return UNITY_END();119}