From 5d0f77919ce1207089ea2e8692b464046ebfb828 Mon Sep 17 00:00:00 2001
From: Sergey Yakubov <sergey.yakubov@desy.de>
Date: Fri, 23 Mar 2018 13:49:36 +0100
Subject: [PATCH] start working at file write handler

---
 receiver/CMakeLists.txt                       |  2 +
 receiver/src/request.cpp                      | 12 +++-
 receiver/src/request.h                        | 11 +++-
 receiver/src/request_handler.h                |  2 +-
 receiver/src/request_handler_file_write.cpp   | 14 +++++
 receiver/src/request_handler_file_write.h     | 19 ++++++
 receiver/unittests/test_request.cpp           |  6 +-
 .../test_request_handler_file_write.cpp       | 60 +++++++++++++++++++
 8 files changed, 119 insertions(+), 7 deletions(-)
 create mode 100644 receiver/src/request_handler_file_write.cpp
 create mode 100644 receiver/src/request_handler_file_write.h
 create mode 100644 receiver/unittests/test_request_handler_file_write.cpp

diff --git a/receiver/CMakeLists.txt b/receiver/CMakeLists.txt
index cd5c8d620..3fd260ef2 100644
--- a/receiver/CMakeLists.txt
+++ b/receiver/CMakeLists.txt
@@ -4,6 +4,7 @@ set(SOURCE_FILES
         src/connection.h src/connection.cpp
         src/receiver_error.h
         src/request.cpp
+        src/request_handler_file_write.cpp
         )
 
 
@@ -33,6 +34,7 @@ set(TEST_SOURCE_FILES
         unittests/test_receiver.cpp
         unittests/test_connection.cpp
         unittests/test_request.cpp
+        unittests/test_request_handler_file_write.cpp
         )
 #
 set(TEST_LIBRARIES "${TARGET_NAME};system_io")
diff --git a/receiver/src/request.cpp b/receiver/src/request.cpp
index 74d0b5984..48d85e9de 100644
--- a/receiver/src/request.cpp
+++ b/receiver/src/request.cpp
@@ -45,6 +45,11 @@ Error Request::Handle() {
     return nullptr;
 }
 
+const RequestHandlerList& Request::GetListHandlers() const {
+    return handlers_;
+}
+
+
 void Request::AddHandler(const RequestHandler* handler) {
     handlers_.emplace_back(handler);
 }
