Team Ai
Modelpublic

AryaWu/sqlite

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