Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_prepare_sqlite3LockAndPrepare.c178 linesDownload Raw Back to tests
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdlib.h>5#include <ctype.h>6 7/* Wrapper provided in the module under test */8int test_sqlite3LockAndPrepare(sqlite3 *db, const char *zSql, int nBytes, u32 prepFlags, Vdbe *pOld, sqlite3_stmt **ppStmt, const char **pzTail);9 10static const char* skip_ws(const char *p){11  while( p && *p && isspace((unsigned char)*p) ) p++;12  return p;13}14 15void setUp(void) {16  /* Setup code here, or leave empty */17}18 19void tearDown(void) {20  /* Cleanup code here, or leave empty */21}22 23void test_sqlite3LockAndPrepare_basic_select(void) {24  sqlite3 *db = NULL;25  sqlite3_stmt *stmt = NULL;26  const char *tail = NULL;27  int rc;28 29  TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));30  TEST_ASSERT_NOT_NULL(db);31 32  const char *sql = "SELECT 1";33  rc = test_sqlite3LockAndPrepare(db, sql, -1, 0, NULL, &stmt, &tail);34 35  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);36  TEST_ASSERT_NOT_NULL(stmt);37  TEST_ASSERT_NOT_NULL(tail);38  TEST_ASSERT_EQUAL_PTR(sql + strlen(sql), tail);39 40  sqlite3_finalize(stmt);41  sqlite3_close(db);42}43 44void test_sqlite3LockAndPrepare_tail_multiple_statements(void) {45  sqlite3 *db = NULL;46  sqlite3_stmt *stmt = NULL;47  const char *tail = NULL;48  int rc;49 50  TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));51  TEST_ASSERT_NOT_NULL(db);52 53  const char *sql = "SELECT 1; SELECT 2";54  rc = test_sqlite3LockAndPrepare(db, sql, -1, 0, NULL, &stmt, &tail);55 56  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);57  TEST_ASSERT_NOT_NULL(stmt);58  TEST_ASSERT_NOT_NULL(tail);59 60  /* Tail should point somewhere after the end of the first statement */61  const char *t = skip_ws(tail);62  TEST_ASSERT_TRUE_MESSAGE(t >= sql && t <= sql + strlen(sql),63                           "Tail pointer out of bounds");64  TEST_ASSERT_TRUE_MESSAGE(strncmp(t, "SELECT 2", 8) == 0,65                           "Tail does not point to start of second statement");66 67  sqlite3_finalize(stmt);68  sqlite3_close(db);69}70 71void test_sqlite3LockAndPrepare_invalid_sql_error(void) {72  sqlite3 *db = NULL;73  sqlite3_stmt *stmt = NULL;74  const char *tail = NULL;75  int rc;76 77  TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));78  TEST_ASSERT_NOT_NULL(db);79 80  const char *sql = "SELCT 1"; /* Intentional syntax error (SELECT misspelled) */81  rc = test_sqlite3LockAndPrepare(db, sql, -1, 0, NULL, &stmt, &tail);82 83  TEST_ASSERT_NOT_EQUAL_INT(SQLITE_OK, rc);84  TEST_ASSERT_NULL(stmt);85 86  sqlite3_close(db);87}88 89void test_sqlite3LockAndPrepare_null_sql_misuse(void) {90  sqlite3 *db = NULL;91  sqlite3_stmt *stmt = NULL;92  const char *tail = NULL;93  int rc;94 95  TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));96  TEST_ASSERT_NOT_NULL(db);97 98  rc = test_sqlite3LockAndPrepare(db, NULL, -1, 0, NULL, &stmt, &tail);99 100  TEST_ASSERT_EQUAL_INT(SQLITE_MISUSE, rc);101  TEST_ASSERT_NULL(stmt);102 103  sqlite3_close(db);104}105 106void test_sqlite3LockAndPrepare_nbytes_truncation_tail(void) {107  sqlite3 *db = NULL;108  sqlite3_stmt *stmt = NULL;109  const char *tail = NULL;110  int rc;111 112  TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));113  TEST_ASSERT_NOT_NULL(db);114 115  const char *sql = "SELECT 1;SELECT 2";116  int nFirst = (int)strlen("SELECT 1;");117  rc = test_sqlite3LockAndPrepare(db, sql, nFirst, 0, NULL, &stmt, &tail);118 119  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);120  TEST_ASSERT_NOT_NULL(stmt);121  TEST_ASSERT_NOT_NULL(tail);122  /* Since nBytes limits to just "SELECT 1;", tail should equal sql + nFirst */123  TEST_ASSERT_EQUAL_PTR(sql + nFirst, tail);124 125  sqlite3_finalize(stmt);126  sqlite3_close(db);127}128 129void test_sqlite3LockAndPrepare_prepare_persistent_flag(void) {130  sqlite3 *db = NULL;131  sqlite3_stmt *stmt = NULL;132  const char *tail = NULL;133  int rc;134 135  TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));136  TEST_ASSERT_NOT_NULL(db);137 138  const char *sql = "SELECT 42";139  rc = test_sqlite3LockAndPrepare(db, sql, -1, SQLITE_PREPARE_PERSISTENT, NULL, &stmt, &tail);140 141  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);142  TEST_ASSERT_NOT_NULL(stmt);143  TEST_ASSERT_NOT_NULL(tail);144  TEST_ASSERT_EQUAL_PTR(sql + strlen(sql), tail);145 146  sqlite3_finalize(stmt);147  sqlite3_close(db);148}149 150void test_sqlite3LockAndPrepare_null_tail_pointer_ok(void) {151  sqlite3 *db = NULL;152  sqlite3_stmt *stmt = NULL;153  int rc;154 155  TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));156  TEST_ASSERT_NOT_NULL(db);157 158  const char *sql = "SELECT 'x'";159  rc = test_sqlite3LockAndPrepare(db, sql, -1, 0, NULL, &stmt, NULL);160 161  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);162  TEST_ASSERT_NOT_NULL(stmt);163 164  sqlite3_finalize(stmt);165  sqlite3_close(db);166}167 168int main(void) {169  UNITY_BEGIN();170  RUN_TEST(test_sqlite3LockAndPrepare_basic_select);171  RUN_TEST(test_sqlite3LockAndPrepare_tail_multiple_statements);172  RUN_TEST(test_sqlite3LockAndPrepare_invalid_sql_error);173  RUN_TEST(test_sqlite3LockAndPrepare_null_sql_misuse);174  RUN_TEST(test_sqlite3LockAndPrepare_nbytes_truncation_tail);175  RUN_TEST(test_sqlite3LockAndPrepare_prepare_persistent_flag);176  RUN_TEST(test_sqlite3LockAndPrepare_null_tail_pointer_ok);177  return UNITY_END();178}