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