| #include "sqliteInt.h" |
| #include "unity.h" |
| #include <string.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
|
|
| extern int test_isAlterableTable(Parse *pParse, Table *pTab); |
|
|
| static void freeParseErrorIfAny(sqlite3 *db, Parse *pParse){ |
| if( pParse->zErrMsg ){ |
| sqlite3DbFree(db, pParse->zErrMsg); |
| pParse->zErrMsg = 0; |
| } |
| } |
|
|
| void setUp(void) { |
| |
| } |
|
|
| void tearDown(void) { |
| |
| } |
|
|
| |
| static void initParse(Parse *pParse, sqlite3 *db){ |
| memset(pParse, 0, sizeof(*pParse)); |
| pParse->db = db; |
| } |
|
|
| |
| static void initTable(Table *pTab, const char *zName, u32 flags){ |
| memset(pTab, 0, sizeof(*pTab)); |
| pTab->zName = (char*)zName; |
| pTab->tabFlags = flags; |
| } |
|
|
| void test_isAlterableTable_user_table_allowed(void){ |
| sqlite3 *db = 0; |
| Parse p; |
| Table t; |
| int rc; |
|
|
| TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); |
| initParse(&p, db); |
| initTable(&t, "t1", 0); |
|
|
| rc = test_isAlterableTable(&p, &t); |
| TEST_ASSERT_EQUAL_INT(0, rc); |
| TEST_ASSERT_NULL(p.zErrMsg); |
|
|
| sqlite3_close(db); |
| } |
|
|
| void test_isAlterableTable_system_table_denied(void){ |
| sqlite3 *db = 0; |
| Parse p; |
| Table t; |
| int rc; |
|
|
| TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); |
| initParse(&p, db); |
| initTable(&t, "sqlite_master", 0); |
|
|
| rc = test_isAlterableTable(&p, &t); |
| TEST_ASSERT_EQUAL_INT(1, rc); |
| TEST_ASSERT_NOT_NULL(p.zErrMsg); |
| |
| TEST_ASSERT_NOT_NULL(strstr(p.zErrMsg, "sqlite_master")); |
| TEST_ASSERT_NOT_NULL(strstr(p.zErrMsg, "may not be altered")); |
|
|
| freeParseErrorIfAny(db, &p); |
| sqlite3_close(db); |
| } |
|
|
| void test_isAlterableTable_system_table_case_insensitive_denied(void){ |
| sqlite3 *db = 0; |
| Parse p; |
| Table t; |
| int rc; |
|
|
| TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); |
| initParse(&p, db); |
| initTable(&t, "SQLite_TeMp123", 0); |
|
|
| rc = test_isAlterableTable(&p, &t); |
| TEST_ASSERT_EQUAL_INT(1, rc); |
| TEST_ASSERT_NOT_NULL(p.zErrMsg); |
| TEST_ASSERT_NOT_NULL(strstr(p.zErrMsg, "may not be altered")); |
|
|
| freeParseErrorIfAny(db, &p); |
| sqlite3_close(db); |
| } |
|
|
| #ifndef SQLITE_OMIT_VIRTUALTABLE |
| void test_isAlterableTable_eponymous_denied(void){ |
| sqlite3 *db = 0; |
| Parse p; |
| Table t; |
| int rc; |
|
|
| TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); |
| initParse(&p, db); |
| initTable(&t, "user_tab", TF_Eponymous); |
|
|
| rc = test_isAlterableTable(&p, &t); |
| TEST_ASSERT_EQUAL_INT(1, rc); |
| TEST_ASSERT_NOT_NULL(p.zErrMsg); |
| TEST_ASSERT_NOT_NULL(strstr(p.zErrMsg, "may not be altered")); |
|
|
| freeParseErrorIfAny(db, &p); |
| sqlite3_close(db); |
| } |
|
|
| void test_isAlterableTable_shadow_readonly_denied(void){ |
| sqlite3 *db = 0; |
| Parse p; |
| Table t; |
| int rc; |
| int old = 0; |
|
|
| TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); |
| |
| sqlite3_db_config(db, SQLITE_DBCONFIG_DEFENSIVE, 1, &old); |
|
|
| initParse(&p, db); |
| initTable(&t, "shadow_tab", TF_Shadow); |
|
|
| rc = test_isAlterableTable(&p, &t); |
| TEST_ASSERT_EQUAL_INT(1, rc); |
| TEST_ASSERT_NOT_NULL(p.zErrMsg); |
| TEST_ASSERT_NOT_NULL(strstr(p.zErrMsg, "may not be altered")); |
|
|
| freeParseErrorIfAny(db, &p); |
| |
| sqlite3_db_config(db, SQLITE_DBCONFIG_DEFENSIVE, old, 0); |
| sqlite3_close(db); |
| } |
|
|
| void test_isAlterableTable_shadow_writable_allowed(void){ |
| sqlite3 *db = 0; |
| Parse p; |
| Table t; |
| int rc; |
| int old = 0; |
|
|
| TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); |
| |
| sqlite3_db_config(db, SQLITE_DBCONFIG_DEFENSIVE, 0, &old); |
|
|
| initParse(&p, db); |
| initTable(&t, "shadow_tab2", TF_Shadow); |
|
|
| rc = test_isAlterableTable(&p, &t); |
| TEST_ASSERT_EQUAL_INT(0, rc); |
| TEST_ASSERT_NULL(p.zErrMsg); |
|
|
| |
| sqlite3_db_config(db, SQLITE_DBCONFIG_DEFENSIVE, old, 0); |
| sqlite3_close(db); |
| } |
| #endif |
|
|
| int main(void){ |
| UNITY_BEGIN(); |
| RUN_TEST(test_isAlterableTable_user_table_allowed); |
| RUN_TEST(test_isAlterableTable_system_table_denied); |
| RUN_TEST(test_isAlterableTable_system_table_case_insensitive_denied); |
| #ifndef SQLITE_OMIT_VIRTUALTABLE |
| RUN_TEST(test_isAlterableTable_eponymous_denied); |
| RUN_TEST(test_isAlterableTable_shadow_readonly_denied); |
| RUN_TEST(test_isAlterableTable_shadow_writable_allowed); |
| #endif |
| return UNITY_END(); |
| } |