#include "ext-data.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "consts.h"
#include "crsqlite.h"
int crsql_close(sqlite3 *db);
static void textNewExtData() {
printf("NewExtData\n");
sqlite3 *db;
int rc = SQLITE_OK;
rc = sqlite3_open(":memory:", &db);
assert(rc == SQLITE_OK);
unsigned char *siteIdBuffer =
sqlite3_malloc(SITE_ID_LEN * sizeof *(siteIdBuffer));
crsql_ExtData *pExtData = crsql_newExtData(db, siteIdBuffer);
assert(pExtData->dbVersion == -1);
assert(pExtData->pPragmaSchemaVersionStmt != 0);
assert(pExtData->pPragmaDataVersionStmt != 0);
assert(pExtData->pragmaSchemaVersion == -1);
assert(pExtData->pragmaSchemaVersionForTableInfos == -1);
assert(pExtData->siteId != 0);
assert(pExtData->pDbVersionStmt == 0);
assert(pExtData->zpTableInfos == 0);
assert(pExtData->tableInfosLen == 0);
assert(pExtData->pragmaDataVersion != -1);
crsql_finalize(pExtData);
crsql_freeExtData(pExtData);
crsql_close(db);
printf("\t\e[0;32mSuccess\e[0m\n");
}
static void testFreeExtData() {
printf("FreeExtData\n");
sqlite3 *db;
int rc;
rc = sqlite3_open(":memory:", &db);
assert(rc == SQLITE_OK);
unsigned char *siteIdBuffer = sqlite3_malloc(SITE_ID_LEN * sizeof(char *));
crsql_ExtData *pExtData = crsql_newExtData(db, siteIdBuffer);
crsql_finalize(pExtData);
crsql_freeExtData(pExtData);
crsql_close(db);
printf("\t\e[0;32mSuccess\e[0m\n");
}
static void testFinalize() {
printf("FinalizeExtData\n");
sqlite3 *db;
int rc;
rc = sqlite3_open(":memory:", &db);
assert(rc == SQLITE_OK);
unsigned char *siteIdBuffer = sqlite3_malloc(SITE_ID_LEN * sizeof(char *));
crsql_ExtData *pExtData = crsql_newExtData(db, siteIdBuffer);
crsql_finalize(pExtData);
assert(pExtData->pDbVersionStmt == 0);
assert(pExtData->pPragmaSchemaVersionStmt == 0);
crsql_finalize(pExtData);
crsql_freeExtData(pExtData);
crsql_close(db);
printf("\t\e[0;32mSuccess\e[0m\n");
}
static void testFetchPragmaSchemaVersion() {
printf("FetchPragmaSchemaVersion\n");
sqlite3 *db;
int rc;
int didChange = 0;
rc = sqlite3_open(":memory:", &db);
assert(rc == SQLITE_OK);
unsigned char *siteIdBuffer = sqlite3_malloc(SITE_ID_LEN * sizeof(char *));
crsql_ExtData *pExtData = crsql_newExtData(db, siteIdBuffer);
didChange = crsql_fetchPragmaSchemaVersion(db, pExtData, 0);
assert(pExtData->pragmaSchemaVersion != -1);
assert(didChange == 1);
didChange = crsql_fetchPragmaSchemaVersion(db, pExtData, 1);
assert(didChange == 1);
assert(pExtData->pragmaSchemaVersionForTableInfos != -1);
int oldVersion = pExtData->pragmaSchemaVersion;
didChange = crsql_fetchPragmaSchemaVersion(db, pExtData, 0);
assert(oldVersion == pExtData->pragmaSchemaVersion);
assert(didChange == 0);
oldVersion = pExtData->pragmaSchemaVersionForTableInfos;
didChange = crsql_fetchPragmaSchemaVersion(db, pExtData, 1);
assert(oldVersion == pExtData->pragmaSchemaVersionForTableInfos);
assert(didChange == 0);
sqlite3_exec(db, "CREATE TABLE foo (a)", 0, 0, 0);
oldVersion = pExtData->pragmaSchemaVersion;
didChange = crsql_fetchPragmaSchemaVersion(db, pExtData, 0);
assert(oldVersion != pExtData->pragmaSchemaVersion);
assert(didChange == 1);
oldVersion = pExtData->pragmaSchemaVersionForTableInfos;
didChange = crsql_fetchPragmaSchemaVersion(db, pExtData, 1);
assert(oldVersion != pExtData->pragmaSchemaVersionForTableInfos);
assert(didChange == 1);
oldVersion = pExtData->pragmaSchemaVersion;
didChange = crsql_fetchPragmaSchemaVersion(db, pExtData, 0);
assert(oldVersion == pExtData->pragmaSchemaVersion);
assert(didChange == 0);
oldVersion = pExtData->pragmaSchemaVersionForTableInfos;
didChange = crsql_fetchPragmaSchemaVersion(db, pExtData, 1);
assert(oldVersion == pExtData->pragmaSchemaVersionForTableInfos);
assert(didChange == 0);
crsql_finalize(pExtData);
crsql_freeExtData(pExtData);
crsql_close(db);
printf("\t\e[0;32mSuccess\e[0m\n");
}
static void testFetchPragmaDataVersion() {
printf("FetchPragmaDataVersion\n");
remove("testFetchPragmaDataVersion.db");
sqlite3 *db1;
sqlite3 *db2;
int rc;
char *errmsg = 0;
rc = sqlite3_open("testFetchPragmaDataVersion.db", &db1);
assert(rc == SQLITE_OK);
rc = sqlite3_open("testFetchPragmaDataVersion.db", &db2);
assert(rc == SQLITE_OK);
rc = sqlite3_exec(db1, "CREATE TABLE fpdv (a)", 0, 0, &errmsg);
assert(rc == SQLITE_OK);
unsigned char *siteIdBuffer = sqlite3_malloc(SITE_ID_LEN * sizeof(char *));
crsql_ExtData *pExtData1 = crsql_newExtData(db1, siteIdBuffer);
siteIdBuffer = sqlite3_malloc(SITE_ID_LEN * sizeof(char *));
crsql_ExtData *pExtData2 = crsql_newExtData(db2, siteIdBuffer);
rc = crsql_fetchPragmaDataVersion(db1, pExtData1);
assert(rc == 0);
rc = crsql_fetchPragmaDataVersion(db2, pExtData2);
assert(rc == 0);
rc = sqlite3_exec(db1, "INSERT INTO fpdv VALUES (1)", 0, 0, 0);
assert(rc == SQLITE_OK);
rc = crsql_fetchPragmaDataVersion(db1, pExtData1);
assert(rc == 0);
rc = crsql_fetchPragmaDataVersion(db2, pExtData2);
assert(rc == 1);
rc = crsql_fetchPragmaDataVersion(db2, pExtData2);
assert(rc == 0);
rc = sqlite3_exec(db2, "INSERT INTO fpdv VALUES (1)", 0, 0, 0);
assert(rc == SQLITE_OK);
rc = crsql_fetchPragmaDataVersion(db2, pExtData2);
assert(rc == 0);
rc = crsql_fetchPragmaDataVersion(db1, pExtData1);
assert(rc == 1);
rc = crsql_fetchPragmaDataVersion(db1, pExtData1);
assert(rc == 0);
crsql_finalize(pExtData1);
crsql_freeExtData(pExtData1);
crsql_close(db1);
crsql_finalize(pExtData2);
crsql_freeExtData(pExtData2);
crsql_close(db2);
remove("testFetchPragmaDataVersion.db");
printf("\t\e[0;32mSuccess\e[0m\n");
}
static void testRecreateDbVersionStmt() {
printf("RecreateDbVersionStmt\n");
sqlite3 *db;
int rc;
rc = sqlite3_open(":memory:", &db);
unsigned char *siteIdBuffer = sqlite3_malloc(SITE_ID_LEN * sizeof(char *));
crsql_ExtData *pExtData = crsql_newExtData(db, siteIdBuffer);
rc = crsql_recreateDbVersionStmt(db, pExtData);
assert(rc == -1);
assert(pExtData->pDbVersionStmt == 0);
sqlite3_exec(db, "CREATE TABLE foo (a primary key, b);", 0, 0, 0);
sqlite3_exec(db, "SELECT crsql_as_crr('foo')", 0, 0, 0);
rc = crsql_recreateDbVersionStmt(db, pExtData);
assert(rc == 0);
assert(pExtData->pDbVersionStmt != 0);
rc = crsql_recreateDbVersionStmt(db, pExtData);
assert(rc == 0);
assert(pExtData->pDbVersionStmt != 0);
crsql_finalize(pExtData);
assert(pExtData->pDbVersionStmt == 0);
crsql_freeExtData(pExtData);
crsql_close(db);
printf("\t\e[0;32mSuccess\e[0m\n");
}
static void fetchDbVersionFromStorage() {
printf("FetchDBVersionFromStorage\n");
sqlite3 *db;
int rc;
char *errmsg;
rc = sqlite3_open(":memory:", &db);
unsigned char *siteIdBuffer = sqlite3_malloc(SITE_ID_LEN * sizeof(char *));
crsql_ExtData *pExtData = crsql_newExtData(db, siteIdBuffer);
rc = crsql_fetchDbVersionFromStorage(db, pExtData, &errmsg);
assert(pExtData->dbVersion == 0);
assert(rc == SQLITE_OK);
rc = crsql_fetchDbVersionFromStorage(db, pExtData, &errmsg);
assert(pExtData->dbVersion == 0);
assert(rc == SQLITE_OK);
sqlite3_exec(db, "CREATE TABLE foo (a primary key, b);", 0, 0, 0);
sqlite3_exec(db, "SELECT crsql_as_crr('foo')", 0, 0, 0);
rc = crsql_fetchDbVersionFromStorage(db, pExtData, &errmsg);
assert(pExtData->dbVersion == 0);
assert(rc == SQLITE_OK);
sqlite3_exec(db, "INSERT INTO foo VALUES (1, 2)", 0, 0, 0);
rc = crsql_fetchDbVersionFromStorage(db, pExtData, &errmsg);
assert(pExtData->dbVersion == 1);
assert(rc == SQLITE_OK);
sqlite3_exec(db, "CREATE TABLE bar (a primary key, b);", 0, 0, 0);
sqlite3_exec(db, "SELECT crsql_as_crr('bar')", 0, 0, 0);
sqlite3_exec(db, "INSERT INTO bar VALUES (1, 2)", 0, 0, 0);
rc = crsql_fetchDbVersionFromStorage(db, pExtData, &errmsg);
assert(pExtData->dbVersion == 2);
assert(rc == SQLITE_OK);
rc = crsql_fetchDbVersionFromStorage(db, pExtData, &errmsg);
assert(pExtData->dbVersion == 2);
assert(rc == SQLITE_OK);
crsql_finalize(pExtData);
crsql_freeExtData(pExtData);
crsql_close(db);
printf("\t\e[0;32mSuccess\e[0m\n");
}
void crsqlExtDataTestSuite() {
printf("\e[47m\e[1;30mSuite: crsql_ExtData\e[0m\n");
textNewExtData();
testFreeExtData();
testFinalize();
testFetchPragmaSchemaVersion();
testRecreateDbVersionStmt();
fetchDbVersionFromStorage();
testFetchPragmaDataVersion();
}