AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdlib.h>5#include <stdint.h>6 7/* Prototype for the test wrapper provided in the module */8int test_openDatabase(const char *zFilename, sqlite3 **ppDb, unsigned int flags, const char *zVfs);9 10void setUp(void) {11 /* No-op */12}13 14void tearDown(void) {15 /* No-op */16}17 18/* Helper to close db if non-NULL, ignore return */19static void close_if_open(sqlite3 *db){20 if( db ){21 sqlite3_close(db);22 }23}24 25/* 1) Basic successful open of an in-memory database */26void test_openDatabase_success_memory_basic(void) {27 sqlite3 *db = NULL;28 unsigned int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;29 30 int rc = test_openDatabase(":memory:", &db, flags, NULL);31 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);32 TEST_ASSERT_NOT_NULL(db);33 34 /* After a successful open, the db should be in OPEN state */35 TEST_ASSERT_EQUAL_INT(SQLITE_STATE_OPEN, db->eOpenState);36 37 /* Main and temp schemas should be initialized */38 TEST_ASSERT_NOT_NULL(db->aDb[0].pSchema);39 TEST_ASSERT_NOT_NULL(db->aDb[1].pSchema);40 41 /* Names should be "main" and "temp" respectively */42 TEST_ASSERT_NOT_NULL(db->aDb[0].zDbSName);43 TEST_ASSERT_NOT_NULL(db->aDb[1].zDbSName);44 TEST_ASSERT_EQUAL_STRING("main", db->aDb[0].zDbSName);45 TEST_ASSERT_EQUAL_STRING("temp", db->aDb[1].zDbSName);46 47 close_if_open(db);48}49 50/* 2) Flag sanitization: harmful bits removed; PRIVATECACHE honored vs SHAREDCACHE */51void test_openDatabase_flag_sanitization(void) {52 sqlite3 *db = NULL;53 54 /* Include bits that should be masked off plus a valid base access mode.55 PRIVATECACHE should remain and SHAREDCACHE must be cleared if PRIVATECACHE set. */56 unsigned int flags =57 SQLITE_OPEN_READWRITE |58 SQLITE_OPEN_CREATE |59 SQLITE_OPEN_NOMUTEX | /* should be masked off */60 SQLITE_OPEN_FULLMUTEX | /* should be masked off */61 SQLITE_OPEN_WAL | /* should be masked off */62 SQLITE_OPEN_PRIVATECACHE; /* should be preserved and should force SHAREDCACHE off */63 64 int rc = test_openDatabase(":memory:", &db, flags, NULL);65 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);66 TEST_ASSERT_NOT_NULL(db);67 68 /* openFlags should not contain masked bits */69 TEST_ASSERT_EQUAL_INT(0, (db->openFlags & SQLITE_OPEN_NOMUTEX));70 TEST_ASSERT_EQUAL_INT(0, (db->openFlags & SQLITE_OPEN_FULLMUTEX));71 TEST_ASSERT_EQUAL_INT(0, (db->openFlags & SQLITE_OPEN_WAL));72 73 /* PRIVATECACHE should be set, and SHAREDCACHE must be cleared */74 TEST_ASSERT_NOT_EQUAL(0, (db->openFlags & SQLITE_OPEN_PRIVATECACHE));75 TEST_ASSERT_EQUAL_INT(0, (db->openFlags & SQLITE_OPEN_SHAREDCACHE));76 77 /* Access mode should still be READWRITE|CREATE */78 TEST_ASSERT_NOT_EQUAL(0, (db->openFlags & SQLITE_OPEN_READWRITE));79 TEST_ASSERT_NOT_EQUAL(0, (db->openFlags & SQLITE_OPEN_CREATE));80 81 close_if_open(db);82}83 84/* 3) Invalid flags combination (no access-mode bits) -> SQLITE_MISUSE and SICK db */85void test_openDatabase_invalid_flags_misuse(void) {86 sqlite3 *db = NULL;87 unsigned int flags = 0; /* invalid: none of READONLY/READWRITE/CREATE set */88 89 int rc = test_openDatabase(":memory:", &db, flags, NULL);90 TEST_ASSERT_EQUAL_INT(SQLITE_MISUSE_BKPT, rc);91 TEST_ASSERT_NOT_NULL(db);92 93 /* The connection is created but marked sick */94 TEST_ASSERT_EQUAL_INT(SQLITE_STATE_SICK, db->eOpenState);95 96 /* sqlite3_errcode should reflect MISUSE on this handle */97 TEST_ASSERT_EQUAL_INT(SQLITE_MISUSE_BKPT, sqlite3_errcode(db));98 99 close_if_open(db);100}101 102/* 4) Unknown VFS name should yield SQLITE_ERROR and SICK db */103void test_openDatabase_unknown_vfs_error(void) {104 sqlite3 *db = NULL;105 unsigned int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;106 107 int rc = test_openDatabase(":memory:", &db, flags, "no_such_vfs");108 TEST_ASSERT_EQUAL_INT(SQLITE_ERROR, rc);109 TEST_ASSERT_NOT_NULL(db);110 111 TEST_ASSERT_EQUAL_INT(SQLITE_STATE_SICK, db->eOpenState);112 113 /* sqlite3_errcode should reflect the error */114 TEST_ASSERT_EQUAL_INT(SQLITE_ERROR, sqlite3_errcode(db));115 116 close_if_open(db);117}118 119/* 5) SQLITE_OPEN_EXRESCODE should enlarge the error mask */120void test_openDatabase_exrescode_errmask(void) {121 sqlite3 *db = NULL;122 123 /* Without EXRESCODE => errMask 0xff */124 {125 unsigned int flags_noex = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;126 int rc = test_openDatabase(":memory:", &db, flags_noex, NULL);127 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);128 TEST_ASSERT_NOT_NULL(db);129 TEST_ASSERT_EQUAL_HEX32(0x000000FFu, (unsigned)db->errMask);130 close_if_open(db);131 db = NULL;132 }133 134 /* With EXRESCODE => errMask 0xffffffff */135 {136 unsigned int flags_ex = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXRESCODE;137 int rc = test_openDatabase(":memory:", &db, flags_ex, NULL);138 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);139 TEST_ASSERT_NOT_NULL(db);140 TEST_ASSERT_EQUAL_HEX32(0xFFFFFFFFu, (unsigned)db->errMask);141 close_if_open(db);142 db = NULL;143 }144}145 146int main(void) {147 UNITY_BEGIN();148 RUN_TEST(test_openDatabase_success_memory_basic);149 RUN_TEST(test_openDatabase_flag_sanitization);150 RUN_TEST(test_openDatabase_invalid_flags_misuse);151 RUN_TEST(test_openDatabase_unknown_vfs_error);152 RUN_TEST(test_openDatabase_exrescode_errmask);153 return UNITY_END();154}