From 2e01d2c82d8185632151e2c9ce7329105b7e9fab Mon Sep 17 00:00:00 2001
From: Sergey Yakubov <sergey.yakubov@desy.de>
Date: Fri, 12 Nov 2021 14:11:39 +0100
Subject: [PATCH] finished refactoring logs/errors for receiver

---
 common/cpp/include/asapo/common/error.h       |  8 +-
 common/cpp/include/asapo/common/error.tpp     | 23 +++--
 common/cpp/include/asapo/logger/logger.h      |  3 +-
 common/cpp/src/logger/logger.cpp              | 43 +++++----
 common/cpp/src/system_io/system_io.cpp        |  8 +-
 common/cpp/src/system_io/system_io_linux.cpp  |  6 +-
 .../cpp/src/system_io/system_io_linux_mac.cpp |  8 +-
 .../cpp/src/system_io/system_io_windows.cpp   |  8 +-
 common/cpp/unittests/common/test_error.cpp    | 16 ++--
 consumer/api/cpp/src/consumer_impl.cpp        |  2 +-
 producer/api/cpp/src/producer_impl.cpp        |  2 +-
 producer/api/cpp/src/request_handler_tcp.cpp  | 10 +-
 .../net_server/rds_fabric_server.cpp          |  2 +-
 .../net_server/rds_tcp_server.cpp             | 91 ++++++++++---------
 .../receiver_data_server.cpp                  |  3 +-
 .../receiver_data_server_error.h              |  6 +-
 .../receiver_data_server_request_handler.cpp  |  7 +-
 receiver/src/request.cpp                      |  8 +-
 .../request_handler/authorization_client.cpp  |  4 +-
 .../receive_file_processor.cpp                |  4 +-
 .../file_processors/write_file_processor.cpp  |  8 +-
 .../request_handler_authorize.cpp             |  2 +-
 .../request_handler/request_handler_db.cpp    |  5 +-
 .../request_handler_receive_data.cpp          | 10 +-
 .../request_handler_receive_metadata.cpp      |  4 +-
 .../test_receive_file_processor.cpp           |  7 +-
 .../test_write_file_processor.cpp             | 17 ++--
 .../test_request_handler_receive_data.cpp     |  2 +-
 .../test_request_handler_receive_metadata.cpp |  2 +-
 .../read_folder_content/CMakeLists.txt        |  4 +-
 .../read_string_from_file/CMakeLists.txt      |  4 +-
 .../read_subdirectories/CMakeLists.txt        |  4 +-
 32 files changed, 188 insertions(+), 143 deletions(-)

