diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index 08a6f139e615e4d63da65b4f6cc21ceb82aeba13..9ca9efb055e31a4ef7903f3843b0b935ff412266 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -29,16 +29,67 @@ target_link_libraries(catch2_main Catch2::Catch2 ) + +# needed for filesystem header +set(CMAKE_CXX_STANDARD 17) + + # define executables for tests and make them depend on the convenience # library (and Catch2 transitively) and fmt + +# test source files +set(test_src + test_example_00.cpp + test_example_01.cpp + db_test.cpp + ) + +# needed headers +set(test_headers + ../../src/global/path_util.cpp + ../../src/daemon/ops/metadentry.cpp + ../../src/daemon/classes/fs_data.cpp + ../../src/global/metadata.cpp + ../../include/global/metadata.hpp + ../../include/daemon/classes/fs_data.hpp + ../../include/version.hpp + ../../include/global/configure.hpp + ../../include/global/global_defs.hpp + ../../include/global/rpc/rpc_types.hpp + ../../include/global/path_util.hpp + ../../include/daemon/ops/metadentry.hpp + ../../include/daemon/classes/fs_data.hpp + ../../include/daemon/classes/rpc_data.hpp + ../../include/daemon/handler/rpc_defs.hpp + ) + add_executable(tests - test_example_00.cpp - test_example_01.cpp -) + ${test_src} + ${test_headers} + ) +# probably dont need all yet target_link_libraries(tests catch2_main fmt::fmt + metadata + metadata_db + storage + distributor + log_util + env_util + spdlog + hermes + # margo libs + ${ABT_LIBRARIES} + mercury + ${MARGO_LIBRARIES} + # others + Boost::boost # needed for tokenizer header + Boost::program_options + Boost::filesystem + Threads::Threads + pthread ) # Catch2's contrib folder includes some helper functions diff --git a/tests/unit/db_test.cpp b/tests/unit/db_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bc2e93f28226ad58c92915012098afe2718e12df --- /dev/null +++ b/tests/unit/db_test.cpp @@ -0,0 +1,302 @@ +// +// Created by tunahan on 10.02.20. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// nach auflistugn/beschreibungsmöglichkeiten schauen +// -l -t für auflistung +// --list-test-names-only + +std::string gen_random(const int len, bool key) { + std::string s; + s.resize(len); + static const char alphanum[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz"; + + static const char numbers[] = "123456789"; + if (key) { + s[0] = '/'; + for (int i = 1; i < len; ++i) { + s[i] = alphanum[std::rand() % (sizeof(alphanum) - 1)]; + } + s[len] = '\0'; + }else{ + if(len < 6) return s; + for (int i = 0; i < len-5; ++i) { + s[i] = numbers[std::rand() % (sizeof(numbers) - 1)]; + } + s[len-5] = '|'; + for (int i = len-4; i < len; ++i) { + s[i] = numbers[std::rand() % (sizeof(numbers) - 1)]; + } + + s[len-1] = '|'; + } + return s; +} +// BDD STYLE + +int i = 0; +SCENARIO( "RDB - Input single Key", "[RocksDB]") { + GIVEN("Open a db") { + + // when open db + std::string metadata_path = "/tmp/db_test" + std::to_string(i); + gkfs::metadata::MetadataDB db = gkfs::metadata::MetadataDB(metadata_path); + i++; + WHEN("Try to input key") { + std::string key = "/a"; + std::string val = "453|123|"; + + db.put(key, val); + + THEN("Key and value in DB") { + auto res = db.get(key); + REQUIRE(res == val); + } + } + + boost::filesystem::remove_all(metadata_path); + + } +} + +SCENARIO( "RDB - Insert 1 key with two values", "[RocksDB]") { + GIVEN("Open a db") { + + // when open db + std::string metadata_path = "/tmp/db_test" + std::to_string(i); + gkfs::metadata::MetadataDB db = gkfs::metadata::MetadataDB(metadata_path); + i++; + + WHEN("RocksDB 1 key two values - returns first value"){ + std::string key = "/a"; + std::string val = "453|123|"; + std::string val2 = "453|124|"; + + THEN("First value returns for key") { + db.put(key, val); + db.put(key, val2); + + auto res = db.get(key); + REQUIRE(res == val); + } + } + + boost::filesystem::remove_all(metadata_path); + + } +} + + +SCENARIO( "RDB - delete existing Key", "[RocksDB]") { + GIVEN("Open a db") { + + // when open db + std::string metadata_path = "/tmp/db_test" + std::to_string(i); + gkfs::metadata::MetadataDB db = gkfs::metadata::MetadataDB(metadata_path); + i++; + + WHEN("RocksDB delete inserted key") { + std::string metadata_path = "/home/tunahan/rocksdb"; + + std::string key = "/"; + std::string val = "453|123|"; + THEN("Key not in DB anymore") { + db.put(key, val); + db.remove(key); + } + } + + + boost::filesystem::remove_all(metadata_path); + + } +} + + +SCENARIO( "RDB - Get deleted Key", "[RocksDB]") { + GIVEN("Open a db") { + + // when open db + std::string metadata_path = "/tmp/db_test" + std::to_string(i); + gkfs::metadata::MetadataDB db = gkfs::metadata::MetadataDB(metadata_path); + i++; + + WHEN("RocksDB get deleted key") { + std::string metadata_path = "/home/tunahan/rocksdb"; + + std::string key = "/"; + std::string val = "453|123|"; + THEN(" requie return = Nor Found: ") { + db.put(key, val); + db.remove(key); + REQUIRE_THROWS(db.get(key), "Not Found: "); + } + } + + boost::filesystem::remove_all(metadata_path); + + } + +} + +SCENARIO( "RDB - update existing Key", "[RocksDB]") { + GIVEN("Open a db") { + + // when open db + std::string metadata_path = "/tmp/db_test" + std::to_string(i); + gkfs::metadata::MetadataDB db = gkfs::metadata::MetadataDB(metadata_path); + i++; + + + + WHEN("RocksDB update key") { + std::string metadata_path = "/home/tunahan/rocksdb"; + + std::string key = "/"; + std::string key2 = "/a"; + std::string val = "453|123|"; + std::string val2 = "453|151|"; + THEN("require old key deleted and new key inserted") { + db.put(key, val); + db.update(key, key2, val2); + auto res2 = db.get(key2); + REQUIRE_THROWS(db.get(key), "Not Found: "); + REQUIRE(res2 == val2); + } + } + + boost::filesystem::remove_all(metadata_path); + + + } +} + + +SCENARIO( "RDB - Bulk Put/Get - single core", "[RocksDB]") { + GIVEN("Open a db") { + + // when open db + std::string metadata_path = "/tmp/db_test" + std::to_string(i); + gkfs::metadata::MetadataDB db = gkfs::metadata::MetadataDB(metadata_path); + i++; + + WHEN("Bulk Insert/Get - single core") { + + + const int number_Entries = 100; + const int len_strings = 10; + std::set keyList; + std::vector valList; + for (int j = 0; j < number_Entries; j++) { + std::string temp; + temp = gen_random(len_strings, false); + valList.push_back(temp); + //std::cout << temp << "\n"; + temp = gen_random(len_strings, true); + keyList.insert(temp); + //std::cout << temp << "\n"; + } + + THEN("require all successfull") { + + auto keys = keyList.begin(); + for (int j = 0; j < number_Entries; j++) { + auto key = *(keys++); + db.put(key, valList[j]); + auto res = db.get(key); + REQUIRE(res == valList[j]); + } + } + } + + boost::filesystem::remove_all(metadata_path); + + + } +} + + + +SCENARIO( "RDB - Multithreaded Bulk Insert and Get", "[RocksDB]") { + GIVEN("Open a db") { + + // when open db + std::string metadata_path = "/tmp/db_test" + std::to_string(i); + gkfs::metadata::MetadataDB db = gkfs::metadata::MetadataDB(metadata_path); + i++; + + WHEN("Multithreaded Bulk Insert and Get") { + + const int number_Entries = 1000; + + + std::vector threads; + + for (int i = 0; i < 8; ++i) { + threads.emplace_back([&]() { + const int len_strings = 10; + std::set keyList; + std::vector valList; + for (int i = 0; i < number_Entries; i++) { + std::string temp; + temp = gen_random(len_strings, false); + valList.push_back(temp); + temp = gen_random(len_strings, true); + keyList.insert(temp); + } + auto keys = keyList.begin(); + for (int i = 0; i < number_Entries; i++) { + auto key = *(keys++); + db.put(key, valList[i]); + auto res = db.get(key); + REQUIRE(res == valList[i]); + } + }); + } + + for (auto &t : threads) { t.join(); } + + } + boost::filesystem::remove_all(metadata_path); + + + } +} +SCENARIO( "RDB - Merge Operator", "[RocksDB]") { + GIVEN("Open a db") { + + // when open db + std::string metadata_path = "/tmp/db_test" + std::to_string(i); + gkfs::metadata::MetadataDB db = gkfs::metadata::MetadataDB(metadata_path); + i++; + WHEN("Merge Operation") { + + std::string key = "/a"; + std::string val = "4523|123|"; + + THEN("increase size of key") { + db.put(key, val); + db.increase_size(key, 10, true); + } + } + boost::filesystem::remove_all(metadata_path); + + } + +} +