Skip to content
Snippets Groups Projects
Verified Commit 0378ad0c authored by Timm Fitschen's avatar Timm Fitschen
Browse files

Merge branch 'f-logging-segfaults' into f-debug-build

parents 6a3a54c9 aefa6bbf
No related branches found
No related tags found
2 merge requests!33Release 0.1,!30Debug build
Pipeline #14873 failed
...@@ -181,6 +181,8 @@ public: ...@@ -181,6 +181,8 @@ public:
} }
} }
~DataType() = default;
inline static auto ListOf(const AtomicDataType &atomic_data_type) -> DataType { inline static auto ListOf(const AtomicDataType &atomic_data_type) -> DataType {
return DataType(atomic_data_type, true); return DataType(atomic_data_type, true);
} }
......
...@@ -385,6 +385,37 @@ class Parent : public ScalarProtoMessageWrapper<ProtoParent> { ...@@ -385,6 +385,37 @@ class Parent : public ScalarProtoMessageWrapper<ProtoParent> {
public: public:
explicit inline Parent(ProtoParent *wrapped) : ScalarProtoMessageWrapper<ProtoParent>(wrapped){}; explicit inline Parent(ProtoParent *wrapped) : ScalarProtoMessageWrapper<ProtoParent>(wrapped){};
Parent() : ScalarProtoMessageWrapper<ProtoParent>(){}; Parent() : ScalarProtoMessageWrapper<ProtoParent>(){};
~Parent() = default;
/**
* Copy constructor.
*/
inline Parent(const Parent &other)
: Parent(ProtoMessageWrapper<ProtoParent>::CopyProtoMessage(other.wrapped)) {}
/**
* Move constructor.
*/
inline Parent(Parent &&other) : Parent(other.wrapped) { other.wrapped = nullptr; }
/**
* Copy assignment operator.
*/
inline auto operator=(const Parent &other) -> Parent & {
if (this != &other) {
this->wrapped->CopyFrom(*other.wrapped);
}
return *this;
}
/**
* Move assignment operator.
*/
inline auto operator=(Parent &&other) -> Parent & {
this->wrapped = other.wrapped;
other.wrapped = nullptr;
return *this;
}
/** /**
* Return the id of the parent entity. * Return the id of the parent entity.
...@@ -499,6 +530,8 @@ public: ...@@ -499,6 +530,8 @@ public:
: ScalarProtoMessageWrapper<ProtoProperty>(), value(static_cast<ProtoValue *>(nullptr)), : ScalarProtoMessageWrapper<ProtoProperty>(), value(static_cast<ProtoValue *>(nullptr)),
data_type(static_cast<ProtoDataType *>(nullptr)){}; data_type(static_cast<ProtoDataType *>(nullptr)){};
~Property() = default;
/** /**
* Return the id of this property * Return the id of this property
*/ */
...@@ -650,14 +683,17 @@ private: ...@@ -650,14 +683,17 @@ private:
* Overview of the Constructors: * Overview of the Constructors:
* *
* <li> Entity() - Calls Entity(ProtoEntity *) with a fresh ProtoEntity * <li> Entity() - Calls Entity(ProtoEntity *) with a fresh ProtoEntity
* <li> Entity(Entity) - Copy constructor, calls Entity(ProtoEntity *) after copying wrapped * <li> Entity(const Entity&) - Copy constructor, calls Entity(ProtoEntity *) after
* ProtoEntity of the original, then also copies all Messages. <li> Entity(ProtoEntity *) - The * copying wrapped ProtoEntity of the original, then also copies all Messages.
* workhorse of the constructors. Initializes everything and does not call other Entity * <li> Entity(ProtoEntity *) - The workhorse of the constructors. Initializes
* constructors. <li> Entity(EntityResponse *) - Constructor which is used by the Transaction class * everything and does not call other Entity constructors.
* to create an Entity from the server's response, calls Entity(ProtoEntity). <li> Entity(IdResponse * <li> Entity(EntityResponse *) - Constructor which is used by the Transaction class
* *) - Constructor which is used by the Transaction class to create an Entity from the servers's * to create an Entity from the server's response, calls Entity(ProtoEntity).
* response. calls Entity(), then moves the data to the wrapped ProtoEntity. * <li> Entity(IdResponse *) - Constructor which is used by the Transaction
* * class to create an Entity from the servers's response. calls Entity(),
* then moves the data to the wrapped ProtoEntity.
* <li> Entity(Entity&&) - Move constructor, calls Entity(ProtoEntity *), then
* moves the messages and resets the original,
*/ */
class Entity : public ScalarProtoMessageWrapper<ProtoEntity> { class Entity : public ScalarProtoMessageWrapper<ProtoEntity> {
public: public:
...@@ -700,6 +736,8 @@ public: ...@@ -700,6 +736,8 @@ public:
parents.wrapped = this->wrapped->mutable_parents(); parents.wrapped = this->wrapped->mutable_parents();
}; };
~Entity() = default;
/** /**
* Move constructor. * Move constructor.
*/ */
...@@ -707,8 +745,8 @@ public: ...@@ -707,8 +745,8 @@ public:
original.wrapped = nullptr; original.wrapped = nullptr;
original.value.wrapped = nullptr; original.value.wrapped = nullptr;
original.data_type.wrapped = nullptr; original.data_type.wrapped = nullptr;
this->properties = std::move(original.properties); original.properties.wrapped = nullptr;
this->parents = std::move(original.parents); original.parents.wrapped = nullptr;
this->errors = std::move(original.errors); this->errors = std::move(original.errors);
this->warnings = std::move(original.warnings); this->warnings = std::move(original.warnings);
this->infos = std::move(original.infos); this->infos = std::move(original.infos);
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include <boost/filesystem/fstream.hpp> // for ifstream #include <boost/filesystem/fstream.hpp> // for ifstream
#include <boost/filesystem/operations.hpp> // for exists #include <boost/filesystem/operations.hpp> // for exists
#include <boost/filesystem/path.hpp> // for path #include <boost/filesystem/path.hpp> // for path
#include <cstddef> // for size_t
#include <fstream> // for ifstream, size_t #include <fstream> // for ifstream, size_t
#include <string> // for string #include <string> // for string
......
attrs==21.2.0 attrs==21.2.0
bottle==0.12.19 bottle==0.12.19
certifi==2021.5.30 certifi==2021.10.8
chardet==4.0.0 chardet==4.0.0
charset-normalizer==2.0.7
colorama==0.4.4 colorama==0.4.4
conan==1.40.3 conan==1.41.0
deprecation==2.0.7 deprecation==2.1.0
distro==1.5.0 distro==1.6.0
fasteners==0.16.3 fasteners==0.16.3
future==0.18.2 future==0.18.2
idna==2.10 idna==3.2
Jinja2==2.11.3 Jinja2==2.11.3
jsonschema==3.2.0 jsonschema==4.1.0
MarkupSafe==2.0.1 MarkupSafe==2.0.1
node-semver==0.6.1 node-semver==0.6.1
packaging==20.9 packaging==21.0
patch-ng==1.17.4 patch-ng==1.17.4
pluginbase==1.0.1 pluginbase==1.0.1
Pygments==2.9.0 Pygments==2.10.0
PyJWT==1.7.1 PyJWT==1.7.1
pyparsing==2.4.7 pyparsing==2.4.7
pyrsistent==0.18.0 pyrsistent==0.18.0
python-dateutil==2.8.1 python-dateutil==2.8.2
PyYAML==5.4.1 PyYAML==5.4.1
requests==2.25.1 requests==2.26.0
six==1.15.0 six==1.16.0
tqdm==4.61.1 tqdm==4.62.3
urllib3==1.25.11 urllib3==1.26.7
...@@ -41,7 +41,7 @@ set(test_cases ...@@ -41,7 +41,7 @@ set(test_cases
# special linting for tests # special linting for tests
set(_CMAKE_CXX_CLANG_TIDY_TEST_CHECKS set(_CMAKE_CXX_CLANG_TIDY_TEST_CHECKS
"${_CMAKE_CXX_CLANG_TIDY_CHECKS},-cert-err58-cpp,-cppcoreguidelines-avoid-non-const-global-variables,-cppcoreguidelines-owning-memory,-modernize-use-trailing-return-type,-google-readability-avoid-underscore-in-googletest-name,-cppcoreguidelines-avoid-magic-numbers,-readability-magic-numbers,-cppcoreguidelines-avoid-goto,-hicpp-avoid-goto,-readability-function-cognitive-complexity,-cppcoreguidelines-non-private-member-variables-in-classes,-misc-non-private-member-variables-in-classes" "${_CMAKE_CXX_CLANG_TIDY_CHECKS},-cert-err58-cpp,-cppcoreguidelines-avoid-non-const-global-variables,-cppcoreguidelines-owning-memory,-modernize-use-trailing-return-type,-google-readability-avoid-underscore-in-googletest-name,-cppcoreguidelines-avoid-magic-numbers,-readability-magic-numbers,-cppcoreguidelines-avoid-goto,-hicpp-avoid-goto,-readability-function-cognitive-complexity,-cppcoreguidelines-non-private-member-variables-in-classes,-misc-non-private-member-variables-in-classes,-clang-analyzer-cplusplus.Move"
) )
# add special cmake functions for gtest # add special cmake functions for gtest
......
...@@ -129,4 +129,54 @@ TEST(test_data_type, test_data_type_to_string) { ...@@ -129,4 +129,54 @@ TEST(test_data_type, test_data_type_to_string) {
EXPECT_EQ(data_type3.ToString(), "{\n \"atomicDataType\": \"ATOMIC_DATA_TYPE_INTEGER\"\n}\n"); EXPECT_EQ(data_type3.ToString(), "{\n \"atomicDataType\": \"ATOMIC_DATA_TYPE_INTEGER\"\n}\n");
} }
TEST(test_data_type, data_type_copy_constructor) {
DataType data_type("person", true);
const auto dt_string = data_type.ToString();
// copy
const DataType copy_data_type(data_type); // NOLINT (explicit copy)
EXPECT_EQ(copy_data_type, data_type);
EXPECT_EQ(dt_string, copy_data_type.ToString());
}
TEST(test_data_type, data_type_move_constructor) {
DataType data_type("person", true);
const auto dt_string = data_type.ToString();
// copy for testing
const DataType copy_data_type(data_type);
// move
const DataType move_data_type(std::move(data_type)); // NOLINT
EXPECT_NE(data_type, copy_data_type); // NOLINT
EXPECT_NE(data_type.ToString(), dt_string); // NOLINT
EXPECT_EQ(copy_data_type, move_data_type);
EXPECT_EQ(move_data_type.ToString(), dt_string);
}
TEST(test_data_type, data_type_copy_assignment) {
DataType data_type("person", true);
const auto dt_string = data_type.ToString();
// copy
DataType copy_data_type = data_type; // NOLINT (explicit copy)
EXPECT_EQ(copy_data_type, data_type);
EXPECT_EQ(dt_string, copy_data_type.ToString());
}
TEST(test_data_type, data_type_move_assignment) {
DataType data_type("person", true);
const auto dt_string = data_type.ToString();
// copy for testing
const DataType copy_data_type(data_type);
// move
DataType move_data_type = std::move(data_type); // NOLINT
EXPECT_NE(data_type, copy_data_type); // NOLINT
EXPECT_NE(data_type.ToString(), dt_string); // NOLINT
EXPECT_EQ(copy_data_type, move_data_type);
EXPECT_EQ(move_data_type.ToString(), dt_string);
}
} // namespace caosdb::entity } // namespace caosdb::entity
...@@ -142,18 +142,17 @@ TEST(test_entity, test_append_property) { ...@@ -142,18 +142,17 @@ TEST(test_entity, test_append_property) {
EXPECT_EQ(prop.GetDataType(), same_prop.GetDataType()); EXPECT_EQ(prop.GetDataType(), same_prop.GetDataType());
} }
TEST(test_entity, test_copy_constructor) { TEST(test_entity, entity_copy_constructor) {
Arena arena; ProtoParent parent;
auto *parent = Arena::CreateMessage<ProtoParent>(&arena); parent.set_description("the parent desc");
parent->set_description("the parent desc"); parent.set_id("the parent id");
parent->set_id("the parent id"); parent.set_name("the parent name");
parent->set_name("the parent name"); ProtoProperty property;
auto *property = Arena::CreateMessage<ProtoProperty>(&arena); property.set_id("the-prop-id");
property->set_id("the-prop-id"); property.set_description("the prop-desc");
property->set_description("the prop-desc"); property.set_name("the-prop-name");
property->set_name("the-prop-name"); property.mutable_value()->mutable_list_values()->mutable_values()->Add()->set_double_value(25.5);
property->mutable_value()->mutable_list_values()->mutable_values()->Add()->set_double_value(25.5); property.mutable_data_type()->mutable_list_data_type()->set_atomic_data_type(
property->mutable_data_type()->mutable_list_data_type()->set_atomic_data_type(
ProtoAtomicDataType::ATOMIC_DATA_TYPE_DOUBLE); ProtoAtomicDataType::ATOMIC_DATA_TYPE_DOUBLE);
auto *entity_response = Arena::CreateMessage<EntityResponse>(&arena); auto *entity_response = Arena::CreateMessage<EntityResponse>(&arena);
entity_response->mutable_entity()->set_id("the-id"); entity_response->mutable_entity()->set_id("the-id");
...@@ -198,18 +197,17 @@ TEST(test_entity, test_copy_constructor) { ...@@ -198,18 +197,17 @@ TEST(test_entity, test_copy_constructor) {
EXPECT_NE(this_entity.ToString(), copy_entity.ToString()); EXPECT_NE(this_entity.ToString(), copy_entity.ToString());
} }
TEST(test_entity, test_move_constructor) { TEST(test_entity, entity_move_constructor) {
Arena arena; ProtoParent parent;
auto *parent = Arena::CreateMessage<ProtoParent>(&arena); parent.set_description("the parent desc");
parent->set_description("the parent desc"); parent.set_id("the parent id");
parent->set_id("the parent id"); parent.set_name("the parent name");
parent->set_name("the parent name"); ProtoProperty property;
auto *property = Arena::CreateMessage<ProtoProperty>(&arena); property.set_id("the-prop-id");
property->set_id("the-prop-id"); property.set_description("the prop-desc");
property->set_description("the prop-desc"); property.set_name("the-prop-name");
property->set_name("the-prop-name"); property.mutable_value()->mutable_list_values()->mutable_values()->Add()->set_double_value(25.5);
property->mutable_value()->mutable_list_values()->mutable_values()->Add()->set_double_value(25.5); property.mutable_data_type()->mutable_list_data_type()->set_atomic_data_type(
property->mutable_data_type()->mutable_list_data_type()->set_atomic_data_type(
ProtoAtomicDataType::ATOMIC_DATA_TYPE_DOUBLE); ProtoAtomicDataType::ATOMIC_DATA_TYPE_DOUBLE);
auto *entity_response = Arena::CreateMessage<EntityResponse>(&arena); auto *entity_response = Arena::CreateMessage<EntityResponse>(&arena);
entity_response->mutable_errors()->Add()->set_code(25); entity_response->mutable_errors()->Add()->set_code(25);
...@@ -265,7 +263,7 @@ TEST(test_entity, test_move_constructor) { ...@@ -265,7 +263,7 @@ TEST(test_entity, test_move_constructor) {
EXPECT_NE(move_entity.ToString(), copy_entity.ToString()); EXPECT_NE(move_entity.ToString(), copy_entity.ToString());
} }
TEST(test_entity, test_property_copy_constructor) { TEST(test_entity, property_copy_constructor) {
Property prop; Property prop;
prop.SetName("prop_name"); prop.SetName("prop_name");
prop.SetId("prop_id"); prop.SetId("prop_id");
...@@ -285,7 +283,7 @@ TEST(test_entity, test_property_copy_constructor) { ...@@ -285,7 +283,7 @@ TEST(test_entity, test_property_copy_constructor) {
EXPECT_EQ(prop.GetDataType(), other_prop.GetDataType()); EXPECT_EQ(prop.GetDataType(), other_prop.GetDataType());
} }
TEST(test_entity, test_property_copy_assignment) { TEST(test_entity, property_copy_assignment) {
Property prop; Property prop;
prop.SetName("prop_name"); prop.SetName("prop_name");
prop.SetId("prop_id"); prop.SetId("prop_id");
...@@ -310,7 +308,7 @@ TEST(test_entity, test_property_copy_assignment) { ...@@ -310,7 +308,7 @@ TEST(test_entity, test_property_copy_assignment) {
EXPECT_EQ(other_prop.GetName(), "other_prop_name"); EXPECT_EQ(other_prop.GetName(), "other_prop_name");
} }
TEST(test_entity, test_property_move_assignment) { TEST(test_entity, property_move_assignment) {
Property prop; Property prop;
prop.SetName("prop_name"); prop.SetName("prop_name");
prop.SetId("prop_id"); prop.SetId("prop_id");
...@@ -345,6 +343,127 @@ TEST(test_entity, test_property_move_assignment) { ...@@ -345,6 +343,127 @@ TEST(test_entity, test_property_move_assignment) {
EXPECT_EQ(other_prop.GetName(), "other_prop_name"); EXPECT_EQ(other_prop.GetName(), "other_prop_name");
} }
TEST(test_entity, property_move_constructor) {
Property prop;
prop.SetName("prop_name");
prop.SetId("prop_id");
prop.SetImportance(Importance::RECOMMENDED);
prop.SetValue("prop_value");
prop.SetUnit("prop_unit");
prop.SetDataType("prop_dtype");
const auto prop_string = prop.ToString();
// we compare the moved one with this one
const Property copy_prop(prop);
Property other_prop(std::move(prop));
EXPECT_NE(prop, copy_prop); // NOLINT
EXPECT_NE(prop, other_prop); // NOLINT
EXPECT_NE(prop.ToString(), prop_string); // NOLINT
EXPECT_EQ(copy_prop.ToString(), prop_string);
EXPECT_EQ(other_prop.ToString(), prop_string);
EXPECT_EQ(copy_prop, other_prop);
EXPECT_EQ(copy_prop.GetName(), other_prop.GetName());
EXPECT_EQ(copy_prop.GetId(), other_prop.GetId());
EXPECT_EQ(copy_prop.GetImportance(), other_prop.GetImportance());
EXPECT_EQ(copy_prop.GetValue().ToString(), other_prop.GetValue().ToString());
EXPECT_EQ(copy_prop.GetUnit(), other_prop.GetUnit());
EXPECT_EQ(copy_prop.GetDataType(), other_prop.GetDataType());
other_prop.SetName("other_prop_name");
EXPECT_NE(copy_prop, other_prop);
EXPECT_NE(copy_prop.GetName(), other_prop.GetName());
EXPECT_EQ(copy_prop.GetName(), "prop_name");
EXPECT_EQ(other_prop.GetName(), "other_prop_name");
}
TEST(test_entity, parent_copy_constructor) {
Parent parent;
parent.SetId("par_id");
parent.SetName("par_name");
// copy
const Parent copy_parent(parent);
EXPECT_EQ(copy_parent, parent);
EXPECT_EQ(copy_parent.GetId(), parent.GetId());
EXPECT_EQ(copy_parent.GetName(), parent.GetName());
// change something
parent.SetName("new_name");
EXPECT_NE(copy_parent, parent);
EXPECT_EQ(copy_parent.GetId(), parent.GetId());
EXPECT_NE(copy_parent.GetName(), parent.GetName());
}
TEST(test_entity, parent_move_constructor) {
Parent parent;
parent.SetId("par_id");
parent.SetName("par_name");
const auto parent_string = parent.ToString();
// copy for testing
const Parent copy_parent = parent;
// move
Parent move_parent(std::move(parent));
EXPECT_NE(parent, copy_parent); // NOLINT
EXPECT_NE(parent, move_parent); // NOLINT
EXPECT_NE(parent.ToString(), parent_string); // NOLINT
EXPECT_EQ(copy_parent, move_parent);
EXPECT_EQ(copy_parent.GetId(), move_parent.GetId());
EXPECT_EQ(copy_parent.GetName(), move_parent.GetName());
// change something
move_parent.SetName("new_name");
EXPECT_NE(copy_parent, move_parent);
EXPECT_EQ(copy_parent.GetId(), move_parent.GetId());
EXPECT_NE(copy_parent.GetName(), move_parent.GetName());
}
TEST(test_entity, parent_copy_assignment) {
Parent parent;
parent.SetId("par_id");
parent.SetName("par_name");
// copy
const Parent copy_parent = parent;
EXPECT_EQ(copy_parent, parent);
EXPECT_EQ(copy_parent.GetId(), parent.GetId());
EXPECT_EQ(copy_parent.GetName(), parent.GetName());
// change something
parent.SetName("new_name");
EXPECT_NE(copy_parent, parent);
EXPECT_EQ(copy_parent.GetId(), parent.GetId());
EXPECT_NE(copy_parent.GetName(), parent.GetName());
}
TEST(test_entity, parent_move_assignment) {
Parent parent;
parent.SetId("par_id");
parent.SetName("par_name");
const auto parent_string = parent.ToString();
// copy for testing
const Parent copy_parent = parent;
// move
Parent move_parent = std::move(parent);
EXPECT_NE(parent, copy_parent); // NOLINT
EXPECT_NE(parent, move_parent); // NOLINT
EXPECT_NE(parent.ToString(), parent_string); // NOLINT
EXPECT_EQ(copy_parent, move_parent);
EXPECT_EQ(copy_parent.GetId(), move_parent.GetId());
EXPECT_EQ(copy_parent.GetName(), move_parent.GetName());
// change something
move_parent.SetName("new_name");
EXPECT_NE(copy_parent, move_parent);
EXPECT_EQ(copy_parent.GetId(), move_parent.GetId());
EXPECT_NE(copy_parent.GetName(), move_parent.GetName());
}
TEST(test_entity, test_copy_to) { TEST(test_entity, test_copy_to) {
auto entity = Entity(); auto entity = Entity();
entity.SetRole(Role::RECORD); entity.SetRole(Role::RECORD);
...@@ -696,7 +815,7 @@ TEST(test_entity, test_add_file) { ...@@ -696,7 +815,7 @@ TEST(test_entity, test_add_file) {
EXPECT_EQ(entity.SetLocalPath(TEST_DATA_DIR + "/test.json"), StatusCode::SUCCESS); EXPECT_EQ(entity.SetLocalPath(TEST_DATA_DIR + "/test.json"), StatusCode::SUCCESS);
} }
TEST(test_entity, test_move_assign) { TEST(test_entity, entity_move_assignment) {
Entity entity1; Entity entity1;
entity1.SetRole(Role::RECORD_TYPE); entity1.SetRole(Role::RECORD_TYPE);
entity1.SetName("E1"); entity1.SetName("E1");
...@@ -760,8 +879,8 @@ TEST(test_entity, test_property_to_string) { ...@@ -760,8 +879,8 @@ TEST(test_entity, test_property_to_string) {
EXPECT_EQ(property.ToString(), "{}\n"); EXPECT_EQ(property.ToString(), "{}\n");
property.SetDataType(AtomicDataType::DOUBLE); property.SetDataType(AtomicDataType::DOUBLE);
EXPECT_EQ(property.ToString(), EXPECT_EQ(property.ToString(), "{\n \"dataType\": {\n \"atomicDataType\": "
"{\n \"dataType\": {\n \"atomicDataType\": \"ATOMIC_DATA_TYPE_DOUBLE\"\n }\n}\n"); "\"ATOMIC_DATA_TYPE_DOUBLE\"\n }\n}\n");
} }
TEST(test_entity, test_parents_to_string) { TEST(test_entity, test_parents_to_string) {
......
...@@ -188,9 +188,9 @@ TEST(test_value, test_value_to_string) { ...@@ -188,9 +188,9 @@ TEST(test_value, test_value_to_string) {
EXPECT_EQ(value3.ToString(), "{\n \"scalarValue\": {\n \"doubleValue\": 2.6\n }\n}\n"); EXPECT_EQ(value3.ToString(), "{\n \"scalarValue\": {\n \"doubleValue\": 2.6\n }\n}\n");
Value value4(std::vector<bool>{true, false}); Value value4(std::vector<bool>{true, false});
EXPECT_EQ(value4.ToString(), EXPECT_EQ(value4.ToString(), "{\n \"listValues\": {\n \"values\": [\n {\n "
"{\n \"listValues\": {\n \"values\": [\n {\n \"booleanValue\": true\n },\n " "\"booleanValue\": true\n },\n "
"{\n \"booleanValue\": false\n }\n ]\n }\n}\n"); "{\n \"booleanValue\": false\n }\n ]\n }\n}\n");
} }
} // namespace caosdb::entity } // namespace caosdb::entity
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment