AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5#include <stdio.h>6 7static void initParse(Parse *p, sqlite3 *db){8 memset(p, 0, sizeof(*p));9 p->db = db;10}11 12static void freeParseZErrMsg(Parse *p){13 if( p && p->zErrMsg ){14 sqlite3DbFree(p->db, p->zErrMsg);15 p->zErrMsg = 0;16 }17}18 19void setUp(void) {20 /* Setup code here, or leave empty */21}22 23void tearDown(void) {24 /* Cleanup code here, or leave empty */25}26 27void test_sqlite3ExprCheckHeight_OK_below_limit(void){28 sqlite3 *db = 0;29 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));30 TEST_ASSERT_NOT_NULL(db);31 32 Parse p;33 initParse(&p, db);34 35 int newLimit = 50;36 (void)sqlite3_limit(db, SQLITE_LIMIT_EXPR_DEPTH, newLimit);37 38 int rc = sqlite3ExprCheckHeight(&p, 40);39 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);40 TEST_ASSERT_EQUAL_PTR(NULL, p.zErrMsg);41 42 freeParseZErrMsg(&p);43 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_close(db));44}45 46void test_sqlite3ExprCheckHeight_OK_at_limit(void){47 sqlite3 *db = 0;48 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));49 TEST_ASSERT_NOT_NULL(db);50 51 Parse p;52 initParse(&p, db);53 54 int newLimit = 10;55 (void)sqlite3_limit(db, SQLITE_LIMIT_EXPR_DEPTH, newLimit);56 57 int rc = sqlite3ExprCheckHeight(&p, newLimit);58 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);59 TEST_ASSERT_EQUAL_PTR(NULL, p.zErrMsg);60 61 freeParseZErrMsg(&p);62 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_close(db));63}64 65void test_sqlite3ExprCheckHeight_Error_above_limit_and_message(void){66 sqlite3 *db = 0;67 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));68 TEST_ASSERT_NOT_NULL(db);69 70 Parse p;71 initParse(&p, db);72 73 int newLimit = 15;74 (void)sqlite3_limit(db, SQLITE_LIMIT_EXPR_DEPTH, newLimit);75 76 int rc = sqlite3ExprCheckHeight(&p, newLimit + 1);77 TEST_ASSERT_EQUAL_INT(SQLITE_ERROR, rc);78 TEST_ASSERT_NOT_NULL(p.zErrMsg);79 80 char expected[128];81 snprintf(expected, sizeof(expected),82 "Expression tree is too large (maximum depth %d)", newLimit);83 TEST_ASSERT_EQUAL_STRING(expected, p.zErrMsg);84 85 freeParseZErrMsg(&p);86 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_close(db));87}88 89void test_sqlite3ExprCheckHeight_Limit_zero_behavior(void){90 sqlite3 *db = 0;91 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));92 TEST_ASSERT_NOT_NULL(db);93 94 Parse p;95 initParse(&p, db);96 97 (void)sqlite3_limit(db, SQLITE_LIMIT_EXPR_DEPTH, 0);98 99 /* nHeight == 0 should be OK */100 int rc0 = sqlite3ExprCheckHeight(&p, 0);101 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc0);102 TEST_ASSERT_EQUAL_PTR(NULL, p.zErrMsg);103 104 /* nHeight > 0 should be ERROR */105 int rc1 = sqlite3ExprCheckHeight(&p, 1);106 TEST_ASSERT_EQUAL_INT(SQLITE_ERROR, rc1);107 TEST_ASSERT_NOT_NULL(p.zErrMsg);108 109 char expected[128];110 snprintf(expected, sizeof(expected),111 "Expression tree is too large (maximum depth %d)", 0);112 TEST_ASSERT_EQUAL_STRING(expected, p.zErrMsg);113 114 freeParseZErrMsg(&p);115 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_close(db));116}117 118void test_sqlite3ExprCheckHeight_DoesNotClobberExistingMessageOnSuccess(void){119 sqlite3 *db = 0;120 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));121 TEST_ASSERT_NOT_NULL(db);122 123 Parse p;124 initParse(&p, db);125 126 (void)sqlite3_limit(db, SQLITE_LIMIT_EXPR_DEPTH, 8);127 128 /* Seed an existing error message */129 p.zErrMsg = sqlite3DbStrDup(db, "prior-message");130 TEST_ASSERT_NOT_NULL(p.zErrMsg);131 132 /* Call with OK case; should not change zErrMsg */133 int rc = sqlite3ExprCheckHeight(&p, 3);134 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);135 TEST_ASSERT_NOT_NULL(p.zErrMsg);136 TEST_ASSERT_EQUAL_STRING("prior-message", p.zErrMsg);137 138 freeParseZErrMsg(&p);139 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_close(db));140}141 142void test_sqlite3ExprCheckHeight_NegativeHeight_OK(void){143 sqlite3 *db = 0;144 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));145 TEST_ASSERT_NOT_NULL(db);146 147 Parse p;148 initParse(&p, db);149 150 (void)sqlite3_limit(db, SQLITE_LIMIT_EXPR_DEPTH, 5);151 152 int rc = sqlite3ExprCheckHeight(&p, -10);153 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);154 TEST_ASSERT_EQUAL_PTR(NULL, p.zErrMsg);155 156 freeParseZErrMsg(&p);157 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_close(db));158}159 160int main(void){161 UNITY_BEGIN();162 RUN_TEST(test_sqlite3ExprCheckHeight_OK_below_limit);163 RUN_TEST(test_sqlite3ExprCheckHeight_OK_at_limit);164 RUN_TEST(test_sqlite3ExprCheckHeight_Error_above_limit_and_message);165 RUN_TEST(test_sqlite3ExprCheckHeight_Limit_zero_behavior);166 RUN_TEST(test_sqlite3ExprCheckHeight_DoesNotClobberExistingMessageOnSuccess);167 RUN_TEST(test_sqlite3ExprCheckHeight_NegativeHeight_OK);168 return UNITY_END();169}