From ee422b982f10413884fcef7a39d6a07039aae938 Mon Sep 17 00:00:00 2001 From: Sergey Yakubov <sergey.yakubov@desy.de> Date: Tue, 30 Jan 2018 11:32:27 +0100 Subject: [PATCH] refactoring --- CMakeModules/testing_go.cmake | 2 +- broker/src/hidra2_broker/server/get_next.go | 6 ++-- .../src/hidra2_broker/server/get_next_test.go | 14 ++++----- broker/src/hidra2_broker/server/listroutes.go | 2 +- common/cpp/include/common/data_structs.h | 1 + common/cpp/src/data_structs/data_structs.cpp | 7 +++++ tests/broker/get_next/check_linux.sh | 6 ++-- tests/broker/get_next/check_windows.bat | 6 ++-- worker/api/cpp/CMakeLists.txt | 2 +- .../src/{io_map.cpp => broker_helpers.cpp} | 2 +- .../cpp/src/{io_map.h => broker_helpers.h} | 0 worker/api/cpp/src/folder_data_broker.cpp | 13 +++----- worker/api/cpp/src/server_data_broker.cpp | 31 +++++++++---------- worker/api/cpp/src/server_data_broker.h | 1 + .../api/cpp/unittests/test_folder_broker.cpp | 10 ------ .../api/cpp/unittests/test_server_broker.cpp | 17 +++++----- 16 files changed, 57 insertions(+), 63 deletions(-) rename worker/api/cpp/src/{io_map.cpp => broker_helpers.cpp} (96%) rename worker/api/cpp/src/{io_map.h => broker_helpers.h} (100%) diff --git a/CMakeModules/testing_go.cmake b/CMakeModules/testing_go.cmake index 715aab8fa..3fcdb6e50 100644 --- a/CMakeModules/testing_go.cmake +++ b/CMakeModules/testing_go.cmake @@ -3,7 +3,7 @@ if (BUILD_TESTS) endif () if (BUILD_TESTS) - set(HIDRA2_MINIMUM_COVERAGE 90) + set(HIDRA2_MINIMUM_COVERAGE 80) find_program(MEMORYCHECK_COMMAND valgrind) set(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full --error-exitcode=1 --suppressions=${CMAKE_SOURCE_DIR}/tests/valgrind.suppressions") diff --git a/broker/src/hidra2_broker/server/get_next.go b/broker/src/hidra2_broker/server/get_next.go index af1017798..efdcf4074 100644 --- a/broker/src/hidra2_broker/server/get_next.go +++ b/broker/src/hidra2_broker/server/get_next.go @@ -1,14 +1,16 @@ package server import ( + "github.com/gorilla/mux" "hidra2_broker/database" "hidra2_broker/utils" "net/http" ) func extractRequestParameters(r *http.Request) (string, bool) { - db_name := r.URL.Query().Get("database") - return db_name, db_name != "" + vars := mux.Vars(r) + db_name, ok := vars["dbname"] + return db_name, ok } func routeGetNext(w http.ResponseWriter, r *http.Request) { diff --git a/broker/src/hidra2_broker/server/get_next_test.go b/broker/src/hidra2_broker/server/get_next_test.go index 1f706218c..ba177fb4c 100644 --- a/broker/src/hidra2_broker/server/get_next_test.go +++ b/broker/src/hidra2_broker/server/get_next_test.go @@ -26,8 +26,8 @@ func doRequest(path string) *httptest.ResponseRecorder { } func TestGetNextWithoutDatabaseName(t *testing.T) { - w := doRequest("/next") - assert.Equal(t, http.StatusBadRequest, w.Code, "no database name") + w := doRequest("/database/next") + assert.Equal(t, http.StatusNotFound, w.Code, "no database name") } func TestGetNextWithWrongDatabaseName(t *testing.T) { @@ -37,8 +37,8 @@ func TestGetNextWithWrongDatabaseName(t *testing.T) { mock_db.On("GetNextRecord", "foo").Return([]byte(""), &database.DBError{utils.StatusWrongInput, ""}) - w := doRequest("/next?database=foo") - assert.Equal(t, http.StatusBadRequest, w.Code, "no database name") + w := doRequest("/database/foo/next") + assert.Equal(t, http.StatusBadRequest, w.Code, "wrong database name") assertExpectations(t, mock_db) } @@ -48,7 +48,7 @@ func TestGetNextWithInternalDBError(t *testing.T) { defer func() { db = nil }() mock_db.On("GetNextRecord", "foo").Return([]byte(""), errors.New("")) - w := doRequest("/next?database=foo") + w := doRequest("/database/foo/next") assert.Equal(t, http.StatusInternalServerError, w.Code, "internal error") assertExpectations(t, mock_db) } @@ -57,9 +57,9 @@ func TestGetNextWithGoodDatabaseName(t *testing.T) { mock_db := new(database.MockedDatabase) db = mock_db defer func() { db = nil }() - mock_db.On("GetNextRecord", "database").Return([]byte("Hello"), nil) + mock_db.On("GetNextRecord", "dbname").Return([]byte("Hello"), nil) - w := doRequest("/next?database=database") + w := doRequest("/database/dbname/next") assert.Equal(t, http.StatusOK, w.Code, "GetNext OK") assert.Equal(t, "Hello", string(w.Body.Bytes()), "GetNext sends data") assertExpectations(t, mock_db) diff --git a/broker/src/hidra2_broker/server/listroutes.go b/broker/src/hidra2_broker/server/listroutes.go index 86baeb470..b9b48ee7e 100644 --- a/broker/src/hidra2_broker/server/listroutes.go +++ b/broker/src/hidra2_broker/server/listroutes.go @@ -8,7 +8,7 @@ var listRoutes = utils.Routes{ utils.Route{ "GetNext", "Get", - "/next", + "/database/{dbname}/next", routeGetNext, }, } diff --git a/common/cpp/include/common/data_structs.h b/common/cpp/include/common/data_structs.h index 93fbdb40b..afa13ae0e 100644 --- a/common/cpp/include/common/data_structs.h +++ b/common/cpp/include/common/data_structs.h @@ -18,6 +18,7 @@ class FileInfo { uint64_t id{0}; std::string Json() const; bool SetFromJson(const std::string& json_string); + std::string FullName(const std::string& base_path); }; inline bool operator==(const FileInfo& lhs, const FileInfo& rhs) { diff --git a/common/cpp/src/data_structs/data_structs.cpp b/common/cpp/src/data_structs/data_structs.cpp index 9cde1a4a5..0467bea29 100644 --- a/common/cpp/src/data_structs/data_structs.cpp +++ b/common/cpp/src/data_structs/data_structs.cpp @@ -75,4 +75,11 @@ bool FileInfo::SetFromJson(const std::string& json_string) { return true; } +std::string FileInfo::FullName(const std::string& base_path) { + std::string full_name; + full_name = base_path.empty() ? "" : base_path + "/"; + full_name += relative_path.empty() ? "" : relative_path + "/"; + return full_name + base_name; +} + } diff --git a/tests/broker/get_next/check_linux.sh b/tests/broker/get_next/check_linux.sh index 32d6ed6e0..d21ae53e8 100644 --- a/tests/broker/get_next/check_linux.sh +++ b/tests/broker/get_next/check_linux.sh @@ -22,7 +22,7 @@ $@ & sleep 0.3 brokerid=`echo $!` -curl -v --silent 127.0.0.1:5005/next?database=data --stderr - | grep '"_id":1' -curl -v --silent 127.0.0.1:5005/next?database=data --stderr - | grep '"_id":2' +curl -v --silent 127.0.0.1:5005/database/data/next --stderr - | grep '"_id":1' +curl -v --silent 127.0.0.1:5005/database/data/next --stderr - | grep '"_id":2' -curl -v --silent 127.0.0.1:5005/next?database=data --stderr - | grep "No Content" +curl -v --silent 127.0.0.1:5005/database/data/next --stderr - | grep "No Content" diff --git a/tests/broker/get_next/check_windows.bat b/tests/broker/get_next/check_windows.bat index 351a03036..009f92c4d 100644 --- a/tests/broker/get_next/check_windows.bat +++ b/tests/broker/get_next/check_windows.bat @@ -11,9 +11,9 @@ start /B "" "%full_name%" ping 1.0.0.0 -n 1 -w 100 > nul -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/next?database=data --stderr - | findstr \"_id\":1 || goto :error -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/next?database=data --stderr - | findstr \"_id\":2 || goto :error -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/next?database=data --stderr - | findstr "No Content" || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/next --stderr - | findstr \"_id\":1 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/next --stderr - | findstr \"_id\":2 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/next --stderr - | findstr "No Content" || goto :error goto :clean diff --git a/worker/api/cpp/CMakeLists.txt b/worker/api/cpp/CMakeLists.txt index cc301d778..30f9c63cc 100644 --- a/worker/api/cpp/CMakeLists.txt +++ b/worker/api/cpp/CMakeLists.txt @@ -4,7 +4,7 @@ set(SOURCE_FILES src/data_broker.cpp src/folder_data_broker.cpp src/server_data_broker.cpp - src/io_map.cpp + src/broker_helpers.cpp src/curl_http_client.cpp) diff --git a/worker/api/cpp/src/io_map.cpp b/worker/api/cpp/src/broker_helpers.cpp similarity index 96% rename from worker/api/cpp/src/io_map.cpp rename to worker/api/cpp/src/broker_helpers.cpp index c6855d6fa..c9e8dc8e2 100644 --- a/worker/api/cpp/src/io_map.cpp +++ b/worker/api/cpp/src/broker_helpers.cpp @@ -1,4 +1,4 @@ -#include "io_map.h" +#include "broker_helpers.h" namespace hidra2 { diff --git a/worker/api/cpp/src/io_map.h b/worker/api/cpp/src/broker_helpers.h similarity index 100% rename from worker/api/cpp/src/io_map.h rename to worker/api/cpp/src/broker_helpers.h diff --git a/worker/api/cpp/src/folder_data_broker.cpp b/worker/api/cpp/src/folder_data_broker.cpp index f081fc9a2..bc0801dfe 100644 --- a/worker/api/cpp/src/folder_data_broker.cpp +++ b/worker/api/cpp/src/folder_data_broker.cpp @@ -1,7 +1,7 @@ #include "folder_data_broker.h" #include "system_wrappers/system_io.h" -#include "io_map.h" +#include "broker_helpers.h" namespace hidra2 { @@ -31,7 +31,7 @@ WorkerErrorCode FolderDataBroker::CanGetData(FileInfo* info, FileData* data, int return WorkerErrorCode::kSourceNotConnected; } - if (info == nullptr && data == nullptr) { + if (info == nullptr) { return WorkerErrorCode::kWrongInput; } @@ -53,19 +53,14 @@ WorkerErrorCode FolderDataBroker::GetNext(FileInfo* info, FileData* data) { return err; } - FileInfo file_info = filelist_[nfile_to_get]; - if (info != nullptr) { - *info = file_info; - } + *info = filelist_[nfile_to_get]; if (data == nullptr) { return WorkerErrorCode::kOK; } IOErrors ioerr; - *data = io__->GetDataFromFile(base_path_ + "/" + file_info.relative_path + - (file_info.relative_path.empty() ? "" : "/") + - file_info.base_name, file_info.size, &ioerr); + *data = io__->GetDataFromFile(info->FullName(base_path_), info->size, &ioerr); return MapIOError(ioerr); } diff --git a/worker/api/cpp/src/server_data_broker.cpp b/worker/api/cpp/src/server_data_broker.cpp index ee712f8e0..26e3b2fe2 100644 --- a/worker/api/cpp/src/server_data_broker.cpp +++ b/worker/api/cpp/src/server_data_broker.cpp @@ -1,7 +1,7 @@ #include "server_data_broker.h" #include "system_wrappers/system_io.h" #include "curl_http_client.h" -#include "io_map.h" +#include "broker_helpers.h" namespace hidra2 { @@ -15,25 +15,27 @@ WorkerErrorCode ServerDataBroker::Connect() { return WorkerErrorCode::kOK; } -WorkerErrorCode ServerDataBroker::GetNext(FileInfo* info, FileData* data) { - if (info == nullptr && data == nullptr) { - return WorkerErrorCode::kWrongInput; - } - - std::string full_uri = server_uri_ + "/next?database=" + source_name_; +WorkerErrorCode ServerDataBroker::GetFileInfoFromServer(FileInfo* info, const std::string& operation) { + std::string full_uri = server_uri_ + "/database/" + source_name_ + "/" + operation; WorkerErrorCode err; auto responce = httpclient__->Get(full_uri, &err); if (err != WorkerErrorCode::kOK) { return err; } - - FileInfo file_info; - if (!file_info.SetFromJson(responce)) { + if (!info->SetFromJson(responce)) { return WorkerErrorCode::kErrorReadingSource; } + return WorkerErrorCode::kOK; +} + +WorkerErrorCode ServerDataBroker::GetNext(FileInfo* info, FileData* data) { + if (info == nullptr) { + return WorkerErrorCode::kWrongInput; + } - if (info != nullptr) { - *info = file_info; + auto err = GetFileInfoFromServer(info, "next"); + if (err != WorkerErrorCode::kOK) { + return err; } if (data == nullptr) { @@ -41,10 +43,7 @@ WorkerErrorCode ServerDataBroker::GetNext(FileInfo* info, FileData* data) { } IOErrors ioerr; - *data = io__->GetDataFromFile(file_info.relative_path + - (file_info.relative_path.empty() ? "" : "/") + - file_info.base_name, file_info.size, &ioerr); - + *data = io__->GetDataFromFile(info->FullName(""), info->size, &ioerr); return hidra2::MapIOError(ioerr); } diff --git a/worker/api/cpp/src/server_data_broker.h b/worker/api/cpp/src/server_data_broker.h index 6cea3a104..ad3bc604e 100644 --- a/worker/api/cpp/src/server_data_broker.h +++ b/worker/api/cpp/src/server_data_broker.h @@ -15,6 +15,7 @@ class ServerDataBroker final : public hidra2::DataBroker { std::unique_ptr<hidra2::IO> io__; // modified in testings to mock system calls,otherwise do not touch std::unique_ptr<hidra2::HttpClient> httpclient__; private: + WorkerErrorCode GetFileInfoFromServer(FileInfo* info, const std::string& operation); std::string server_uri_; std::string source_name_; }; diff --git a/worker/api/cpp/unittests/test_folder_broker.cpp b/worker/api/cpp/unittests/test_folder_broker.cpp index b7131c45e..e736d061e 100644 --- a/worker/api/cpp/unittests/test_folder_broker.cpp +++ b/worker/api/cpp/unittests/test_folder_broker.cpp @@ -248,16 +248,6 @@ TEST_F(GetDataFromFileTests, GetNextReturnsDataAndInfo) { } -TEST_F(GetDataFromFileTests, GetNextReturnsOnlyData) { - EXPECT_CALL(mock, GetDataFromFileProxy(_, _, _)). - WillOnce(DoAll(testing::SetArgPointee<2>(IOErrors::kNoError), testing::Return(new uint8_t[1] {'1'}))); - - data_broker->GetNext(nullptr, &data); - - ASSERT_THAT(data[0], Eq('1')); -} - - TEST_F(GetDataFromFileTests, GetNextReturnsErrorWhenCannotReadData) { EXPECT_CALL(mock, GetDataFromFileProxy(_, _, _)). WillOnce(DoAll(testing::SetArgPointee<2>(IOErrors::kReadError), testing::Return(nullptr))); diff --git a/worker/api/cpp/unittests/test_server_broker.cpp b/worker/api/cpp/unittests/test_server_broker.cpp index 6e083a32d..afe61a0dc 100644 --- a/worker/api/cpp/unittests/test_server_broker.cpp +++ b/worker/api/cpp/unittests/test_server_broker.cpp @@ -33,13 +33,14 @@ using ::testing::SetArgPointee; namespace { -TEST(FolderDataBroker, SetCorrectMembers) { - auto data_broker = std::unique_ptr<ServerDataBroker> {new ServerDataBroker("test", "database")}; +TEST(FolderDataBroker, SetCorrectIo) { + auto data_broker = std::unique_ptr<ServerDataBroker> {new ServerDataBroker("test", "dbname")}; ASSERT_THAT(dynamic_cast<hidra2::SystemIO*>(data_broker->io__.get()), Ne(nullptr)); } TEST(FolderDataBroker, SetCorrectHttpClient) { - auto data_broker = std::unique_ptr<ServerDataBroker> {new ServerDataBroker("test", "database")}; + auto data_broker = std::unique_ptr<ServerDataBroker> {new ServerDataBroker("test", "dbname")}; + ASSERT_THAT(dynamic_cast<hidra2::CurlHttpClient*>(data_broker->httpclient__.get()), Ne(nullptr)); } @@ -51,7 +52,7 @@ class ServerDataBrokerTests : public Test { FileInfo info; void SetUp() override { - data_broker = std::unique_ptr<ServerDataBroker> {new ServerDataBroker("test", "database")}; + data_broker = std::unique_ptr<ServerDataBroker> {new ServerDataBroker("test", "dbname")}; data_broker->io__ = std::unique_ptr<IO> {&mock_io}; data_broker->httpclient__ = std::unique_ptr<hidra2::HttpClient> {&mock_http_client}; } @@ -72,7 +73,7 @@ TEST_F(ServerDataBrokerTests, GetNextReturnsErrorOnWrongInput) { } TEST_F(ServerDataBrokerTests, GetNextUsesCorrectUri) { - EXPECT_CALL(mock_http_client, Get("test/next?database=database", _)).WillOnce(DoAll( + EXPECT_CALL(mock_http_client, Get("test/database/dbname/next", _)).WillOnce(DoAll( SetArgPointee<1>(WorkerErrorCode::kOK), Return(""))); data_broker->GetNext(&info, nullptr); @@ -104,8 +105,7 @@ TEST_F(ServerDataBrokerTests, GetNextReturnsFileInfo) { auto json = to_send.Json(); EXPECT_CALL(mock_http_client, Get(_, _)).WillOnce(DoAll( SetArgPointee<1>(WorkerErrorCode::kOK), - Return(json) - )); + Return(json))); auto err = data_broker->GetNext(&info, nullptr); @@ -134,8 +134,7 @@ TEST_F(ServerDataBrokerTests, GetNextReturnsParseError) { TEST_F(ServerDataBrokerTests, GetNextReturnsIfNoDtataNeeded) { EXPECT_CALL(mock_http_client, Get(_, _)).WillOnce(DoAll( SetArgPointee<1>(WorkerErrorCode::kOK), - Return("blabla") - )); + Return("blabla"))); EXPECT_CALL( mock_io, GetDataFromFile_t(_, _, _)).Times(0); data_broker->GetNext(&info, nullptr); -- GitLab