@@ -55,8 +60,11 @@ std::unique_ptr<Request> RequestFactory::GenerateRequest(const GenericNetworkReq
         Error* err) const noexcept {
     *err = nullptr;
     switch (request_header.op_code) {
-    case Opcode::kNetOpcodeSendData:
-        return std::unique_ptr<Request> {new Request{request_header, socket_fd}};
+    case Opcode::kNetOpcodeSendData: {
+        auto request = std::unique_ptr<Request> {new Request{request_header, socket_fd}};
+        request->AddHandler(&request_handler_filewrite_);
+        return request;
+    }
     default:
         *err = ReceiverErrorTemplates::kInvalidOpCode.Generate();
         return nullptr;
diff --git a/receiver/src/request.h b/receiver/src/request.h
index c2da48398..8efcaf784 100644
--- a/receiver/src/request.h
+++ b/receiver/src/request.h
@@ -5,9 +5,11 @@
 #include "common/networking.h"
 #include "system_wrappers/io.h"
 #include "request_handler.h"
+#include "request_handler_file_write.h"
+
 namespace hidra2 {
 
-class RequestHandler;
+using RequestHandlerList = std::vector<const RequestHandler*>;
 
 class Request {
   public:
@@ -15,6 +17,7 @@ class Request {
     virtual ~Request() = default;
     Request(const GenericNetworkRequestHeader& request_header, SocketDescriptor socket_fd);
     void AddHandler(const RequestHandler*);
+    const RequestHandlerList& GetListHandlers() const;
     std::unique_ptr<IO> io__;
   private:
     Error AllocateDataBuffer();
@@ -22,13 +25,15 @@ class Request {
     const GenericNetworkRequestHeader request_header_;
     const SocketDescriptor socket_fd_;
     FileData data_buffer_;
-    std::vector<const RequestHandler*> handlers_;
+    RequestHandlerList handlers_;
 };
 
 class RequestFactory {
   public:
     virtual std::unique_ptr<Request> GenerateRequest(const GenericNetworkRequestHeader& request_header,
-                                                     SocketDescriptor socket_fd, Error* err) const noexcept ;
+                                                     SocketDescriptor socket_fd, Error* err) const noexcept;
+  private:
+    RequestHandlerFileWrite request_handler_filewrite_;
 };
 
 }
diff --git a/receiver/src/request_handler.h b/receiver/src/request_handler.h
index a136c40eb..2d208c636 100644
--- a/receiver/src/request_handler.h
+++ b/receiver/src/request_handler.h
@@ -1,7 +1,6 @@
 #ifndef HIDRA2_REQUEST_HANDLER_H
 #define HIDRA2_REQUEST_HANDLER_H
 
-#include "request.h"
 #include "receiver_error.h"
 
 namespace hidra2 {
@@ -11,6 +10,7 @@ class Request;
 class RequestHandler {
   public:
     virtual Error ProcessRequest(const Request& request) const = 0;
+    virtual ~RequestHandler() = default;
   private:
 };
 
diff --git a/receiver/src/request_handler_file_write.cpp b/receiver/src/request_handler_file_write.cpp
new file mode 100644
index 000000000..6b509495d
--- /dev/null
+++ b/receiver/src/request_handler_file_write.cpp
@@ -0,0 +1,14 @@
+#include "request_handler_file_write.h"
+#include "system_wrappers/system_io.h"
+
+namespace hidra2 {
+
+Error RequestHandlerFileWrite::ProcessRequest(const Request& request) const {
+    return nullptr;
+}
+
+RequestHandlerFileWrite::RequestHandlerFileWrite() : io__{new SystemIO} {
+
+}
+
+}
diff --git a/receiver/src/request_handler_file_write.h b/receiver/src/request_handler_file_write.h
new file mode 100644
index 000000000..bbffa8d3f
--- /dev/null
+++ b/receiver/src/request_handler_file_write.h
@@ -0,0 +1,19 @@
+#ifndef HIDRA2_REQUEST_HANDLER_FILE_WRITE_H
+#define HIDRA2_REQUEST_HANDLER_FILE_WRITE_H
+
+#include "request_handler.h"
+
+#include "system_wrappers/io.h"
+
+namespace hidra2 {
+
+class RequestHandlerFileWrite final: public RequestHandler {
+  public:
+    RequestHandlerFileWrite();
+    Error ProcessRequest(const Request& request) const override;
+    std::unique_ptr<IO> io__;
+};
+
+}
+
+#endif //HIDRA2_REQUEST_HANDLER_FILE_WRITE_H
diff --git a/receiver/unittests/test_request.cpp b/receiver/unittests/test_request.cpp
index 0fafb5fda..7e6f175f7 100644
--- a/receiver/unittests/test_request.cpp
+++ b/receiver/unittests/test_request.cpp
@@ -5,6 +5,7 @@
 #include "../src/receiver_error.h"
 #include "../src/request.h"
 #include "../src/request_handler.h"
+#include "../src/request_handler_file_write.h"
 
 using ::testing::Test;
 using ::testing::Return;
@@ -61,15 +62,18 @@ TEST_F(FactoryTests, ErrorOnWrongCode) {
     ASSERT_THAT(err, Ne(nullptr));
 }
 
-TEST_F(FactoryTests, ReturnsSendDataRequestOnkNetOpcodeSendDataCode) {
+TEST_F(FactoryTests, ReturnsDataRequestOnkNetOpcodeSendDataCode) {
     generic_request_header.op_code = hidra2::Opcode::kNetOpcodeSendData;
     auto request = factory.GenerateRequest(generic_request_header, 1, &err);
 
     ASSERT_THAT(err, Eq(nullptr));
     ASSERT_THAT(dynamic_cast<hidra2::Request*>(request.get()), Ne(nullptr));
+    ASSERT_THAT(dynamic_cast<const hidra2::RequestHandlerFileWrite*>(request->GetListHandlers()[0]), Ne(nullptr));
 }
 
 
+
+
 class RequestTests : public Test {
   public:
     GenericNetworkRequestHeader generic_request_header;
diff --git a/receiver/unittests/test_request_handler_file_write.cpp b/receiver/unittests/test_request_handler_file_write.cpp
new file mode 100644
index 000000000..2996f7159
--- /dev/null
+++ b/receiver/unittests/test_request_handler_file_write.cpp
@@ -0,0 +1,60 @@
+#include <gtest/gtest.h>
+#include <gmock/gmock.h>
+#include <unittests/MockIO.h>
+#include "../src/receiver_error.h"
+#include "../src/request.h"
+#include "../src/request_handler.h"
+#include "../src/request_handler_file_write.h"
+#include "common/networking.h"
+
+using ::testing::Test;
+using ::testing::Return;
+using ::testing::_;
+using ::testing::DoAll;
+using ::testing::SetArgReferee;
+using ::testing::Gt;
+using ::testing::Eq;
+using ::testing::Ne;
+using ::testing::Mock;
+using ::testing::NiceMock;
+using ::testing::InSequence;
+using ::testing::SetArgPointee;
+using ::hidra2::Error;
+using ::hidra2::ErrorInterface;
+using ::hidra2::FileDescriptor;
+using ::hidra2::SocketDescriptor;
+using ::hidra2::MockIO;
+using hidra2::Request;
+using hidra2::RequestHandlerFileWrite;
+using ::hidra2::GenericNetworkRequestHeader;
+
+namespace {
+
+class MockRequest: public Request {
+  public:
+    MockRequest(const GenericNetworkRequestHeader& request_header, SocketDescriptor socket_fd):
+        Request(request_header, socket_fd) {};
+
+    MOCK_CONST_METHOD0(GetFileName, std::string());
+    MOCK_CONST_METHOD0(GetDataSize, uint64_t());
+    MOCK_CONST_METHOD0(GetData, const hidra2::FileData & ());
+};
+
+class FileWriteHandlerTests : public Test {
+  public:
+    RequestHandlerFileWrite handler;
+    NiceMock<MockIO> mock_io;
+    void SetUp() override {
+        handler.io__ = std::unique_ptr<hidra2::IO> {&mock_io};
+        /*      ON_CALL(mock_io, Receive_t(socket_fd_, _, data_size_, _)).WillByDefault(
+                  DoAll(SetArgPointee<3>(nullptr),
+                        Return(0)
+                  ));*/
+    }
+    void TearDown() override {
+        handler.io__.release();
+    }
+
+};
+
+}
\ No newline at end of file
-- 
GitLab