diff --git a/common/cpp/include/asapo/common/error.h b/common/cpp/include/asapo/common/error.h
index 510ea0866..4c38ae3ca 100644
--- a/common/cpp/include/asapo/common/error.h
+++ b/common/cpp/include/asapo/common/error.h
@@ -21,7 +21,8 @@ class ErrorInterface {
     virtual std::string Explain() const noexcept = 0;
     virtual std::string ExplainPretty(uint8_t shift = 0) const noexcept = 0;
     virtual std::string ExplainInJSON() const noexcept = 0;
-    virtual ErrorInterface* AddContext(std::string key, std::string value) noexcept = 0;
+    virtual ErrorInterface* AddDetails(std::string key, std::string value) noexcept = 0;
+    virtual ErrorInterface* AddDetails(std::string key, uint64_t value) noexcept = 0;
     virtual ErrorInterface* SetCause(Error cause_err) noexcept = 0;
     virtual const Error& GetCause() const noexcept = 0;
     virtual CustomErrorData* GetCustomData() noexcept = 0;
@@ -50,7 +51,7 @@ class ServiceError : public ErrorInterface {
     ServiceErrorType error_type_;
     std::string error_name_;
     std::string error_message_;
-    std::map<std::string, std::string> context_;
+    std::map<std::string, std::string> details_;
     Error cause_err_;
     std::unique_ptr<CustomErrorData> custom_data_;
   public:
@@ -58,7 +59,8 @@ class ServiceError : public ErrorInterface {
     ServiceErrorType GetServiceErrorType() const noexcept;
     CustomErrorData* GetCustomData() noexcept override;
     void SetCustomData(std::unique_ptr<CustomErrorData> data) noexcept override;
-    ErrorInterface* AddContext(std::string key, std::string value) noexcept override;
+    ErrorInterface* AddDetails(std::string key, std::string value) noexcept override;
+    ErrorInterface* AddDetails(std::string key, uint64_t value) noexcept override;
     ErrorInterface* SetCause(Error cause_err) noexcept override;
     const Error& GetCause() const noexcept override;
     std::string Explain() const noexcept override;
diff --git a/common/cpp/include/asapo/common/error.tpp b/common/cpp/include/asapo/common/error.tpp
index 95f6eed66..a48955d2b 100644
--- a/common/cpp/include/asapo/common/error.tpp
+++ b/common/cpp/include/asapo/common/error.tpp
@@ -37,10 +37,10 @@ std::string ServiceError<ServiceErrorType>::ExplainPretty(uint8_t shift) const n
     if (!error_message_.empty()) {
         err += "\n" + base_shift + shift_s + "message: " + error_message_;
     }
-    if (!context_.empty()) {
+    if (!details_.empty()) {
         err += "\n" + base_shift + shift_s + "context: ";
         auto i = 0;
-        for (const auto &kv : context_) {
+        for (const auto &kv : details_) {
             err += (i > 0 ? ", " : "") + kv.first + ":" + kv.second;
             i++;
         }
@@ -58,10 +58,10 @@ std::string ServiceError<ServiceErrorType>::Explain() const noexcept {
     if (!error_message_.empty()) {
         err += ", message: " + error_message_;
     }
-    if (!context_.empty()) {
-        err += ", context: ";
+    if (!details_.empty()) {
+        err += ", details: ";
         auto i = 0;
-        for (const auto &kv : context_) {
+        for (const auto &kv : details_) {
             err += (i > 0 ? ", " : "") + kv.first + ":" + kv.second;
             i++;
         }
@@ -73,8 +73,8 @@ std::string ServiceError<ServiceErrorType>::Explain() const noexcept {
 }
 
 template<typename ServiceErrorType>
-ErrorInterface *ServiceError<ServiceErrorType>::AddContext(std::string key, std::string value) noexcept {
-    context_[std::move(key)] = std::move(value);
+ErrorInterface *ServiceError<ServiceErrorType>::AddDetails(std::string key, std::string value) noexcept {
+    details_[std::move(key)] = std::move(value);
     return this;
 }
 template<typename ServiceErrorType>
@@ -93,10 +93,10 @@ std::string ServiceError<ServiceErrorType>::ExplainInJSON() const noexcept {
     if (!error_message_.empty()) {
         err += "," + WrapInQuotes("message") + ":" + WrapInQuotes(error_message_);
     }
-    if (!context_.empty()) {
+    if (!details_.empty()) {
         err += "," + WrapInQuotes("context") + ":{";
         auto i = 0;
-        for (const auto &kv : context_) {
+        for (const auto &kv : details_) {
             err += (i > 0 ? ", " : "") + WrapInQuotes(kv.first) + ":" + WrapInQuotes(kv.second);
             i++;
         }
@@ -112,6 +112,11 @@ const Error &ServiceError<ServiceErrorType>::GetCause() const noexcept {
     return cause_err_;
 }
 
+template<typename ServiceErrorType>
+ErrorInterface *ServiceError<ServiceErrorType>::AddDetails(std::string key, uint64_t value) noexcept {
+    return AddDetails(key,std::to_string(value));
+}
+
 template<typename ServiceErrorType>
 Error ServiceErrorTemplate<ServiceErrorType>::Generate() const noexcept {
     return Generate("");
diff --git a/common/cpp/include/asapo/logger/logger.h b/common/cpp/include/asapo/logger/logger.h
index e4dc86895..4bd212dc2 100644
--- a/common/cpp/include/asapo/logger/logger.h
+++ b/common/cpp/include/asapo/logger/logger.h
@@ -27,10 +27,11 @@ class LogMessageWithFields {
     LogMessageWithFields& Append(std::string key, uint64_t val);
     LogMessageWithFields& Append(std::string key, double val, int precision);
     LogMessageWithFields& Append(const LogMessageWithFields& log_msg);
+    LogMessageWithFields& Append(std::string key, const LogMessageWithFields& log_msg);
     LogMessageWithFields& Append(std::string key, std::string val);
     std::string LogString() const;
   private:
-    inline std::string QuoteIFNeeded();
+    inline std::string CommaIfNeeded();
     std::string log_string_;
 };
 
diff --git a/common/cpp/src/logger/logger.cpp b/common/cpp/src/logger/logger.cpp
index 546112130..e9613d768 100644
--- a/common/cpp/src/logger/logger.cpp
+++ b/common/cpp/src/logger/logger.cpp
@@ -6,7 +6,7 @@
 
 namespace asapo {
 
-Logger CreateLogger(std::string name, bool console, bool centralized_log, const std::string& endpoint_uri) {
+Logger CreateLogger(std::string name, bool console, bool centralized_log, const std::string &endpoint_uri) {
     auto logger = new SpdLogger{name, endpoint_uri};
     logger->SetLogLevel(LogLevel::Info);
     if (console) {
@@ -19,15 +19,15 @@ Logger CreateLogger(std::string name, bool console, bool centralized_log, const
     return Logger{logger};
 }
 
-Logger CreateDefaultLoggerBin(const std::string& name) {
+Logger CreateDefaultLoggerBin(const std::string &name) {
     return CreateLogger(name, true, false, "");
 }
 
-Logger CreateDefaultLoggerApi(const std::string& name, const std::string& endpoint_uri) {
+Logger CreateDefaultLoggerApi(const std::string &name, const std::string &endpoint_uri) {
     return CreateLogger(name, false, true, endpoint_uri);
 }
 
-LogLevel StringToLogLevel(const std::string& name, Error* err) {
+LogLevel StringToLogLevel(const std::string &name, Error *err) {
     *err = nullptr;
     if (name == "debug") return LogLevel::Debug;
     if (name == "info") return LogLevel::Info;
@@ -40,7 +40,7 @@ LogLevel StringToLogLevel(const std::string& name, Error* err) {
 }
 
 template<typename ... Args>
-std::string string_format(const std::string& format, Args ... args) {
+std::string string_format(const std::string &format, Args ... args) {
     size_t size = static_cast<size_t>(snprintf(nullptr, 0, format.c_str(), args ...) + 1);
     std::unique_ptr<char[]> buf(new char[size]);
     snprintf(buf.get(), size, format.c_str(), args ...);
@@ -52,11 +52,11 @@ std::string EncloseQuotes(std::string str) {
 }
 
 LogMessageWithFields::LogMessageWithFields(std::string key, uint64_t val) {
-    log_string_ = EncloseQuotes(key) + ":" + std::to_string(val);
+    log_string_ = EncloseQuotes(std::move(key)) + ":" + std::to_string(val);
 }
 
 LogMessageWithFields::LogMessageWithFields(std::string key, double val, int precision) {
-    log_string_ = EncloseQuotes(key) + ":" + string_format("%." + std::to_string(precision) + "f", val);
+    log_string_ = EncloseQuotes(std::move(key)) + ":" + string_format("%." + std::to_string(precision) + "f", val);
 }
 
 LogMessageWithFields::LogMessageWithFields(std::string val) {
@@ -66,25 +66,26 @@ LogMessageWithFields::LogMessageWithFields(std::string val) {
 }
 
 LogMessageWithFields::LogMessageWithFields(std::string key, std::string val) {
-    log_string_ = EncloseQuotes(key) + ":" + EncloseQuotes(escape_json(val));
+    log_string_ = EncloseQuotes(std::move(key)) + ":" + EncloseQuotes(escape_json(val));
 }
 
-inline std::string LogMessageWithFields::QuoteIFNeeded() {
+inline std::string LogMessageWithFields::CommaIfNeeded() {
     return log_string_.empty() ? "" : ",";
 }
 
-LogMessageWithFields& LogMessageWithFields::Append(std::string key, uint64_t val) {
-    log_string_ += QuoteIFNeeded() + EncloseQuotes(key) + ":" + std::to_string(val);
+LogMessageWithFields &LogMessageWithFields::Append(std::string key, uint64_t val) {
+    log_string_ += CommaIfNeeded() + EncloseQuotes(std::move(key)) + ":" + std::to_string(val);
     return *this;
 }
 
-LogMessageWithFields& LogMessageWithFields::Append(std::string key, double val, int precision) {
-    log_string_ += QuoteIFNeeded() + EncloseQuotes(key) + ":" + string_format("%." + std::to_string(precision) + "f", val);
+LogMessageWithFields &LogMessageWithFields::Append(std::string key, double val, int precision) {
+    log_string_ += CommaIfNeeded() + EncloseQuotes(std::move(key)) + ":"
+        + string_format("%." + std::to_string(precision) + "f", val);
     return *this;
 }
 
-LogMessageWithFields& LogMessageWithFields::Append(std::string key, std::string val) {
-    log_string_ += QuoteIFNeeded() + EncloseQuotes(key) + ":" + EncloseQuotes(escape_json(val));
+LogMessageWithFields &LogMessageWithFields::Append(std::string key, std::string val) {
+    log_string_ += CommaIfNeeded() + EncloseQuotes(std::move(key)) + ":" + EncloseQuotes(escape_json(val));
     return *this;
 }
 
@@ -92,11 +93,17 @@ std::string LogMessageWithFields::LogString() const {
     return log_string_;
 }
 
-LogMessageWithFields::LogMessageWithFields(const Error& error) {
+LogMessageWithFields::LogMessageWithFields(const Error &error) {
     log_string_ = error->ExplainInJSON();
 }
-LogMessageWithFields& LogMessageWithFields::Append(const LogMessageWithFields& log_msg) {
-    log_string_ += QuoteIFNeeded() + log_msg.LogString();
+
+LogMessageWithFields &LogMessageWithFields::Append(const LogMessageWithFields &log_msg) {
+    log_string_ += CommaIfNeeded() + log_msg.LogString();
+    return *this;
+}
+
+LogMessageWithFields &LogMessageWithFields::Append(std::string key, const LogMessageWithFields &log_msg) {
+    log_string_ += CommaIfNeeded() + EncloseQuotes(std::move(key)) + ":{" + log_msg.LogString() + "}";
     return *this;
 }
 
diff --git a/common/cpp/src/system_io/system_io.cpp b/common/cpp/src/system_io/system_io.cpp
index 3165a6a3d..8a5b403f3 100644
--- a/common/cpp/src/system_io/system_io.cpp
+++ b/common/cpp/src/system_io/system_io.cpp
@@ -116,7 +116,7 @@ MessageData SystemIO::GetDataFromFile(const std::string& fname, uint64_t* fsize,
 
     Read(fd, data_array, (size_t)*fsize, err);
     if (*err != nullptr) {
-        (*err)->AddContext("name", fname)->AddContext("expected size", std::to_string(*fsize));
+        (*err)->AddDetails("name", fname)->AddDetails("expected size", std::to_string(*fsize));
         Close(fd, nullptr);
         return nullptr;
     }
@@ -191,7 +191,7 @@ Error SystemIO::WriteDataToFile(const std::string& root_folder, const std::strin
 
     Write(fd, data, length, &err);
     if (err) {
-        err->AddContext("name", fname);
+        err->AddDetails("name", fname);
         return err;
     }
 
@@ -402,7 +402,7 @@ asapo::FileDescriptor asapo::SystemIO::Open(const std::string& filename,
     FileDescriptor fd = _open(filename.c_str(), flags);
     if (fd == -1) {
         *err = GetLastError();
-        (*err)->AddContext("name", filename);
+        (*err)->AddDetails("name", filename);
     } else {
         *err = nullptr;
     }
@@ -616,7 +616,7 @@ Error SystemIO::CreateDirectoryWithParents(const std::string& root_path, const s
         Error err;
         CreateNewDirectory(new_path, &err);
         if (err && err != IOErrorTemplates::kFileAlreadyExists) {
-            err->AddContext("name", new_path);
+            err->AddDetails("name", new_path);
             return err;
         }
         if (iter != path.end()) {
diff --git a/common/cpp/src/system_io/system_io_linux.cpp b/common/cpp/src/system_io/system_io_linux.cpp
index f4256bddb..18c4f1afe 100644
--- a/common/cpp/src/system_io/system_io_linux.cpp
+++ b/common/cpp/src/system_io/system_io_linux.cpp
@@ -28,7 +28,7 @@ Error SystemIO::AddToEpool(SocketDescriptor sd) const {
     event.data.fd = sd;
     if((epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, sd, &event) == -1) && (errno != EEXIST)) {
         auto err =  GetLastError();
-        err->AddContext("where", "add to epoll");
+        err->AddDetails("where", "add to epoll");
         close(epoll_fd_);
         return err;
     }
@@ -43,7 +43,7 @@ Error SystemIO::CreateEpoolIfNeeded(SocketDescriptor master_socket) const {
     epoll_fd_ = epoll_create1(0);
     if(epoll_fd_ == kDisconnectedSocketDescriptor) {
         auto err = GetLastError();
-        err->AddContext("where", "create epoll");
+        err->AddDetails("where", "create epoll");
         return err;
     }
     return AddToEpool(master_socket);
@@ -84,7 +84,7 @@ ListSocketDescriptors SystemIO::WaitSocketsActivity(SocketDescriptor master_sock
         }
         if (event_count < 0) {
             *err = GetLastError();
-            (*err)->AddContext("where", "epoll wait");
+            (*err)->AddDetails("where", "epoll wait");
             return {};
         }
 
diff --git a/common/cpp/src/system_io/system_io_linux_mac.cpp b/common/cpp/src/system_io/system_io_linux_mac.cpp
index 371c12e4d..8aba5f769 100644
--- a/common/cpp/src/system_io/system_io_linux_mac.cpp
+++ b/common/cpp/src/system_io/system_io_linux_mac.cpp
@@ -68,7 +68,7 @@ Error GetLastErrorFromErrno() {
         return IOErrorTemplates::kBrokenPipe.Generate();
     default:
         Error err = IOErrorTemplates::kUnknownIOError.Generate();
-        (*err).AddContext("Unknown error code: ", std::to_string(errno));
+            (*err).AddDetails("Unknown error code: ", std::to_string(errno));
         return err;
     }
 }
@@ -122,7 +122,7 @@ MessageMeta GetMessageMeta(const string& name, Error* err) {
 
     auto t_stat = FileStat(name, err);
     if (*err != nullptr) {
-        (*err)->AddContext("name", name);
+        (*err)->AddDetails("name", name);
         return MessageMeta{};
     }
 
@@ -157,7 +157,7 @@ void SystemIO::GetSubDirectoriesRecursively(const std::string& path, SubDirList*
     auto dir = opendir((path).c_str());
     if (dir == nullptr) {
         *err = GetLastError();
-        (*err)->AddContext("name", path);
+        (*err)->AddDetails("name", path);
         return;
     }
 
@@ -183,7 +183,7 @@ void SystemIO::CollectMessageMetarmationRecursively(const std::string& path,
     auto dir = opendir((path).c_str());
     if (dir == nullptr) {
         *err = GetLastError();
-        (*err)->AddContext("name", path);
+        (*err)->AddDetails("name", path);
         return;
     }
 
diff --git a/common/cpp/src/system_io/system_io_windows.cpp b/common/cpp/src/system_io/system_io_windows.cpp
index b847d747b..d8df3328f 100644
--- a/common/cpp/src/system_io/system_io_windows.cpp
+++ b/common/cpp/src/system_io/system_io_windows.cpp
@@ -66,7 +66,7 @@ Error IOErrorFromGetLastError() {
     default:
         std::cout << "[IOErrorFromGetLastError] Unknown error code: " << last_error << std::endl;
         Error err = IOErrorTemplates::kUnknownIOError.Generate();
-        (*err).AddContext("Unknown error code", std::to_string(last_error));
+            (*err).AddDetails("Unknown error code", std::to_string(last_error));
         return err;
     }
 }
@@ -151,7 +151,7 @@ MessageMeta SystemIO::GetMessageMeta(const std::string& name, Error* err) const
     auto hFind = FindFirstFile(name.c_str(), &f);
     if (hFind == INVALID_HANDLE_VALUE) {
         *err = IOErrorFromGetLastError();
-        (*err)->AddContext("name", name);
+        (*err)->AddDetails("name", name);
         return {};
     }
     FindClose(hFind);
@@ -179,7 +179,7 @@ void SystemIO::GetSubDirectoriesRecursively(const std::string& path, SubDirList*
     HANDLE handle = FindFirstFile((path + "\\*.*").c_str(), &find_data);
     if (handle == INVALID_HANDLE_VALUE) {
         *err = IOErrorFromGetLastError();
-        (*err)->AddContext("name", path);
+        (*err)->AddDetails("name", path);
         return;
     }
 
@@ -208,7 +208,7 @@ void SystemIO::CollectMessageMetarmationRecursively(const std::string& path,
     HANDLE handle = FindFirstFile((path + "\\*.*").c_str(), &find_data);
     if (handle == INVALID_HANDLE_VALUE) {
         *err = IOErrorFromGetLastError();
-        (*err)->AddContext("name", path);
+        (*err)->AddDetails("name", path);
         return;
     }
 
diff --git a/common/cpp/unittests/common/test_error.cpp b/common/cpp/unittests/common/test_error.cpp
index c588ea052..4d459ba1a 100644
--- a/common/cpp/unittests/common/test_error.cpp
+++ b/common/cpp/unittests/common/test_error.cpp
@@ -27,13 +27,13 @@ TEST(ErrorTemplate, Explain) {
     ASSERT_THAT(error->Explain(), HasSubstr("test"));
 }
 
-TEST(ErrorTemplate, Context) {
+TEST(ErrorTemplate, Details) {
     Error error = asapo::GeneralErrorTemplates::kEndOfFile.Generate("test");
-    error->AddContext("key", "value");
-    error->AddContext("key2", "value2");
+    error->AddDetails("key", "value");
+    error->AddDetails("key2", "value2");
 
     ASSERT_THAT(error->Explain(), AllOf(HasSubstr("test"),
-                                        HasSubstr("context"),
+                                        HasSubstr("details"),
                                         HasSubstr("key:value"),
                                         HasSubstr("key2:value2")
                                        ));
@@ -43,8 +43,8 @@ TEST(ErrorTemplate, Cause) {
     Error error = asapo::GeneralErrorTemplates::kEndOfFile.Generate("test");
     Error error_c = asapo::GeneralErrorTemplates::kMemoryAllocationError.Generate("cause_test");
     Error error_c1 = asapo::GeneralErrorTemplates::kSimpleError.Generate("simple error");
-    error->AddContext("key", "value");
-    error_c->AddContext("key2", "value2");
+    error->AddDetails("key", "value");
+    error_c->AddDetails("key2", "value2");
     error_c->SetCause(std::move(error_c1));
     error->SetCause(std::move(error_c));
     ASSERT_THAT(error->Explain(), AllOf(HasSubstr("test"),
@@ -64,10 +64,10 @@ TEST(ErrorTemplate, Cause) {
 TEST(ErrorTemplate, Json) {
     Error error = asapo::GeneralErrorTemplates::kEndOfFile.Generate("test");
     Error error_c = asapo::GeneralErrorTemplates::kMemoryAllocationError.Generate("cause_test");
-    error->AddContext("key", "value");
+    error->AddDetails("key", "value");
     error->SetCause(std::move(error_c));
     auto expected_string =
-        R"("error":"end of file","message":"test","context":{"key":"value"},"cause":{"error":"memory allocation","message":"cause_test"})";
+        R"("error":"end of file","message":"test","details":{"key":"value"},"cause":{"error":"memory allocation","message":"cause_test"})";
     ASSERT_THAT(error->ExplainInJSON(),  Eq(expected_string));
 }
 
diff --git a/consumer/api/cpp/src/consumer_impl.cpp b/consumer/api/cpp/src/consumer_impl.cpp
index 0fda0f437..e20366e14 100644
--- a/consumer/api/cpp/src/consumer_impl.cpp
+++ b/consumer/api/cpp/src/consumer_impl.cpp
@@ -124,7 +124,7 @@ Error ProcessRequestResponce(const RequestInfo& request,
     }
 
     if (err != nullptr) {
-        err->AddContext("host", request.host)->AddContext("api", "request.api");
+        err->AddDetails("host", request.host)->AddDetails("api", request.api);
     }
     return err;
 
diff --git a/producer/api/cpp/src/producer_impl.cpp b/producer/api/cpp/src/producer_impl.cpp
index a0b68f070..80dd71e16 100644
--- a/producer/api/cpp/src/producer_impl.cpp
+++ b/producer/api/cpp/src/producer_impl.cpp
@@ -89,7 +89,7 @@ Error CheckDatasetInRequest(const MessageHeader& message_header) {
         return ProducerErrorTemplates::kWrongInput.Generate("dataset dimensions");
     }
 
-    if (message_header.auto_id) {
+    if (message_header.autwo_id) {
         return ProducerErrorTemplates::kWrongInput.Generate("auto id mode not implemented for datasets");
     }
 
diff --git a/producer/api/cpp/src/request_handler_tcp.cpp b/producer/api/cpp/src/request_handler_tcp.cpp
index 9595e3146..defaa31a5 100644
--- a/producer/api/cpp/src/request_handler_tcp.cpp
+++ b/producer/api/cpp/src/request_handler_tcp.cpp
@@ -93,22 +93,22 @@ Error RequestHandlerTcp::ReceiveResponse(std::string* response) {
     switch (sendDataResponse.error_code) {
     case kNetAuthorizationError : {
         auto res_err = ProducerErrorTemplates::kWrongInput.Generate();
-        res_err->AddContext("response", sendDataResponse.message);
+        res_err->AddDetails("response", sendDataResponse.message);
         return res_err;
     }
     case kNetErrorNotSupported : {
         auto res_err = ProducerErrorTemplates::kUnsupportedClient.Generate();
-        res_err->AddContext("response", sendDataResponse.message);
+        res_err->AddDetails("response", sendDataResponse.message);
         return res_err;
     }
     case kNetErrorWrongRequest : {
         auto res_err = ProducerErrorTemplates::kWrongInput.Generate();
-        res_err->AddContext("response", sendDataResponse.message);
+        res_err->AddDetails("response", sendDataResponse.message);
         return res_err;
     }
     case kNetErrorWarning: {
         auto res_err = ProducerErrorTemplates::kServerWarning.Generate();
-        res_err->AddContext("response", sendDataResponse.message);
+        res_err->AddDetails("response", sendDataResponse.message);
         return res_err;
     }
     case kNetErrorReauthorize: {
@@ -122,7 +122,7 @@ Error RequestHandlerTcp::ReceiveResponse(std::string* response) {
         return nullptr;
     default:
         auto res_err = ProducerErrorTemplates::kInternalServerError.Generate();
-        res_err->AddContext("response", sendDataResponse.message);
+            res_err->AddDetails("response", sendDataResponse.message);
         return res_err;
     }
 }
diff --git a/receiver/src/receiver_data_server/net_server/rds_fabric_server.cpp b/receiver/src/receiver_data_server/net_server/rds_fabric_server.cpp
index a31ab1874..4df46716d 100644
--- a/receiver/src/receiver_data_server/net_server/rds_fabric_server.cpp
+++ b/receiver/src/receiver_data_server/net_server/rds_fabric_server.cpp
@@ -30,7 +30,7 @@ Error RdsFabricServer::Initialize() {
         return err;
     }
 
-    log__->Info("Started Fabric ReceiverDataServer at '" + server__->GetAddress() + "'");
+    log__->Info(LogMessageWithFields("started fabric data server").Append("address",server__->GetAddress()));
 
     return err;
 }
diff --git a/receiver/src/receiver_data_server/net_server/rds_tcp_server.cpp b/receiver/src/receiver_data_server/net_server/rds_tcp_server.cpp
index fc8efd3fe..e1d983add 100644
--- a/receiver/src/receiver_data_server/net_server/rds_tcp_server.cpp
+++ b/receiver/src/receiver_data_server/net_server/rds_tcp_server.cpp
@@ -1,34 +1,38 @@
 #include "rds_tcp_server.h"
 #include "../receiver_data_server_logger.h"
+#include "../receiver_data_server_error.h"
 
 #include "asapo/io/io_factory.h"
 #include "asapo/common/networking.h"
 
 namespace asapo {
 
-RdsTcpServer::RdsTcpServer(std::string address, const AbstractLogger* logger) : io__{GenerateDefaultIO()}, log__{logger},
-    address_{std::move(address)} {}
+RdsTcpServer::RdsTcpServer(std::string address, const AbstractLogger *logger) : io__{GenerateDefaultIO()},
+                                                                                log__{logger},
+                                                                                address_{std::move(address)} {}
 
 Error RdsTcpServer::Initialize() {
-    Error err;
-    if (master_socket_ == kDisconnectedSocketDescriptor) {
-        master_socket_ = io__->CreateAndBindIPTCPSocketListener(address_, kMaxPendingConnections, &err);
-        if (!err) {
-            log__->Info("Started TCP ReceiverDataServer at '" + address_ + "'");
-        } else {
-            log__->Error("TCP ReceiverDataServer cannot listen on " + address_ + ": " + err->Explain());
-        }
+    if (master_socket_ != kDisconnectedSocketDescriptor) {
+        return GeneralErrorTemplates::kSimpleError.Generate("server was already initialized");
+    }
+    Error io_err;
+    master_socket_ = io__->CreateAndBindIPTCPSocketListener(address_, kMaxPendingConnections, &io_err);
+    if (!io_err) {
+        log__->Info(LogMessageWithFields("started TCP data server").Append("address", address_));
     } else {
-        err = GeneralErrorTemplates::kSimpleError.Generate("Server was already initialized");
+        auto err =
+            ReceiverDataServerErrorTemplates::kServerError.Generate("cannot start TCP data server", std::move(io_err));
+        err->AddDetails("address", address_);
+        return err;
     }
-    return err;
+    return nullptr;
 }
 
-ListSocketDescriptors RdsTcpServer::GetActiveSockets(Error* err) {
+ListSocketDescriptors RdsTcpServer::GetActiveSockets(Error *err) {
     std::vector<std::string> new_connections;
     auto sockets = io__->WaitSocketsActivity(master_socket_, &sockets_to_listen_, &new_connections, err);
-    for (auto& connection : new_connections) {
-        log__->Debug("new connection from " + connection);
+    for (auto &connection: new_connections) {
+        log__->Debug(LogMessageWithFields("new connection").Append("origin", connection));
     }
     return sockets;
 }
@@ -36,42 +40,44 @@ ListSocketDescriptors RdsTcpServer::GetActiveSockets(Error* err) {
 void RdsTcpServer::CloseSocket(SocketDescriptor socket) {
     sockets_to_listen_.erase(std::remove(sockets_to_listen_.begin(), sockets_to_listen_.end(), socket),
                              sockets_to_listen_.end());
-    log__->Debug("connection " + io__->AddressFromSocket(socket) + " closed");
+    log__->Debug(LogMessageWithFields("connection closed").Append("origin", io__->AddressFromSocket(socket)));
     io__->CloseSocket(socket, nullptr);
 }
 
-ReceiverDataServerRequestPtr RdsTcpServer::ReadRequest(SocketDescriptor socket, Error* err) {
+ReceiverDataServerRequestPtr RdsTcpServer::ReadRequest(SocketDescriptor socket, Error *err) {
     GenericRequestHeader header;
+    Error io_err;
+    *err = nullptr;
     io__->Receive(socket, &header,
-                  sizeof(GenericRequestHeader), err);
-    if (*err == GeneralErrorTemplates::kEndOfFile) {
+                  sizeof(GenericRequestHeader), &io_err);
+    if (io_err == GeneralErrorTemplates::kEndOfFile) {
         CloseSocket(socket);
         return nullptr;
-    } else if (*err) {
-        log__->Error("error getting next request from " + io__->AddressFromSocket(socket) + ": " + (*err)->
-                     Explain()
-                    );
+    } else if (io_err) {
+        *err = ReceiverDataServerErrorTemplates::kServerError.Generate("error getting next request",std::move(io_err));
+        (*err)->AddDetails("origin",io__->AddressFromSocket(socket));
         return nullptr;
     }
     return ReceiverDataServerRequestPtr{new ReceiverDataServerRequest{header, (uint64_t) socket}};
 }
 
-GenericRequests RdsTcpServer::ReadRequests(const ListSocketDescriptors& sockets) {
+GenericRequests RdsTcpServer::ReadRequests(const ListSocketDescriptors &sockets) {
     GenericRequests requests;
-    for (auto client : sockets) {
+    for (auto client: sockets) {
         Error err;
         auto request = ReadRequest(client, &err);
         if (err) {
             continue;
         }
-        log__->Debug("received request opcode: " + std::to_string(request->header.op_code) + " id: " + std::to_string(
-                         request->header.data_id));
+        log__->Debug(LogMessageWithFields("received request").
+            Append("operation", OpcodeToString(request->header.op_code)).
+            Append("id", request->header.data_id));
         requests.emplace_back(std::move(request));
     }
     return requests;
 }
 
-GenericRequests RdsTcpServer::GetNewRequests(Error* err) {
+GenericRequests RdsTcpServer::GetNewRequests(Error *err) {
     auto sockets = GetActiveSockets(err);
     if (*err) {
         return {};
@@ -82,7 +88,7 @@ GenericRequests RdsTcpServer::GetNewRequests(Error* err) {
 
 RdsTcpServer::~RdsTcpServer() {
     if (!io__) return; // need for test that override io__ to run
-    for (auto client : sockets_to_listen_) {
+    for (auto client: sockets_to_listen_) {
         io__->CloseSocket(client, nullptr);
     }
     io__->CloseSocket(master_socket_, nullptr);
@@ -92,28 +98,31 @@ void RdsTcpServer::HandleAfterError(uint64_t source_id) {
     CloseSocket(static_cast<int>(source_id));
 }
 
-Error RdsTcpServer::SendResponse(const ReceiverDataServerRequest* request, const GenericNetworkResponse* response) {
-    Error err;
-    io__->Send(static_cast<int>(request->source_id), response, sizeof(*response), &err);
-    if (err) {
-        log__->Error("cannot send to consumer" + err->Explain());
+Error RdsTcpServer::SendResponse(const ReceiverDataServerRequest *request, const GenericNetworkResponse *response) {
+    Error io_err,err;
+    auto socket= static_cast<int>(request->source_id);
+    io__->Send(socket, response, sizeof(*response), &io_err);
+    if (io_err) {
+        err = ReceiverDataServerErrorTemplates::kServerError.Generate("error sending response",std::move(io_err));
+        err->AddDetails("origin",io__->AddressFromSocket(socket));
     }
     return err;
 }
 
 Error
-RdsTcpServer::SendResponseAndSlotData(const ReceiverDataServerRequest* request, const GenericNetworkResponse* response,
-                                      const CacheMeta* cache_slot) {
+RdsTcpServer::SendResponseAndSlotData(const ReceiverDataServerRequest *request, const GenericNetworkResponse *response,
+                                      const CacheMeta *cache_slot) {
     Error err;
-
     err = SendResponse(request, response);
     if (err) {
         return err;
     }
-
-    io__->Send(static_cast<int>(request->source_id), cache_slot->addr, cache_slot->size, &err);
-    if (err) {
-        log__->Error("cannot send slot to worker" + err->Explain());
+    Error io_err;
+    auto socket= static_cast<int>(request->source_id);
+    io__->Send(socket, cache_slot->addr, cache_slot->size, &io_err);
+    if (io_err) {
+        err = ReceiverDataServerErrorTemplates::kServerError.Generate("error sending slot data",std::move(io_err));
+        err->AddDetails("origin",io__->AddressFromSocket(socket));
     }
     return err;
 }
diff --git a/receiver/src/receiver_data_server/receiver_data_server.cpp b/receiver/src/receiver_data_server/receiver_data_server.cpp
index 1dd311a90..3ac686056 100644
--- a/receiver/src/receiver_data_server/receiver_data_server.cpp
+++ b/receiver/src/receiver_data_server/receiver_data_server.cpp
@@ -24,12 +24,11 @@ void ReceiverDataServer::Run() {
         if (err == IOErrorTemplates::kTimeout) {
             continue;
         }
-
         if (!err) {
             err = request_pool__->AddRequests(std::move(requests));
         }
         if (err) {
-            log__->Error(std::string("receiver data server stopped: ") + err->Explain());
+            log__->Error(LogMessageWithFields("receiver data server stopped").Append("cause",std::move(err)));
             return;
         }
     }
diff --git a/receiver/src/receiver_data_server/receiver_data_server_error.h b/receiver/src/receiver_data_server/receiver_data_server_error.h
index 3e2e48601..be9bd21d5 100644
--- a/receiver/src/receiver_data_server/receiver_data_server_error.h
+++ b/receiver/src/receiver_data_server/receiver_data_server_error.h
@@ -7,7 +7,8 @@ namespace asapo {
 
 enum class ReceiverDataServerErrorType {
     kMemoryPool,
-    kWrongRequest
+    kWrongRequest,
+    kServerError
 };
 
 using ReceiverDataServerErrorTemplate = ServiceErrorTemplate<ReceiverDataServerErrorType>;
@@ -21,6 +22,9 @@ auto const kWrongRequest = ReceiverDataServerErrorTemplate {
     "wrong request", ReceiverDataServerErrorType::kWrongRequest
 };
 
+auto const kServerError = ReceiverDataServerErrorTemplate {
+    "server error", ReceiverDataServerErrorType::kServerError
+};
 
 }
 }
diff --git a/receiver/src/receiver_data_server/request_handler/receiver_data_server_request_handler.cpp b/receiver/src/receiver_data_server/request_handler/receiver_data_server_request_handler.cpp
index f2409de02..3ecec5d88 100644
--- a/receiver/src/receiver_data_server/request_handler/receiver_data_server_request_handler.cpp
+++ b/receiver/src/receiver_data_server/request_handler/receiver_data_server_request_handler.cpp
@@ -92,7 +92,10 @@ void ReceiverDataServerRequestHandler::ProcessRequestTimeoutUnlocked(GenericRequ
 
 void ReceiverDataServerRequestHandler::HandleInvalidRequest(const ReceiverDataServerRequest* receiver_request,
         NetworkErrorCode code) {
-    SendResponse(receiver_request, code);
+    auto err = SendResponse(receiver_request, code);
+    if (err) {
+        log__->Error(err);
+    }
     server_->HandleAfterError(receiver_request->source_id);
     switch (code) {
     case NetworkErrorCode::kNetErrorWrongRequest:
@@ -111,8 +114,8 @@ void ReceiverDataServerRequestHandler::HandleValidRequest(const ReceiverDataServ
         const CacheMeta* meta) {
     auto err = SendResponseAndSlotData(receiver_request, meta);
     if (err) {
-        log__->Error("failed to send slot:" + err->Explain());
         server_->HandleAfterError(receiver_request->source_id);
+        log__->Error(err);
     } else {
         statistics__->IncreaseRequestCounter();
         statistics__->IncreaseRequestDataVolume(receiver_request->header.data_size);
diff --git a/receiver/src/request.cpp b/receiver/src/request.cpp
index 0c4ed721b..25172a9ab 100644
--- a/receiver/src/request.cpp
+++ b/receiver/src/request.cpp
@@ -18,7 +18,9 @@ Error Request::PrepareDataBufferAndLockIfNeeded() {
         try {
             data_buffer_.reset(new uint8_t[(size_t)request_header_.data_size]);
         } catch(std::exception& e) {
-            auto err = GeneralErrorTemplates::kMemoryAllocationError.Generate(e.what());
+            auto err = GeneralErrorTemplates::kMemoryAllocationError.Generate(
+                std::string("cannot allocate memory for request"));
+            err->AddDetails("reason", e.what())->AddDetails("size", std::to_string(request_header_.data_size));
             return err;
         }
     } else {
@@ -27,7 +29,9 @@ Error Request::PrepareDataBufferAndLockIfNeeded() {
         if (data_ptr) {
             slot_meta_ = slot;
         } else {
-            return GeneralErrorTemplates::kMemoryAllocationError.Generate("cannot allocate slot in cache");
+            auto err = GeneralErrorTemplates::kMemoryAllocationError.Generate("cannot allocate slot in cache");
+            err->AddDetails("size", std::to_string(request_header_.data_size));
+            return err;
         }
     }
     return nullptr;
diff --git a/receiver/src/request_handler/authorization_client.cpp b/receiver/src/request_handler/authorization_client.cpp
index 183fac7cb..cb5c737f4 100644
--- a/receiver/src/request_handler/authorization_client.cpp
+++ b/receiver/src/request_handler/authorization_client.cpp
@@ -26,7 +26,7 @@ Error ErrorFromAuthorizationServerResponse(Error err, const std::string response
     } else {
         if (code != HttpCode::Unauthorized) {
             return_err = asapo::ReceiverErrorTemplates::kInternalServerError.Generate();
-            return_err->AddContext("response", response)->AddContext("errorCode", std::to_string(int(
+            return_err->AddDetails("response", response)->AddDetails("errorCode", std::to_string(int(
                 code)));
         } else {
             return_err = asapo::ReceiverErrorTemplates::kAuthorizationFailure.Generate();
@@ -45,7 +45,7 @@ Error CheckAccessType(SourceType source_type, const std::vector<std::string> &ac
         for (size_t i = 0; i < access_types.size(); i++) {
             types += (i > 0 ? "," : "") + access_types[i];
         }
-        err->AddContext("expected", source_type == SourceType::kProcessed ? "write" : "writeraw")->AddContext("have",
+        err->AddDetails("expected", source_type == SourceType::kProcessed ? "write" : "writeraw")->AddDetails("have",
                                                                                                               types);
         return err;
     }
diff --git a/receiver/src/request_handler/file_processors/receive_file_processor.cpp b/receiver/src/request_handler/file_processors/receive_file_processor.cpp
index 3ff0d607e..02da8d258 100644
--- a/receiver/src/request_handler/file_processors/receive_file_processor.cpp
+++ b/receiver/src/request_handler/file_processors/receive_file_processor.cpp
@@ -5,6 +5,7 @@
 #include "../../receiver_error.h"
 #include "../../request.h"
 #include "../../receiver_config.h"
+#include "../../receiver_logger.h"
 
 namespace asapo {
 
@@ -23,7 +24,8 @@ Error ReceiveFileProcessor::ProcessFile(const Request* request, bool overwrite)
     }
     err =  io__->ReceiveDataToFile(socket, root_folder, fname, (size_t) fsize, true, overwrite);
     if (!err) {
-        log__->Debug("received file of size " + std::to_string(fsize) + " to " + root_folder + kPathSeparator + fname);
+        log__->Debug(RequestLog("received file", request).Append("size",std::to_string(fsize)).Append("name",
+                root_folder + kPathSeparator + fname));
     }
     return err;
 }
diff --git a/receiver/src/request_handler/file_processors/write_file_processor.cpp b/receiver/src/request_handler/file_processors/write_file_processor.cpp
index 3dcc5ae00..e9886926f 100644
--- a/receiver/src/request_handler/file_processors/write_file_processor.cpp
+++ b/receiver/src/request_handler/file_processors/write_file_processor.cpp
@@ -3,6 +3,7 @@
 #include "asapo/preprocessor/definitions.h"
 #include "../../receiver_error.h"
 #include "../../request.h"
+#include "../../receiver_logger.h"
 
 namespace asapo {
 
@@ -14,7 +15,9 @@ WriteFileProcessor::WriteFileProcessor() : FileProcessor()  {
 Error WriteFileProcessor::ProcessFile(const Request* request, bool overwrite) const {
     auto fsize = request->GetDataSize();
     if (fsize <= 0) {
-        return ReceiverErrorTemplates::kBadRequest.Generate("wrong file size");
+        auto err = ReceiverErrorTemplates::kBadRequest.Generate("wrong file size");
+        err->AddDetails("size",std::to_string(fsize));
+        return err;
     }
 
     auto data = request->GetData();
@@ -27,7 +30,8 @@ Error WriteFileProcessor::ProcessFile(const Request* request, bool overwrite) co
 
     err =  io__->WriteDataToFile(root_folder, fname, (uint8_t*)data, (size_t) fsize, true, overwrite);
     if (!err) {
-        log__->Debug("saved file of size " + std::to_string(fsize) + " to " + root_folder + kPathSeparator + fname);
+        log__->Debug(RequestLog("saved file", request).Append("size",std::to_string(fsize)).Append("name",
+                                                                                                      root_folder + kPathSeparator + fname));
     }
 
     return err;
diff --git a/receiver/src/request_handler/request_handler_authorize.cpp b/receiver/src/request_handler/request_handler_authorize.cpp
index f29681fec..bb158c38e 100644
--- a/receiver/src/request_handler/request_handler_authorize.cpp
+++ b/receiver/src/request_handler/request_handler_authorize.cpp
@@ -15,7 +15,7 @@ Error RequestHandlerAuthorize::CheckVersion(const Request* request) const {
     int verService = VersionToNumber(GetReceiverApiVersion());
     if (verClient > verService) {
         auto err = asapo::ReceiverErrorTemplates::kUnsupportedClient.Generate();
-        err->AddContext("client",version_from_client)->AddContext("server",GetReceiverApiVersion());
+        err->AddDetails("client", version_from_client)->AddDetails("server", GetReceiverApiVersion());
         return err;
     }
     return nullptr;
diff --git a/receiver/src/request_handler/request_handler_db.cpp b/receiver/src/request_handler/request_handler_db.cpp
index fea6e8246..ed201b179 100644
--- a/receiver/src/request_handler/request_handler_db.cpp
+++ b/receiver/src/request_handler/request_handler_db.cpp
@@ -43,13 +43,14 @@ Error RequestHandlerDb::GetDatabaseServerUri(std::string* uri) const {
                      Append("origin", GetReceiverConfig()->discovery_server));
         auto err = ReceiverErrorTemplates::kInternalServerError.Generate("http error while discovering database server",
                 std::move(http_err));
-        err->AddContext("discoveryEndpoint",GetReceiverConfig()->discovery_server);
+        err->AddDetails("discoveryEndpoint", GetReceiverConfig()->discovery_server);
         return err;
     }
 
     if (code != HttpCode::OK) {
         auto err =  ReceiverErrorTemplates::kInternalServerError.Generate("error when discover database server");
-        err->AddContext("discoveryEndpoint",GetReceiverConfig()->discovery_server)->AddContext("errorCode",std::to_string((int) code));
+        err->AddDetails("discoveryEndpoint", GetReceiverConfig()->discovery_server)->AddDetails("errorCode",
+                                                                                                std::to_string((int) code));
         return err;
     }
 
diff --git a/receiver/src/request_handler/request_handler_receive_data.cpp b/receiver/src/request_handler/request_handler_receive_data.cpp
index 8c840c026..e81a5e304 100644
--- a/receiver/src/request_handler/request_handler_receive_data.cpp
+++ b/receiver/src/request_handler/request_handler_receive_data.cpp
@@ -18,8 +18,16 @@ Error RequestHandlerReceiveData::ProcessRequest(Request* request) const {
     if (err) {
         return err;
     }
-    io__->Receive(request->GetSocket(), request->GetData(), (size_t) request->GetDataSize(), &err);
+    Error io_err;
+    io__->Receive(request->GetSocket(), request->GetData(), (size_t) request->GetDataSize(), &io_err);
+    if (io_err) {
+        err = ReceiverErrorTemplates::kProcessingError.Generate("cannot receive data",std::move(io_err));
+    }
     request->UnlockDataBufferIfNeeded();
+    if (err == nullptr) {
+        log__->Debug(RequestLog("received request data", request).Append("size",request->GetDataSize()));
+    }
+
     return err;
 }
 
diff --git a/receiver/src/request_handler/request_handler_receive_metadata.cpp b/receiver/src/request_handler/request_handler_receive_metadata.cpp
index 71aab0b74..6e0826a15 100644
--- a/receiver/src/request_handler/request_handler_receive_metadata.cpp
+++ b/receiver/src/request_handler/request_handler_receive_metadata.cpp
@@ -15,9 +15,9 @@ Error RequestHandlerReceiveMetaData::ProcessRequest(Request* request) const {
     auto buf = std::unique_ptr<uint8_t[]> {new uint8_t[meta_size]};
     io__->Receive(request->GetSocket(), (void*) buf.get(), meta_size, &err);
     if (err) {
-        return err;
+        return ReceiverErrorTemplates::kProcessingError.Generate("cannot receive metadata",std::move(err));
     }
-
+    log__->Debug(RequestLog("received request metadata", request).Append("size",meta_size));
     request->SetMetadata(std::string((char*)buf.get(), meta_size));
     return nullptr;
 }
diff --git a/receiver/unittests/request_handler/file_processors/test_receive_file_processor.cpp b/receiver/unittests/request_handler/file_processors/test_receive_file_processor.cpp
index 0fe70c057..81d8aa890 100644
--- a/receiver/unittests/request_handler/file_processors/test_receive_file_processor.cpp
+++ b/receiver/unittests/request_handler/file_processors/test_receive_file_processor.cpp
@@ -27,7 +27,7 @@ class ReceiveFileProcessorTests : public Test {
   public:
     ReceiveFileProcessor processor;
     NiceMock<MockIO> mock_io;
-    std::unique_ptr<MockRequest> mock_request;
+    std::unique_ptr<NiceMock<MockRequest>> mock_request;
     NiceMock<asapo::MockLogger> mock_logger;
     SocketDescriptor expected_socket_id = SocketDescriptor{1};
     std::string expected_file_name = std::string("processed") + asapo::kPathSeparator + std::string("2");
@@ -54,8 +54,10 @@ class ReceiveFileProcessorTests : public Test {
         asapo::ReceiverConfig test_config;
         asapo::SetReceiverConfig(test_config, "none");
         processor.log__ = &mock_logger;
-        mock_request.reset(new MockRequest{request_header, 1, "", nullptr});
+        mock_request.reset(new NiceMock<MockRequest>{request_header, 1, "", nullptr});
         processor.io__ = std::unique_ptr<asapo::IO> {&mock_io};
+        SetDefaultRequestCalls(mock_request.get(),expected_beamtime_id);
+
     }
     void TearDown() override {
         processor.io__.release();
@@ -119,7 +121,6 @@ TEST_F(ReceiveFileProcessorTests, WritesToLog) {
 
     EXPECT_CALL(mock_logger, Debug(AllOf(HasSubstr("received file"),
                                          HasSubstr(expected_file_name),
-                                         HasSubstr(expected_beamtime_id),
                                          HasSubstr(std::to_string(expected_file_size))
                                         )
                                   )
diff --git a/receiver/unittests/request_handler/file_processors/test_write_file_processor.cpp b/receiver/unittests/request_handler/file_processors/test_write_file_processor.cpp
index bead65417..5a4e77115 100644
--- a/receiver/unittests/request_handler/file_processors/test_write_file_processor.cpp
+++ b/receiver/unittests/request_handler/file_processors/test_write_file_processor.cpp
@@ -27,7 +27,7 @@ class WriteFileProcessorTests : public Test {
   public:
     WriteFileProcessor processor;
     NiceMock<MockIO> mock_io;
-    std::unique_ptr<MockRequest> mock_request;
+    std::unique_ptr<NiceMock<MockRequest>> mock_request;
     NiceMock<asapo::MockLogger> mock_logger;
     std::string expected_file_name = std::string("raw") + asapo::kPathSeparator + std::string("2");
     asapo::SourceType expected_source_type = asapo::SourceType::kRaw;
@@ -53,8 +53,10 @@ class WriteFileProcessorTests : public Test {
         asapo::ReceiverConfig test_config;
         asapo::SetReceiverConfig(test_config, "none");
         processor.log__ = &mock_logger;
-        mock_request.reset(new MockRequest{request_header, 1, "", nullptr});
+        mock_request.reset(new NiceMock<MockRequest>{request_header, 1, "", nullptr});
         processor.io__ = std::unique_ptr<asapo::IO> {&mock_io};
+        SetDefaultRequestCalls(mock_request.get(),expected_beamtime_id);
+
     }
     void TearDown() override {
         processor.io__.release();
@@ -114,15 +116,8 @@ TEST_F(WriteFileProcessorTests, WritesToLog) {
 
     ExpectFileWrite(nullptr);
 
-    EXPECT_CALL(mock_logger, Debug(AllOf(HasSubstr("saved file"),
-                                         HasSubstr(expected_file_name),
-                                         HasSubstr(expected_beamtime_id),
-                                         HasSubstr(expected_facility),
-                                         HasSubstr(expected_year),
-                                         HasSubstr(std::to_string(expected_file_size))
-                                        )
-                                  )
-               );
+    EXPECT_CALL(mock_logger, Debug(HasSubstr("saved file")));
+
     auto err = processor.ProcessFile(mock_request.get(), expected_overwrite);
     ASSERT_THAT(err, Eq(nullptr));
 }
diff --git a/receiver/unittests/request_handler/test_request_handler_receive_data.cpp b/receiver/unittests/request_handler/test_request_handler_receive_data.cpp
index d3e679b7c..8d734e18c 100644
--- a/receiver/unittests/request_handler/test_request_handler_receive_data.cpp
+++ b/receiver/unittests/request_handler/test_request_handler_receive_data.cpp
@@ -109,7 +109,7 @@ TEST_F(ReceiveDataHandlerTests, HandleDoesNotReceiveDataWhenMetadataOnlyWasSent)
 TEST_F(ReceiveDataHandlerTests, HandleReturnsErrorOnDataReceive) {
     ExpectReceiveData(false);
     auto err = handler.ProcessRequest(request.get());
-    ASSERT_THAT(err, Eq(asapo::IOErrorTemplates::kReadError));
+    ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kProcessingError));
 }
 
 TEST_F(ReceiveDataHandlerTests, HandleReturnsOK) {
diff --git a/receiver/unittests/request_handler/test_request_handler_receive_metadata.cpp b/receiver/unittests/request_handler/test_request_handler_receive_metadata.cpp
index 99b3e4ed5..0b15844d4 100644
--- a/receiver/unittests/request_handler/test_request_handler_receive_metadata.cpp
+++ b/receiver/unittests/request_handler/test_request_handler_receive_metadata.cpp
@@ -87,7 +87,7 @@ TEST_F(ReceiveMetaDataHandlerTests, CheckStatisticEntity) {
 TEST_F(ReceiveMetaDataHandlerTests, HandleReturnsErrorOnMetaDataReceive) {
     ExpectReceiveMetaData(false);
     auto err = handler.ProcessRequest(request.get());
-    ASSERT_THAT(err, Eq(asapo::IOErrorTemplates::kReadError));
+    ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kProcessingError));
 }
 
 TEST_F(ReceiveMetaDataHandlerTests, HandleReturnsOK) {
diff --git a/tests/automatic/system_io/read_folder_content/CMakeLists.txt b/tests/automatic/system_io/read_folder_content/CMakeLists.txt
index 42bc1ec48..222ab4585 100644
--- a/tests/automatic/system_io/read_folder_content/CMakeLists.txt
+++ b/tests/automatic/system_io/read_folder_content/CMakeLists.txt
@@ -27,6 +27,6 @@ ELSE()
 ENDIF(WIN32)
 
 
-add_integration_test(${TARGET_NAME} foldernotfound "test_notexist error:Nosuchfileordirectory,context:name:test_notexist")
-add_integration_test(${TARGET_NAME} foldernoaccess "test_noaccess1 error:Permissiondenied,context:name:test_noaccess1")
+add_integration_test(${TARGET_NAME} foldernotfound "test_notexist error:Nosuchfileordirectory,details:name:test_notexist")
+add_integration_test(${TARGET_NAME} foldernoaccess "test_noaccess1 error:Permissiondenied,details:name:test_noaccess1")
 
diff --git a/tests/automatic/system_io/read_string_from_file/CMakeLists.txt b/tests/automatic/system_io/read_string_from_file/CMakeLists.txt
index 8cfa3aed8..358742805 100644
--- a/tests/automatic/system_io/read_string_from_file/CMakeLists.txt
+++ b/tests/automatic/system_io/read_string_from_file/CMakeLists.txt
@@ -16,6 +16,6 @@ set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 
 add_test_setup_cleanup(${TARGET_NAME})
 add_integration_test(${TARGET_NAME} readfile "test/1 123")
-add_integration_test(${TARGET_NAME} filenotfound "test_notexist error:Nosuchfileordirectory,context:name:test_notexist")
-add_integration_test(${TARGET_NAME} filenoaccess "file_noaccess error:Permissiondenied,context:name:file_noaccess")
+add_integration_test(${TARGET_NAME} filenotfound "test_notexist error:Nosuchfileordirectory,details:name:test_notexist")
+add_integration_test(${TARGET_NAME} filenoaccess "file_noaccess error:Permissiondenied,details:name:file_noaccess")
 
diff --git a/tests/automatic/system_io/read_subdirectories/CMakeLists.txt b/tests/automatic/system_io/read_subdirectories/CMakeLists.txt
index ab9b1908f..837b0c6b1 100644
--- a/tests/automatic/system_io/read_subdirectories/CMakeLists.txt
+++ b/tests/automatic/system_io/read_subdirectories/CMakeLists.txt
@@ -27,6 +27,6 @@ ELSE()
 ENDIF(WIN32)
 
 
-add_integration_test(${TARGET_NAME} foldernotfound "test_notexist error:Nosuchfileordirectory,context:name:test_notexist")
-add_integration_test(${TARGET_NAME} foldernoaccess "test_noaccess1 error:Permissiondenied,context:name:test_noaccess1")
+add_integration_test(${TARGET_NAME} foldernotfound "test_notexist error:Nosuchfileordirectory,details:name:test_notexist")
+add_integration_test(${TARGET_NAME} foldernoaccess "test_noaccess1 error:Permissiondenied,details:name:test_noaccess1")
 
-- 
GitLab