diff --git a/common/cpp/include/common/networking.h b/common/cpp/include/common/networking.h index f477ac9d386d79f77ceb1b1bf1d87734f4c9a05c..4aa126303adadcc04441f40a2e983380c2e8acef 100644 --- a/common/cpp/include/common/networking.h +++ b/common/cpp/include/common/networking.h @@ -16,7 +16,7 @@ enum OpCode : uint8_t { enum NetworkErrorCode : uint16_t { NET_ERR__NO_ERROR, - NET_ERR__FILENAME_ALREADY_IN_USE, + NET_ERR__FILEID_ALREADY_IN_USE, NET_ERR__ALLOCATE_STORAGE_FAILED, NET_ERR__INTERNAL_SERVER_ERROR = 65535, }; diff --git a/examples/producer/dummy-data-producer/dummy_data_producer.cpp b/examples/producer/dummy-data-producer/dummy_data_producer.cpp index 820df34ad8299e53b74c406ed432000c4da11f72..6878b06fde9860a484882d012598b186e0741f95 100644 --- a/examples/producer/dummy-data-producer/dummy_data_producer.cpp +++ b/examples/producer/dummy-data-producer/dummy_data_producer.cpp @@ -1,10 +1,12 @@ #include <producer/producer.h> #include <iostream> -#include <tuple> +#include <chrono> +#include <vector> -typedef std::tuple<std::string, size_t, uint64_t> ArgumentTuple; +using std::chrono::high_resolution_clock; +typedef std::tuple<std::string, size_t, uint64_t> ArgumentTuple; ArgumentTuple ProcessCommandArguments(int argc, char* argv[]) { if (argc != 4) { std::cout << @@ -21,32 +23,27 @@ ArgumentTuple ProcessCommandArguments(int argc, char* argv[]) { } } -int SendDummyData(const std::string& receiver_address, size_t number_of_byte, uint64_t iterations) { - auto producer = hidra2::Producer::create(); - - hidra2::ProducerError err = producer->ConnectToReceiver(receiver_address); - if(err != hidra2::ProducerError::kNoError) { - std::cerr << "Fail to connect to receiver. ProducerError: " /*<< err*/ << std::endl;//TODO - return 1; - } - std::cout << "Successfully connected" << std::endl; - +bool SendDummyData(hidra2::Producer* producer, size_t number_of_byte, uint64_t iterations) { auto buffer = std::unique_ptr<uint8_t>(new uint8_t[number_of_byte]); for(uint64_t i = 0; i < iterations; i++) { std::cout << "Send file " << i + 1 << "/" << iterations << std::endl; - hidra2::ProducerError error; - error = producer->Send(i, buffer.get(), number_of_byte); - if (error != hidra2::ProducerError::kNoError) { - std::cerr << "File was not successfully send, ErrorCode: " /*<< error*/ << std::endl; - break; + hidra2::ProducerError err = producer->Send(i, buffer.get(), number_of_byte); + + if (err != hidra2::ProducerError::kNoError) { + if(err == hidra2::ProducerError::kFileIdAlreadyInUse) { + std::cerr << "File id is already in use." << std::endl; + } else { + std::cerr << "File was not successfully send, ErrorCode: " /*<< error*/ << std::endl; + } + return false; } else { std::cout << "File was successfully send." << std::endl; } } - return 0; + return true; } int main (int argc, char* argv[]) { @@ -60,7 +57,22 @@ int main (int argc, char* argv[]) { << "iterations: " << iterations << std::endl << std::endl; - SendDummyData(receiver_address, number_of_byte, iterations); + auto producer = hidra2::Producer::create(); + hidra2::ProducerError err = producer->ConnectToReceiver(receiver_address); + if(err != hidra2::ProducerError::kNoError) { + if (err == hidra2::ProducerError::kConnectionRefused) { + std::cerr << "Failed to connect to receiver - connection refused. Is the receiver running?" << std::endl; + } else { + std::cerr << "Failed to connect to receiver. ProducerError: " /*<< err*/ << std::endl;//TODO + } + return EXIT_FAILURE; + } + std::cout << "Successfully connected" << std::endl; + + if(!SendDummyData(producer.get(), number_of_byte, iterations)) { + return EXIT_FAILURE; + } + return EXIT_SUCCESS; } diff --git a/producer/api/include/producer/producer.h b/producer/api/include/producer/producer.h index 456ced8d1f7a0aea57ea1977994f6106e43fbd06..e04f927825176e2742c1ef464e33edd901464b74 100644 --- a/producer/api/include/producer/producer.h +++ b/producer/api/include/producer/producer.h @@ -6,15 +6,16 @@ namespace hidra2 { enum class ProducerError { + kUnknownError, kNoError, + kUnknownServerError, kAlreadyConnected, kConnectionNotReady, kInvalidAddressFormat, kUnexpectedIOError, kFileIdAlreadyInUse, kFileTooLarge, - kUnknownServerError, - kUnknownError, + kConnectionRefused, }; enum class ProducerStatus { diff --git a/producer/api/src/producer_impl.cpp b/producer/api/src/producer_impl.cpp index 9001457e16faf0c48a602bde0dd945d4a64feef5..da208b21ed4d0a834b52dba4e474f9e49208bdfb 100644 --- a/producer/api/src/producer_impl.cpp +++ b/producer/api/src/producer_impl.cpp @@ -9,7 +9,7 @@ hidra2::ProducerError hidra2::ProducerImpl::NetworkErrorToProducerError(hidra2:: switch(networkError) { case NET_ERR__NO_ERROR: return ProducerError::kNoError; - case NET_ERR__FILENAME_ALREADY_IN_USE: + case NET_ERR__FILEID_ALREADY_IN_USE: return ProducerError::kFileIdAlreadyInUse; default: return ProducerError::kUnknownServerError; @@ -36,6 +36,9 @@ hidra2::ProducerError hidra2::ProducerImpl::initialize_socket_to_receiver_(const if(err == IOErrors::kInvalidAddressFormat) { return ProducerError::kInvalidAddressFormat; } + if(err == IOErrors::kConnectionRefused) { + return ProducerError::kConnectionRefused; + } return ProducerError::kUnknownError; } @@ -102,8 +105,11 @@ hidra2::ProducerError hidra2::ProducerImpl::Send(uint64_t file_id, void* data, s } if(sendDataResponse.error_code) { - std::cerr << "Server reported an error. NetErrorCode: " << sendDataResponse.error_code << std::endl; status_ = ProducerStatus::kConnected; + if(sendDataResponse.error_code == NET_ERR__FILEID_ALREADY_IN_USE) { + return hidra2::ProducerError::kFileIdAlreadyInUse; + } + std::cerr << "Server reported an error. NetErrorCode: " << sendDataResponse.error_code << std::endl; return ProducerError::kUnknownServerError; } diff --git a/producer/api/unittests/test_producer_impl.cpp b/producer/api/unittests/test_producer_impl.cpp index b7377370b195547921674e12b9222c44d584a2c9..118667004592ed15426e534fd4773da7d502456f 100644 --- a/producer/api/unittests/test_producer_impl.cpp +++ b/producer/api/unittests/test_producer_impl.cpp @@ -327,6 +327,45 @@ TEST(ProducerImpl, Send__Receive_server_error) { ASSERT_THAT(status, Eq(hidra2::ProducerStatus::kConnected)); } +TEST(ProducerImpl, Send__Receive_server_error_id_already_in_use) { + InSequence sequence; + + hidra2::ProducerImpl producer; + hidra2::FileDescriptor expected_fd = 83942; + uint64_t expected_request_id = 0; + uint64_t expected_file_id = 1; + uint64_t expected_file_size = 1337; + void* expected_file_pointer = (void*)0xC00FE; + + ConnectToReceiver_DONE(producer, expected_fd); + expected_request_id++; + + hidra2::MockIO mockIO; + producer.__set_io(&mockIO); + + EXPECT_CALL(mockIO, Send(_, _, _, _)) + .Times(2) + .WillRepeatedly( + DoAll( + testing::SetArgPointee<3>(hidra2::IOErrors::kNoError), + testing::ReturnArg<2>() + )); + + EXPECT_CALL(mockIO, Receive(_, _, sizeof(hidra2::SendDataResponse), _)) + .Times(1) + .WillOnce( + DoAll( + testing::SetArgPointee<3>(hidra2::IOErrors::kNoError), + A_WriteSendDataResponse(hidra2::NET_ERR__FILEID_ALREADY_IN_USE, expected_request_id), + testing::ReturnArg<2>() + )); + + hidra2::ProducerError error = producer.Send(expected_file_id, expected_file_pointer, expected_file_size); + hidra2::ProducerStatus status = producer.GetStatus(); + + ASSERT_THAT(error, Eq(hidra2::ProducerError::kFileIdAlreadyInUse)); + ASSERT_THAT(status, Eq(hidra2::ProducerStatus::kConnected)); +} TEST(ProducerImpl, Send) { InSequence sequence; diff --git a/receiver/src/network_producer_peer.cpp b/receiver/src/network_producer_peer.cpp index 00726c5dcb9bc0950266f07920c8caf787a9a9c4..b78927b751f8bf73df4b19985d44034479f3ddfe 100644 --- a/receiver/src/network_producer_peer.cpp +++ b/receiver/src/network_producer_peer.cpp @@ -20,14 +20,6 @@ uint32_t NetworkProducerPeer::connection_id() const { return connection_id_; } -const std::string& NetworkProducerPeer::address() const { - return address_; -} - -bool NetworkProducerPeer::is_listening() const { - return is_listening_; -} - void NetworkProducerPeer::start_peer_listener() { if(listener_thread_ || is_listening_) return; diff --git a/receiver/src/network_producer_peer_handlers.cpp b/receiver/src/network_producer_peer_handlers.cpp index 212f72c1b418279dcb8699d41429ae8344f154af..b4d5373aa3eb429c6f42b0e5194c42a729081d16 100644 --- a/receiver/src/network_producer_peer_handlers.cpp +++ b/receiver/src/network_producer_peer_handlers.cpp @@ -35,7 +35,7 @@ void NetworkProducerPeer::handle_send_data_request_(NetworkProducerPeer* self, c FileDescriptor fd = self->CreateAndOpenFileByFileId(request->file_id, &io_err); if(io_err != IOErrors::kNoError) { - response->error_code = NET_ERR__FILENAME_ALREADY_IN_USE; + response->error_code = NET_ERR__FILEID_ALREADY_IN_USE; std::cerr << "[" << self->connection_id() << "] file_id: " << request->file_id << " does already exists" << std::endl; self->io->Skip(self->socket_fd_, request->file_size, &io_err); if(io_err != IOErrors::kNoError) {