AryaWu/sqlite
0
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}