Team Ai
Modelpublic

AryaWu/sqlite

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