AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdlib.h>5 6/* Wrapper provided in the module for the static function */7extern int test_isValidSchemaTableName(const char *zTab, Table *pTab, const char *zDb);8 9static void initTable(Table *pTab, const char *zName){10 memset(pTab, 0, sizeof(*pTab));11 pTab->tnum = 1; /* Required by the target function (assert) */12 pTab->zName = (char*)zName; /* Safe: function only reads the name */13}14 15void setUp(void) {16 /* No global setup required */17}18 19void tearDown(void) {20 /* No global teardown required */21}22 23/* Non "sqlite_" prefix should always be rejected */24void test_isValidSchemaTableName_rejects_non_sqlite_prefix(void) {25 Table t;26 initTable(&t, PREFERRED_SCHEMA_TABLE);27 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName("mytable", &t, NULL));28 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName("sqlitex_schema", &t, NULL));29}30 31/* Preferred main schema name should be accepted for non-legacy-temp pTab names */32void test_isValidSchemaTableName_accepts_preferred_schema_for_main(void) {33 Table t1, t2, t3;34 initTable(&t1, PREFERRED_SCHEMA_TABLE);35 initTable(&t2, LEGACY_SCHEMA_TABLE);36 initTable(&t3, PREFERRED_TEMP_SCHEMA_TABLE);37 38 /* Case-insensitive acceptance of preferred schema name */39 TEST_ASSERT_EQUAL_INT(1, test_isValidSchemaTableName(PREFERRED_SCHEMA_TABLE, &t1, NULL));40 TEST_ASSERT_EQUAL_INT(1, test_isValidSchemaTableName("SQLITE_SCHEMA", &t1, NULL));41 42 TEST_ASSERT_EQUAL_INT(1, test_isValidSchemaTableName(PREFERRED_SCHEMA_TABLE, &t2, NULL));43 TEST_ASSERT_EQUAL_INT(1, test_isValidSchemaTableName("SqlItE_ScHeMa", &t2, NULL));44 45 /* Even if pTab is preferred temp schema, only preferred main schema name matches in the else-branch */46 TEST_ASSERT_EQUAL_INT(1, test_isValidSchemaTableName(PREFERRED_SCHEMA_TABLE, &t3, NULL));47}48 49/* Legacy main schema input is not accepted for non-legacy-temp pTab names */50void test_isValidSchemaTableName_rejects_legacy_master_for_non_legacy_temp_targets(void) {51 Table t1, t2, t3;52 initTable(&t1, PREFERRED_SCHEMA_TABLE);53 initTable(&t2, LEGACY_SCHEMA_TABLE);54 initTable(&t3, PREFERRED_TEMP_SCHEMA_TABLE);55 56 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName(LEGACY_SCHEMA_TABLE, &t1, NULL));57 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName(LEGACY_SCHEMA_TABLE, &t2, NULL));58 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName("SQLITE_MASTER", &t3, NULL));59}60 61/* Legacy temp schema target handling */62void test_isValidSchemaTableName_legacy_temp_accepts_preferred_temp_unconditionally(void) {63 Table t;64 initTable(&t, LEGACY_TEMP_SCHEMA_TABLE);65 66 TEST_ASSERT_EQUAL_INT(1, test_isValidSchemaTableName(PREFERRED_TEMP_SCHEMA_TABLE, &t, NULL));67 TEST_ASSERT_EQUAL_INT(1, test_isValidSchemaTableName("SQLITE_TEMP_SCHEMA", &t, NULL));68}69 70/* Legacy temp schema target requires zDb qualifier for main schema synonyms */71void test_isValidSchemaTableName_legacy_temp_requires_db_for_main_schema_names(void) {72 Table t;73 initTable(&t, LEGACY_TEMP_SCHEMA_TABLE);74 75 /* Without zDb qualifier -> reject */76 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName(PREFERRED_SCHEMA_TABLE, &t, NULL));77 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName(LEGACY_SCHEMA_TABLE, &t, NULL));78 79 /* With zDb qualifier (any non-NULL string) -> accept */80 TEST_ASSERT_EQUAL_INT(1, test_isValidSchemaTableName(PREFERRED_SCHEMA_TABLE, &t, "temp"));81 TEST_ASSERT_EQUAL_INT(1, test_isValidSchemaTableName(LEGACY_SCHEMA_TABLE, &t, "temp"));82}83 84/* Legacy temp schema target never accepts legacy temp name as input */85void test_isValidSchemaTableName_legacy_temp_never_accepts_legacy_temp_name(void) {86 Table t;87 initTable(&t, LEGACY_TEMP_SCHEMA_TABLE);88 89 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName(LEGACY_TEMP_SCHEMA_TABLE, &t, NULL));90 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName(LEGACY_TEMP_SCHEMA_TABLE, &t, "temp"));91 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName("SQLITE_TEMP_MASTER", &t, "temp"));92}93 94/* Preferred temp pTab name behaves like non-legacy-temp branch (only preferred main schema accepted) */95void test_isValidSchemaTableName_preferred_temp_target_behavior(void) {96 Table t;97 initTable(&t, PREFERRED_TEMP_SCHEMA_TABLE);98 99 TEST_ASSERT_EQUAL_INT(1, test_isValidSchemaTableName(PREFERRED_SCHEMA_TABLE, &t, NULL));100 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName(PREFERRED_TEMP_SCHEMA_TABLE, &t, NULL));101 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName(LEGACY_SCHEMA_TABLE, &t, "main"));102 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName(LEGACY_TEMP_SCHEMA_TABLE, &t, "temp"));103}104 105/* Misc rejections under sqlite_ prefix but non-matching suffixes */106void test_isValidSchemaTableName_rejects_other_sqlite_prefix_names(void) {107 Table t;108 initTable(&t, PREFERRED_SCHEMA_TABLE);109 110 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName("sqlite_not_schema", &t, NULL));111 TEST_ASSERT_EQUAL_INT(0, test_isValidSchemaTableName("SQLITE_SOMETHING", &t, "main"));112}113 114int main(void) {115 UNITY_BEGIN();116 RUN_TEST(test_isValidSchemaTableName_rejects_non_sqlite_prefix);117 RUN_TEST(test_isValidSchemaTableName_accepts_preferred_schema_for_main);118 RUN_TEST(test_isValidSchemaTableName_rejects_legacy_master_for_non_legacy_temp_targets);119 RUN_TEST(test_isValidSchemaTableName_legacy_temp_accepts_preferred_temp_unconditionally);120 RUN_TEST(test_isValidSchemaTableName_legacy_temp_requires_db_for_main_schema_names);121 RUN_TEST(test_isValidSchemaTableName_legacy_temp_never_accepts_legacy_temp_name);122 RUN_TEST(test_isValidSchemaTableName_preferred_temp_target_behavior);123 RUN_TEST(test_isValidSchemaTableName_rejects_other_sqlite_prefix_names);124 return UNITY_END();125}