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