Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_btree_sqlite3BtreeCheckpoint.c127 linesDownload Raw Back to tests
1#include "sqliteInt.h"2#include "unity.h"3#include <sqlite3.h>4#include <string.h>5 6/* Helper to open an in-memory SQLite database and return both db and its Btree */7static void open_inmemory_db(sqlite3 **ppDb, Btree **ppBtree){8  int rc;9  sqlite3 *db = NULL;10  rc = sqlite3_open(":memory:", &db);11  TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "sqlite3_open failed");12  TEST_ASSERT_NOT_NULL(db);13  /* Main database handle is aDb[0].pBt */14  TEST_ASSERT_TRUE_MESSAGE(db->nDb > 0, "No database slots");15  TEST_ASSERT_NOT_NULL_MESSAGE(db->aDb[0].pBt, "Main Btree not initialized");16  *ppDb = db;17  *ppBtree = db->aDb[0].pBt;18}19 20static void close_db(sqlite3 *db){21  int rc = sqlite3_close(db);22  TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "sqlite3_close failed");23}24 25void setUp(void) {26  /* no-op */27}28void tearDown(void) {29  /* no-op */30}31 32/* Test: Passing NULL Btree returns SQLITE_OK and does not modify outputs */33void test_sqlite3BtreeCheckpoint_null_btree_returns_ok_and_no_change(void){34  int logCount = -12345;35  int ckptCount = -67890;36  int rc = sqlite3BtreeCheckpoint(NULL, SQLITE_CHECKPOINT_PASSIVE, &logCount, &ckptCount);37  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);38  TEST_ASSERT_EQUAL_INT(-12345, logCount);39  TEST_ASSERT_EQUAL_INT(-67890, ckptCount);40}41 42/* Test: When a read transaction is active, function returns SQLITE_LOCKED and outputs unchanged */43void test_sqlite3BtreeCheckpoint_locked_when_read_transaction_active(void){44  sqlite3 *db = NULL;45  Btree *pBt = NULL;46  open_inmemory_db(&db, &pBt);47 48  /* Begin a read transaction */49  int rc = sqlite3BtreeBeginTrans(pBt, 0, NULL); /* wrflag=0 => read transaction */50  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);51 52  int logCount = -1;53  int ckptCount = -1;54  rc = sqlite3BtreeCheckpoint(pBt, SQLITE_CHECKPOINT_PASSIVE, &logCount, &ckptCount);55  TEST_ASSERT_EQUAL_INT(SQLITE_LOCKED, rc);56  TEST_ASSERT_EQUAL_INT(-1, logCount);57  TEST_ASSERT_EQUAL_INT(-1, ckptCount);58 59  /* End the transaction */60  rc = sqlite3BtreeCommit(pBt);61  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);62 63  close_db(db);64}65 66/* Test: When a write transaction is active, function returns SQLITE_LOCKED and outputs unchanged */67void test_sqlite3BtreeCheckpoint_locked_when_write_transaction_active(void){68  sqlite3 *db = NULL;69  Btree *pBt = NULL;70  open_inmemory_db(&db, &pBt);71 72  /* Begin a write transaction */73  int rc = sqlite3BtreeBeginTrans(pBt, 1, NULL); /* wrflag=1 => write transaction */74  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);75 76  int logCount = -2;77  int ckptCount = -3;78  rc = sqlite3BtreeCheckpoint(pBt, SQLITE_CHECKPOINT_FULL, &logCount, &ckptCount);79  TEST_ASSERT_EQUAL_INT(SQLITE_LOCKED, rc);80  TEST_ASSERT_EQUAL_INT(-2, logCount);81  TEST_ASSERT_EQUAL_INT(-3, ckptCount);82 83  /* End the transaction */84  rc = sqlite3BtreeCommit(pBt);85  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);86 87  close_db(db);88}89 90/* Test: With no active transaction, checkpoint returns SQLITE_OK for various modes */91void test_sqlite3BtreeCheckpoint_ok_without_transaction_various_modes(void){92  sqlite3 *db = NULL;93  Btree *pBt = NULL;94  open_inmemory_db(&db, &pBt);95 96  /* Ensure we are not in a transaction */97  TEST_ASSERT_EQUAL_INT(TRANS_NONE, sqlite3BtreeTxnState(pBt));98 99  int logCount = -1, ckptCount = -1;100  int rc;101 102  /* PASSIVE */103  logCount = -1; ckptCount = -1;104  rc = sqlite3BtreeCheckpoint(pBt, SQLITE_CHECKPOINT_PASSIVE, &logCount, &ckptCount);105  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);106 107  /* FULL */108  logCount = -1; ckptCount = -1;109  rc = sqlite3BtreeCheckpoint(pBt, SQLITE_CHECKPOINT_FULL, &logCount, &ckptCount);110  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);111 112  /* RESTART */113  logCount = -1; ckptCount = -1;114  rc = sqlite3BtreeCheckpoint(pBt, SQLITE_CHECKPOINT_RESTART, &logCount, &ckptCount);115  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);116 117  close_db(db);118}119 120int main(void){121  UNITY_BEGIN();122  RUN_TEST(test_sqlite3BtreeCheckpoint_null_btree_returns_ok_and_no_change);123  RUN_TEST(test_sqlite3BtreeCheckpoint_locked_when_read_transaction_active);124  RUN_TEST(test_sqlite3BtreeCheckpoint_locked_when_write_transaction_active);125  RUN_TEST(test_sqlite3BtreeCheckpoint_ok_without_transaction_various_modes);126  return UNITY_END();127}