| | #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(); |
| | } |