From 4ad86b5da30280046b7262a28b662b09232dd534 Mon Sep 17 00:00:00 2001 From: Daniel <d.hornung@indiscale.com> Date: Tue, 31 Aug 2021 12:08:26 +0200 Subject: [PATCH] TEST: Test for server #170 (Updating datatype to list & add value) --- test/CMakeLists.txt | 1 + test/test_issues.cpp | 147 ++++++++++++++++++++++++++++++++++++++ test/test_transaction.cpp | 3 +- 3 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 test/test_issues.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index ec9d390..4e70ab9 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -26,6 +26,7 @@ set(test_cases test_transaction test_list_properties test_ccaosdb + test_issues ) diff --git a/test/test_issues.cpp b/test/test_issues.cpp new file mode 100644 index 0000000..2d12f4d --- /dev/null +++ b/test/test_issues.cpp @@ -0,0 +1,147 @@ +#include "caosdb/connection.h" // for Connection, ConnectionManager +#include "caosdb/data_type.h" // for AtomicDataType +#include "caosdb/entity.h" // for Entity, Messages, Message +#include "caosdb/file_transmission/file_reader.h" // for FileReader +#include "caosdb/file_transmission/file_writer.h" // for FileWriter +#include "caosdb/message_code.h" // for ENTITY_DOES_NOT_EXIST, Messag... +#include "caosdb/status_code.h" // for SUCCESS, StatusCode +#include "caosdb/transaction.h" // for Entity, Transaction,... +#include "caosdb/transaction_status.h" // for TransactionStatus, StatusCode +#include <boost/filesystem/operations.hpp> // for remove +#include <boost/filesystem/path.hpp> // for path +#include <boost/filesystem/path_traits.hpp> // for filesystem +#include <boost/lexical_cast.hpp> +#include <gtest/gtest-message.h> // for Message +#include <gtest/gtest-spi.h> // for EXPECT_NONFATAL_FAILURE +#include <gtest/gtest-test-part.h> // for TestPartResult, SuiteApiResolver +#include <gtest/gtest_pred_impl.h> // for Test, EXPECT_EQ, AssertionResult +#include <iostream> +#include <memory> // for unique_ptr, allocator, __shar... +#include <string> // for string +#include <vector> // for vector + +namespace fs = boost::filesystem; +namespace caosdb::transaction { +using caosdb::entity::AtomicDataType; +using caosdb::entity::Entity; +using caosdb::entity::Role; +using caosdb::entity::Value; + +class test_issues : public ::testing::Test { +public: + // public utility functions + // //////////////////////////////////////////////////////// + + /** + * Generate a vector with useful values for testing. + */ + template <typename T> static auto generateValues() -> std::vector<T> { + std::vector<T> values = { + 0, 1, + // (T)6.91629132943846e-310, + std::numeric_limits<T>::max(), std::numeric_limits<T>::min(), + std::numeric_limits<T>::denorm_min(), std::numeric_limits<T>::lowest(), + std::numeric_limits<T>::epsilon() // 0 for integers, but who cares? + }; + + return values; + } + + template <typename T> static auto getValueAs(const Value & /*value*/) -> T { + throw std::logic_error("Template not implemented for this type."); + } + static void DeleteEntities() { + // delete all entities + const auto &connection = + caosdb::connection::ConnectionManager::GetDefaultConnection(); + auto query_transaction(connection->CreateTransaction()); + query_transaction->Query("FIND ENTITY WITH id > 99"); + query_transaction->Execute(); + if (query_transaction->GetResultSet().size() > 0) { + std::cout << "Cleanup: Deleting " + << query_transaction->GetResultSet().size() << " entities." + << std::endl; + auto delete_transaction(connection->CreateTransaction()); + for (const Entity &entity : query_transaction->GetResultSet()) { + delete_transaction->DeleteById(entity.GetId()); + } + delete_transaction->Execute(); + } + } + +protected: + fs::path test_upload_file_1; + fs::path test_download_file_1; + + // Fixture methods ////////////////////////////////////////////////////////// + + void SetUp() override { + DeleteEntities(); + + test_upload_file_1 = fs::path("test_upload_file_1_delete_me.dat"); + test_download_file_1 = fs::path("test_download_file_1_delete_me.dat"); + + // fill the file that shall be uploaded + FileWriter writer(test_upload_file_1); + std::string buffer(1024, 'c'); + for (int i = 0; i < 8; i++) { + writer.write(buffer); + } + } + + void TearDown() override { + // delete files + fs::remove(test_upload_file_1); + fs::remove(test_download_file_1); + DeleteEntities(); + } +}; + +/* + * test error-prone updates + */ +TEST_F(test_issues, server_issue_170) { + const auto &connection = + caosdb::connection::ConnectionManager::GetDefaultConnection(); + + // Insert original + auto insert_transaction(connection->CreateTransaction()); + + Entity original; + original.SetRole(Role::PROPERTY); + original.SetName("Prop 1"); + original.SetDataType(AtomicDataType::DOUBLE); + insert_transaction->InsertEntity(&original); + insert_transaction->ExecuteAsynchronously(); + auto insert_status = insert_transaction->WaitForIt(); + ASSERT_TRUE(insert_status.IsTerminated()); + ASSERT_FALSE(insert_status.IsError()); + + const auto &insert_result_set = insert_transaction->GetResultSet(); + auto id = insert_result_set.at(0).GetId(); + EXPECT_FALSE(id.empty()); + + // Retrieve original with ID + auto retrieve_transaction(connection->CreateTransaction()); + retrieve_transaction->RetrieveById(id); + retrieve_transaction->Execute(); + auto update_entity(retrieve_transaction->GetResultSet().at(0)); + + // UPDATE + auto update_transaction(connection->CreateTransaction()); + update_entity.SetDataType(AtomicDataType::INTEGER, true); + update_entity.SetValue(std::vector<int32_t>{1, 1, 2, 3, 5, 8, 13}); + + EXPECT_NONFATAL_FAILURE( + { + update_transaction->UpdateEntity(&update_entity); + update_transaction->ExecuteAsynchronously(); + + auto update_status = update_transaction->WaitForIt(); + EXPECT_TRUE(update_status.IsTerminated()); + EXPECT_FALSE(update_status.IsError()); + }, + "update_status.IsError"); +} + +} // namespace caosdb::transaction diff --git a/test/test_transaction.cpp b/test/test_transaction.cpp index 64b6d8a..d98c68f 100644 --- a/test/test_transaction.cpp +++ b/test/test_transaction.cpp @@ -1,8 +1,9 @@ /* * This file is a part of the CaosDB Project. * - * Copyright (C) 2021 Timm Fitschen <t.fitschen@indiscale.com> * Copyright (C) 2021 IndiScale GmbH <info@indiscale.com> + * Copyright (C) 2021 Timm Fitschen <t.fitschen@indiscale.com> + * Copyright (C) 2021 Daniel Hornung <d.hornung@indiscale.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as -- GitLab