AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdlib.h>5 6/* Wrapper for the static function under test (provided in module) */7extern int test_isSetNullAction(Parse *pParse, FKey *pFKey);8 9static void init_parse(Parse *p, sqlite3 *db){10 memset(p, 0, sizeof(*p));11 p->db = db;12}13 14static void init_db(sqlite3 *db){15 memset(db, 0, sizeof(*db));16}17 18void setUp(void) {19 /* No global setup required */20}21 22void tearDown(void) {23 /* No global teardown required */24}25 26/* Return 1 when pTop->pTriggerPrg->pTrigger == pFKey->apTrigger[0]27** and aAction[0] == OE_SetNull.28*/29void test_isSetNullAction_matches_apTrigger0_setnull(void) {30 sqlite3 db; init_db(&db);31 Parse top; init_parse(&top, &db);32 33 Trigger tr0, tr1;34 memset(&tr0, 0, sizeof(tr0));35 memset(&tr1, 0, sizeof(tr1));36 37 TriggerPrg prg;38 memset(&prg, 0, sizeof(prg));39 prg.pTrigger = &tr0;40 top.pTriggerPrg = &prg;41 42 FKey fk;43 memset(&fk, 0, sizeof(fk));44 fk.apTrigger[0] = &tr0;45 fk.apTrigger[1] = &tr1;46 fk.aAction[0] = OE_SetNull;47 fk.aAction[1] = OE_Restrict;48 49 db.flags &= ~SQLITE_FkNoAction; /* ensure assert condition satisfied */50 51 int rc = test_isSetNullAction(&top, &fk);52 TEST_ASSERT_EQUAL_INT(1, rc);53}54 55/* Return 1 when pTop->pTriggerPrg->pTrigger == pFKey->apTrigger[1]56** and aAction[1] == OE_SetNull.57*/58void test_isSetNullAction_matches_apTrigger1_setnull(void) {59 sqlite3 db; init_db(&db);60 Parse top; init_parse(&top, &db);61 62 Trigger tr0, tr1;63 memset(&tr0, 0, sizeof(tr0));64 memset(&tr1, 0, sizeof(tr1));65 66 TriggerPrg prg;67 memset(&prg, 0, sizeof(prg));68 prg.pTrigger = &tr1;69 top.pTriggerPrg = &prg;70 71 FKey fk;72 memset(&fk, 0, sizeof(fk));73 fk.apTrigger[0] = &tr0;74 fk.apTrigger[1] = &tr1;75 fk.aAction[0] = OE_Restrict;76 fk.aAction[1] = OE_SetNull;77 78 db.flags &= ~SQLITE_FkNoAction; /* ensure assert condition satisfied */79 80 int rc = test_isSetNullAction(&top, &fk);81 TEST_ASSERT_EQUAL_INT(1, rc);82}83 84/* Return 0 when no TriggerPrg is present. */85void test_isSetNullAction_no_triggerprg_returns_0(void) {86 sqlite3 db; init_db(&db);87 Parse top; init_parse(&top, &db);88 89 top.pTriggerPrg = NULL;90 91 Trigger tr0, tr1;92 memset(&tr0, 0, sizeof(tr0));93 memset(&tr1, 0, sizeof(tr1));94 95 FKey fk;96 memset(&fk, 0, sizeof(fk));97 fk.apTrigger[0] = &tr0;98 fk.apTrigger[1] = &tr1;99 fk.aAction[0] = OE_SetNull; /* even if SetNull, no TriggerPrg -> 0 */100 fk.aAction[1] = OE_SetNull;101 102 int rc = test_isSetNullAction(&top, &fk);103 TEST_ASSERT_EQUAL_INT(0, rc);104}105 106/* Return 0 when trigger matches but action is not SetNull. */107void test_isSetNullAction_matching_trigger_non_setnull_action_returns_0(void) {108 sqlite3 db; init_db(&db);109 Parse top; init_parse(&top, &db);110 111 Trigger tr0, tr1;112 memset(&tr0, 0, sizeof(tr0));113 memset(&tr1, 0, sizeof(tr1));114 115 TriggerPrg prg;116 memset(&prg, 0, sizeof(prg));117 prg.pTrigger = &tr0;118 top.pTriggerPrg = &prg;119 120 FKey fk;121 memset(&fk, 0, sizeof(fk));122 fk.apTrigger[0] = &tr0;123 fk.apTrigger[1] = &tr1;124 fk.aAction[0] = OE_Cascade; /* not SetNull */125 fk.aAction[1] = OE_Restrict;126 127 int rc = test_isSetNullAction(&top, &fk);128 TEST_ASSERT_EQUAL_INT(0, rc);129}130 131/* Return 0 when the current trigger does not match either FKey.apTrigger[]. */132void test_isSetNullAction_non_matching_trigger_returns_0(void) {133 sqlite3 db; init_db(&db);134 Parse top; init_parse(&top, &db);135 136 Trigger tr0, tr1, trOther;137 memset(&tr0, 0, sizeof(tr0));138 memset(&tr1, 0, sizeof(tr1));139 memset(&trOther, 0, sizeof(trOther));140 141 TriggerPrg prg;142 memset(&prg, 0, sizeof(prg));143 prg.pTrigger = &trOther; /* neither tr0 nor tr1 */144 top.pTriggerPrg = &prg;145 146 FKey fk;147 memset(&fk, 0, sizeof(fk));148 fk.apTrigger[0] = &tr0;149 fk.apTrigger[1] = &tr1;150 fk.aAction[0] = OE_SetNull;151 fk.aAction[1] = OE_SetNull;152 153 int rc = test_isSetNullAction(&top, &fk);154 TEST_ASSERT_EQUAL_INT(0, rc);155}156 157/* Ensure sqlite3ParseToplevel() behavior: child Parse points to a top-level Parse. */158void test_isSetNullAction_uses_toplevel_parse_context(void) {159 sqlite3 db; init_db(&db);160 Parse top; init_parse(&top, &db);161 Parse child; init_parse(&child, &db);162 child.pToplevel = ⊤163 164 Trigger tr0, tr1;165 memset(&tr0, 0, sizeof(tr0));166 memset(&tr1, 0, sizeof(tr1));167 168 TriggerPrg prg;169 memset(&prg, 0, sizeof(prg));170 prg.pTrigger = &tr1;171 top.pTriggerPrg = &prg;172 173 FKey fk;174 memset(&fk, 0, sizeof(fk));175 fk.apTrigger[0] = &tr0;176 fk.apTrigger[1] = &tr1;177 fk.aAction[0] = OE_Restrict;178 fk.aAction[1] = OE_SetNull;179 180 db.flags &= ~SQLITE_FkNoAction; /* ensure assert condition satisfied */181 182 int rc = test_isSetNullAction(&child, &fk);183 TEST_ASSERT_EQUAL_INT(1, rc);184}185 186/* If SQLITE_FkNoAction is set but conditions do not match, still return 0187 (and no assertion should be triggered). */188void test_isSetNullAction_fknoaction_flag_non_matching_returns_0(void) {189 sqlite3 db; init_db(&db);190 db.flags |= SQLITE_FkNoAction; /* set the flag; path should not assert since not matching */191 192 Parse top; init_parse(&top, &db);193 194 Trigger tr0, tr1, trOther;195 memset(&tr0, 0, sizeof(tr0));196 memset(&tr1, 0, sizeof(tr1));197 memset(&trOther, 0, sizeof(trOther));198 199 TriggerPrg prg;200 memset(&prg, 0, sizeof(prg));201 prg.pTrigger = &trOther; /* not matching either */202 top.pTriggerPrg = &prg;203 204 FKey fk;205 memset(&fk, 0, sizeof(fk));206 fk.apTrigger[0] = &tr0;207 fk.apTrigger[1] = &tr1;208 fk.aAction[0] = OE_SetNull;209 fk.aAction[1] = OE_SetNull;210 211 int rc = test_isSetNullAction(&top, &fk);212 TEST_ASSERT_EQUAL_INT(0, rc);213}214 215int main(void) {216 UNITY_BEGIN();217 RUN_TEST(test_isSetNullAction_matches_apTrigger0_setnull);218 RUN_TEST(test_isSetNullAction_matches_apTrigger1_setnull);219 RUN_TEST(test_isSetNullAction_no_triggerprg_returns_0);220 RUN_TEST(test_isSetNullAction_matching_trigger_non_setnull_action_returns_0);221 RUN_TEST(test_isSetNullAction_non_matching_trigger_returns_0);222 RUN_TEST(test_isSetNullAction_uses_toplevel_parse_context);223 RUN_TEST(test_isSetNullAction_fknoaction_flag_non_matching_returns_0);224 return UNITY_END();225}