Skip to content

Commit

Permalink
Add unit tests for subscribe and unsubscribe button
Browse files Browse the repository at this point in the history
  • Loading branch information
OlhaVorobiova authored and ychernysheva committed Jul 21, 2021
1 parent dce94e5 commit a327f06
Show file tree
Hide file tree
Showing 5 changed files with 692 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,8 @@
#include "hmi/sdl_get_user_friendly_message_response.h"
#include "hmi/sdl_policy_update.h"
#include "hmi/sdl_policy_update_response.h"
#include "hmi/subscribe_button_request.h"
#include "hmi/subscribe_button_response.h"
#include "hmi/tts_change_registration_request.h"
#include "hmi/tts_change_registration_response.h"
#include "hmi/tts_get_capabilities_request.h"
Expand Down Expand Up @@ -206,6 +208,8 @@
#include "hmi/ui_slider_response.h"
#include "hmi/ui_subtle_alert_request.h"
#include "hmi/ui_subtle_alert_response.h"
#include "hmi/unsubscribe_button_request.h"
#include "hmi/unsubscribe_button_response.h"
#include "hmi/update_app_list_request.h"
#include "hmi/update_app_list_response.h"
#include "hmi/update_device_list_request.h"
Expand Down Expand Up @@ -499,8 +503,12 @@ typedef Types<commands::AllowAllAppsRequest,
commands::AllowAppResponse,
commands::BCGetFilePathRequest,
commands::BCGetFilePathResponse,
commands::hmi::SubscribeButtonRequest,
commands::hmi::SubscribeButtonResponse,
commands::UISubtleAlertResponse,
commands::UISubtleAlertRequest>
commands::UISubtleAlertRequest,
commands::hmi::UnsubscribeButtonRequest,
commands::hmi::UnsubscribeButtonResponse>
HMICommandsListFifth;

