|
|
#include "sqliteInt.h" |
|
|
#include "unity.h" |
|
|
#include <string.h> |
|
|
#include <stdlib.h> |
|
|
|
|
|
|
|
|
void sqlite3RenameTokenRemap(Parse *pParse, const void *pTo, const void *pFrom); |
|
|
|
|
|
static void* allocByte(unsigned char v){ |
|
|
unsigned char *p = (unsigned char*)sqlite3_malloc(1); |
|
|
TEST_ASSERT_NOT_NULL(p); |
|
|
*p = v; |
|
|
return (void*)p; |
|
|
} |
|
|
|
|
|
static void freeIf(void *p){ |
|
|
if(p) sqlite3_free(p); |
|
|
} |
|
|
|
|
|
static void initParseWithDb(Parse *pParse, sqlite3 **ppDb){ |
|
|
int rc; |
|
|
sqlite3 *db = 0; |
|
|
|
|
|
memset(pParse, 0, sizeof(*pParse)); |
|
|
rc = sqlite3_open(":memory:", &db); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
TEST_ASSERT_NOT_NULL(db); |
|
|
|
|
|
pParse->db = db; |
|
|
db->pParse = pParse; |
|
|
db->mallocFailed = 0; |
|
|
*ppDb = db; |
|
|
} |
|
|
|
|
|
static void cleanupDb(sqlite3 *db){ |
|
|
if(db){ |
|
|
db->pParse = 0; |
|
|
sqlite3_close(db); |
|
|
} |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void test_sqlite3RenameTokenRemap_basic_remap(void){ |
|
|
Parse parse; |
|
|
sqlite3 *db = NULL; |
|
|
initParseWithDb(&parse, &db); |
|
|
parse.nErr = 0; |
|
|
|
|
|
|
|
|
void *pA = allocByte(0xA1); |
|
|
void *pB = allocByte(0xB2); |
|
|
void *pC = allocByte(0xC3); |
|
|
void *pX = allocByte(0x5A); |
|
|
|
|
|
|
|
|
RenameToken rt1, rt2, rt3; |
|
|
memset(&rt1, 0, sizeof(rt1)); |
|
|
memset(&rt2, 0, sizeof(rt2)); |
|
|
memset(&rt3, 0, sizeof(rt3)); |
|
|
rt1.p = pA; rt1.pNext = &rt2; |
|
|
rt2.p = pB; rt2.pNext = &rt3; |
|
|
rt3.p = pC; rt3.pNext = NULL; |
|
|
|
|
|
parse.pRename = &rt1; |
|
|
|
|
|
|
|
|
sqlite3RenameTokenRemap(&parse, pX, pB); |
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(pA, rt1.p); |
|
|
TEST_ASSERT_EQUAL_PTR(pX, rt2.p); |
|
|
TEST_ASSERT_EQUAL_PTR(pC, rt3.p); |
|
|
|
|
|
|
|
|
freeIf(pA); |
|
|
freeIf(pB); |
|
|
freeIf(pC); |
|
|
freeIf(pX); |
|
|
cleanupDb(db); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void test_sqlite3RenameTokenRemap_no_match(void){ |
|
|
Parse parse; |
|
|
sqlite3 *db = NULL; |
|
|
initParseWithDb(&parse, &db); |
|
|
parse.nErr = 0; |
|
|
|
|
|
void *pA = allocByte(0x11); |
|
|
void *pB = allocByte(0x22); |
|
|
void *pC = allocByte(0x33); |
|
|
void *pZ = allocByte(0x44); |
|
|
void *pTo = allocByte(0x55); |
|
|
|
|
|
RenameToken rt1, rt2, rt3; |
|
|
memset(&rt1, 0, sizeof(rt1)); |
|
|
memset(&rt2, 0, sizeof(rt2)); |
|
|
memset(&rt3, 0, sizeof(rt3)); |
|
|
rt1.p = pA; rt1.pNext = &rt2; |
|
|
rt2.p = pB; rt2.pNext = &rt3; |
|
|
rt3.p = pC; rt3.pNext = NULL; |
|
|
|
|
|
parse.pRename = &rt1; |
|
|
|
|
|
sqlite3RenameTokenRemap(&parse, pTo, pZ); |
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(pA, rt1.p); |
|
|
TEST_ASSERT_EQUAL_PTR(pB, rt2.p); |
|
|
TEST_ASSERT_EQUAL_PTR(pC, rt3.p); |
|
|
|
|
|
freeIf(pA); |
|
|
freeIf(pB); |
|
|
freeIf(pC); |
|
|
freeIf(pZ); |
|
|
freeIf(pTo); |
|
|
cleanupDb(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_sqlite3RenameTokenRemap_multiple_matches_first_only(void){ |
|
|
Parse parse; |
|
|
sqlite3 *db = NULL; |
|
|
initParseWithDb(&parse, &db); |
|
|
parse.nErr = 0; |
|
|
|
|
|
void *pM = allocByte(0x77); |
|
|
void *pOther = allocByte(0x88); |
|
|
void *pNew = allocByte(0x99); |
|
|
|
|
|
RenameToken rt1, rt2, rt3; |
|
|
memset(&rt1, 0, sizeof(rt1)); |
|
|
memset(&rt2, 0, sizeof(rt2)); |
|
|
memset(&rt3, 0, sizeof(rt3)); |
|
|
rt1.p = pM; rt1.pNext = &rt2; |
|
|
rt2.p = pOther; rt2.pNext = &rt3; |
|
|
rt3.p = pM; rt3.pNext = NULL; |
|
|
|
|
|
parse.pRename = &rt1; |
|
|
|
|
|
sqlite3RenameTokenRemap(&parse, pNew, pM); |
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(pNew, rt1.p); |
|
|
TEST_ASSERT_EQUAL_PTR(pOther, rt2.p); |
|
|
TEST_ASSERT_EQUAL_PTR(pM, rt3.p); |
|
|
|
|
|
freeIf(pM); |
|
|
freeIf(pOther); |
|
|
freeIf(pNew); |
|
|
cleanupDb(db); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void test_sqlite3RenameTokenRemap_nErr_nonzero_allows_pTo_equal_existing(void){ |
|
|
Parse parse; |
|
|
sqlite3 *db = NULL; |
|
|
initParseWithDb(&parse, &db); |
|
|
|
|
|
parse.nErr = 1; |
|
|
|
|
|
void *pA = allocByte(0xAB); |
|
|
void *pB = allocByte(0xBC); |
|
|
|
|
|
RenameToken rt1, rt2; |
|
|
memset(&rt1, 0, sizeof(rt1)); |
|
|
memset(&rt2, 0, sizeof(rt2)); |
|
|
rt1.p = pA; rt1.pNext = &rt2; |
|
|
rt2.p = pB; rt2.pNext = NULL; |
|
|
|
|
|
parse.pRename = &rt1; |
|
|
|
|
|
|
|
|
sqlite3RenameTokenRemap(&parse, pB, pA); |
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(pB, rt1.p); |
|
|
TEST_ASSERT_EQUAL_PTR(pB, rt2.p); |
|
|
|
|
|
|
|
|
freeIf(pA); |
|
|
freeIf(pB); |
|
|
cleanupDb(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_sqlite3RenameTokenRemap_handles_null_token_pointers(void){ |
|
|
Parse parse; |
|
|
sqlite3 *db = NULL; |
|
|
initParseWithDb(&parse, &db); |
|
|
parse.nErr = 0; |
|
|
|
|
|
void *pA = allocByte(0x01); |
|
|
void *pNew = allocByte(0x02); |
|
|
|
|
|
RenameToken rt1, rt2; |
|
|
memset(&rt1, 0, sizeof(rt1)); |
|
|
memset(&rt2, 0, sizeof(rt2)); |
|
|
rt1.p = NULL; rt1.pNext = &rt2; |
|
|
rt2.p = pA; rt2.pNext = NULL; |
|
|
|
|
|
parse.pRename = &rt1; |
|
|
|
|
|
sqlite3RenameTokenRemap(&parse, pNew, pA); |
|
|
|
|
|
TEST_ASSERT_NULL(rt1.p); |
|
|
TEST_ASSERT_EQUAL_PTR(pNew, rt2.p); |
|
|
|
|
|
freeIf(pA); |
|
|
freeIf(pNew); |
|
|
cleanupDb(db); |
|
|
} |
|
|
|
|
|
int main(void){ |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_sqlite3RenameTokenRemap_basic_remap); |
|
|
RUN_TEST(test_sqlite3RenameTokenRemap_no_match); |
|
|
RUN_TEST(test_sqlite3RenameTokenRemap_multiple_matches_first_only); |
|
|
RUN_TEST(test_sqlite3RenameTokenRemap_nErr_nonzero_allows_pTo_equal_existing); |
|
|
RUN_TEST(test_sqlite3RenameTokenRemap_handles_null_token_pointers); |
|
|
return UNITY_END(); |
|
|
} |