From 3007aad10f92bf07cd6f10861f4395a8eacf39af Mon Sep 17 00:00:00 2001
From: Sergey Yakubov <sergey.yakubov@desy.de>
Date: Mon, 14 Jun 2021 19:34:04 +0200
Subject: [PATCH] fix tests, refactor

---
 common/cpp/include/asapo/database/database.h  |  4 +--
 .../include/asapo/unittests/MockDatabase.h    | 10 +++----
 common/cpp/src/database/mongodb_client.cpp    | 28 ++++++++++---------
 common/cpp/src/database/mongodb_client.h      |  4 +--
 .../request_handler_db_meta_write.cpp         |  2 +-
 .../test_request_handler_db_meta_writer.cpp   | 12 ++++----
 .../insert_retrieve_mongodb.cpp               | 10 +++----
 .../mongo_db/upsert/upsert_mongodb.cpp        |  4 +--
 8 files changed, 38 insertions(+), 36 deletions(-)

diff --git a/common/cpp/include/asapo/database/database.h b/common/cpp/include/asapo/database/database.h
index 0d1f5c614..678983382 100644
--- a/common/cpp/include/asapo/database/database.h
+++ b/common/cpp/include/asapo/database/database.h
@@ -15,8 +15,8 @@ class Database {
   public:
     virtual Error Connect(const std::string& address, const std::string& database) = 0;
     virtual Error Insert(const std::string& collection, const MessageMeta& file, bool ignore_duplicates) const = 0;
-    virtual Error Insert(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size,
-                         MetaIngestMode mode) const = 0;
+    virtual Error InsertMeta(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size,
+                             MetaIngestMode mode) const = 0;
     virtual Error InsertAsDatasetMessage(const std::string& collection, const MessageMeta& file,
                                          uint64_t dataset_size,
                                          bool ignore_duplicates) const = 0;
diff --git a/common/cpp/include/asapo/unittests/MockDatabase.h b/common/cpp/include/asapo/unittests/MockDatabase.h
index f5d4d75cc..65631cdd8 100644
--- a/common/cpp/include/asapo/unittests/MockDatabase.h
+++ b/common/cpp/include/asapo/unittests/MockDatabase.h
@@ -30,13 +30,13 @@ class MockDatabase : public Database {
     MOCK_CONST_METHOD4(InsertAsDatasetMessage_t,
                        ErrorInterface * (const std::string&, const MessageMeta&, uint64_t, bool));
 
-    Error Insert(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size,
-                 MetaIngestMode mode) const override {
-        return Error{Insert_t(collection, id, data, size, mode)};
+    Error InsertMeta(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size,
+                     MetaIngestMode mode) const override {
+        return Error{InsertMeta_t(collection, id, data, size, mode)};
 
     }
-    MOCK_CONST_METHOD5(Insert_t, ErrorInterface * (const std::string&, const std::string& id, const uint8_t* data,
-                                                   uint64_t size, MetaIngestMode mode));
+    MOCK_CONST_METHOD5(InsertMeta_t, ErrorInterface * (const std::string&, const std::string& id, const uint8_t* data,
+                       uint64_t size, MetaIngestMode mode));
 
     Error GetById(const std::string& collection, uint64_t id, MessageMeta* file) const override {
         return Error{GetById_t(collection, id, file)};
diff --git a/common/cpp/src/database/mongodb_client.cpp b/common/cpp/src/database/mongodb_client.cpp
index 0f496865b..747c4ed23 100644
--- a/common/cpp/src/database/mongodb_client.cpp
+++ b/common/cpp/src/database/mongodb_client.cpp
@@ -190,16 +190,16 @@ Error MongoDBClient::ReplaceBsonDocument(const std::string& id, const bson_p& do
     Error err = nullptr;
     bson_iter_t iter;
 
-    if (!mongoc_collection_replace_one(current_collection_, selector, document.get(), opts,&reply, &mongo_err)) {
+    if (!mongoc_collection_replace_one(current_collection_, selector, document.get(), opts, &reply, &mongo_err)) {
         err = DBErrorTemplates::kInsertError.Generate(mongo_err.message);
     }
 
-    if (err==nullptr) {
+    if (err == nullptr) {
         bson_iter_init_find(&iter, &reply, "upsertedCount");
         auto n_upsert = bson_iter_int32(&iter);
         bson_iter_init_find(&iter, &reply, "modifiedCount");
         auto n_mod = bson_iter_int32(&iter);
-        if (n_mod + n_upsert!=1) {
+        if (n_mod + n_upsert != 1) {
             err = DBErrorTemplates::kInsertError.Generate("metadata does not exist");
         }
     }
@@ -233,8 +233,9 @@ MongoDBClient::~MongoDBClient() {
     CleanUp();
 }
 
-Error MongoDBClient::Insert(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size,
-                            MetaIngestMode mode) const {
+Error MongoDBClient::InsertMeta(const std::string& collection, const std::string& id, const uint8_t* data,
+                                uint64_t size,
+                                MetaIngestMode mode) const {
     if (!connected_) {
         return DBErrorTemplates::kNotConnected.Generate();
     }
@@ -248,18 +249,18 @@ Error MongoDBClient::Insert(const std::string& collection, const std::string& id
     if (err) {
         return err;
     }
-
-    if (!BSON_APPEND_UTF8(document.get(), "_id", id.c_str())) {
+    auto id_encoded = EncodeColName(id);
+    if (!BSON_APPEND_UTF8(document.get(), "_id", id_encoded.c_str())) {
         err = DBErrorTemplates::kInsertError.Generate("cannot assign document id ");
     }
 
     switch (mode.op) {
-        case MetaIngestOp::kInsert:
-            return InsertBsonDocument(document,false);
-        case asapo::MetaIngestOp::kReplace:
-            return ReplaceBsonDocument(id, document, mode.upsert);
-        case MetaIngestOp::kUpdate:
-            break;
+    case MetaIngestOp::kInsert:
+        return InsertBsonDocument(document, false);
+    case asapo::MetaIngestOp::kReplace:
+        return ReplaceBsonDocument(id_encoded, document, mode.upsert);
+    case MetaIngestOp::kUpdate:
+        break;
 
     }
 
@@ -645,6 +646,7 @@ Error MongoDBClient::DeleteStream(const std::string& stream) const {
         DeleteCollections(acks_col);
         std::string querystr = ".*_" + EscapeQuery(stream_encoded) + "$";
         DeleteDocumentsInCollection("current_location", querystr);
+        DeleteDocumentsInCollection("meta", "^" + EscapeQuery(stream_encoded) + "$");
     }
     return err;
 }
diff --git a/common/cpp/src/database/mongodb_client.h b/common/cpp/src/database/mongodb_client.h
index 2114c4c05..517e75a64 100644
--- a/common/cpp/src/database/mongodb_client.h
+++ b/common/cpp/src/database/mongodb_client.h
@@ -49,8 +49,8 @@ class MongoDBClient final : public Database {
     Error Insert(const std::string& collection, const MessageMeta& file, bool ignore_duplicates) const override;
     Error InsertAsDatasetMessage(const std::string& collection, const MessageMeta& file, uint64_t dataset_size,
                                  bool ignore_duplicates) const override;
-    Error Insert(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size,
-                 MetaIngestMode mode) const override;
+    Error InsertMeta(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size,
+                     MetaIngestMode mode) const override;
     Error GetById(const std::string& collection, uint64_t id, MessageMeta* file) const override;
     Error GetDataSetById(const std::string& collection, uint64_t id_in_set, uint64_t id, MessageMeta* file) const override;
     Error GetStreamInfo(const std::string& collection, StreamInfo* info) const override;
diff --git a/receiver/src/request_handler/request_handler_db_meta_write.cpp b/receiver/src/request_handler/request_handler_db_meta_write.cpp
index 58aa2af5c..c1b096af1 100644
--- a/receiver/src/request_handler/request_handler_db_meta_write.cpp
+++ b/receiver/src/request_handler/request_handler_db_meta_write.cpp
@@ -27,7 +27,7 @@ Error RequestHandlerDbMetaWrite::ProcessRequest(Request* request) const {
         mode.Decode(request->GetCustomData()[kPosMetaIngestMode]);
     }
 
-    auto err =  db_client__->Insert(collection_name_prefix_, stream.empty() ? "bt" : "st_" + stream, meta, size, mode);
+    auto err =  db_client__->InsertMeta(collection_name_prefix_, stream.empty() ? "bt" : "st_" + stream, meta, size, mode);
     if (!err) {
         if (stream.empty()) {
             log__->Debug(std::string{"insert beamtime meta"} + " to " + collection_name_prefix_ + " in " +
diff --git a/receiver/unittests/request_handler/test_request_handler_db_meta_writer.cpp b/receiver/unittests/request_handler/test_request_handler_db_meta_writer.cpp
index 73a88dd21..56d3ad7a8 100644
--- a/receiver/unittests/request_handler/test_request_handler_db_meta_writer.cpp
+++ b/receiver/unittests/request_handler/test_request_handler_db_meta_writer.cpp
@@ -130,8 +130,8 @@ TEST_F(DbMetaWriterHandlerTests, CallsIngestBeamtimeMetaOldVersion) {
 
     asapo::MetaIngestMode expected_mode{asapo::MetaIngestOp::kReplace, true};
 
-    EXPECT_CALL(mock_db, Insert_t(expected_collection_name, "bt", expected_meta, expected_meta_size,
-                                  M_CheckIngestMode(expected_mode))).
+    EXPECT_CALL(mock_db, InsertMeta_t(expected_collection_name, "bt", expected_meta, expected_meta_size,
+                                      M_CheckIngestMode(expected_mode))).
     WillOnce(testing::Return(nullptr));
 
     EXPECT_CALL(mock_logger, Debug(AllOf(HasSubstr("insert beamtime meta"),
@@ -152,8 +152,8 @@ TEST_F(DbMetaWriterHandlerTests, CallsIngestBeamtimeMeta) {
 
 
     asapo::MetaIngestMode expected_mode{asapo::MetaIngestOp::kInsert, true};
-    EXPECT_CALL(mock_db, Insert_t(expected_collection_name, "bt", expected_meta, expected_meta_size,
-                                  M_CheckIngestMode(expected_mode))).
+    EXPECT_CALL(mock_db, InsertMeta_t(expected_collection_name, "bt", expected_meta, expected_meta_size,
+                                      M_CheckIngestMode(expected_mode))).
     WillOnce(testing::Return(nullptr));
 
     EXPECT_CALL(mock_logger, Debug(AllOf(HasSubstr("insert beamtime meta"),
@@ -173,8 +173,8 @@ TEST_F(DbMetaWriterHandlerTests, CallsIngestStreamMeta) {
     ExpectRequestParams(asapo::GetReceiverApiVersion(), 13, expected_stream);
 
     asapo::MetaIngestMode expected_mode{asapo::MetaIngestOp::kUpdate, true};
-    EXPECT_CALL(mock_db, Insert_t(expected_collection_name, "st_" + expected_stream, expected_meta, expected_meta_size,
-                                  M_CheckIngestMode(expected_mode))).
+    EXPECT_CALL(mock_db, InsertMeta_t(expected_collection_name, "st_" + expected_stream, expected_meta, expected_meta_size,
+                                      M_CheckIngestMode(expected_mode))).
     WillOnce(testing::Return(nullptr));
 
     EXPECT_CALL(mock_logger, Debug(AllOf(HasSubstr("insert stream meta"),
diff --git a/tests/automatic/mongo_db/insert_retrieve/insert_retrieve_mongodb.cpp b/tests/automatic/mongo_db/insert_retrieve/insert_retrieve_mongodb.cpp
index 5e05165dd..9fdcc4cac 100644
--- a/tests/automatic/mongo_db/insert_retrieve/insert_retrieve_mongodb.cpp
+++ b/tests/automatic/mongo_db/insert_retrieve/insert_retrieve_mongodb.cpp
@@ -100,16 +100,16 @@ int main(int argc, char* argv[]) {
 
 
 // metadata
-        asapo::MetaIngestMode mode{asapo::MetaIngestOp::kInsert,false};
+        asapo::MetaIngestMode mode{asapo::MetaIngestOp::kInsert, false};
         std::string meta = R"({"data":"test"})";
-        err = db_new.Insert("meta","bt", reinterpret_cast<const uint8_t *>(meta.c_str()),meta.size(),mode);
+        err = db_new.InsertMeta("meta", stream_name, reinterpret_cast<const uint8_t*>(meta.c_str()), meta.size(), mode);
         M_AssertEq(nullptr, err);
-        err = db_new.Insert("meta","bt", reinterpret_cast<const uint8_t *>(meta.c_str()),meta.size(),mode);
+        err = db_new.InsertMeta("meta", stream_name, reinterpret_cast<const uint8_t*>(meta.c_str()), meta.size(), mode);
         M_AssertTrue(err == asapo::DBErrorTemplates::kDuplicateID);
         mode.op = asapo::MetaIngestOp::kReplace;
-        err = db_new.Insert("meta","bt", reinterpret_cast<const uint8_t *>(meta.c_str()),meta.size(),mode);
+        err = db_new.InsertMeta("meta", stream_name, reinterpret_cast<const uint8_t*>(meta.c_str()), meta.size(), mode);
         M_AssertEq(nullptr, err);
-        err = db_new.Insert("meta","bt1", reinterpret_cast<const uint8_t *>(meta.c_str()),meta.size(),mode);
+        err = db_new.InsertMeta("meta", "notexist", reinterpret_cast<const uint8_t*>(meta.c_str()), meta.size(), mode);
         M_AssertTrue(err == asapo::DBErrorTemplates::kInsertError);
 
 
diff --git a/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp b/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp
index 9b14210d0..ffdbfda51 100644
--- a/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp
+++ b/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp
@@ -46,14 +46,14 @@ int main(int argc, char* argv[]) {
     }
 
     auto mode = asapo::MetaIngestMode{asapo::MetaIngestOp::kReplace, true};
-    auto err = db.Insert("meta", "0", reinterpret_cast<const uint8_t*>(json.c_str()), json.size(), mode);
+    auto err = db.InsertMeta("meta", "0", reinterpret_cast<const uint8_t*>(json.c_str()), json.size(), mode);
     if (err) {
         std::cout << err->Explain() << std::endl;
     }
 
     Assert(err, args.keyword);
 
-    err = db.Insert("meta", "0", reinterpret_cast<const uint8_t*>(json.c_str()), json.size(), mode);
+    err = db.InsertMeta("meta", "0", reinterpret_cast<const uint8_t*>(json.c_str()), json.size(), mode);
     if (err) {
         std::cout << err->Explain() << std::endl;
     }
-- 
GitLab