AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <stdint.h>4#include <string.h>5#include <limits.h>6 7/* Save/restore global state across tests */8static sqlite3_int64 gSavedSoftLimit = 0;9static sqlite3_int64 gSavedHardLimit = 0;10 11/* A callback that would mark invocation if it were ever called */12static void cb_counter(void *pArg, sqlite3_int64 used, int N){13 (void)used;14 (void)N;15 if( pArg ){16 int *pCnt = (int*)pArg;17 (*pCnt)++;18 }19}20 21void setUp(void) {22 int rc = sqlite3_initialize();23 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);24 /* Capture current limits to restore in tearDown */25 gSavedSoftLimit = sqlite3_soft_heap_limit64(-1);26 gSavedHardLimit = sqlite3_hard_heap_limit64(-1);27}28 29void tearDown(void) {30 /* Restore limits so tests are independent */31 sqlite3_soft_heap_limit64(gSavedSoftLimit);32 sqlite3_hard_heap_limit64(gSavedHardLimit);33}34 35/* Basic: returns SQLITE_OK with null arguments */36void test_sqlite3_memory_alarm_returns_ok_nulls(void){37 int rc = sqlite3_memory_alarm(NULL, NULL, 0);38 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);39}40 41/* Callback should never be invoked */42void test_sqlite3_memory_alarm_never_calls_callback(void){43 int called = 0;44 int rc = sqlite3_memory_alarm(cb_counter, &called, 1000);45 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);46 TEST_ASSERT_EQUAL_INT(0, called);47}48 49/* No effect on soft heap limit */50void test_sqlite3_memory_alarm_no_effect_on_soft_heap_limit(void){51 /* Ensure no hard limit constrains the soft limit for this test */52 sqlite3_hard_heap_limit64(0);53 54 sqlite3_int64 newSoft = 1024*1024; /* 1 MiB */55 (void)sqlite3_soft_heap_limit64(newSoft);56 57 int rc = sqlite3_memory_alarm(cb_counter, NULL, 1234567890);58 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);59 60 sqlite3_int64 current = sqlite3_soft_heap_limit64(-1);61 TEST_ASSERT_EQUAL_INT64(newSoft, current);62}63 64/* Extreme thresholds and multiple calls remain no-ops */65void test_sqlite3_memory_alarm_extreme_values(void){66 int called = 0;67 sqlite3_int64 thresholds[] = {68 (sqlite3_int64)-1,69 (sqlite3_int64)0,70 (sqlite3_int64)1,71 (sqlite3_int64)100,72 (sqlite3_int64)1000000,73 (sqlite3_int64)LLONG_MAX74 };75 size_t i;76 for(i = 0; i < sizeof(thresholds)/sizeof(thresholds[0]); i++){77 called = 0;78 int rc = sqlite3_memory_alarm(cb_counter, &called, thresholds[i]);79 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);80 TEST_ASSERT_EQUAL_INT(0, called);81 }82}83 84/* Multiple sequential calls should not change memory limits */85void test_sqlite3_memory_alarm_multiple_calls_no_effect_on_soft_limit(void){86 sqlite3_int64 initialSoft = sqlite3_soft_heap_limit64(-1);87 88 int called = 0;89 (void)sqlite3_memory_alarm(cb_counter, &called, 10);90 (void)sqlite3_memory_alarm(cb_counter, &called, 0);91 (void)sqlite3_memory_alarm(cb_counter, &called, 999999);92 (void)sqlite3_memory_alarm(NULL, NULL, -1);93 94 TEST_ASSERT_EQUAL_INT(0, called);95 96 sqlite3_int64 currentSoft = sqlite3_soft_heap_limit64(-1);97 TEST_ASSERT_EQUAL_INT64(initialSoft, currentSoft);98}99 100int main(void){101 UNITY_BEGIN();102 RUN_TEST(test_sqlite3_memory_alarm_returns_ok_nulls);103 RUN_TEST(test_sqlite3_memory_alarm_never_calls_callback);104 RUN_TEST(test_sqlite3_memory_alarm_no_effect_on_soft_heap_limit);105 RUN_TEST(test_sqlite3_memory_alarm_extreme_values);106 RUN_TEST(test_sqlite3_memory_alarm_multiple_calls_no_effect_on_soft_limit);107 return UNITY_END();108}