AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5 6/* Stable pArg values for tests */7static int g_arg1 = 0x1111;8static int g_arg2 = 0x2222;9static int g_arg3 = 0x3333;10 11/* Dummy trace callbacks */12static int testTraceCb1(unsigned m, void *pArg, void *p, void *x){13 /* No-op; safe if invoked by SQLite internally */14 (void)m; (void)pArg; (void)p; (void)x;15 return 0;16}17static int testTraceCb2(unsigned m, void *pArg, void *p, void *x){18 (void)m; (void)pArg; (void)p; (void)x;19 return 0;20}21 22void setUp(void) {23 /* Nothing needed */24}25void tearDown(void) {26 /* Nothing needed */27}28 29/* Helper to open an in-memory DB and assert success */30static sqlite3* open_memory_db(void){31 sqlite3 *db = NULL;32 int rc = sqlite3_open(":memory:", &db);33 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);34 TEST_ASSERT_NOT_NULL(db);35 return db;36}37 38/* Helper to safely close DB after disabling trace to avoid close-time callbacks */39static void disable_trace_and_close(sqlite3 *db){40 /* Disable tracing and clear callback prior to closing */41 (void)sqlite3_trace_v2(db, 0, 0, 0);42 (void)sqlite3_close(db);43}44 45void test_sqlite3_trace_v2_sets_fields_when_enabled(void){46 sqlite3 *db = open_memory_db();47 48 unsigned mask = 0x00000005u; /* arbitrary non-zero mask */49 void *arg = &g_arg1;50 51 int rc = sqlite3_trace_v2(db, mask, testTraceCb1, arg);52 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);53 TEST_ASSERT_EQUAL_UINT(mask, db->mTrace);54 TEST_ASSERT_TRUE(db->trace.xV2 == testTraceCb1);55 TEST_ASSERT_EQUAL_PTR(arg, db->pTraceArg);56 57 disable_trace_and_close(db);58}59 60void test_sqlite3_trace_v2_zero_mask_disables_even_with_callback(void){61 sqlite3 *db = open_memory_db();62 63 /* First, enable with non-zero to ensure we are clearing from a set state */64 (void)sqlite3_trace_v2(db, 0x0Fu, testTraceCb1, &g_arg1);65 66 /* Now call with mask==0 but non-NULL callback: should disable */67 void *arg = &g_arg2;68 int rc = sqlite3_trace_v2(db, 0, testTraceCb1, arg);69 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);70 TEST_ASSERT_EQUAL_UINT(0u, db->mTrace);71 TEST_ASSERT_NULL(db->trace.xV2);72 TEST_ASSERT_EQUAL_PTR(arg, db->pTraceArg);73 74 disable_trace_and_close(db);75}76 77void test_sqlite3_trace_v2_null_callback_disables_even_with_mask(void){78 sqlite3 *db = open_memory_db();79 80 /* First, enable with non-zero to ensure we are clearing from a set state */81 (void)sqlite3_trace_v2(db, 0x02u, testTraceCb1, &g_arg1);82 83 /* Now set with NULL callback and non-zero mask: should disable */84 void *arg = &g_arg3;85 int rc = sqlite3_trace_v2(db, 0xFFFFFFFFu, NULL, arg);86 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);87 TEST_ASSERT_EQUAL_UINT(0u, db->mTrace);88 TEST_ASSERT_NULL(db->trace.xV2);89 TEST_ASSERT_EQUAL_PTR(arg, db->pTraceArg);90 91 disable_trace_and_close(db);92}93 94void test_sqlite3_trace_v2_both_zero_clears_but_updates_pArg(void){95 sqlite3 *db = open_memory_db();96 97 /* Start with something set */98 (void)sqlite3_trace_v2(db, 0x01u, testTraceCb1, &g_arg1);99 100 /* Both zero clears trace but must update pArg */101 void *arg = &g_arg2;102 int rc = sqlite3_trace_v2(db, 0, 0, arg);103 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);104 TEST_ASSERT_EQUAL_UINT(0u, db->mTrace);105 TEST_ASSERT_NULL(db->trace.xV2);106 TEST_ASSERT_EQUAL_PTR(arg, db->pTraceArg);107 108 disable_trace_and_close(db);109}110 111void test_sqlite3_trace_v2_overwrite_existing_registration(void){112 sqlite3 *db = open_memory_db();113 114 unsigned mask1 = 0x01u;115 unsigned mask2 = 0x0Au; /* different from mask1 */116 void *arg1 = &g_arg1;117 void *arg2 = &g_arg2;118 119 int rc = sqlite3_trace_v2(db, mask1, testTraceCb1, arg1);120 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);121 TEST_ASSERT_EQUAL_UINT(mask1, db->mTrace);122 TEST_ASSERT_TRUE(db->trace.xV2 == testTraceCb1);123 TEST_ASSERT_EQUAL_PTR(arg1, db->pTraceArg);124 125 rc = sqlite3_trace_v2(db, mask2, testTraceCb2, arg2);126 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);127 TEST_ASSERT_EQUAL_UINT(mask2, db->mTrace);128 TEST_ASSERT_TRUE(db->trace.xV2 == testTraceCb2);129 TEST_ASSERT_EQUAL_PTR(arg2, db->pTraceArg);130 131 disable_trace_and_close(db);132}133 134void test_sqlite3_trace_v2_disable_after_enable(void){135 sqlite3 *db = open_memory_db();136 137 /* Enable */138 int rc = sqlite3_trace_v2(db, 0x04u, testTraceCb1, &g_arg1);139 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);140 TEST_ASSERT_NOT_NULL(db->trace.xV2);141 TEST_ASSERT_NOT_EQUAL(0u, db->mTrace);142 143 /* Disable and update pArg */144 rc = sqlite3_trace_v2(db, 0, 0, &g_arg3);145 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);146 TEST_ASSERT_EQUAL_UINT(0u, db->mTrace);147 TEST_ASSERT_NULL(db->trace.xV2);148 TEST_ASSERT_EQUAL_PTR(&g_arg3, db->pTraceArg);149 150 disable_trace_and_close(db);151}152 153int main(void){154 UNITY_BEGIN();155 RUN_TEST(test_sqlite3_trace_v2_sets_fields_when_enabled);156 RUN_TEST(test_sqlite3_trace_v2_zero_mask_disables_even_with_callback);157 RUN_TEST(test_sqlite3_trace_v2_null_callback_disables_even_with_mask);158 RUN_TEST(test_sqlite3_trace_v2_both_zero_clears_but_updates_pArg);159 RUN_TEST(test_sqlite3_trace_v2_overwrite_existing_registration);160 RUN_TEST(test_sqlite3_trace_v2_disable_after_enable);161 return UNITY_END();162}