diff --git a/common/cpp/include/common/error.h b/common/cpp/include/common/error.h index ee07360567adef4c64e4747b24e013509796bf59..863b87dafad91f0fb3d2f3488147a0c84650e3d8 100644 --- a/common/cpp/include/common/error.h +++ b/common/cpp/include/common/error.h @@ -155,5 +155,48 @@ auto const kEndOfFile = SimpleErrorTemplate { } +template <typename ServiceErrorType, ErrorType MainErrorType> +class ServiceError : public SimpleError { + private: + ServiceErrorType error_type_; + public: + ServiceError(const std::string& error, ServiceErrorType error_type) : SimpleError(error, MainErrorType) { + error_type_ = error_type; + } + ServiceErrorType GetServiceErrorType() const noexcept { + return error_type_; + } +}; + +template <typename ServiceErrorType, ErrorType MainErrorType> +class ServiceErrorTemplate : public SimpleErrorTemplate { + protected: + ServiceErrorType error_type_; + public: + ServiceErrorTemplate(const std::string& error, ServiceErrorType error_type) : SimpleErrorTemplate(error, + MainErrorType) { + error_type_ = error_type; + } + + inline ServiceErrorType GetServiceErrorType() const noexcept { + return error_type_; + } + + inline Error Generate() const noexcept override { + auto err = new ServiceError<ServiceErrorType, MainErrorType>(error_, error_type_); + return Error(err); + } + + inline Error Generate(const std::string& prefix) const noexcept { + auto err = new ServiceError<ServiceErrorType, MainErrorType>(prefix + " :" + error_, error_type_); + return Error(err); + } + + inline bool operator==(const Error& rhs) const override { + return SimpleErrorTemplate::operator==(rhs) + && GetServiceErrorType() == ((ServiceError<ServiceErrorType, MainErrorType>*) rhs.get())->GetServiceErrorType(); + } +}; + } #endif //ASAPO_ERROR_H diff --git a/deploy/nomad_jobs/fluentd.conf b/deploy/nomad_jobs/fluentd.conf index 3c7d54708e94b1dc168d7dac3922e78447ae85b7..5be45afa2f189e1dc97eb5435839651e017232d1 100644 --- a/deploy/nomad_jobs/fluentd.conf +++ b/deploy/nomad_jobs/fluentd.conf @@ -48,6 +48,7 @@ <store> @type file flush_interval 1s + append true buffer_type memory path /shared/asapo-logs </store> diff --git a/receiver/CMakeLists.txt b/receiver/CMakeLists.txt index e13af4c7e7bc1b6d535e2a4506e99a9b1a736a8d..3bccb108760827e87ad3b553927a8662b4962470 100644 --- a/receiver/CMakeLists.txt +++ b/receiver/CMakeLists.txt @@ -12,7 +12,12 @@ set(SOURCE_FILES src/request_handler_authorize.cpp src/statistics_sender_fluentd.cpp src/requests_dispatcher.cpp -) + src/receiver_data_server/receiver_data_server.cpp + src/receiver_data_server/net_server.cpp + src/receiver_data_server/tcp_server.cpp + src/receiver_data_server/request_pool.cpp + src/receiver_data_server/request.cpp + src/receiver_data_server/receiver_data_server_logger.cpp) ################################ @@ -63,3 +68,7 @@ set(TEST_SOURCE_FILES # set(TEST_LIBRARIES "${TARGET_NAME};system_io") gtest(${TARGET_NAME} "${TEST_SOURCE_FILES}" "${TEST_LIBRARIES}" ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp) + +set(TEST_SOURCE_FILES_RDS + unittests/receiver_data_server/test_receiver_data_server.cpp) +gtest(${TARGET_NAME}_RDS "${TEST_SOURCE_FILES_RDS}" "${TEST_LIBRARIES}") diff --git a/receiver/src/receiver_data_server/common.h b/receiver/src/receiver_data_server/common.h new file mode 100644 index 0000000000000000000000000000000000000000..552b109b034248db40eda40222c02db875bb0e6d --- /dev/null +++ b/receiver/src/receiver_data_server/common.h @@ -0,0 +1,13 @@ +#ifndef ASAPO_COMMON_H +#define ASAPO_COMMON_H + +#include <vector> + +#include "request.h" +namespace asapo { + +using Requests = std::vector<asapo::Request>; + +} + +#endif //ASAPO_COMMON_H diff --git a/receiver/src/receiver_data_server/net_server.cpp b/receiver/src/receiver_data_server/net_server.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dbc8718a1dc0fef2c2f281f6ce05d49e0e1ded4b --- /dev/null +++ b/receiver/src/receiver_data_server/net_server.cpp @@ -0,0 +1,5 @@ +#include "net_server.h" + +namespace asapo { + +} \ No newline at end of file diff --git a/receiver/src/receiver_data_server/net_server.h b/receiver/src/receiver_data_server/net_server.h new file mode 100644 index 0000000000000000000000000000000000000000..d0ebb83bd9cc2c9564cc26eeee8e4ed3af378b58 --- /dev/null +++ b/receiver/src/receiver_data_server/net_server.h @@ -0,0 +1,18 @@ +#ifndef ASAPO_NET_SERVER_H +#define ASAPO_NET_SERVER_H + +#include "common/error.h" + +#include "common.h" + +namespace asapo { + +class NetServer { + public: + virtual Requests GetNewRequests(Error* err) const noexcept = 0; + virtual ~NetServer() = default; +}; + +} + +#endif //ASAPO_NET_SERVER_H diff --git a/receiver/src/receiver_data_server/receiver_data_server.cpp b/receiver/src/receiver_data_server/receiver_data_server.cpp new file mode 100644 index 0000000000000000000000000000000000000000..674a3cdc34313195828108c430f34e07741bb037 --- /dev/null +++ b/receiver/src/receiver_data_server/receiver_data_server.cpp @@ -0,0 +1,27 @@ +#include "receiver_data_server.h" +#include "tcp_server.h" +#include "receiver_data_server_logger.h" + +namespace asapo { + +ReceiverDataServer::ReceiverDataServer() : request_pool__{new RequestPool}, net__{new TcpServer()}, +log__{GetDefaultReceiverDataServerLogger()} { +} + +void ReceiverDataServer::Run() { + while (true) { + Error err; + auto requests = net__->GetNewRequests(&err); + if (err) { + log__->Error(std::string("receiver data server stopped: ") + err->Explain()); + return; + } + err = request_pool__->AddRequests(requests); + if (err) { + log__->Error(std::string("receiver data server stopped: ") + err->Explain()); + return; + } + } +} + +} \ No newline at end of file diff --git a/receiver/src/receiver_data_server/receiver_data_server.h b/receiver/src/receiver_data_server/receiver_data_server.h new file mode 100644 index 0000000000000000000000000000000000000000..d3a2972efde3b0fa53dbba6cf56e100bdedb52bd --- /dev/null +++ b/receiver/src/receiver_data_server/receiver_data_server.h @@ -0,0 +1,24 @@ +#ifndef ASAPO_RECEIVER_DATA_SERVER_H +#define ASAPO_RECEIVER_DATA_SERVER_H + +#include <memory> + +#include "net_server.h" +#include "request_pool.h" +#include "logger/logger.h" + +namespace asapo { + +class ReceiverDataServer { + public: + std::unique_ptr<RequestPool> request_pool__; + std::unique_ptr<NetServer> net__; + const AbstractLogger* log__; + + ReceiverDataServer(); + void Run(); +}; + +} + +#endif //ASAPO_RECEIVER_DATA_SERVER_H diff --git a/receiver/src/receiver_data_server/receiver_data_server_error.h b/receiver/src/receiver_data_server/receiver_data_server_error.h new file mode 100644 index 0000000000000000000000000000000000000000..822fbafbd3ed407a42b58b3100477e1cb3e0bf22 --- /dev/null +++ b/receiver/src/receiver_data_server/receiver_data_server_error.h @@ -0,0 +1,22 @@ +#ifndef ASAPO_RECEIVER_ERROR_H +#define ASAPO_RECEIVER_ERROR_H + +#include "common/error.h" + +namespace asapo { + +enum class ReceiverDataServerErrorType { + kMemoryPool, +}; + +using ReceiverDataServerErrorTemplate = ServiceErrorTemplate<ReceiverDataServerErrorType, ErrorType::kReceiverError>; + +namespace ReceiverErrorTemplates { +auto const kMemoryPool = ReceiverDataServerErrorTemplate { + "memory error", ReceiverDataServerErrorType::kMemoryPool +}; + +}; +} + +#endif //ASAPO_RECEIVER_ERROR_H diff --git a/receiver/src/receiver_data_server/receiver_data_server_logger.cpp b/receiver/src/receiver_data_server/receiver_data_server_logger.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a3adbb050800da73957ccb9d9693c0d2a970cad5 --- /dev/null +++ b/receiver/src/receiver_data_server/receiver_data_server_logger.cpp @@ -0,0 +1,11 @@ +#include "receiver_data_server_logger.h" + +namespace asapo { + + +AbstractLogger* GetDefaultReceiverDataServerLogger() { + static Logger logger = asapo::CreateDefaultLoggerBin("receiver_dataserver"); + return logger.get(); +} + +} diff --git a/receiver/src/receiver_data_server/receiver_data_server_logger.h b/receiver/src/receiver_data_server/receiver_data_server_logger.h new file mode 100644 index 0000000000000000000000000000000000000000..c391dbe0d827627bf27edb7eb904235a16b62733 --- /dev/null +++ b/receiver/src/receiver_data_server/receiver_data_server_logger.h @@ -0,0 +1,14 @@ +#ifndef ASAPO_RECEIVER_LOGGER_H +#define ASAPO_RECEIVER_LOGGER_H + +#include "logger/logger.h" + +namespace asapo { + + +AbstractLogger* GetDefaultReceiverDataServerLogger(); + +} + + +#endif //ASAPO_RECEIVER_LOGGER_H diff --git a/receiver/src/receiver_data_server/request.cpp b/receiver/src/receiver_data_server/request.cpp new file mode 100644 index 0000000000000000000000000000000000000000..85a4b136f49f3e469a6faf5b230a1bcef285dc8f --- /dev/null +++ b/receiver/src/receiver_data_server/request.cpp @@ -0,0 +1,5 @@ +#include "request.h" + +namespace asapo { + +} \ No newline at end of file diff --git a/receiver/src/receiver_data_server/request.h b/receiver/src/receiver_data_server/request.h new file mode 100644 index 0000000000000000000000000000000000000000..712dcb23e8fb375bbb5158328ac5af652f41d633 --- /dev/null +++ b/receiver/src/receiver_data_server/request.h @@ -0,0 +1,12 @@ +#ifndef ASAPO_REQUEST_H +#define ASAPO_REQUEST_H + +namespace asapo { + +class Request { + +}; + +} + +#endif //ASAPO_REQUEST_H diff --git a/receiver/src/receiver_data_server/request_pool.cpp b/receiver/src/receiver_data_server/request_pool.cpp new file mode 100644 index 0000000000000000000000000000000000000000..837a62b2f219b5b2381e56fb78aa907136250082 --- /dev/null +++ b/receiver/src/receiver_data_server/request_pool.cpp @@ -0,0 +1,9 @@ +#include "request_pool.h" + +namespace asapo { + +Error RequestPool::AddRequests(const Requests& requests) noexcept { + return nullptr; +} + +} \ No newline at end of file diff --git a/receiver/src/receiver_data_server/request_pool.h b/receiver/src/receiver_data_server/request_pool.h new file mode 100644 index 0000000000000000000000000000000000000000..42d46fa20da2474ca89affac6d33e91131d8fbbf --- /dev/null +++ b/receiver/src/receiver_data_server/request_pool.h @@ -0,0 +1,17 @@ +#ifndef ASAPO_REQUEST_POOL_H +#define ASAPO_REQUEST_POOL_H + +#include "preprocessor/definitions.h" +#include "common/error.h" +#include "common.h" + +namespace asapo { + +class RequestPool { + public: + VIRTUAL Error AddRequests(const Requests& requests) noexcept; +}; + +} + +#endif //ASAPO_REQUEST_POOL_H diff --git a/receiver/src/receiver_data_server/tcp_server.cpp b/receiver/src/receiver_data_server/tcp_server.cpp new file mode 100644 index 0000000000000000000000000000000000000000..db717fea1c103d0507153cd3b5f2310de031bce6 --- /dev/null +++ b/receiver/src/receiver_data_server/tcp_server.cpp @@ -0,0 +1,8 @@ +#include "tcp_server.h" + +namespace asapo { + +Requests TcpServer::GetNewRequests(Error* err) const noexcept { + return {}; +} +} \ No newline at end of file diff --git a/receiver/src/receiver_data_server/tcp_server.h b/receiver/src/receiver_data_server/tcp_server.h new file mode 100644 index 0000000000000000000000000000000000000000..27d28f078bf65b2f7c055ea974ee3f6800eaa644 --- /dev/null +++ b/receiver/src/receiver_data_server/tcp_server.h @@ -0,0 +1,15 @@ +#ifndef ASAPO_TCP_SERVER_H +#define ASAPO_TCP_SERVER_H + +#include "net_server.h" + +namespace asapo { + +class TcpServer : public NetServer { + public: + virtual Requests GetNewRequests(Error* err) const noexcept override ; +}; + +} + +#endif //ASAPO_TCP_SERVER_H diff --git a/receiver/unittests/receiver_data_server/receiver_dataserver_mocking.h b/receiver/unittests/receiver_data_server/receiver_dataserver_mocking.h new file mode 100644 index 0000000000000000000000000000000000000000..07ebfe1409d1fca06d708cfe6599f2c7b4ed7594 --- /dev/null +++ b/receiver/unittests/receiver_data_server/receiver_dataserver_mocking.h @@ -0,0 +1,40 @@ +#ifndef ASAPO_MOCK_STATISTICS_H +#define ASAPO_MOCK_STATISTICS_H + +#include <gtest/gtest.h> +#include <gmock/gmock.h> + +#include "../../src/receiver_data_server/net_server.h" +#include "../../src/receiver_data_server/request_pool.h" + + +namespace asapo { + +class MockNetServer : public NetServer { + public: + Requests GetNewRequests(Error* err) const noexcept override { + ErrorInterface* error = nullptr; + auto reqs = GetNewRequests_t(&error); + err->reset(error); + return reqs; + } + + MOCK_CONST_METHOD1(GetNewRequests_t, Requests (ErrorInterface** + error)); +}; + +class MockPool : public RequestPool { + public: + Error AddRequests(const Requests& requests) noexcept override { + return Error(AddRequests_t(requests)); + + } + + MOCK_METHOD1(AddRequests_t, ErrorInterface * (const Requests&)); +}; + + + +} + +#endif //ASAPO_MOCK_STATISTICS_H diff --git a/receiver/unittests/receiver_data_server/test_receiver_data_server.cpp b/receiver/unittests/receiver_data_server/test_receiver_data_server.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a7685fe9b0309c13ec47fae9142a5c39baa1c855 --- /dev/null +++ b/receiver/unittests/receiver_data_server/test_receiver_data_server.cpp @@ -0,0 +1,109 @@ +#include <gtest/gtest.h> +#include <gmock/gmock.h> + + +#include "unittests/MockLogger.h" +#include "../../src/receiver_data_server/receiver_data_server.h" +#include "../../src/receiver_data_server/tcp_server.h" +#include "../../src/receiver_data_server/common.h" + +#include "receiver_dataserver_mocking.h" + +#include "common/io_error.h" +#include "../../src/receiver_data_server/receiver_data_server_error.h" + + +using ::testing::Test; +using ::testing::Gt; +using ::testing::Ge; +using ::testing::Le; +using ::testing::Eq; +using ::testing::Ne; +using ::testing::Ref; +using ::testing::Return; +using ::testing::_; +using ::testing::SetArgPointee; +using ::testing::NiceMock; +using ::testing::HasSubstr; + + +using asapo::MockLogger; +using asapo::ReceiverDataServer; +using asapo::Error; + + +namespace { + +TEST(ReceiverDataServer, Constructor) { + ReceiverDataServer data_server; + ASSERT_THAT(dynamic_cast<const asapo::TcpServer*>(data_server.net__.get()), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<asapo::RequestPool*>(data_server.request_pool__.get()), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::AbstractLogger*>(data_server.log__), Ne(nullptr)); + +} + +class ReceiverDataServerTests : public Test { + public: + ReceiverDataServer data_server; + asapo::MockNetServer mock_net; + asapo::MockPool mock_pool; + NiceMock<asapo::MockLogger> mock_logger; + void SetUp() override { + data_server.net__ = std::unique_ptr<asapo::NetServer> {&mock_net}; + data_server.request_pool__ = std::unique_ptr<asapo::RequestPool> {&mock_pool}; + data_server.log__ = &mock_logger; + + } + void TearDown() override { + data_server.net__.release(); + data_server.request_pool__.release(); + } +}; + + +TEST_F(ReceiverDataServerTests, ErrorGetNewRequests) { + + /* EXPECT_CALL(mock_net, ProcessRequest_t(_)).WillOnce( + Return(nullptr) + ).WillOnce( + Return(new asapo::IOError("Test Send Error", asapo::IOErrorType::kUnknownIOError)) + ); + */ + + EXPECT_CALL(mock_net, GetNewRequests_t(_)).WillOnce( + DoAll(SetArgPointee<0>(asapo::IOErrorTemplates::kUnknownIOError.Generate().release()), + Return(asapo::Requests{}) + ) + ); + + auto errtext = asapo::IOErrorTemplates::kUnknownIOError.Generate()->Explain(); + + EXPECT_CALL(mock_logger, Error(AllOf(HasSubstr("stopped"), HasSubstr(errtext)))); + + + data_server.Run(); + +} + +TEST_F(ReceiverDataServerTests, ErrorAddingRequests) { + + EXPECT_CALL(mock_net, GetNewRequests_t(_)).WillOnce( + DoAll(SetArgPointee<0>(nullptr), + Return(asapo::Requests{}) + ) + ); + + EXPECT_CALL(mock_pool, AddRequests_t(_)).WillOnce( + Return(asapo::ReceiverErrorTemplates::kMemoryPool.Generate("cannot add request to pool").release()) + ); + + auto errtext = asapo::ReceiverErrorTemplates::kMemoryPool.Generate("cannot add request to pool")->Explain(); + + EXPECT_CALL(mock_logger, Error(AllOf(HasSubstr("stopped"), HasSubstr(errtext)))); + + data_server.Run(); +} + + + +}