diff --git a/common/cpp/include/system_wrappers/io.h b/common/cpp/include/system_wrappers/io.h index cb72c12881ff7b968c55021e33d481420b02555b..bf24db4b9f4d47b30ad32c3fe5dfce749fdfa8a1 100644 --- a/common/cpp/include/system_wrappers/io.h +++ b/common/cpp/include/system_wrappers/io.h @@ -48,10 +48,13 @@ class IO { /* * Network */ - virtual FileDescriptor create_socket (AddressFamilies address_family, SocketTypes socket_type, SocketProtocols socket_protocol, IOErrors* err) = 0; + virtual FileDescriptor create_socket (AddressFamilies address_family, SocketTypes socket_type, + SocketProtocols socket_protocol, IOErrors* err) = 0; virtual void listen (FileDescriptor socket_fd, int backlog, IOErrors* err) = 0; - virtual void inet_bind (FileDescriptor socket_fd, const std::string& address, uint16_t port, IOErrors* err) = 0; - virtual std::unique_ptr<std::tuple<std::string, FileDescriptor>> inet_accept(FileDescriptor socket_fd, IOErrors* err) = 0; + virtual void inet_bind (FileDescriptor socket_fd, const std::string& address, uint16_t port, + IOErrors* err) = 0; + virtual std::unique_ptr<std::tuple<std::string, FileDescriptor>> inet_accept(FileDescriptor socket_fd, + IOErrors* err) = 0; virtual void inet_connect (FileDescriptor socket_fd, const std::string& address, IOErrors* err) = 0; virtual FileDescriptor create_and_connect_ip_tcp_socket(const std::string& address, IOErrors* err) = 0; @@ -72,7 +75,7 @@ class IO { virtual ssize_t deprecated_write (int __fd, const void* __buf, size_t __n) = 0; // this is not standard function - to be implemented differently in windows and linux - virtual FileData GetDataFromFile (const std::string &fname, IOErrors* err) = 0; + virtual FileData GetDataFromFile (const std::string& fname, IOErrors* err) = 0; virtual std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) = 0; }; diff --git a/common/cpp/include/system_wrappers/system_io.h b/common/cpp/include/system_wrappers/system_io.h index ac944b26e09984849a8ef7e71ef71fee6adbbd90..12c4043bb6d00f1a73cbea77256c42525e1b9928 100644 --- a/common/cpp/include/system_wrappers/system_io.h +++ b/common/cpp/include/system_wrappers/system_io.h @@ -11,7 +11,8 @@ class SystemIO final : public IO { /* * Network */ - FileDescriptor create_socket (AddressFamilies address_family, SocketTypes socket_type, SocketProtocols socket_protocol, IOErrors* err); + FileDescriptor create_socket (AddressFamilies address_family, SocketTypes socket_type, + SocketProtocols socket_protocol, IOErrors* err); void listen (FileDescriptor socket_fd, int backlog, IOErrors* err); void inet_bind (FileDescriptor socket_fd, const std::string& address, uint16_t port, IOErrors* err); std::unique_ptr<std::tuple<std::string, FileDescriptor>> inet_accept(FileDescriptor socket_fd, IOErrors* err); @@ -35,7 +36,7 @@ class SystemIO final : public IO { ssize_t deprecated_write (int __fd, const void* __buf, size_t __n); // this is not standard function - to be implemented differently in windows and linux - FileData GetDataFromFile (const std::string &fname, IOErrors* err); + FileData GetDataFromFile (const std::string& fname, IOErrors* err); std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err); }; } diff --git a/common/cpp/src/system_io_linux.cpp b/common/cpp/src/system_io_linux.cpp index 705de99fe41f307134cece3b3c3c54c68d203218..18cc744ac7a4db610d8cea960b65015f2de1d98a 100644 --- a/common/cpp/src/system_io_linux.cpp +++ b/common/cpp/src/system_io_linux.cpp @@ -53,13 +53,13 @@ IOErrors IOErrorFromErrno() { sa_family_t AddressFamilyToPosixFamily(AddressFamilies address_family) { switch(address_family) { - case AddressFamilies::INET: - return AF_INET; + case AddressFamilies::INET: + return AF_INET; } return -1; }; -hidra2::FileData hidra2::SystemIO::GetDataFromFile(const std::string &fname, IOErrors* err) { +hidra2::FileData hidra2::SystemIO::GetDataFromFile(const std::string& fname, IOErrors* err) { int fd = deprecated_open(fname.c_str(), O_RDONLY); *err = IOErrorFromErrno(); if (*err != IOErrors::NO_ERROR) { @@ -165,9 +165,9 @@ std::vector<FileInfo> SystemIO::FilesInFolder(const string& folder, IOErrors* er hidra2::FileDescriptor hidra2::SystemIO::create_socket(hidra2::AddressFamilies address_family, - hidra2::SocketTypes socket_type, - hidra2::SocketProtocols socket_protocol, - hidra2::IOErrors* err) { + hidra2::SocketTypes socket_type, + hidra2::SocketProtocols socket_protocol, + hidra2::IOErrors* err) { *err = IOErrors::NO_ERROR; int domain = AddressFamilyToPosixFamily(address_family); @@ -178,22 +178,22 @@ hidra2::FileDescriptor hidra2::SystemIO::create_socket(hidra2::AddressFamilies a int type = 0; switch(socket_type) { - case SocketTypes::STREAM: - type = SOCK_STREAM; - break; - default: - *err = IOErrors::UNKNOWN_ERROR;//TODO - return -1; + case SocketTypes::STREAM: + type = SOCK_STREAM; + break; + default: + *err = IOErrors::UNKNOWN_ERROR;//TODO + return -1; } int protocol = 0; switch(socket_protocol) { - case SocketProtocols::IP: - protocol = IPPROTO_IP; - break; - default: - *err = IOErrors::UNKNOWN_ERROR;//TODO - return -1; + case SocketProtocols::IP: + protocol = IPPROTO_IP; + break; + default: + *err = IOErrors::UNKNOWN_ERROR;//TODO + return -1; } int fd = ::socket(domain, type, protocol); @@ -238,8 +238,9 @@ void hidra2::SystemIO::listen(hidra2::FileDescriptor socket_fd, int backlog, hid *err = IOErrorFromErrno(); } } -std::unique_ptr<std::tuple<std::string, hidra2::FileDescriptor>> hidra2::SystemIO::inet_accept(hidra2::FileDescriptor socket_fd, - IOErrors* err) { +std::unique_ptr<std::tuple<std::string, hidra2::FileDescriptor>> hidra2::SystemIO::inet_accept( + hidra2::FileDescriptor socket_fd, +IOErrors* err) { sa_family_t family = AddressFamilyToPosixFamily(AddressFamilies::INET); if(family == -1) { *err = IOErrors::UNSUPPORTED_ADDRESS_FAMILY; @@ -257,7 +258,8 @@ std::unique_ptr<std::tuple<std::string, hidra2::FileDescriptor>> hidra2::SystemI } std::string address = std::string(inet_ntoa(client_address.sin_addr)) + ':' + std::to_string(client_address.sin_port); - return std::unique_ptr<std::tuple<std::string, hidra2::FileDescriptor>>(new std::tuple<std::string, hidra2::FileDescriptor>(address, peer_fd)); + return std::unique_ptr<std::tuple<std::string, hidra2::FileDescriptor>>(new + std::tuple<std::string, hidra2::FileDescriptor>(address, peer_fd)); } void hidra2::SystemIO::inet_connect(FileDescriptor socket_fd, const std::string& address, hidra2::IOErrors* err) { @@ -270,8 +272,7 @@ void hidra2::SystemIO::inet_connect(FileDescriptor socket_fd, const std::string& std::string port_str = address.substr(address.find(':') + 1, address.length()); port = static_cast<uint16_t>(std::stoi(port_str)); - } - catch(std::exception& e) { + } catch(std::exception& e) { *err = IOErrors::INVALID_ADDRESS_FORMAT; return; } @@ -292,7 +293,8 @@ void hidra2::SystemIO::inet_connect(FileDescriptor socket_fd, const std::string& return; } } -hidra2::FileDescriptor hidra2::SystemIO::create_and_connect_ip_tcp_socket(const std::string& address, hidra2::IOErrors* err) { +hidra2::FileDescriptor hidra2::SystemIO::create_and_connect_ip_tcp_socket(const std::string& address, + hidra2::IOErrors* err) { *err = hidra2::IOErrors::NO_ERROR; FileDescriptor fd = create_socket(AddressFamilies::INET, SocketTypes::STREAM, SocketProtocols::IP, err); @@ -330,10 +332,10 @@ size_t hidra2::SystemIO::receive(hidra2::FileDescriptor socket_fd, void* buf, si } size_t hidra2::SystemIO::receive_timeout(hidra2::FileDescriptor socket_fd, - void* buf, - size_t length, - uint16_t timeout_in_sec, - hidra2::IOErrors* err) { + void* buf, + size_t length, + uint16_t timeout_in_sec, + hidra2::IOErrors* err) { *err = hidra2::IOErrors::NO_ERROR; fd_set read_fds; @@ -342,7 +344,7 @@ size_t hidra2::SystemIO::receive_timeout(hidra2::FileDescriptor socket_fd, timeout.tv_sec = timeout_in_sec; timeout.tv_usec = 0; - int res = select(socket_fd+1, &read_fds, nullptr, nullptr, &timeout); + int res = select(socket_fd + 1, &read_fds, nullptr, nullptr, &timeout); if(res == 0) { *err = IOErrors::TIMEOUT; return 0; diff --git a/producer/api/include/producer/producer.h b/producer/api/include/producer/producer.h index 2a282f01d15606323b5af8f729a81d88677a16db..9b0ce5fbecea5ebb4a391ee0c54ce7b8cd18eca3 100644 --- a/producer/api/include/producer/producer.h +++ b/producer/api/include/producer/producer.h @@ -9,7 +9,7 @@ namespace hidra2 { enum ProducerError { - PRODUCER_ERROR__OK, + PRODUCER_ERROR__NO_ERROR, PRODUCER_ERROR__ALREADY_CONNECTED, PRODUCER_ERROR__CONNECTION_NOT_READY, PRODUCER_ERROR__SENDING_CHUNK_FAILED, diff --git a/producer/api/src/producer_impl.cpp b/producer/api/src/producer_impl.cpp index 19a853ead40709495a6e59fdb7327bc94115d10c..e1a1533efc572d8666eaa51015a674472c110c5d 100644 --- a/producer/api/src/producer_impl.cpp +++ b/producer/api/src/producer_impl.cpp @@ -9,6 +9,7 @@ #include "producer_impl.h" const uint32_t hidra2::ProducerImpl::kVersion = 1; +const size_t hidra2::ProducerImpl::kMaxChunkSize = (size_t)1024 * (size_t)1024 * (size_t)1024 * (size_t)2; //2GiByte hidra2::ProducerImpl::ProducerImpl() { __set_io(ProducerImpl::kDefaultIO); @@ -19,10 +20,10 @@ uint64_t hidra2::ProducerImpl::get_version() const { } hidra2::ProducerStatus hidra2::ProducerImpl::get_status() const { - return PRODUCER_STATUS__CONNECTED; + return status_; } -hidra2::ProducerError hidra2::ProducerImpl::initialize_socket_to_receiver_(const std::string &receiver_address) { +hidra2::ProducerError hidra2::ProducerImpl::initialize_socket_to_receiver_(const std::string& receiver_address) { IOErrors err; FileDescriptor fd = io->create_and_connect_ip_tcp_socket(receiver_address, &err); @@ -34,17 +35,20 @@ hidra2::ProducerError hidra2::ProducerImpl::initialize_socket_to_receiver_(const } client_fd_ = fd; - return PRODUCER_ERROR__OK; + return PRODUCER_ERROR__NO_ERROR; } hidra2::ProducerError hidra2::ProducerImpl::connect_to_receiver(const std::string& receiver_address) { - if(client_fd_ != -1) { + if(client_fd_ != -1 && status_ != PRODUCER_STATUS__DISCONNECTED && status_ != PRODUCER_STATUS__CONNECTING) { return PRODUCER_ERROR__ALREADY_CONNECTED; } + status_ = PRODUCER_STATUS__CONNECTING; + ProducerError error; error = initialize_socket_to_receiver_(receiver_address); if(error) { + status_ = PRODUCER_STATUS__DISCONNECTED; return error; } @@ -59,6 +63,7 @@ hidra2::ProducerError hidra2::ProducerImpl::connect_to_receiver(const std::strin io->send(client_fd_, &helloRequest, sizeof(helloRequest), &io_error); if(io_error != IOErrors::NO_ERROR) { std::cerr << "hidra2::ProducerImpl::connect_to_receiver/send error" << std::endl; + status_ = PRODUCER_STATUS__DISCONNECTED; return PRODUCER_ERROR__FAILED_TO_CONNECT_TO_SERVER; } @@ -66,6 +71,7 @@ hidra2::ProducerError hidra2::ProducerImpl::connect_to_receiver(const std::strin io->receive_timeout(client_fd_, &helloResponse, sizeof(helloResponse), 30, &io_error); if(io_error != IOErrors::NO_ERROR) { std::cerr << "hidra2::ProducerImpl::connect_to_receiver/receive_timeout error" << std::endl; + status_ = PRODUCER_STATUS__DISCONNECTED; return PRODUCER_ERROR__FAILED_TO_CONNECT_TO_SERVER; } @@ -75,22 +81,29 @@ hidra2::ProducerError hidra2::ProducerImpl::connect_to_receiver(const std::strin std::cout << "server_version: " << helloResponse.server_version << std::endl; - if(helloResponse.error_code == NET_ERR__NO_ERROR) { - return PRODUCER_ERROR__OK; - } + if(helloResponse.error_code != NET_ERR__NO_ERROR) { + std::cerr << "Fail to connect to server. NetErrorCode: " << helloResponse.error_code << std::endl; - std::cerr << "Fail to connect to server. NetErrorCode: " << helloResponse.error_code << std::endl; + status_ = PRODUCER_STATUS__DISCONNECTED; + return PRODUCER_ERROR__FAILED_TO_CONNECT_TO_SERVER; + } - return PRODUCER_ERROR__OK; + status_ = PRODUCER_STATUS__CONNECTED; + return PRODUCER_ERROR__NO_ERROR; } -hidra2::ProducerError hidra2::ProducerImpl::send(std::string filename, void *data, uint64_t file_size) { +hidra2::ProducerError hidra2::ProducerImpl::send(std::string filename, void* data, uint64_t file_size) { + if(status_ != PRODUCER_STATUS__CONNECTED) { + return PRODUCER_ERROR__CONNECTION_NOT_READY; + } + status_ = PRODUCER_STATUS__SENDING; + hidra2::PrepareSendDataRequest prepareSendDataRequest; prepareSendDataRequest.op_code = OP_CODE__PREPARE_SEND_DATA; prepareSendDataRequest.request_id = request_id++; prepareSendDataRequest.file_size = file_size; filename.copy((char*)&prepareSendDataRequest.filename, sizeof(prepareSendDataRequest.filename)); - + prepareSendDataRequest.filename[filename.length()] = '\0'; std::cout << "Send file: " << filename << std::endl; @@ -98,6 +111,7 @@ hidra2::ProducerError hidra2::ProducerImpl::send(std::string filename, void *dat io->send(client_fd_, &prepareSendDataRequest, sizeof(prepareSendDataRequest), &io_error); if(io_error != IOErrors::NO_ERROR) { std::cerr << "hidra2::ProducerImpl::send/send error" << std::endl; + status_ = PRODUCER_STATUS__CONNECTED; return PRODUCER_ERROR__SENDING_SERVER_REQUEST_FAILED; } @@ -106,11 +120,13 @@ hidra2::ProducerError hidra2::ProducerImpl::send(std::string filename, void *dat io->receive_timeout(client_fd_, &prepareSendDataResponse, sizeof(prepareSendDataResponse), 30, &io_error); if(io_error != IOErrors::NO_ERROR) { std::cerr << "hidra2::ProducerImpl::send/receive_timeout error" << std::endl; + status_ = PRODUCER_STATUS__CONNECTED; return PRODUCER_ERROR__RECEIVING_SERVER_RESPONSE_FAILED; } if(prepareSendDataResponse.error_code) { std::cerr << "Server rejected metadata. NetErrorCode: " << prepareSendDataResponse.error_code << std::endl; + status_ = PRODUCER_STATUS__CONNECTED; return PRODUCER_ERROR__SERVER_REPORTED_AN_ERROR; } std::cout << "op_code: " << prepareSendDataResponse.op_code << std::endl; @@ -118,14 +134,12 @@ hidra2::ProducerError hidra2::ProducerImpl::send(std::string filename, void *dat std::cout << "error_code: " << prepareSendDataResponse.error_code << std::endl; std::cout << "file_reference_id: " << prepareSendDataResponse.file_reference_id << std::endl; - NetworkErrorCode network_error = NET_ERR__NO_ERROR; size_t already_send = 0; - uint64_t max_chunk_size = (uint64_t)1024*(uint64_t)1024*(uint64_t)1024*(uint64_t)2; - while(!network_error && already_send < file_size) { - size_t need_to_send = max_chunk_size; + while(already_send < file_size) { + size_t need_to_send = kMaxChunkSize; - if(double(file_size) - already_send - max_chunk_size < 0) { + if(double(file_size) - already_send - kMaxChunkSize < 0) { need_to_send = file_size - already_send; } @@ -139,12 +153,14 @@ hidra2::ProducerError hidra2::ProducerImpl::send(std::string filename, void *dat io->send(client_fd_, &sendDataChunkRequest, sizeof(sendDataChunkRequest), &io_error); if(io_error != IOErrors::NO_ERROR) { std::cerr << "hidra2::ProducerImpl::send/send2 error" << std::endl; + status_ = PRODUCER_STATUS__CONNECTED; return PRODUCER_ERROR__SENDING_CHUNK_FAILED; } io->send(client_fd_, (uint8_t*)data + already_send, need_to_send, &io_error); if(io_error != IOErrors::NO_ERROR) { std::cerr << "hidra2::ProducerImpl::send/send3 error" << std::endl; + status_ = PRODUCER_STATUS__CONNECTED; return PRODUCER_ERROR__SENDING_CHUNK_FAILED; } @@ -154,15 +170,18 @@ hidra2::ProducerError hidra2::ProducerImpl::send(std::string filename, void *dat io->receive_timeout(client_fd_, &sendDataChunkResponse, sizeof(sendDataChunkResponse), 30, &io_error); if(io_error != IOErrors::NO_ERROR) { std::cerr << "hidra2::ProducerImpl::send/receive_timeout2 error" << std::endl; + status_ = PRODUCER_STATUS__CONNECTED; return PRODUCER_ERROR__RECEIVING_SERVER_RESPONSE_FAILED; } if(sendDataChunkResponse.error_code) { std::cout << "Server reported an error. NetErrorCode: " << sendDataChunkResponse.error_code; + status_ = PRODUCER_STATUS__CONNECTED; return PRODUCER_ERROR__SERVER_REPORTED_AN_ERROR; } } - return PRODUCER_ERROR__OK; + status_ = PRODUCER_STATUS__CONNECTED; + return PRODUCER_ERROR__NO_ERROR; } diff --git a/producer/api/src/producer_impl.h b/producer/api/src/producer_impl.h index e880dbee6611c556cf1d91a0e89c29b69be68ebb..1ea1eeb9e21ba2d765999d44932f52c7eab58483 100644 --- a/producer/api/src/producer_impl.h +++ b/producer/api/src/producer_impl.h @@ -7,18 +7,21 @@ namespace hidra2 { class ProducerImpl : public Producer { - friend Producer; private: static const uint32_t kVersion; int client_fd_ = -1; uint64_t request_id = 0; - ProducerError initialize_socket_to_receiver_(const std::string &receiver_address); + ProducerStatus status_; + + ProducerError initialize_socket_to_receiver_(const std::string& receiver_address); public: + static const size_t kMaxChunkSize; + ProducerImpl(); - ProducerImpl(const ProducerImpl &) = delete; - ProducerImpl &operator=(const ProducerImpl &) = delete; + ProducerImpl(const ProducerImpl&) = delete; + ProducerImpl& operator=(const ProducerImpl&) = delete; //~ProducerImpl() override; uint64_t get_version() const override; diff --git a/producer/api/unittests/test_producer_impl.cpp b/producer/api/unittests/test_producer_impl.cpp index 0e769a804829aa26770d2560a7b5d33c56bf97c4..8e68c80cb19644b7bed3a6d241ab6d1f13390a96 100644 --- a/producer/api/unittests/test_producer_impl.cpp +++ b/producer/api/unittests/test_producer_impl.cpp @@ -9,19 +9,22 @@ using ::testing::Return; using ::testing::_; using ::testing::DoAll; using ::testing::SetArgReferee; -//using ::testing::SetArg; using ::testing::Gt; +using ::testing::Mock; +using ::testing::InSequence; class MockIO : public hidra2::IO { - public: + public: MOCK_METHOD4(create_socket, - hidra2::FileDescriptor(hidra2::AddressFamilies address_family, hidra2::SocketTypes socket_type, hidra2::SocketProtocols socket_protocol, hidra2::IOErrors* err)); + hidra2::FileDescriptor(hidra2::AddressFamilies address_family, hidra2::SocketTypes socket_type, + hidra2::SocketProtocols socket_protocol, hidra2::IOErrors* err)); MOCK_METHOD3(listen, void(hidra2::FileDescriptor socket_fd, int backlog, hidra2::IOErrors* err)); MOCK_METHOD4(inet_bind, void(hidra2::FileDescriptor socket_fd, const std::string& address, uint16_t port, hidra2::IOErrors* err)); MOCK_METHOD2(inet_accept, - std::unique_ptr<std::tuple<std::string, hidra2::FileDescriptor>>(hidra2::FileDescriptor socket_fd, hidra2::IOErrors* err)); + std::unique_ptr<std::tuple<std::string, hidra2::FileDescriptor>>(hidra2::FileDescriptor socket_fd, + hidra2::IOErrors* err)); MOCK_METHOD3(inet_connect, void(hidra2::FileDescriptor socket_fd, const std::string& address, hidra2::IOErrors* err)); MOCK_METHOD2(create_and_connect_ip_tcp_socket, @@ -41,41 +44,246 @@ class MockIO : public hidra2::IO { MOCK_METHOD3(deprecated_write, ssize_t(int __fd, const void* __buf, size_t __n)); MOCK_METHOD2(GetDataFromFile, - hidra2::FileData(const std::string &fname, hidra2::IOErrors* err)); + hidra2::FileData(const std::string& fname, hidra2::IOErrors* err)); MOCK_METHOD2(FilesInFolder, std::vector<hidra2::FileInfo>(const std::string& folder, hidra2::IOErrors* err)); }; +hidra2::ProducerImpl producer; +uint64_t expected_request_id = 0; +int expected_fd = 83942; + TEST(get_version, VersionAboveZero) { hidra2::ProducerImpl producer; EXPECT_GE(producer.get_version(), 0); } +TEST(ProducerImpl, get_status__disconnected) { + EXPECT_EQ(producer.get_status(), hidra2::PRODUCER_STATUS__DISCONNECTED); +} -ACTION(write_hello_reponse_arg1) { - ((hidra2::HelloResponse*)arg1)->error_code = hidra2::NET_ERR__NO_ERROR; +TEST(ProducerImpl, send__connection_not_ready) { + EXPECT_EQ(producer.send("", nullptr, 1), hidra2::PRODUCER_ERROR__CONNECTION_NOT_READY); } -TEST(ProducerImpl, connect_to_receiver) { + +/** + * connect_to_receiver + */ + +MATCHER_P(M_CheckHelloRequest, request_id, "Checks if a valid HelloRequest was send") { + return ((hidra2::HelloRequest*)arg)->op_code == hidra2::OP_CODE__HELLO + && ((hidra2::HelloRequest*)arg)->request_id == request_id; +} + +ACTION_P3(A_WriteHelloResponse, error_code, request_id, server_version) { + ((hidra2::HelloResponse*)arg1)->op_code = hidra2::OP_CODE__HELLO; + ((hidra2::HelloResponse*)arg1)->error_code = error_code; + ((hidra2::HelloResponse*)arg1)->request_id = request_id; + ((hidra2::HelloResponse*)arg1)->server_version = server_version; +} + +TEST(ProducerImpl, connect_to_receiver__invalid__address_format) { MockIO mockIO; + producer.__set_io(&mockIO); - hidra2::ProducerImpl producer; + std::string expected_address = "127.0.0.1:9090"; + + EXPECT_CALL(mockIO, create_and_connect_ip_tcp_socket(expected_address, _)) + .Times(1) + .WillOnce( + DoAll( + testing::SetArgPointee<1>(hidra2::IOErrors::INVALID_ADDRESS_FORMAT), + Return(-1) + )); + + EXPECT_EQ(producer.connect_to_receiver(expected_address), hidra2::PRODUCER_ERROR__INVALID_ADDRESS_FORMAT); + EXPECT_EQ(producer.get_status(), hidra2::PRODUCER_STATUS__DISCONNECTED); + + Mock::VerifyAndClearExpectations(&mockIO); +} + +TEST(ProducerImpl, connect_to_receiver__failed_unk) { + MockIO mockIO; producer.__set_io(&mockIO); std::string expected_address = "127.0.0.1:9090"; - int expected_fd = 83942; EXPECT_CALL(mockIO, create_and_connect_ip_tcp_socket(expected_address, _)) - .WillOnce(DoAll(testing::SetArgPointee<1>(hidra2::IOErrors::NO_ERROR), Return(expected_fd))); + .Times(1) + .WillOnce( + DoAll( + testing::SetArgPointee<1>(hidra2::IOErrors::UNKNOWN_ERROR), + Return(-1) + )); + + EXPECT_EQ(producer.connect_to_receiver(expected_address), hidra2::PRODUCER_ERROR__FAILED_TO_CONNECT_TO_SERVER); + EXPECT_EQ(producer.get_status(), hidra2::PRODUCER_STATUS__DISCONNECTED); + + Mock::VerifyAndClearExpectations(&mockIO); +} + +TEST(ProducerImpl, connect_to_receiver) { + MockIO mockIO; + producer.__set_io(&mockIO); + + InSequence sequence; - EXPECT_CALL(mockIO, send(expected_fd, _/*addr*/, sizeof(hidra2::HelloRequest), _)) - .WillOnce(DoAll(testing::SetArgPointee<3>(hidra2::IOErrors::NO_ERROR), Return(sizeof(hidra2::HelloRequest)))); + std::string expected_address = "127.0.0.1:9090"; + EXPECT_CALL(mockIO, create_and_connect_ip_tcp_socket(expected_address, _)) + .Times(1) + .WillOnce( + DoAll( + testing::SetArgPointee<1>(hidra2::IOErrors::NO_ERROR), + Return(expected_fd) + )); + EXPECT_CALL(mockIO, send(expected_fd, M_CheckHelloRequest(expected_request_id), sizeof(hidra2::HelloRequest), _)) + .Times(1) + .WillOnce( + DoAll( + testing::SetArgPointee<3>(hidra2::IOErrors::NO_ERROR), + Return(sizeof(hidra2::HelloRequest)) + )); EXPECT_CALL(mockIO, receive_timeout(expected_fd, _/*addr*/, sizeof(hidra2::HelloResponse), Gt(0), _)) - .WillOnce(DoAll(write_hello_reponse_arg1(), testing::SetArgPointee<4>(hidra2::IOErrors::NO_ERROR), Return(sizeof(hidra2::HelloResponse)))); + .Times(1) + .WillOnce( + DoAll( + A_WriteHelloResponse(hidra2::NET_ERR__NO_ERROR, expected_request_id, 1), + testing::SetArgPointee<4>(hidra2::IOErrors::NO_ERROR), + Return(sizeof(hidra2::HelloResponse)) + )); + + expected_request_id++; + + EXPECT_EQ(producer.connect_to_receiver(expected_address), hidra2::PRODUCER_ERROR__NO_ERROR); + EXPECT_EQ(producer.get_status(), hidra2::PRODUCER_STATUS__CONNECTED); + + Mock::VerifyAndClearExpectations(&mockIO); +} - EXPECT_EQ(producer.connect_to_receiver(expected_address), hidra2::PRODUCER_ERROR__OK); +TEST(ProducerImpl, connect_to_receiver__already_connected) { + EXPECT_EQ(producer.connect_to_receiver(""), hidra2::PRODUCER_ERROR__ALREADY_CONNECTED); + EXPECT_EQ(producer.get_status(), hidra2::PRODUCER_STATUS__CONNECTED); } + +/** + * send + */ + +MATCHER_P3(M_CheckPrepareSendDataRequest, request_id, filename, file_size, + "Checks if a valid PrepareSendDataRequest was send") { + return ((hidra2::PrepareSendDataRequest*)arg)->op_code == hidra2::OP_CODE__PREPARE_SEND_DATA + && ((hidra2::PrepareSendDataRequest*)arg)->request_id == request_id + && strcmp(((hidra2::PrepareSendDataRequest*)arg)->filename, filename.c_str()) == 0 + && ((hidra2::PrepareSendDataRequest*)arg)->file_size == file_size; +} + +ACTION_P3(A_WritePrepareSendDataResponse, error_code, request_id, file_reference_id) { + ((hidra2::PrepareSendDataResponse*)arg1)->op_code = hidra2::OP_CODE__PREPARE_SEND_DATA; + ((hidra2::PrepareSendDataResponse*)arg1)->error_code = error_code; + ((hidra2::PrepareSendDataResponse*)arg1)->request_id = request_id; + ((hidra2::PrepareSendDataResponse*)arg1)->file_reference_id = file_reference_id; +} + +MATCHER_P4(M_CheckSendDataChunkRequest, request_id, file_reference_id, chunk_size, start_byte, + "Checks if a valid SendDataChunkRequest was send") { + return ((hidra2::SendDataChunkRequest*)arg)->op_code == hidra2::OP_CODE__SEND_DATA_CHUNK + && ((hidra2::SendDataChunkRequest*)arg)->request_id == request_id + && ((hidra2::SendDataChunkRequest*)arg)->file_reference_id == file_reference_id + && ((hidra2::SendDataChunkRequest*)arg)->chunk_size == chunk_size + && ((hidra2::SendDataChunkRequest*)arg)->start_byte == start_byte; +} + +ACTION_P2(A_WriteSendDataChunkResponse, error_code, request_id) { + ((hidra2::SendDataChunkResponse*)arg1)->op_code = hidra2::OP_CODE__SEND_DATA_CHUNK; + ((hidra2::SendDataChunkResponse*)arg1)->error_code = error_code; + ((hidra2::SendDataChunkResponse*)arg1)->request_id = request_id; +} + +TEST(ProducerImpl, send) { + MockIO mockIO; + producer.__set_io(&mockIO); + + InSequence sequence; + + std::string expected_filename = "somefilename.bin"; + void* expected_file_buffer = (void*)0xC0FFEE; + size_t expected_file_size = (size_t)1024 * (size_t)1024 * (size_t)1024 * (size_t)4 + (size_t)300; + uint64_t expected_file_ref_id = 1337; + + + /* PrepareSendDataRequest */ + EXPECT_CALL(mockIO, send(expected_fd, M_CheckPrepareSendDataRequest(expected_request_id, expected_filename, + expected_file_size), sizeof(hidra2::PrepareSendDataRequest), _)) + .Times(1) + .WillOnce( + DoAll( + testing::SetArgPointee<3>(hidra2::IOErrors::NO_ERROR), + Return(sizeof(hidra2::PrepareSendDataRequest)) + )); + + /* PrepareSendDataResponse */ + EXPECT_CALL(mockIO, receive_timeout(expected_fd, _/*addr*/, sizeof(hidra2::PrepareSendDataResponse), Gt(0), _)) + .Times(1) + .WillOnce( + DoAll( + A_WritePrepareSendDataResponse(hidra2::NET_ERR__NO_ERROR, expected_request_id, expected_file_ref_id), + testing::SetArgPointee<4>(hidra2::IOErrors::NO_ERROR), + Return(sizeof(hidra2::PrepareSendDataResponse)) + )); + + expected_request_id++; + + + size_t already_send = 0; + + while(already_send < expected_file_size) { + + size_t need_to_send = producer.kMaxChunkSize; + if(double(expected_file_size) - already_send - producer.kMaxChunkSize < 0) { + need_to_send = expected_file_size - already_send; + } + + /* SendDataChunkRequest */ + EXPECT_CALL(mockIO, send(expected_fd, M_CheckSendDataChunkRequest(expected_request_id, expected_file_ref_id, + need_to_send, already_send), sizeof(hidra2::SendDataChunkRequest), _)) + .Times(1) + .WillOnce( + DoAll( + testing::SetArgPointee<3>(hidra2::IOErrors::NO_ERROR), + Return(sizeof(hidra2::SendDataChunkRequest)) + )); + + EXPECT_CALL(mockIO, send(expected_fd, (uint8_t*)expected_file_buffer + already_send, need_to_send, _)) + .Times(1) + .WillOnce( + DoAll( + testing::SetArgPointee<3>(hidra2::IOErrors::NO_ERROR), + Return(need_to_send) + )); + + /* SendDataChunkResponse */ + EXPECT_CALL(mockIO, receive_timeout(expected_fd, _/*addr*/, sizeof(hidra2::SendDataChunkResponse), Gt(0), _)) + .Times(1) + .WillOnce( + DoAll( + A_WriteSendDataChunkResponse(hidra2::NET_ERR__NO_ERROR, expected_request_id), + testing::SetArgPointee<4>(hidra2::IOErrors::NO_ERROR), + Return(sizeof(hidra2::SendDataChunkResponse)) + )); + + expected_request_id++; + + already_send += need_to_send; + } + + + EXPECT_EQ(producer.send(expected_filename, expected_file_buffer, expected_file_size), hidra2::PRODUCER_ERROR__NO_ERROR); + + Mock::VerifyAndClearExpectations(&mockIO); +} + } diff --git a/producer/dummy-event-detector-cpp/src/dummy_detector.cpp b/producer/dummy-event-detector-cpp/src/dummy_detector.cpp index 996d7c1e48c6b86c03f0e0a0250d4ec6fdacb4fd..f8b31d8afa14dd4e37a09346307fab785c6d8ffa 100644 --- a/producer/dummy-event-detector-cpp/src/dummy_detector.cpp +++ b/producer/dummy-event-detector-cpp/src/dummy_detector.cpp @@ -6,7 +6,7 @@ #include <cmath> #include <unistd.h> -int DummyDetector::main(int argc, char **argv) { +int DummyDetector::main(int argc, char** argv) { auto producer = hidra2::Producer::create(); hidra2::ProducerError err = producer->connect_to_receiver("127.0.0.1:8099"); @@ -26,8 +26,8 @@ int DummyDetector::main(int argc, char **argv) { struct stat astat {}; fstat(fd, &astat); - size_t map_size = static_cast<size_t>(ceil(float(astat.st_size)/float(getpagesize()))*getpagesize()); - void *buffer = mmap(nullptr, map_size, PROT_READ, MAP_SHARED, fd, 0); + size_t map_size = static_cast<size_t>(ceil(float(astat.st_size) / float(getpagesize())) * getpagesize()); + void* buffer = mmap(nullptr, map_size, PROT_READ, MAP_SHARED, fd, 0); madvise(buffer, map_size, MADV_SEQUENTIAL | MADV_WILLNEED); diff --git a/receiver/src/file_refernce_handler.cpp b/receiver/src/file_refernce_handler.cpp index 72200ef6946c6bf2d84868225e9ff95321d35c4c..52aa818264397b8b35c1bab0cd66c8dcb719bb68 100644 --- a/receiver/src/file_refernce_handler.cpp +++ b/receiver/src/file_refernce_handler.cpp @@ -4,13 +4,14 @@ namespace hidra2 { -std::map<FileReferenceId, std::shared_ptr<FileReferenceHandler::FileInformation>> FileReferenceHandler::kFileRefernceMap; +std::map<FileReferenceId, std::shared_ptr<FileReferenceHandler::FileInformation>> + FileReferenceHandler::kFileRefernceMap; FileReferenceId FileReferenceHandler::kGlobalFileRefernceId = 0; hidra2::FileReferenceId FileReferenceHandler::add_file(std::string filename, - uint64_t file_size, - uint32_t owner_connection_id, - FileReferenceHandlerError& err) { + uint64_t file_size, + uint32_t owner_connection_id, + FileReferenceHandlerError& err) { FileReferenceId file_ref_id = ++kGlobalFileRefernceId; @@ -39,7 +40,8 @@ hidra2::FileReferenceId FileReferenceHandler::add_file(std::string filename, return file_ref_id; } -std::shared_ptr<FileReferenceHandler::FileInformation> FileReferenceHandler::get_file(FileReferenceId file_reference_id) { +std::shared_ptr<FileReferenceHandler::FileInformation> FileReferenceHandler::get_file( + FileReferenceId file_reference_id) { return kFileRefernceMap[file_reference_id]; } diff --git a/receiver/src/file_refernce_handler.h b/receiver/src/file_refernce_handler.h index f9b19f55a4d7ef7e31a40a6de6ea421a94545336..78f2da8a42c5021cf82cb3886e094d8110e1879f 100644 --- a/receiver/src/file_refernce_handler.h +++ b/receiver/src/file_refernce_handler.h @@ -28,7 +28,8 @@ class FileReferenceHandler : HasIO { static FileReferenceId kGlobalFileRefernceId; static std::map<FileReferenceId, std::shared_ptr<FileReferenceHandler::FileInformation>> kFileRefernceMap; public: - FileReferenceId add_file (std::string filename, uint64_t file_size, uint32_t owner_connection_id, FileReferenceHandlerError& err); + FileReferenceId add_file (std::string filename, uint64_t file_size, uint32_t owner_connection_id, + FileReferenceHandlerError& err); std::shared_ptr<FileInformation> get_file (FileReferenceId file_reference_id); void remove_file (FileReferenceId file_reference_id); }; diff --git a/receiver/src/network_producer_peer.cpp b/receiver/src/network_producer_peer.cpp index 3bdab2f75d11835111a8ee123d7a105badda0d15..59865f6b20efee9cc8c8dcd567a11aa0a66a6790 100644 --- a/receiver/src/network_producer_peer.cpp +++ b/receiver/src/network_producer_peer.cpp @@ -5,10 +5,11 @@ namespace hidra2 { FileReferenceHandler NetworkProducerPeer::file_reference_handler; -const size_t NetworkProducerPeer::kGenericBufferSize = 1024*50;//50KiByte +const size_t NetworkProducerPeer::kGenericBufferSize = 1024 * 50; //50KiByte std::atomic<uint32_t> NetworkProducerPeer::kNetworkProducerPeerCount; -const std::vector<NetworkProducerPeer::RequestHandlerInformation> NetworkProducerPeer::kRequestHandlers = NetworkProducerPeer::init_request_handlers(); +const std::vector<NetworkProducerPeer::RequestHandlerInformation> NetworkProducerPeer::kRequestHandlers = + NetworkProducerPeer::init_request_handlers(); NetworkProducerPeer::NetworkProducerPeer(int socket_fd, std::string address) : HasIO() { address_ = std::move(address); @@ -111,9 +112,11 @@ size_t NetworkProducerPeer::handle_generic_request_(GenericNetworkRequest* reque IOErrors err; //receive the rest of the message - io->receive_timeout(socket_fd_, request->data, handler_information.request_size - sizeof(GenericNetworkRequest), 30, &err); + io->receive_timeout(socket_fd_, request->data, handler_information.request_size - sizeof(GenericNetworkRequest), 30, + &err); if(err != IOErrors::NO_ERROR) { - std::cerr << "[" << connection_id() << "] NetworkProducerPeer::handle_generic_request_/receive_timeout: " << request->op_code << std::endl; + std::cerr << "[" << connection_id() << "] NetworkProducerPeer::handle_generic_request_/receive_timeout: " << + request->op_code << std::endl; return 0; } diff --git a/receiver/src/network_producer_peer.h b/receiver/src/network_producer_peer.h index 5ce160cf640a6de05a94046b90ac1acae8f0c480..9d50c6a1983c66ea839067745f74d8f6b56dd75c 100644 --- a/receiver/src/network_producer_peer.h +++ b/receiver/src/network_producer_peer.h @@ -16,7 +16,8 @@ namespace hidra2 { class NetworkProducerPeer : HasIO { public: - typedef void (*RequestHandler) (NetworkProducerPeer* self, GenericNetworkRequest* request, GenericNetworkResponse* response); + typedef void (*RequestHandler) (NetworkProducerPeer* self, GenericNetworkRequest* request, + GenericNetworkResponse* response); struct RequestHandlerInformation { size_t request_size; size_t response_size; @@ -43,11 +44,13 @@ class NetworkProducerPeer : HasIO { size_t handle_generic_request_(GenericNetworkRequest* request, GenericNetworkResponse* response); static void handle_hello_request_(NetworkProducerPeer* self, const HelloRequest* request, HelloResponse* response); - static void handle_prepare_send_data_request_(NetworkProducerPeer* self, const PrepareSendDataRequest* request, PrepareSendDataResponse* response); - static void handle_send_data_chunk_request_(NetworkProducerPeer* self, const SendDataChunkRequest* request, SendDataChunkResponse* response); + static void handle_prepare_send_data_request_(NetworkProducerPeer* self, const PrepareSendDataRequest* request, + PrepareSendDataResponse* response); + static void handle_send_data_chunk_request_(NetworkProducerPeer* self, const SendDataChunkRequest* request, + SendDataChunkResponse* response); public: - NetworkProducerPeer &operator=(const NetworkProducerPeer &) = delete; + NetworkProducerPeer& operator=(const NetworkProducerPeer&) = delete; NetworkProducerPeer() = default; NetworkProducerPeer(int socket_fd, std::string address); diff --git a/receiver/src/network_producer_peer_handlers.cpp b/receiver/src/network_producer_peer_handlers.cpp index 6abf14f704b05a0437bf2004a317e7be5adde1ea..94dff6c47928bb65630f91d820d5c9ee60e67ae1 100644 --- a/receiver/src/network_producer_peer_handlers.cpp +++ b/receiver/src/network_producer_peer_handlers.cpp @@ -13,19 +13,19 @@ const std::vector<NetworkProducerPeer::RequestHandlerInformation> NetworkProduce vec[OP_CODE__HELLO] = { sizeof(HelloRequest), sizeof(HelloResponse), - (NetworkProducerPeer::RequestHandler) &NetworkProducerPeer::handle_hello_request_ + (NetworkProducerPeer::RequestHandler)& NetworkProducerPeer::handle_hello_request_ }; vec[OP_CODE__PREPARE_SEND_DATA] = { sizeof(PrepareSendDataRequest), sizeof(PrepareSendDataResponse), - (NetworkProducerPeer::RequestHandler) &NetworkProducerPeer::handle_prepare_send_data_request_ + (NetworkProducerPeer::RequestHandler)& NetworkProducerPeer::handle_prepare_send_data_request_ }; vec[OP_CODE__SEND_DATA_CHUNK] = { sizeof(SendDataChunkRequest), sizeof(SendDataChunkResponse), - (NetworkProducerPeer::RequestHandler) &NetworkProducerPeer::handle_send_data_chunk_request_ + (NetworkProducerPeer::RequestHandler)& NetworkProducerPeer::handle_send_data_chunk_request_ }; return vec; @@ -53,13 +53,14 @@ void NetworkProducerPeer::handle_hello_request_(NetworkProducerPeer* self, const response->server_version = 1; } -void NetworkProducerPeer::handle_prepare_send_data_request_(NetworkProducerPeer* self, const PrepareSendDataRequest* request, - PrepareSendDataResponse* response) { +void NetworkProducerPeer::handle_prepare_send_data_request_(NetworkProducerPeer* self, + const PrepareSendDataRequest* request, + PrepareSendDataResponse* response) { FileReferenceHandlerError error = FILE_REFERENCE_HANDLER_ERR__OK; FileReferenceId reference_id = self->file_reference_handler.add_file(request->filename, - request->file_size, - self->connection_id(), - error); + request->file_size, + self->connection_id(), + error); if(reference_id == 0 || error) { std::cerr << "Failed to add_file. FileReferenceHandlerError: " << error << std::endl; @@ -75,8 +76,8 @@ void NetworkProducerPeer::handle_prepare_send_data_request_(NetworkProducerPeer* } void NetworkProducerPeer::handle_send_data_chunk_request_(NetworkProducerPeer* self, - const SendDataChunkRequest* request, - SendDataChunkResponse* response) { + const SendDataChunkRequest* request, + SendDataChunkResponse* response) { IOErrors io_error; auto file_info = self->file_reference_handler.get_file(request->file_reference_id); @@ -86,13 +87,15 @@ void NetworkProducerPeer::handle_send_data_chunk_request_(NetworkProducerPeer* s } // Round to the next full pagesize - size_t map_start = size_t(request->start_byte/getpagesize())*getpagesize(); - size_t map_offset = request->start_byte%getpagesize(); - size_t map_size = static_cast<size_t>(ceil(float(request->chunk_size+map_offset)/float(getpagesize()))*getpagesize()); + size_t map_start = size_t(request->start_byte / getpagesize()) * getpagesize(); + size_t map_offset = request->start_byte % getpagesize(); + size_t map_size = static_cast<size_t>(ceil(float(request->chunk_size + map_offset) / float( + getpagesize())) * getpagesize()); - if(request->start_byte+request->chunk_size > file_info->file_size) { + if(request->start_byte + request->chunk_size > file_info->file_size) { std::cerr << "Producer is sending a lager file then excepted" << std::endl; - self->io->receive_timeout(self->socket_fd_, nullptr, request->chunk_size, 30, &io_error);//TODO nullptr not a valid target for receive + self->io->receive_timeout(self->socket_fd_, nullptr, request->chunk_size, 30, + &io_error);//TODO nullptr not a valid target for receive return; } @@ -104,7 +107,8 @@ void NetworkProducerPeer::handle_send_data_chunk_request_(NetworkProducerPeer* s if(!mapped_file || mapped_file == MAP_FAILED) { std::cerr << "Mapping a file failed. errno: " << errno << std::endl; - self->io->receive_timeout(self->socket_fd_, nullptr, request->chunk_size, 30, &io_error);//TODO nullptr not a valid target for receive + self->io->receive_timeout(self->socket_fd_, nullptr, request->chunk_size, 30, + &io_error);//TODO nullptr not a valid target for receive response->error_code = NET_ERR__INTERNAL_SERVER_ERROR; return; } diff --git a/receiver/src/receiver.cpp b/receiver/src/receiver.cpp index 74256e0ed9c5f502bf802c989ae7deac628c7fa5..08f61d6c54f729606c5819f8e36b2d2fc2b9b92c 100644 --- a/receiver/src/receiver.cpp +++ b/receiver/src/receiver.cpp @@ -18,7 +18,8 @@ void hidra2::Receiver::start_listener(std::string listener_address, uint16_t por IOErrors io_error; - FileDescriptor listener_fd = io->create_socket(AddressFamilies::INET, SocketTypes::STREAM, SocketProtocols::IP, &io_error); + FileDescriptor listener_fd = io->create_socket(AddressFamilies::INET, SocketTypes::STREAM, SocketProtocols::IP, + &io_error); if(io_error != IOErrors::NO_ERROR) { std::cerr << "Fail to create socket" << std::endl; return; diff --git a/receiver/src/receiver.h b/receiver/src/receiver.h index 892f3ca872f1d698ff12a084dc890a8bea5c6f4b..37b2be88fc452f61094a8e783b7f5137c4593d7a 100644 --- a/receiver/src/receiver.h +++ b/receiver/src/receiver.h @@ -28,8 +28,8 @@ class Receiver : HasIO { std::list<std::unique_ptr<NetworkProducerPeer>> peer_list_; std::unique_ptr<NetworkProducerPeer> on_new_peer_(int peer_socket_fd, std::string address); public: - Receiver(const Receiver &) = delete; - Receiver &operator=(const Receiver &) = delete; + Receiver(const Receiver&) = delete; + Receiver& operator=(const Receiver&) = delete; Receiver() = default; void start_listener(std::string listener_address, uint16_t port, ReceiverError* err); diff --git a/worker/api/cpp/src/folder_data_broker.cpp b/worker/api/cpp/src/folder_data_broker.cpp index 1c4d7e65c990ee8554d6e1a2012f37c364831dd8..e5b0301a5f795b9ab13494f48a544f3c610d3a15 100644 --- a/worker/api/cpp/src/folder_data_broker.cpp +++ b/worker/api/cpp/src/folder_data_broker.cpp @@ -7,18 +7,18 @@ namespace hidra2 { WorkerErrorCode MapIOError(IOErrors io_err) { WorkerErrorCode err; switch (io_err) { // we do not use map due to performance reasons - case IOErrors::NO_ERROR: - err = WorkerErrorCode::OK; - break; - case IOErrors::FILE_NOT_FOUND: - err = WorkerErrorCode::SOURCE_NOT_FOUND; - break; - case IOErrors::PERMISSIONS_DENIED: - err = WorkerErrorCode::PERMISSIONS_DENIED; - break; - case IOErrors::READ_ERROR: - err = WorkerErrorCode::ERROR_READING_FROM_SOURCE; - break; + case IOErrors::NO_ERROR: + err = WorkerErrorCode::OK; + break; + case IOErrors::FILE_NOT_FOUND: + err = WorkerErrorCode::SOURCE_NOT_FOUND; + break; + case IOErrors::PERMISSIONS_DENIED: + err = WorkerErrorCode::PERMISSIONS_DENIED; + break; + case IOErrors::READ_ERROR: + err = WorkerErrorCode::ERROR_READING_FROM_SOURCE; + break; default: err = WorkerErrorCode::UNKNOWN_IO_ERROR; break; @@ -78,8 +78,8 @@ WorkerErrorCode FolderDataBroker::GetNext(FileInfo* info, FileData* data) { IOErrors ioerr; *data = io__->GetDataFromFile(base_path_ + "/" + info->relative_path + - (info->relative_path.empty() ? "" : "/") + - info->base_name, &ioerr); + (info->relative_path.empty() ? "" : "/") + + info->base_name, &ioerr); return MapIOError(ioerr); } diff --git a/worker/api/cpp/unittests/test_folder_broker.cpp b/worker/api/cpp/unittests/test_folder_broker.cpp index 353e50cae12b0e96e1bfa7c58056e8e933ac00cd..763316c29848ff3e35c9b08d60642eaae5ed01ce 100644 --- a/worker/api/cpp/unittests/test_folder_broker.cpp +++ b/worker/api/cpp/unittests/test_folder_broker.cpp @@ -36,7 +36,7 @@ TEST(FolderDataBroker, SetCorrectIO) { class FakeIO: public IO { public: - FileData GetDataFromFile(const std::string &fname, IOErrors* err) { + FileData GetDataFromFile(const std::string& fname, IOErrors* err) { *err = IOErrors::NO_ERROR; return {}; }; @@ -95,7 +95,7 @@ class IOEmptyFodler: public FakeIO { class IOCannotOpenFile: public FakeIO { public: - FileData GetDataFromFile(const std::string &fname, IOErrors* err) { + FileData GetDataFromFile(const std::string& fname, IOErrors* err) { *err = IOErrors::PERMISSIONS_DENIED; return {}; }; @@ -229,11 +229,11 @@ TEST_F(FolderDataBrokerTests, GetNextReturnsData) { FileData data; EXPECT_CALL(mock, GetDataFromFile(_, _)). - WillOnce(DoAll(testing::SetArgPointee<1>(IOErrors::NO_ERROR), testing::Return(FileData{'1'}))); + WillOnce(DoAll(testing::SetArgPointee<1>(IOErrors::NO_ERROR), testing::Return(FileData{'1'}))); data_broker->GetNext(&fi, &data); data_broker->io__.release(); - ASSERT_THAT(data[0],Eq('1')); + ASSERT_THAT(data[0], Eq('1')); } @@ -245,11 +245,11 @@ TEST_F(FolderDataBrokerTests, GetNextReturnsErrorWhenCannotReadData) { FileData data; EXPECT_CALL(mock, GetDataFromFile(_, _)). - WillOnce(DoAll(testing::SetArgPointee<1>(IOErrors::READ_ERROR), testing::Return(FileData{}))); + WillOnce(DoAll(testing::SetArgPointee<1>(IOErrors::READ_ERROR), testing::Return(FileData{}))); auto err = data_broker->GetNext(&fi, &data); data_broker->io__.release(); - ASSERT_THAT(err,Eq(WorkerErrorCode::ERROR_READING_FROM_SOURCE)); + ASSERT_THAT(err, Eq(WorkerErrorCode::ERROR_READING_FROM_SOURCE)); ASSERT_TRUE(data.empty()); }