From ee6d59223a3c8557f0eec2609eaa250e49009aa4 Mon Sep 17 00:00:00 2001 From: Jonas Vautherin Date: Thu, 24 May 2018 15:16:40 +0200 Subject: [PATCH] backend: add StartPhotoInterval to camera --- .../src/plugins/camera/camera_service_impl.h | 19 +++++++- backend/test/camera_service_impl_test.cpp | 46 +++++++++++++++++++ plugins/camera/mocks/camera_mock.h | 2 + 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/backend/src/plugins/camera/camera_service_impl.h b/backend/src/plugins/camera/camera_service_impl.h index 9bf9fdc414..7e3d52c4e6 100644 --- a/backend/src/plugins/camera/camera_service_impl.h +++ b/backend/src/plugins/camera/camera_service_impl.h @@ -25,7 +25,7 @@ class CameraServiceImpl final : public rpc::camera::CameraService::Service } template - void fillResponseWithResult(ResponseType *response, dronecore::Camera::Result &camera_result) const + void fillResponseWithResult(ResponseType *response, dronecore::Camera::Result camera_result) const { auto rpc_result = static_cast(camera_result); @@ -36,6 +36,23 @@ class CameraServiceImpl final : public rpc::camera::CameraService::Service response->set_allocated_camera_result(rpc_camera_result); } + grpc::Status StartPhotoInterval(grpc::ServerContext * /* context */, + const rpc::camera::StartPhotoIntervalRequest *request, + rpc::camera::StartPhotoIntervalResponse *response) override + { + if (request == nullptr && response != nullptr) { + fillResponseWithResult(response, dronecore::Camera::Result::WRONG_ARGUMENT); + } else { + auto camera_result = _camera.start_photo_interval(request->interval_s()); + + if (response != nullptr) { + fillResponseWithResult(response, camera_result); + } + } + + return grpc::Status::OK; + } + private: Camera &_camera; }; diff --git a/backend/test/camera_service_impl_test.cpp b/backend/test/camera_service_impl_test.cpp index 361f3a3613..0443183ac5 100644 --- a/backend/test/camera_service_impl_test.cpp +++ b/backend/test/camera_service_impl_test.cpp @@ -5,6 +5,7 @@ namespace { +using testing::_; using testing::NiceMock; using testing::Return; @@ -14,6 +15,8 @@ using CameraServiceImpl = dronecore::backend::CameraServiceImpl; using CameraResult = dronecore::rpc::camera::CameraResult; using InputPair = std::pair; +static constexpr auto ARBITRARY_FLOAT = 24.2f; + std::vector generateInputPairs(); class CameraServiceImplTest : public ::testing::TestWithParam @@ -45,6 +48,49 @@ TEST_F(CameraServiceImplTest, takesPhotoEvenWhenArgsAreNull) _camera_service.TakePhoto(nullptr, nullptr, nullptr); } +TEST_P(CameraServiceImplTest, startPhotoIntervalResultIsTranslatedCorrectly) +{ + ON_CALL(_camera, start_photo_interval(_)) + .WillByDefault(Return(GetParam().second)); + dronecore::rpc::camera::StartPhotoIntervalRequest request; + request.set_interval_s(ARBITRARY_FLOAT); + dronecore::rpc::camera::StartPhotoIntervalResponse response; + + _camera_service.StartPhotoInterval(nullptr, &request, &response); + + EXPECT_EQ(GetParam().first, CameraResult::Result_Name(response.camera_result().result())); +} + +TEST_F(CameraServiceImplTest, startsPhotoIntervalEvenWhenContextAndResponseAreNull) +{ + EXPECT_CALL(_camera, start_photo_interval(_)) + .Times(1); + dronecore::rpc::camera::StartPhotoIntervalRequest request; + request.set_interval_s(ARBITRARY_FLOAT); + + _camera_service.StartPhotoInterval(nullptr, &request, nullptr); +} + +TEST_F(CameraServiceImplTest, startsPhotoIntervalWithRightParameter) +{ + auto expected_interval = ARBITRARY_FLOAT; + EXPECT_CALL(_camera, start_photo_interval(expected_interval)) + .Times(1); + dronecore::rpc::camera::StartPhotoIntervalRequest request; + request.set_interval_s(expected_interval); + + _camera_service.StartPhotoInterval(nullptr, &request, nullptr); +} + +TEST_F(CameraServiceImplTest, startPhotoIntervalReturnsWrongArgumentErrorIfRequestIsNull) +{ + dronecore::rpc::camera::StartPhotoIntervalResponse response; + + _camera_service.StartPhotoInterval(nullptr, nullptr, &response); + + EXPECT_EQ("WRONG_ARGUMENT", CameraResult::Result_Name(response.camera_result().result())); +} + INSTANTIATE_TEST_CASE_P(CameraResultCorrespondences, CameraServiceImplTest, ::testing::ValuesIn(generateInputPairs())); diff --git a/plugins/camera/mocks/camera_mock.h b/plugins/camera/mocks/camera_mock.h index 481d3c0301..cf38596242 100644 --- a/plugins/camera/mocks/camera_mock.h +++ b/plugins/camera/mocks/camera_mock.h @@ -9,6 +9,8 @@ class MockCamera { public: MOCK_CONST_METHOD0(take_photo, Camera::Result()); + MOCK_CONST_METHOD1(start_photo_interval, Camera::Result(float)); + MOCK_CONST_METHOD0(stop_photo_interval, Camera::Result()); }; } // namespace testing