TYPED_TEST_CASE(HMICommandsTestFirst, HMICommandsListFirst);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
/*
* Copyright (c) 2021, Ford Motor Company
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the
* distribution.
*
* Neither the name of the Ford Motor Company nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

#include "hmi/subscribe_button_request.h"
#include <memory>
#include <string>
#include "application_manager/mock_event_dispatcher.h"

#include "gtest/gtest.h"

namespace test {
namespace components {
namespace commands_test {
namespace hmi_commands_test {
namespace subscribe_button_request {

using ::testing::_;
using ::testing::Return;
namespace am = ::application_manager;
namespace strings = am::strings;
using am::commands::RequestToHMI;
using am::event_engine::Event;
using sdl_rpc_plugin::commands::hmi::SubscribeButtonRequest;
using ::test::components::application_manager_test::MockApplication;
using ::test::components::event_engine_test::MockEventDispatcher;

typedef std::shared_ptr<MockApplication> MockAppPtr;
typedef std::shared_ptr<RequestToHMI> RequestToHMIPtr;
typedef std::shared_ptr<SubscribeButtonRequest> SubscribeButtonRequestPtr;

namespace {
const uint32_t kCorrelationId = 2u;
const uint32_t kAppId = 1u;
const hmi_apis::Common_ButtonName::eType kCustomButtonName =
hmi_apis::Common_ButtonName::CUSTOM_BUTTON;
const hmi_apis::Common_ButtonName::eType kHmiButtonName =
hmi_apis::Common_ButtonName::SEEKLEFT;
const mobile_apis::ButtonName::eType kMobileButtonName =
mobile_apis::ButtonName::SEEKLEFT;
const mobile_apis::ButtonName::eType kMobileCustomButtonName =
mobile_apis::ButtonName::CUSTOM_BUTTON;
const hmi_apis::FunctionID::eType kFunctionID =
hmi_apis::FunctionID::Buttons_SubscribeButton;
} // namespace

class HMISubscribeButtonRequestTest
: public CommandRequestTest<CommandsTestMocks::kIsNice> {
protected:
MessageSharedPtr CreateCommandMsg() {
MessageSharedPtr command_msg(CreateMessage(smart_objects::SmartType_Map));
(*command_msg)[strings::msg_params][strings::app_id] = kAppId;
(*command_msg)[strings::msg_params][strings::button_name] = kHmiButtonName;
(*command_msg)[strings::params][strings::correlation_id] = kCorrelationId;
(*command_msg)[strings::params][strings::function_id] = kFunctionID;

return command_msg;
}

void InitCommand(const uint32_t& timeout) OVERRIDE {
mock_app_ = CreateMockApp();
CommandRequestTest<CommandsTestMocks::kIsNice>::InitCommand(timeout);
ON_CALL((*mock_app_), hmi_app_id()).WillByDefault(Return(kAppId));
ON_CALL(app_mngr_, application_by_hmi_app(kAppId))
.WillByDefault(Return(mock_app_));
ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(mock_app_));
}

MockAppPtr mock_app_;
};

TEST_F(HMISubscribeButtonRequestTest, Run_SendRequest_SUCCESS) {
MockEventDispatcher mock_event_dispatcher;
EXPECT_CALL(app_mngr_, event_dispatcher())
.WillOnce(ReturnRef(mock_event_dispatcher));

MessageSharedPtr command_msg = CreateCommandMsg();
RequestToHMIPtr command(CreateCommand<SubscribeButtonRequest>(command_msg));

EXPECT_CALL(mock_event_dispatcher,
add_observer(kFunctionID, kCorrelationId, _))
.Times(0);
EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(command_msg));
ASSERT_TRUE(command->Init());

command->Run();
}

TEST_F(HMISubscribeButtonRequestTest, Run_SendRequest_CUSTOM_BUTTON_SUCCESS) {
MockEventDispatcher mock_event_dispatcher;
EXPECT_CALL(app_mngr_, event_dispatcher())
.WillOnce(ReturnRef(mock_event_dispatcher));

MessageSharedPtr command_msg = CreateCommandMsg();
(*command_msg)[strings::msg_params][strings::button_name] = kCustomButtonName;
RequestToHMIPtr command(CreateCommand<SubscribeButtonRequest>(command_msg));

EXPECT_CALL(mock_event_dispatcher,
add_observer(kFunctionID, kCorrelationId, _));
EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(command_msg));

ASSERT_TRUE(command->Init());
command->Run();
}

TEST_F(HMISubscribeButtonRequestTest,
onTimeOut_RequestIsExpired_HandleOnTimeout) {
MessageSharedPtr command_msg = CreateCommandMsg();
RequestToHMIPtr command(CreateCommand<SubscribeButtonRequest>(command_msg));

resumption_test::MockResumeCtrl mock_resume_ctrl;
ON_CALL(app_mngr_, resume_controller())
.WillByDefault(ReturnRef(mock_resume_ctrl));
EXPECT_CALL(mock_resume_ctrl, HandleOnTimeOut(kCorrelationId, kFunctionID));

command->onTimeOut();
}

TEST_F(HMISubscribeButtonRequestTest,
OnEvent_SuccessfulResponse_ButtonSubscribed) {
MessageSharedPtr command_msg = CreateCommandMsg();
(*command_msg)[strings::msg_params][strings::button_name] = kCustomButtonName;

SubscribeButtonRequestPtr command =
CreateCommand<SubscribeButtonRequest>(command_msg);

MessageSharedPtr event_msg = CreateCommandMsg();
(*event_msg)[am::strings::params][am::hmi_response::code] =
hmi_apis::Common_Result::SUCCESS;

Event event(kFunctionID);
event.set_smart_object(*event_msg);

EXPECT_CALL(*mock_app_, SubscribeToButton(kMobileCustomButtonName))
.WillOnce(Return(true));

command->on_event(event);
}

TEST_F(HMISubscribeButtonRequestTest,
OnEvent_UnsuccessfulResponse_ButtonNotSubscribed) {
MessageSharedPtr command_msg = CreateCommandMsg();
(*command_msg)[strings::msg_params][strings::button_name] = kCustomButtonName;

SubscribeButtonRequestPtr command =
CreateCommand<SubscribeButtonRequest>(command_msg);

MessageSharedPtr event_msg = CreateCommandMsg();
(*event_msg)[am::strings::params][am::hmi_response::code] =
hmi_apis::Common_Result::GENERIC_ERROR;

Event event(kFunctionID);
event.set_smart_object(*event_msg);

EXPECT_CALL(*mock_app_, SubscribeToButton(kMobileCustomButtonName)).Times(0);

command->on_event(event);
}

TEST_F(HMISubscribeButtonRequestTest, onEvent_App_NULL) {
MessageSharedPtr command_msg = CreateCommandMsg();
SubscribeButtonRequestPtr command =
CreateCommand<SubscribeButtonRequest>(command_msg);

MessageSharedPtr event_msg = CreateCommandMsg();
(*event_msg)[am::strings::params][am::hmi_response::code] =
hmi_apis::Common_Result::SUCCESS;

Event event(kFunctionID);
event.set_smart_object(*event_msg);

MockAppPtr mock_app = NULL;
EXPECT_CALL(app_mngr_, application_by_hmi_app(kAppId))
.WillOnce(Return(mock_app));

EXPECT_CALL(*mock_app_, SubscribeToButton(kMobileButtonName)).Times(0);

command->on_event(event);
}

} // namespace subscribe_button_request
} // namespace hmi_commands_test
} // namespace commands_test
} // namespace components
} // namespace test
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
/*
* Copyright (c) 2021, Ford Motor Company
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the
* distribution.
*
* Neither the name of the Ford Motor Company nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

#include <string>

#include "application_manager/mock_event_dispatcher.h"
#include "gtest/gtest.h"
#include "hmi/subscribe_button_response.h"

namespace test {
namespace components {
namespace commands_test {
namespace hmi_commands_test {
namespace subscribe_button_response {

namespace am = ::application_manager;
using application_manager::ExpiredButtonRequestData;
using application_manager::commands::ResponseFromHMI;
using sdl_rpc_plugin::commands::hmi::SubscribeButtonResponse;
using ::test::components::event_engine_test::MockEventDispatcher;
typedef std::shared_ptr<ResponseFromHMI> ResponseFromHMIPtr;

namespace {
const uint32_t kCorrelationId = 2u;
const uint32_t kAppId = 1u;
const hmi_apis::Common_ButtonName::eType kButtonName =
hmi_apis::Common_ButtonName::SEEKLEFT;
const hmi_apis::FunctionID::eType kFunctionID =
hmi_apis::FunctionID::Buttons_UnsubscribeButton;
} // namespace

class HMISubscribeButtonResponseTest
: public CommandsTest<CommandsTestMocks::kIsNice> {
public:
HMISubscribeButtonResponseTest() {
ON_CALL(app_mngr_, event_dispatcher())
.WillByDefault(ReturnRef(event_dispatcher_));
}

MessageSharedPtr CreateCommandMsg() {
MessageSharedPtr command_msg(CreateMessage(smart_objects::SmartType_Map));
(*command_msg)[strings::params][strings::correlation_id] = kCorrelationId;
(*command_msg)[am::strings::params][am::hmi_response::code] =
hmi_apis::Common_Result::SUCCESS;

return command_msg;
}

MockEventDispatcher event_dispatcher_;
};

TEST_F(HMISubscribeButtonResponseTest,
RUN_ProcessExpiredRequest_SendUnsubscribeRequestToHMI) {
MessageSharedPtr command_msg = CreateCommandMsg();
ResponseFromHMIPtr command(
CreateCommand<SubscribeButtonResponse>(command_msg));

ExpiredButtonRequestData expired_data;
expired_data.app_id_ = kAppId;
expired_data.button_name_ = kButtonName;
utils::Optional<ExpiredButtonRequestData> expired_data_opt = expired_data;

ON_CALL(app_mngr_, GetExpiredButtonRequestData(kCorrelationId))
.WillByDefault(Return(expired_data_opt));
ON_CALL(mock_message_helper_,
CreateButtonSubscriptionHandlingRequestToHmi(
kAppId, kButtonName, kFunctionID, _))
.WillByDefault(Return(command_msg));
EXPECT_CALL(event_dispatcher_, raise_event(_)).Times(0);
EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(command_msg));

command->Run();
}

TEST_F(
HMISubscribeButtonResponseTest,
RUN_ProcessUnsuccessfulExpiredRequest_EventNotRaisedUnsubscribeRequestNotSent) {
MessageSharedPtr command_msg = CreateCommandMsg();
(*command_msg)[am::strings::params][am::hmi_response::code] =
hmi_apis::Common_Result::GENERIC_ERROR;

ResponseFromHMIPtr command(
CreateCommand<SubscribeButtonResponse>(command_msg));

ExpiredButtonRequestData expired_data;
expired_data.app_id_ = kAppId;
expired_data.button_name_ = kButtonName;
utils::Optional<ExpiredButtonRequestData> expired_data_opt = expired_data;

ON_CALL(app_mngr_, GetExpiredButtonRequestData(kCorrelationId))
.WillByDefault(Return(expired_data_opt));
EXPECT_CALL(event_dispatcher_, raise_event(_)).Times(0);
EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(_)).Times(0);

command->Run();
}

TEST_F(HMISubscribeButtonResponseTest, RUN_NoExpiredRequests_EventRaised) {
MessageSharedPtr command_msg = CreateCommandMsg();
ResponseFromHMIPtr command(
CreateCommand<SubscribeButtonResponse>(command_msg));

ON_CALL(app_mngr_, GetExpiredButtonRequestData(kCorrelationId))
.WillByDefault(Return(utils::Optional<ExpiredButtonRequestData>::EMPTY));

EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(_)).Times(0);
EXPECT_CALL(event_dispatcher_, raise_event(_));

command->Run();
}

} // namespace subscribe_button_response
} // namespace hmi_commands_test
} // namespace commands_test
} // namespace components
} // namespace test
Loading

0 comments on commit a327f06

Please sign in to comment.