
2 changed files with 848 additions and 0 deletions
@ -0,0 +1,732 @@ |
|||||
|
#include "test_pEpSQLite.hh" |
||||
|
#include "../src/sqlite3.h" |
||||
|
#include "../src/pEpLog.hh" |
||||
|
#include "../src/pEpSQLite.hh" |
||||
|
#include "framework/utils.hh" |
||||
|
#include <exception> |
||||
|
#include <iostream> |
||||
|
#include <fstream> |
||||
|
#include <cstdio> |
||||
|
|
||||
|
using namespace std; |
||||
|
using namespace pEp; |
||||
|
using namespace pEp::Test; |
||||
|
|
||||
|
using namespace Test::Log; |
||||
|
|
||||
|
ofstream file_create(const string& filename) |
||||
|
{ |
||||
|
ofstream outfile{ filename }; |
||||
|
return outfile; |
||||
|
} |
||||
|
|
||||
|
bool file_exists(const string& filename) |
||||
|
{ |
||||
|
|
||||
|
ifstream ifile(filename.c_str()); |
||||
|
return (bool)ifile; |
||||
|
} |
||||
|
|
||||
|
void file_delete(const string& filename) |
||||
|
{ |
||||
|
int status = remove(filename.c_str()); |
||||
|
if (status) { |
||||
|
runtime_error e{ string("file_delete(\"" + filename + "\") - " + strerror(errno)) }; |
||||
|
throw(e); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
namespace pEp { |
||||
|
namespace Test { |
||||
|
// Util
|
||||
|
void ensure_file_not_existing(string path) |
||||
|
{ |
||||
|
while (file_exists(path)) { |
||||
|
file_delete(path); |
||||
|
} |
||||
|
} |
||||
|
// --------------------------------- FIXTURES ---------------------------------
|
||||
|
// filenames
|
||||
|
string fixture_db_filename_new() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
string path = "new.db"; |
||||
|
return path; |
||||
|
} |
||||
|
|
||||
|
string fixture_db_filename_bad() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
string db_path_bad = "/will_not_create_dirs/bad.db"; |
||||
|
return db_path_bad; |
||||
|
} |
||||
|
|
||||
|
string fixture_db_filename_existing_and_verified() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
string path = "new.db"; |
||||
|
return path; |
||||
|
} |
||||
|
|
||||
|
string fixture_db_filename_corrupt() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
string path = "corrupt.db"; |
||||
|
return path; |
||||
|
} |
||||
|
|
||||
|
// prepared db's
|
||||
|
string fixture_init_db_new() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
string path = fixture_db_filename_new(); |
||||
|
// cout << "fixture: \"" << path << "\" not existing" << endl;
|
||||
|
ensure_file_not_existing(path); |
||||
|
return path; |
||||
|
} |
||||
|
|
||||
|
string fixture_init_db_existing_and_verified() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
string path = "existing.db"; |
||||
|
// cout << "fixture: \"" << path << "\" not existing" << endl;
|
||||
|
ensure_file_not_existing(path); |
||||
|
return path; |
||||
|
} |
||||
|
|
||||
|
string fixture_init_db_corrupt() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
// cout << "creating corrupt db" << endl;
|
||||
|
string path = fixture_db_filename_corrupt(); |
||||
|
ensure_file_not_existing(path); |
||||
|
ofstream db_corrupt = file_create(path); |
||||
|
db_corrupt << "G4rbage" << endl; |
||||
|
db_corrupt.close(); |
||||
|
return path; |
||||
|
} |
||||
|
|
||||
|
// instance
|
||||
|
pEpSQLite fixture_instance_of_new() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_create_instance_on_new(); |
||||
|
} |
||||
|
|
||||
|
pEpSQLite fixture_instance_of_existing_and_verified() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_create_instance_on_existing(); |
||||
|
} |
||||
|
|
||||
|
pEpSQLite fixture_instance_of_bad() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_create_instance_on_path_bad(); |
||||
|
} |
||||
|
|
||||
|
pEpSQLite fixture_instance_of_corrupt() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_create_instance_on_path_corrupt(); |
||||
|
} |
||||
|
|
||||
|
// open
|
||||
|
pEpSQLite fixture_db_open_of_new() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_createopen_db_new(); |
||||
|
} |
||||
|
|
||||
|
pEpSQLite fixture_db_open_of_existing_and_verified() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_db_verify_content_after_insert_on_tables_exist(); |
||||
|
} |
||||
|
|
||||
|
pEpSQLite fixture_db_open_of_bad() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_createopen_db_bad(); |
||||
|
} |
||||
|
|
||||
|
pEpSQLite fixture_db_open_of_corrupt() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_createopen_db_corrupt(); |
||||
|
} |
||||
|
|
||||
|
pEpSQLite fixture_db_open_after_close() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_close_after_open(); |
||||
|
} |
||||
|
|
||||
|
// tables
|
||||
|
pEpSQLite fixture_db_open_with_tables_of_new() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_db_create_tables_on_open_new(); |
||||
|
} |
||||
|
|
||||
|
pEpSQLite fixture_db_open_with_tables_of_corrupt() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_db_create_tables_on_open_corrupt(); |
||||
|
} |
||||
|
|
||||
|
// content
|
||||
|
pEpSQLite fixture_db_open_with_tables_and_content() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_db_insert_on_tables_exist(); |
||||
|
} |
||||
|
|
||||
|
// delete
|
||||
|
pEpSQLite fixture_db_open_after_delete() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_delete_file_gone_after_open_existing(); |
||||
|
} |
||||
|
|
||||
|
pEpSQLite fixture_db_open_after_close_after_delete() |
||||
|
{ |
||||
|
// pEpLog("called");
|
||||
|
return test_delete_file_gone_after_close_new(); |
||||
|
} |
||||
|
|
||||
|
// --------------------------------- TESTS ---------------------------------
|
||||
|
|
||||
|
// instance creation
|
||||
|
// OK
|
||||
|
pEpSQLite test_create_instance_on_new() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db(fixture_init_db_new()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// OK
|
||||
|
pEpSQLite test_create_instance_on_existing() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db(fixture_init_db_existing_and_verified()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// OK
|
||||
|
pEpSQLite test_create_instance_on_path_bad() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db(fixture_db_filename_bad()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// OK
|
||||
|
pEpSQLite test_create_instance_on_path_corrupt() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db(fixture_init_db_corrupt()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// db create_open (create_or_open())
|
||||
|
// OK, new db
|
||||
|
pEpSQLite test_createopen_db_new() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_instance_of_new(); |
||||
|
assert(!file_exists(fixture_db_filename_new())); |
||||
|
db.create_or_open_db(); |
||||
|
assert(file_exists(fixture_db_filename_new())); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// OK, open db
|
||||
|
pEpSQLite test_createopen_db_existing() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_instance_of_existing_and_verified(); |
||||
|
assert(file_exists(fixture_db_filename_existing_and_verified())); |
||||
|
db.create_or_open_db(); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// ERR, cant create
|
||||
|
pEpSQLite test_createopen_db_bad() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
assert(!file_exists(fixture_db_filename_bad())); |
||||
|
pEpSQLite db = fixture_instance_of_bad(); |
||||
|
assert(!file_exists(fixture_db_filename_bad())); |
||||
|
try { |
||||
|
db.create_or_open_db(); |
||||
|
assert(false); |
||||
|
} catch (const exception& e) { |
||||
|
pEp::Test::Utils::print_exception(e); |
||||
|
} |
||||
|
assert(!file_exists(fixture_db_filename_bad())); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// OK(cant detect corruption)
|
||||
|
pEpSQLite test_createopen_db_corrupt() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_instance_of_corrupt(); |
||||
|
assert(file_exists(fixture_db_filename_corrupt())); |
||||
|
db.create_or_open_db(); |
||||
|
assert(file_exists(fixture_db_filename_corrupt())); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// close()
|
||||
|
// OK
|
||||
|
pEpSQLite test_close_before_open() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_instance_of_new(); |
||||
|
db.close_db(); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// OK
|
||||
|
pEpSQLite test_close_after_open() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_new(); |
||||
|
db.close_db(); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// OK
|
||||
|
pEpSQLite test_close_idempotent() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_new(); |
||||
|
db.close_db(); |
||||
|
db.close_db(); |
||||
|
db.close_db(); |
||||
|
db.close_db(); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// create tables (execute())
|
||||
|
// OK
|
||||
|
pEpSQLite test_db_create_tables_on_open_new() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_new(); |
||||
|
db.execute("CREATE TABLE test(i,i_squared);"); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// ERR, Tables already exist
|
||||
|
pEpSQLite test_db_create_tables_open_existing() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_existing_and_verified(); |
||||
|
try { |
||||
|
db.execute("CREATE TABLE test(i,i_squared);"); |
||||
|
assert(false); |
||||
|
} catch (const exception& e) { |
||||
|
pEp::Test::Utils::print_exception(e); |
||||
|
} |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// ERR, db closed
|
||||
|
pEpSQLite test_db_create_tables_on_open_bad() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_bad(); |
||||
|
try { |
||||
|
db.execute("CREATE TABLE test(i,i_squared);"); |
||||
|
assert(false); |
||||
|
} catch (const exception& e) { |
||||
|
pEp::Test::Utils::print_exception(e); |
||||
|
} |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// ERR, db corrupt
|
||||
|
pEpSQLite test_db_create_tables_on_open_corrupt() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_corrupt(); |
||||
|
try { |
||||
|
db.execute("CREATE TABLE test(i,i_squared);"); |
||||
|
assert(false); |
||||
|
} catch (const exception& e) { |
||||
|
pEp::Test::Utils::print_exception(e); |
||||
|
} |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// insert (execute())
|
||||
|
void insert_operation(pEpSQLite& db) |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
for (int i = 0; i < 9; i = (i + 2)) { |
||||
|
db.execute( |
||||
|
"INSERT INTO test(i,i_squared) VALUES ('" + to_string(i) + "', '" + |
||||
|
to_string(i * i) + "');"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// OK
|
||||
|
pEpSQLite test_db_insert_on_tables_exist() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_with_tables_of_new(); |
||||
|
insert_operation(db); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// ERR, Tables missing
|
||||
|
pEpSQLite test_db_insert_on_tables_dont_exist() |
||||
|
{ |
||||
|
pEpSQLite db = fixture_db_open_of_new(); |
||||
|
try { |
||||
|
insert_operation(db); |
||||
|
assert(false); |
||||
|
} catch (const exception& e) { |
||||
|
pEp::Test::Utils::print_exception(e); |
||||
|
} |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// ERR, Tables missing
|
||||
|
pEpSQLite test_db_insert_before_open() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_instance_of_new(); |
||||
|
try { |
||||
|
insert_operation(db); |
||||
|
assert(false); |
||||
|
} catch (const exception& e) { |
||||
|
pEp::Test::Utils::print_exception(e); |
||||
|
} |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// ERR, Tables missing
|
||||
|
pEpSQLite test_db_insert_after_close() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_after_close(); |
||||
|
try { |
||||
|
insert_operation(db); |
||||
|
assert(false); |
||||
|
} catch (const exception& e) { |
||||
|
pEp::Test::Utils::print_exception(e); |
||||
|
} |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// verify contents (execute())
|
||||
|
void verify_operation(pEpSQLite& db) |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
for (int i = 0; i < 9; i++) { |
||||
|
ResultSet rs = db.execute( |
||||
|
"SELECT i, i_squared FROM test " |
||||
|
"WHERE (test.i == '" + |
||||
|
to_string(i) + "');"); |
||||
|
// cout << "RESULT: " << endl << pEpSQLite::to_string(rs) << endl;
|
||||
|
if (i % 2) { |
||||
|
if (rs.size() != 0) { |
||||
|
runtime_error e{ "Exception verifying database content" }; |
||||
|
throw(e); |
||||
|
} |
||||
|
} else { |
||||
|
if(rs.size() != 1) { |
||||
|
runtime_error e{ "Exception verifying database content" }; |
||||
|
throw(e); |
||||
|
} |
||||
|
for (const RSRecord& r : rs) { |
||||
|
const int x = stoi(r.at("i")); |
||||
|
const int x_squared = stoi(r.at("i_squared")); |
||||
|
if((x * x) != x_squared) { |
||||
|
runtime_error e{ "Exception verifying database content" }; |
||||
|
throw(e); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// OK
|
||||
|
pEpSQLite test_db_verify_content_existing_open_db() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_existing_and_verified(); |
||||
|
verify_operation(db); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// OK
|
||||
|
pEpSQLite test_db_verify_content_after_insert_on_tables_exist() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_with_tables_and_content(); |
||||
|
verify_operation(db); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// ERR - no tables
|
||||
|
pEpSQLite test_db_verify_content_no_tables() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_new(); |
||||
|
try { |
||||
|
verify_operation(db); |
||||
|
assert(false); |
||||
|
} catch (const exception& e) { |
||||
|
pEp::Test::Utils::print_exception(e); |
||||
|
} |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// ERR - err no data
|
||||
|
pEpSQLite test_db_verify_content_after_create_tables() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_with_tables_of_new(); |
||||
|
try { |
||||
|
verify_operation(db); |
||||
|
assert(false); |
||||
|
} catch (const exception& e) { |
||||
|
pEp::Test::Utils::print_exception(e); |
||||
|
} |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// get_path()
|
||||
|
// OK
|
||||
|
pEpSQLite test_get_path_on_instance_good() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_instance_of_new(); |
||||
|
assert(db.get_db_path() == fixture_db_filename_new()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// OK
|
||||
|
pEpSQLite test_get_path_on_instance_bad() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_instance_of_bad(); |
||||
|
assert(db.get_db_path() == fixture_db_filename_bad()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// delete_db()
|
||||
|
// ERR, file not found
|
||||
|
pEpSQLite test_delete_file_gone_before_open_new() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_instance_of_new(); |
||||
|
try { |
||||
|
db.delete_db(); |
||||
|
assert(false); |
||||
|
} catch (const exception& e) { |
||||
|
pEp::Test::Utils::print_exception(e); |
||||
|
} |
||||
|
assert(!file_exists(fixture_db_filename_new())); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// ERR, file not found
|
||||
|
pEpSQLite test_delete_file_gone_before_open_existing() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_instance_of_existing_and_verified(); |
||||
|
try { |
||||
|
db.delete_db(); |
||||
|
assert(false); |
||||
|
} catch (const exception& e) { |
||||
|
pEp::Test::Utils::print_exception(e); |
||||
|
} |
||||
|
assert(!file_exists(fixture_db_filename_existing_and_verified())); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// OK
|
||||
|
pEpSQLite test_delete_file_gone_after_close_new() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_after_close(); |
||||
|
db.delete_db(); |
||||
|
assert(!file_exists(fixture_db_filename_new())); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// OK
|
||||
|
pEpSQLite test_delete_file_gone_after_open_existing() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_existing_and_verified(); |
||||
|
db.delete_db(); |
||||
|
assert(!file_exists(fixture_db_filename_existing_and_verified())); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// OK
|
||||
|
pEpSQLite test_delete_file_gone_after_open_corrupt() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_corrupt(); |
||||
|
db.delete_db(); |
||||
|
assert(!file_exists(fixture_db_filename_corrupt())); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// ERR
|
||||
|
pEpSQLite test_delete_file_gone_after_open_bad() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_bad(); |
||||
|
try { |
||||
|
db.delete_db(); |
||||
|
assert(false); |
||||
|
} catch (const exception& e) { |
||||
|
pEp::Test::Utils::print_exception(e); |
||||
|
} |
||||
|
assert(!file_exists(fixture_db_filename_bad())); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// is_open()
|
||||
|
// false
|
||||
|
pEpSQLite test_is_open_before_open_new() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_instance_of_new(); |
||||
|
assert(!db.is_open()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// true
|
||||
|
pEpSQLite test_is_open_after_open_new() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_new(); |
||||
|
assert(db.is_open()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// true
|
||||
|
pEpSQLite test_is_open_after_open_existing() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_existing_and_verified(); |
||||
|
assert(db.is_open()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// false
|
||||
|
pEpSQLite test_is_open_after_open_bad() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_bad(); |
||||
|
assert(!db.is_open()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// true (cant detect corruption)
|
||||
|
pEpSQLite test_is_open_after_open_corrupt() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_of_corrupt(); |
||||
|
assert(db.is_open()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// false
|
||||
|
pEpSQLite test_is_open_after_close() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_after_close(); |
||||
|
assert(!db.is_open()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// false
|
||||
|
pEpSQLite test_is_open_after_delete_on_open() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_after_delete(); |
||||
|
assert(!db.is_open()); |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// false
|
||||
|
pEpSQLite test_is_open_after_delete_on_closed() |
||||
|
{ |
||||
|
pEpLog("called"); |
||||
|
pEpSQLite db = fixture_db_open_after_close_after_delete(); |
||||
|
assert(!db.is_open()); |
||||
|
return db; |
||||
|
} |
||||
|
} // namespace Test
|
||||
|
} // namespace pEp
|
||||
|
|
||||
|
int main(int argc, char* argv[]) |
||||
|
{ |
||||
|
// Enable logging for all instances of pEpSQLite
|
||||
|
pEpSQLite::log_enabled = true; |
||||
|
Adapter::pEpLog::set_enabled(true); |
||||
|
// instance creation
|
||||
|
test_create_instance_on_new(); |
||||
|
test_create_instance_on_existing(); |
||||
|
test_create_instance_on_path_bad(); |
||||
|
test_create_instance_on_path_corrupt(); |
||||
|
// db create_open (create_or_open())
|
||||
|
test_createopen_db_new(); |
||||
|
test_createopen_db_existing(); |
||||
|
test_createopen_db_bad(); |
||||
|
test_createopen_db_corrupt(); |
||||
|
// close()
|
||||
|
test_close_before_open(); |
||||
|
test_close_after_open(); |
||||
|
test_close_idempotent(); |
||||
|
// create tables (execute())
|
||||
|
test_db_create_tables_on_open_new(); |
||||
|
test_db_create_tables_open_existing(); |
||||
|
test_db_create_tables_on_open_bad(); |
||||
|
test_db_create_tables_on_open_corrupt(); |
||||
|
// insert (execute())
|
||||
|
test_db_insert_on_tables_exist(); |
||||
|
test_db_insert_on_tables_dont_exist(); |
||||
|
test_db_insert_before_open(); |
||||
|
test_db_insert_after_close(); |
||||
|
// verify contents (execute())
|
||||
|
test_db_verify_content_existing_open_db(); |
||||
|
test_db_verify_content_after_insert_on_tables_exist(); |
||||
|
test_db_verify_content_no_tables(); |
||||
|
test_db_verify_content_after_create_tables(); |
||||
|
// get_path()
|
||||
|
test_get_path_on_instance_good(); |
||||
|
test_get_path_on_instance_bad(); |
||||
|
// delete_db()
|
||||
|
test_delete_file_gone_before_open_new(); |
||||
|
test_delete_file_gone_before_open_existing(); |
||||
|
test_delete_file_gone_after_close_new(); |
||||
|
test_delete_file_gone_after_open_existing(); |
||||
|
test_delete_file_gone_after_open_corrupt(); |
||||
|
test_delete_file_gone_after_open_bad(); |
||||
|
// is_open()
|
||||
|
test_is_open_before_open_new(); |
||||
|
test_is_open_after_open_new(); |
||||
|
test_is_open_after_open_existing(); |
||||
|
test_is_open_after_open_bad(); |
||||
|
test_is_open_after_open_corrupt(); |
||||
|
test_is_open_after_close(); |
||||
|
test_is_open_after_delete_on_open(); |
||||
|
test_is_open_after_delete_on_closed(); |
||||
|
return 0; |
||||
|
} |
@ -0,0 +1,116 @@ |
|||||
|
// This file is under GNU General Public License 3.0
|
||||
|
// see LICENSE.txt
|
||||
|
|
||||
|
#ifndef LIBPEPADAPTER_TEST_PEPSQLITE_HH |
||||
|
#define LIBPEPADAPTER_TEST_PEPSQLITE_HH |
||||
|
|
||||
|
#include <string> |
||||
|
#include "../src/pEpSQLite.hh" |
||||
|
|
||||
|
// ATTENTION ATTENTION ATTENTION ATTENTION ATTENTION ATTENTION ATTENTION
|
||||
|
//
|
||||
|
// THIS IS TERRIBLE, JUST TERRIBLE, THIS IS A ANTI-PATTERN
|
||||
|
// Thats the single most stupid way of writing unit test ever!!!
|
||||
|
// DONT EVER DO THIS!
|
||||
|
//
|
||||
|
// The idea is as follows:
|
||||
|
// * Tests start simple and become increasingly complex
|
||||
|
// * There are fixtures and tests, as usual
|
||||
|
// * You start with basic fixtures to write the first test
|
||||
|
// * A test becomes a fixture, if the operation is needed for another test
|
||||
|
// * You systematically cover all the states possible in which a test can be executed
|
||||
|
//
|
||||
|
// THATS JUST TERRIBLE!!!
|
||||
|
// I WILL NEVER DO THAT AGAIN!
|
||||
|
//
|
||||
|
// ATTENTION ATTENTION ATTENTION ATTENTION ATTENTION ATTENTION ATTENTION
|
||||
|
|
||||
|
namespace pEp { |
||||
|
namespace Test { |
||||
|
// FIXTURES
|
||||
|
// --------
|
||||
|
// filenames
|
||||
|
std::string fixture_db_filename_new(); |
||||
|
std::string fixture_db_filename_existing_and_verified(); |
||||
|
std::string fixture_db_filename_bad(); |
||||
|
std::string fixture_db_filename_corrupt(); |
||||
|
// prepared db's
|
||||
|
std::string fixture_init_db_new(); |
||||
|
std::string fixture_init_db_existing_and_verified(); |
||||
|
std::string fixture_init_db_corrupt(); |
||||
|
// instance
|
||||
|
pEpSQLite fixture_instance_of_new(); |
||||
|
pEpSQLite fixture_instance_of_existing_and_verified(); |
||||
|
pEpSQLite fixture_instance_of_bad(); |
||||
|
pEpSQLite fixture_instance_of_corrupt(); |
||||
|
// open
|
||||
|
pEpSQLite fixture_db_open_of_new(); |
||||
|
pEpSQLite fixture_db_open_of_existing_and_verified(); |
||||
|
pEpSQLite fixture_db_open_of_bad(); |
||||
|
pEpSQLite fixture_db_open_of_corrupt(); |
||||
|
pEpSQLite fixture_db_open_after_close(); |
||||
|
// tables
|
||||
|
pEpSQLite fixture_db_open_with_tables_of_new(); |
||||
|
pEpSQLite fixture_db_open_with_tables_of_corrupt(); |
||||
|
// content
|
||||
|
pEpSQLite fixture_db_open_with_tables_and_content(); |
||||
|
// delete
|
||||
|
pEpSQLite fixture_db_open_after_delete(); |
||||
|
pEpSQLite fixture_db_open_after_close_after_delete(); |
||||
|
|
||||
|
|
||||
|
// TESTS
|
||||
|
// -----
|
||||
|
// instance creation
|
||||
|
pEpSQLite test_create_instance_on_new(); // OK
|
||||
|
pEpSQLite test_create_instance_on_existing(); // OK
|
||||
|
pEpSQLite test_create_instance_on_path_bad(); // OK
|
||||
|
pEpSQLite test_create_instance_on_path_corrupt(); // OK
|
||||
|
// db create_open (create_or_open())
|
||||
|
pEpSQLite test_createopen_db_new(); // OK, new db
|
||||
|
pEpSQLite test_createopen_db_existing(); // OK, open db
|
||||
|
pEpSQLite test_createopen_db_bad(); // ERR, cant create
|
||||
|
pEpSQLite test_createopen_db_corrupt(); // OK (cant detect corruption)
|
||||
|
// close()
|
||||
|
pEpSQLite test_close_before_open(); // OK
|
||||
|
pEpSQLite test_close_after_open(); // OK
|
||||
|
pEpSQLite test_close_idempotent(); // OK
|
||||
|
// create tables (execute())
|
||||
|
pEpSQLite test_db_create_tables_on_open_new(); // OK
|
||||
|
pEpSQLite test_db_create_tables_open_existing(); // ERR, Tables already exist
|
||||
|
pEpSQLite test_db_create_tables_on_open_bad(); // ERR, db closed
|
||||
|
pEpSQLite test_db_create_tables_on_open_corrupt(); // ERR, db corrupt
|
||||
|
// insert (execute())
|
||||
|
pEpSQLite test_db_insert_on_tables_exist(); // OK
|
||||
|
pEpSQLite test_db_insert_on_tables_dont_exist(); // ERR, Tables missing
|
||||
|
pEpSQLite test_db_insert_before_open(); // ERR, Tables missing
|
||||
|
pEpSQLite test_db_insert_after_close(); // ERR, Tables missing
|
||||
|
// verify contents (execute())
|
||||
|
pEpSQLite test_db_verify_content_existing_open_db(); // OK
|
||||
|
pEpSQLite test_db_verify_content_after_insert_on_tables_exist(); // OK
|
||||
|
pEpSQLite test_db_verify_content_no_tables(); // ERR - no tables
|
||||
|
pEpSQLite test_db_verify_content_after_create_tables(); // ERR - err no data
|
||||
|
// get_path()
|
||||
|
pEpSQLite test_get_path_on_instance_good(); // OK
|
||||
|
pEpSQLite test_get_path_on_instance_bad(); // OK
|
||||
|
// delete_db()
|
||||
|
pEpSQLite test_delete_file_gone_before_open_new(); // OK?
|
||||
|
pEpSQLite test_delete_file_gone_before_open_existing(); // OK
|
||||
|
pEpSQLite test_delete_file_gone_after_close_new(); // OK
|
||||
|
pEpSQLite test_delete_file_gone_after_open_existing(); // OK
|
||||
|
pEpSQLite test_delete_file_gone_after_open_corrupt(); // OK
|
||||
|
pEpSQLite test_delete_file_gone_after_open_bad(); // ERR
|
||||
|
// is_open()
|
||||
|
pEpSQLite test_is_open_before_open_new(); // false
|
||||
|
pEpSQLite test_is_open_after_open_new(); // true
|
||||
|
pEpSQLite test_is_open_after_open_existing(); // true
|
||||
|
pEpSQLite test_is_open_after_open_bad(); // false
|
||||
|
pEpSQLite test_is_open_after_open_corrupt(); // true (cant detect corruption)
|
||||
|
pEpSQLite test_is_open_after_close(); // false
|
||||
|
pEpSQLite test_is_open_after_delete_on_open(); // false
|
||||
|
pEpSQLite test_is_open_after_delete_on_closed(); // false
|
||||
|
|
||||
|
} // namespace Test
|
||||
|
} // end of namespace pEp
|
||||
|
|
||||
|
#endif // LIBPEPADAPTER_TEST_PEPSQLITE_HH
|
Loading…
Reference in new issue