AryaWu/sqlite
0
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}