Browse Source

refactor(test): Use temporary files in dbschema_test

Files are conceptually temporary, having extra conflict handling logic
is unnecessary, and having the test fail to run if it crashed on last
invocation is annoying.
reviewable/pr6589/r1
Anthony Bilinski 3 years ago
parent
commit
d1a8f5d6ae
No known key found for this signature in database
GPG Key ID: 2AA8E0DA1B31FB3C
  1. 64
      test/persistence/dbschema_test.cpp

64
test/persistence/dbschema_test.cpp

@ -21,8 +21,9 @@
#include "src/persistence/dbupgrader.h" #include "src/persistence/dbupgrader.h"
#include "src/core/toxfile.h" #include "src/core/toxfile.h"
#include <QtTest/QtTest>
#include <QString> #include <QString>
#include <QTemporaryFile>
#include <QtTest/QtTest>
#include <algorithm> #include <algorithm>
#include <memory> #include <memory>
@ -84,7 +85,8 @@ class TestDbSchema : public QObject
{ {
Q_OBJECT Q_OBJECT
private slots: private slots:
void initTestCase(); void init();
void cleanup();
void testCreation(); void testCreation();
void testIsNewDb(); void testIsNewDb();
void test0to1(); void test0to1();
@ -98,12 +100,11 @@ private slots:
// test8to9 omitted, data corruption correction upgrade with no schema change // test8to9 omitted, data corruption correction upgrade with no schema change
void test9to10(); void test9to10();
// test suite // test suite
void cleanupTestCase() const;
private: private:
bool initSucess{false};
void createSchemaAtVersion(std::shared_ptr<RawDatabase> db, const std::vector<SqliteMasterEntry>& schema); void createSchemaAtVersion(std::shared_ptr<RawDatabase> db, const std::vector<SqliteMasterEntry>& schema);
void verifyDb(std::shared_ptr<RawDatabase> db, const std::vector<SqliteMasterEntry>& expectedSql); void verifyDb(std::shared_ptr<RawDatabase> db, const std::vector<SqliteMasterEntry>& expectedSql);
std::unique_ptr<QTemporaryFile> testDatabaseFile;
}; };
const QString testFileList[] = {"testCreation.db", "testIsNewDbTrue.db", "testIsNewDbFalse.db", const QString testFileList[] = {"testCreation.db", "testIsNewDbTrue.db", "testIsNewDbFalse.db",
@ -208,25 +209,6 @@ const std::vector<SqliteMasterEntry> schema7{
const std::vector<SqliteMasterEntry> schema9 = schema7; const std::vector<SqliteMasterEntry> schema9 = schema7;
const std::vector<SqliteMasterEntry> schema10 = schema9; const std::vector<SqliteMasterEntry> schema10 = schema9;
void TestDbSchema::initTestCase()
{
for (const auto& path : testFileList) {
QVERIFY(!QFileInfo{path}.exists());
}
initSucess = true;
}
void TestDbSchema::cleanupTestCase() const
{
if (!initSucess) {
qWarning() << "init failed, skipping cleanup to avoid loss of data";
return;
}
for (const auto& path : testFileList) {
QFile::remove(path);
}
}
void TestDbSchema::verifyDb(std::shared_ptr<RawDatabase> db, const std::vector<SqliteMasterEntry>& expectedSql) void TestDbSchema::verifyDb(std::shared_ptr<RawDatabase> db, const std::vector<SqliteMasterEntry>& expectedSql)
{ {
QVERIFY(db->execNow(RawDatabase::Query(QStringLiteral( QVERIFY(db->execNow(RawDatabase::Query(QStringLiteral(
@ -257,22 +239,36 @@ void TestDbSchema::createSchemaAtVersion(std::shared_ptr<RawDatabase> db, const
QVERIFY(db->execNow(queries)); QVERIFY(db->execNow(queries));
} }
void TestDbSchema::init()
{
testDatabaseFile = std::unique_ptr<QTemporaryFile>(new QTemporaryFile());
// fileName is only defined once the file is opened. Since RawDatabase
// will be openening the file itself not using QFile, open and close it now.
QVERIFY(testDatabaseFile->open());
testDatabaseFile->close();
}
void TestDbSchema::cleanup()
{
testDatabaseFile.reset();
}
void TestDbSchema::testCreation() void TestDbSchema::testCreation()
{ {
QVector<RawDatabase::Query> queries; QVector<RawDatabase::Query> queries;
auto db = std::shared_ptr<RawDatabase>{new RawDatabase{"testCreation.db", {}, {}}}; auto db = std::shared_ptr<RawDatabase>{new RawDatabase{testDatabaseFile->fileName(), {}, {}}};
QVERIFY(DbUpgrader::createCurrentSchema(*db)); QVERIFY(DbUpgrader::createCurrentSchema(*db));
verifyDb(db, schema7); verifyDb(db, schema7);
} }
void TestDbSchema::testIsNewDb() void TestDbSchema::testIsNewDb()
{ {
auto db = std::shared_ptr<RawDatabase>{new RawDatabase{"testIsNewDbTrue.db", {}, {}}}; auto db = std::shared_ptr<RawDatabase>{new RawDatabase{testDatabaseFile->fileName(), {}, {}}};
bool success = false; bool success = false;
bool newDb = DbUpgrader::isNewDb(db, success); bool newDb = DbUpgrader::isNewDb(db, success);
QVERIFY(success); QVERIFY(success);
QVERIFY(newDb == true); QVERIFY(newDb == true);
db = std::shared_ptr<RawDatabase>{new RawDatabase{"testIsNewDbFalse.db", {}, {}}}; db = std::shared_ptr<RawDatabase>{new RawDatabase{testDatabaseFile->fileName(), {}, {}}};
createSchemaAtVersion(db, schema0); createSchemaAtVersion(db, schema0);
newDb = DbUpgrader::isNewDb(db, success); newDb = DbUpgrader::isNewDb(db, success);
QVERIFY(success); QVERIFY(success);
@ -281,7 +277,7 @@ void TestDbSchema::testIsNewDb()
void TestDbSchema::test0to1() void TestDbSchema::test0to1()
{ {
auto db = std::shared_ptr<RawDatabase>{new RawDatabase{"test0to1.db", {}, {}}}; auto db = std::shared_ptr<RawDatabase>{new RawDatabase{testDatabaseFile->fileName(), {}, {}}};
createSchemaAtVersion(db, schema0); createSchemaAtVersion(db, schema0);
QVERIFY(DbUpgrader::dbSchema0to1(*db)); QVERIFY(DbUpgrader::dbSchema0to1(*db));
verifyDb(db, schema1); verifyDb(db, schema1);
@ -302,7 +298,7 @@ void TestDbSchema::test1to2()
https://github.com/qTox/qTox/issues/5776 https://github.com/qTox/qTox/issues/5776
*/ */
auto db = std::shared_ptr<RawDatabase>{new RawDatabase{"test1to2.db", {}, {}}}; auto db = std::shared_ptr<RawDatabase>{new RawDatabase{testDatabaseFile->fileName(), {}, {}}};
createSchemaAtVersion(db, schema1); createSchemaAtVersion(db, schema1);
const QString myPk = "AC18841E56CCDEE16E93E10E6AB2765BE54277D67F1372921B5B418A6B330D3D"; const QString myPk = "AC18841E56CCDEE16E93E10E6AB2765BE54277D67F1372921B5B418A6B330D3D";
@ -384,7 +380,7 @@ void TestDbSchema::test1to2()
void TestDbSchema::test2to3() void TestDbSchema::test2to3()
{ {
auto db = std::shared_ptr<RawDatabase>{new RawDatabase{"test2to3.db", {}, {}}}; auto db = std::shared_ptr<RawDatabase>{new RawDatabase{testDatabaseFile->fileName(), {}, {}}};
createSchemaAtVersion(db, schema2); createSchemaAtVersion(db, schema2);
// since we don't enforce foreign key contraints in the db, we can stick in IDs to other tables // since we don't enforce foreign key contraints in the db, we can stick in IDs to other tables
@ -446,7 +442,7 @@ void TestDbSchema::test2to3()
void TestDbSchema::test3to4() void TestDbSchema::test3to4()
{ {
auto db = std::shared_ptr<RawDatabase>{new RawDatabase{"test3to4.db", {}, {}}}; auto db = std::shared_ptr<RawDatabase>{new RawDatabase{testDatabaseFile->fileName(), {}, {}}};
createSchemaAtVersion(db, schema3); createSchemaAtVersion(db, schema3);
QVERIFY(DbUpgrader::dbSchema3to4(*db)); QVERIFY(DbUpgrader::dbSchema3to4(*db));
verifyDb(db, schema4); verifyDb(db, schema4);
@ -454,7 +450,7 @@ void TestDbSchema::test3to4()
void TestDbSchema::test4to5() void TestDbSchema::test4to5()
{ {
auto db = std::shared_ptr<RawDatabase>{new RawDatabase{"test4to5.db", {}, {}}}; auto db = std::shared_ptr<RawDatabase>{new RawDatabase{testDatabaseFile->fileName(), {}, {}}};
createSchemaAtVersion(db, schema4); createSchemaAtVersion(db, schema4);
QVERIFY(DbUpgrader::dbSchema4to5(*db)); QVERIFY(DbUpgrader::dbSchema4to5(*db));
verifyDb(db, schema5); verifyDb(db, schema5);
@ -462,7 +458,7 @@ void TestDbSchema::test4to5()
void TestDbSchema::test5to6() void TestDbSchema::test5to6()
{ {
auto db = std::shared_ptr<RawDatabase>{new RawDatabase{"test5to6.db", {}, {}}}; auto db = std::shared_ptr<RawDatabase>{new RawDatabase{testDatabaseFile->fileName(), {}, {}}};
createSchemaAtVersion(db, schema5); createSchemaAtVersion(db, schema5);
QVERIFY(DbUpgrader::dbSchema5to6(*db)); QVERIFY(DbUpgrader::dbSchema5to6(*db));
verifyDb(db, schema6); verifyDb(db, schema6);
@ -470,7 +466,7 @@ void TestDbSchema::test5to6()
void TestDbSchema::test6to7() void TestDbSchema::test6to7()
{ {
auto db = std::shared_ptr<RawDatabase>{new RawDatabase{"test6to7.db", {}, {}}}; auto db = std::shared_ptr<RawDatabase>{new RawDatabase{testDatabaseFile->fileName(), {}, {}}};
// foreign_keys are enabled by History constructor and required for this upgrade to work on older sqlite versions // foreign_keys are enabled by History constructor and required for this upgrade to work on older sqlite versions
db->execNow( db->execNow(
"PRAGMA foreign_keys = ON;"); "PRAGMA foreign_keys = ON;");
@ -481,7 +477,7 @@ void TestDbSchema::test6to7()
void TestDbSchema::test9to10() void TestDbSchema::test9to10()
{ {
auto db = std::shared_ptr<RawDatabase>{new RawDatabase{"test9to10.db", {}, {}}}; auto db = std::shared_ptr<RawDatabase>{new RawDatabase{testDatabaseFile->fileName(), {}, {}}};
createSchemaAtVersion(db, schema9); createSchemaAtVersion(db, schema9);
QVERIFY(insertFileId(*db, 1, true)); QVERIFY(insertFileId(*db, 1, true));

Loading…
Cancel
Save