Team Ai
Modelpublic

AryaWu/sqlite

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