From 9af086151e6d9d3fe88f9e3e21797812a3e701ba Mon Sep 17 00:00:00 2001 From: dec05eba <0xdec05eba@gmail.com> Date: Mon, 14 May 2018 00:20:11 +0200 Subject: Replace files with sqlite Using sqlite because sqlite has transactions, storing/loading from files automatically, unloading data that is not accessed often. Removed cosmetic data (node name, username). They can be added using addData by the application that uses odhtdb instead. Database callback functions can now be called with stored data using database.loadNode function. TODO: Add local user storage (with password) back, it has been temorary disabled --- tests/assert.hpp | 12 +++++--- tests/main.cpp | 86 +++++++++++++++++++++++++++++++++++--------------------- 2 files changed, 62 insertions(+), 36 deletions(-) (limited to 'tests') diff --git a/tests/assert.hpp b/tests/assert.hpp index 86f74f2..03157c6 100644 --- a/tests/assert.hpp +++ b/tests/assert.hpp @@ -2,19 +2,23 @@ #include #include +#include +#include template static void assertEquals(const T &expected, const T &actual) { if(expected != actual) { - std::cerr << "Assertion failed!\nExpected: " << expected << ", actual: " << actual << std::endl; - exit(1); + std::stringstream ss; + ss << "Assertion failed!\nExpected: " << expected << ", actual: " << actual << std::endl; + throw std::runtime_error(ss.str()); } } static void fail(const std::string &errMsg) { - fprintf(stderr, "Fail:\n%.*s\n", errMsg.size(), errMsg.c_str()); - exit(1); + std::stringstream ss; + ss << "Fail:\n" << errMsg << std::endl; + throw std::runtime_error(ss.str()); } diff --git a/tests/main.cpp b/tests/main.cpp index 8f19838..6e1a72f 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -12,6 +12,7 @@ #include #include #include +#include using namespace std; using namespace chrono_literals; @@ -144,59 +145,80 @@ void testTimestamp(const Database &database) int main() { Log::debug("Starting tests..."); + boost::filesystem::path storagePath("/tmp/odhtdbTest"); + boost::filesystem::remove_all(storagePath); + boost::filesystem::create_directory(storagePath); + testCachedIdentity(); testBinHexConvert(); testHash(); testEncryption(); - LocalUser *localUser = LocalUser::create(Signature::KeyPair(), "dec05eba", nullptr); - testSignData(localUser); - - // TODO: Setup local bootstrap node for tests - Database database("bootstrap.ring.cx", 4222, "storage"); - - testTimestamp(database); - int createNodeCounter = 0; int addDataCounter = 0; int addUserCounter = 0; - database.setOnCreateNodeCallback([&createNodeCounter](const DatabaseCreateNodeRequest &request) + auto createNodeCallback = [&createNodeCounter](const DatabaseCreateNodeRequest &request) { Log::debug("Create node callback"); ++createNodeCounter; - }); - - database.setOnAddNodeCallback([&addDataCounter](const DatabaseAddNodeRequest &request) + }; + + auto addNodeCallback = [&addDataCounter](const DatabaseAddNodeRequest &request) { Log::debug("Add node callback"); ++addDataCounter; - }); - - database.setOnAddUserCallback([&addUserCounter](const DatabaseAddUserRequest &request) + }; + + auto addUserCallback = [&addUserCounter](const DatabaseAddUserRequest &request) { Log::debug("Add user callback"); ++addUserCounter; - }); + }; - auto databaseCreateResponse = database.create("adminUserName", "latenight"); - DatabaseNode databaseNode(databaseCreateResponse->getNodeEncryptionKey(), databaseCreateResponse->getRequestHash()); - auto adminUser = (LocalUser*)databaseCreateResponse->getNodeAdminUser(); - database.addData(databaseNode, adminUser, DataView{ (void*)"hello, world!", 13 }); - database.addUser(databaseNode, adminUser, localUser->getName(), localUser->getPublicKey(), adminUser->getGroups()[0]); - localUser->addToGroup(adminUser->getGroups()[0]); - database.addData(databaseNode, localUser, DataView{ (void*)"hello, aaald!", 13 }); - - database.seed(databaseNode); - auto start = chrono::high_resolution_clock::now(); - while(chrono::high_resolution_clock::now() - start < 3s) + DatabaseCallbackFuncs callbackFuncs { createNodeCallback, addNodeCallback, addUserCallback }; + DatabaseNode databaseNode; + { - this_thread::sleep_for(10ms); + LocalUser *localUser = LocalUser::create(Signature::KeyPair(), nullptr); + testSignData(localUser); + + // TODO: Setup local bootstrap node for tests + Database database("bootstrap.ring.cx", 4222, storagePath, callbackFuncs); + testTimestamp(database); + + auto databaseCreateResponse = database.create(); + databaseNode = { databaseCreateResponse->getNodeEncryptionKey(), databaseCreateResponse->getRequestHash() }; + auto adminUser = (LocalUser*)databaseCreateResponse->getNodeAdminUser(); + database.addData(databaseNode, adminUser, DataView{ (void*)"hello, world!", 13 }); + database.addUser(databaseNode, adminUser, localUser->getPublicKey(), adminUser->getGroups()[0]); + localUser->addToGroup(adminUser->getGroups()[0]); + database.addData(databaseNode, localUser, DataView{ (void*)"hello, aaald!", 13 }); + + database.seed(databaseNode); + this_thread::sleep_for(chrono::seconds(3)); + + assertEquals(1, createNodeCounter); + assertEquals(2, addDataCounter); + assertEquals(1, addUserCounter); + } + Log::debug("Callback works when adding data while connected, now testing to reconnect and check if data remains..."); + { + createNodeCounter = 0; + addDataCounter = 0; + addUserCounter = 0; + + // TODO: Setup local bootstrap node for tests + Database database("bootstrap.ring.cx", 4222, storagePath, callbackFuncs); + database.loadNode(*databaseNode.getRequestHash()); + + database.seed(databaseNode); + this_thread::sleep_for(chrono::seconds(3)); + + assertEquals(1, createNodeCounter); + assertEquals(2, addDataCounter); + assertEquals(1, addUserCounter); } - - assertEquals(1, createNodeCounter); - assertEquals(2, addDataCounter); - assertEquals(1, addUserCounter); return 0; } -- cgit v1.2.3