Team Ai
Modelpublic

AryaWu/sqlite

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