AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5 6/* Unity setUp/tearDown */7void setUp(void) {8 /* No global setup required */9}10void tearDown(void) {11 /* No global teardown required */12}13 14/* Test: valid ms values should return SQLITE_OK and, if enabled, update fields */15void test_sqlite3_setlk_timeout_valid_ms_updates_and_ok(void) {16 sqlite3 *db = NULL;17 int rc = sqlite3_open(":memory:", &db);18 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);19 TEST_ASSERT_NOT_NULL(db);20 21 int flags = 0xA5A5;22 23 /* Call with a positive timeout */24 rc = sqlite3_setlk_timeout(db, 2000, flags);25 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);26 27#ifdef SQLITE_ENABLE_SETLK_TIMEOUT28 /* When feature is enabled, the db fields should reflect the call */29 TEST_ASSERT_EQUAL_INT(2000, db->setlkTimeout);30 TEST_ASSERT_EQUAL_INT(flags, db->setlkFlags);31#endif32 33 /* Call with zero timeout */34 rc = sqlite3_setlk_timeout(db, 0, flags + 1);35 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);36 37#ifdef SQLITE_ENABLE_SETLK_TIMEOUT38 TEST_ASSERT_EQUAL_INT(0, db->setlkTimeout);39 TEST_ASSERT_EQUAL_INT(flags + 1, db->setlkFlags);40#endif41 42 /* Call with -1 (special value) */43 rc = sqlite3_setlk_timeout(db, -1, 0);44 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);45 46#ifdef SQLITE_ENABLE_SETLK_TIMEOUT47 TEST_ASSERT_EQUAL_INT(-1, db->setlkTimeout);48 TEST_ASSERT_EQUAL_INT(0, db->setlkFlags);49#endif50 51 sqlite3_close(db);52}53 54/* Test: ms < -1 returns SQLITE_RANGE and does not modify fields if feature is enabled */55void test_sqlite3_setlk_timeout_ms_less_than_minus1_is_range_and_no_change(void) {56 sqlite3 *db = NULL;57 int rc = sqlite3_open(":memory:", &db);58 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);59 TEST_ASSERT_NOT_NULL(db);60 61#ifdef SQLITE_ENABLE_SETLK_TIMEOUT62 /* Initialize fields to known values to verify they are unchanged on error */63 db->setlkTimeout = 123;64 db->setlkFlags = 0x55AA;65#endif66 67 rc = sqlite3_setlk_timeout(db, -2, 0xFFFF);68 TEST_ASSERT_EQUAL_INT(SQLITE_RANGE, rc);69 70#ifdef SQLITE_ENABLE_SETLK_TIMEOUT71 TEST_ASSERT_EQUAL_INT(123, db->setlkTimeout);72 TEST_ASSERT_EQUAL_INT(0x55AA, db->setlkFlags);73#endif74 75 sqlite3_close(db);76}77 78/* Test: NULL db behavior.79 - With API armor: expect SQLITE_MISUSE_BKPT.80 - Without SETLK feature: db is unused; expect SQLITE_OK.81 Do not compile this test in the potentially unsafe combination:82 SETLK enabled but API armor disabled (could dereference NULL). */83#if defined(SQLITE_ENABLE_API_ARMOR) || !defined(SQLITE_ENABLE_SETLK_TIMEOUT)84void test_sqlite3_setlk_timeout_null_db_behavior(void) {85 int rc;86 87#if defined(SQLITE_ENABLE_API_ARMOR)88 rc = sqlite3_setlk_timeout(NULL, 0, 0);89 TEST_ASSERT_EQUAL_INT(SQLITE_MISUSE_BKPT, rc);90 91 /* Also check that range check is not reached before armor; with invalid ms it still should be MISUSE_BKPT */92 rc = sqlite3_setlk_timeout(NULL, -2, 0);93 TEST_ASSERT_EQUAL_INT(SQLITE_MISUSE_BKPT, rc);94#else95 /* SETLK feature not enabled: function does not deref db and should return OK for valid ms */96 rc = sqlite3_setlk_timeout(NULL, 0, 0);97 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);98 99 /* But for ms < -1, range error occurs irrespective of db */100 rc = sqlite3_setlk_timeout(NULL, -3, 0);101 TEST_ASSERT_EQUAL_INT(SQLITE_RANGE, rc);102#endif103}104#endif105 106int main(void) {107 UNITY_BEGIN();108 109 RUN_TEST(test_sqlite3_setlk_timeout_valid_ms_updates_and_ok);110 RUN_TEST(test_sqlite3_setlk_timeout_ms_less_than_minus1_is_range_and_no_change);111#if defined(SQLITE_ENABLE_API_ARMOR) || !defined(SQLITE_ENABLE_SETLK_TIMEOUT)112 RUN_TEST(test_sqlite3_setlk_timeout_null_db_behavior);113#endif114 115 return UNITY_END();116}