summaryrefslogtreecommitdiff
path: root/src/components/application_manager/test/application_impl_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/application_manager/test/application_impl_test.cc')
-rw-r--r--src/components/application_manager/test/application_impl_test.cc732
1 files changed, 732 insertions, 0 deletions
diff --git a/src/components/application_manager/test/application_impl_test.cc b/src/components/application_manager/test/application_impl_test.cc
new file mode 100644
index 0000000000..7989f11fce
--- /dev/null
+++ b/src/components/application_manager/test/application_impl_test.cc
@@ -0,0 +1,732 @@
+/*
+ * Copyright (c) 2016, 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 "application_manager/application_impl.h"
+#include <iostream>
+#include "gtest/gtest.h"
+#include "application_manager/hmi_state.h"
+#include "utils/file_system.h"
+
+#include "utils/make_shared.h"
+#include "application_manager/mock_message_helper.h"
+#include "utils/custom_string.h"
+#include "application_manager/mock_application_manager.h"
+#include "application_manager/mock_application_manager_settings.h"
+#include "application_manager/mock_request_controller_settings.h"
+#include "application_manager/event_engine/event_dispatcher.h"
+#include "application_manager/state_controller.h"
+#include "resumption/last_state.h"
+#include "application_manager/resumption/resume_ctrl.h"
+#include "application_manager/policies/mock_policy_handler_interface.h"
+#include "policy/mock_statistics_manager.h"
+
+namespace test {
+namespace components {
+namespace application_manager_test {
+
+using namespace application_manager;
+
+using namespace mobile_apis;
+namespace smart_objects = NsSmartDeviceLink::NsSmartObjects;
+namespace custom_str = utils::custom_string;
+
+using ::testing::_;
+using ::testing::Return;
+using ::testing::ReturnRef;
+using ::testing::AtLeast;
+using usage_statistics_test::MockStatisticsManager;
+
+typedef void (ApplicationImpl::*AddSet)(HmiStatePtr args);
+
+class ApplicationImplTest : public ::testing::Test {
+ protected:
+ virtual void SetUp() OVERRIDE {
+ app_id = 10;
+ policy_app_id = "policy_app_id";
+ app_name = "app_name";
+ mac_address = "mac_address";
+ test_lvl = HMILevel::INVALID_ENUM;
+ state_id = HmiState::STATE_ID_REGULAR;
+ audiostate = AudioStreamingState::NOT_AUDIBLE;
+ syst_context = SystemContext::SYSCTXT_MAIN;
+
+ testHmiState = CreateTestHmiState();
+ EXPECT_CALL(mock_application_manager_, CreateRegularState(app_id, _, _, _))
+ .WillOnce(Return(testHmiState));
+ EXPECT_CALL(mock_application_manager_, get_settings())
+ .WillRepeatedly(ReturnRef(mock_application_manager_settings_));
+ EXPECT_CALL(mock_application_manager_settings_, app_icons_folder())
+ .WillRepeatedly(ReturnRef(directory_name));
+ EXPECT_CALL(mock_application_manager_settings_, app_storage_folder())
+ .WillRepeatedly(ReturnRef(directory_name));
+ EXPECT_CALL(mock_application_manager_settings_,
+ audio_data_stopped_timeout()).WillOnce(Return(0));
+ EXPECT_CALL(mock_application_manager_settings_,
+ video_data_stopped_timeout()).WillOnce(Return(0));
+ app_impl = new ApplicationImpl(app_id,
+ policy_app_id,
+ mac_address,
+ app_name,
+ utils::MakeShared<MockStatisticsManager>(),
+ mock_application_manager_);
+ }
+ void TearDown() OVERRIDE {
+ delete app_impl;
+ }
+ HmiStatePtr CreateTestHmiState();
+
+ HmiStatePtr TestAddHmiState(HMILevel::eType hmi_lvl,
+ HmiState::StateID id_state,
+ AddSet hmi_action);
+
+ void CheckCurrentHMIState();
+ MockApplicationManagerSettings mock_application_manager_settings_;
+ MockApplicationManager mock_application_manager_;
+ ApplicationImpl* app_impl;
+ uint32_t app_id;
+ std::string policy_app_id;
+ std::string mac_address;
+ custom_str::CustomString app_name;
+ const std::string directory_name = "./test_storage";
+ HmiState::StateID state_id;
+ HmiStatePtr testHmiState;
+ HMILevel::eType test_lvl;
+ AudioStreamingState::eType audiostate;
+ SystemContext::eType syst_context;
+};
+
+HmiStatePtr ApplicationImplTest::CreateTestHmiState() {
+ HmiStatePtr testState =
+ utils::MakeShared<HmiState>(app_id, mock_application_manager_, state_id);
+ testState->set_hmi_level(test_lvl);
+ testState->set_audio_streaming_state(audiostate);
+ testState->set_system_context(syst_context);
+ return testState;
+}
+
+HmiStatePtr ApplicationImplTest::TestAddHmiState(HMILevel::eType hmi_lvl,
+ HmiState::StateID id_state,
+ AddSet hmi_action) {
+ test_lvl = hmi_lvl;
+ state_id = id_state;
+ HmiStatePtr state = CreateTestHmiState();
+ (app_impl->*hmi_action)(state);
+ return state;
+}
+
+void ApplicationImplTest::CheckCurrentHMIState() {
+ HmiStatePtr current_state = app_impl->CurrentHmiState();
+ EXPECT_EQ(test_lvl, current_state->hmi_level());
+ EXPECT_EQ(state_id, current_state->state_id());
+}
+
+TEST_F(ApplicationImplTest, AddHmiState_GetCurrentState) {
+ TestAddHmiState(HMILevel::HMI_FULL,
+ HmiState::STATE_ID_PHONE_CALL,
+ &ApplicationImpl::AddHMIState);
+
+ CheckCurrentHMIState();
+ EXPECT_EQ(app_id, app_impl->app_id());
+}
+
+TEST_F(ApplicationImplTest, AddRegularHmiState_GetCurrentState) {
+ TestAddHmiState(HMILevel::HMI_LIMITED,
+ HmiState::STATE_ID_REGULAR,
+ &ApplicationImpl::SetRegularState);
+
+ CheckCurrentHMIState();
+ EXPECT_EQ(app_id, app_impl->app_id());
+}
+
+TEST_F(ApplicationImplTest, AddStateAddRegularState_GetCurrentState) {
+ TestAddHmiState(HMILevel::HMI_FULL,
+ HmiState::STATE_ID_REGULAR,
+ &ApplicationImpl::SetRegularState);
+ TestAddHmiState(HMILevel::HMI_LIMITED,
+ HmiState::STATE_ID_NAVI_STREAMING,
+ &ApplicationImpl::AddHMIState);
+
+ CheckCurrentHMIState();
+ EXPECT_EQ(app_id, app_impl->app_id());
+}
+
+TEST_F(ApplicationImplTest, AddStateAddRegularState_GetRegularState) {
+ TestAddHmiState(HMILevel::HMI_FULL,
+ HmiState::STATE_ID_REGULAR,
+ &ApplicationImpl::SetRegularState);
+ TestAddHmiState(HMILevel::HMI_LIMITED,
+ HmiState::STATE_ID_NAVI_STREAMING,
+ &ApplicationImpl::AddHMIState);
+
+ HmiStatePtr current_state = app_impl->RegularHmiState();
+ EXPECT_EQ(HMILevel::HMI_FULL, current_state->hmi_level());
+ EXPECT_EQ(HmiState::STATE_ID_REGULAR, current_state->state_id());
+ EXPECT_EQ(app_id, app_impl->app_id());
+}
+
+TEST_F(ApplicationImplTest, AddStates_RemoveLastState) {
+ // First state
+ TestAddHmiState(HMILevel::HMI_FULL,
+ HmiState::STATE_ID_PHONE_CALL,
+ &ApplicationImpl::AddHMIState);
+ HmiStatePtr state2 = TestAddHmiState(HMILevel::HMI_NONE,
+ HmiState::STATE_ID_NAVI_STREAMING,
+ &ApplicationImpl::AddHMIState);
+ HmiStatePtr state3 = TestAddHmiState(HMILevel::HMI_LIMITED,
+ HmiState::STATE_ID_TTS_SESSION,
+ &ApplicationImpl::AddHMIState);
+
+ CheckCurrentHMIState();
+
+ // Remove last state
+ app_impl->RemoveHMIState(state3->state_id());
+ HmiStatePtr current_state = app_impl->CurrentHmiState();
+ EXPECT_EQ(state2, current_state);
+ EXPECT_EQ(HMILevel::HMI_NONE, current_state->hmi_level());
+ EXPECT_EQ(HmiState::STATE_ID_NAVI_STREAMING, current_state->state_id());
+}
+
+TEST_F(ApplicationImplTest, AddStates_RemoveNotLastNotFirstState) {
+ HmiStatePtr state1 = TestAddHmiState(HMILevel::HMI_FULL,
+ HmiState::STATE_ID_PHONE_CALL,
+ &ApplicationImpl::AddHMIState);
+ HmiStatePtr state2 = TestAddHmiState(HMILevel::HMI_NONE,
+ HmiState::STATE_ID_NAVI_STREAMING,
+ &ApplicationImpl::AddHMIState);
+ HmiStatePtr state3 = TestAddHmiState(HMILevel::HMI_LIMITED,
+ HmiState::STATE_ID_TTS_SESSION,
+ &ApplicationImpl::AddHMIState);
+
+ CheckCurrentHMIState();
+
+ // Remove not last state
+ app_impl->RemoveHMIState(state2->state_id());
+ HmiStatePtr current_state = app_impl->CurrentHmiState();
+ EXPECT_EQ(state3, current_state);
+ // HMI level is equal to parent hmi_level
+ EXPECT_EQ(HMILevel::HMI_FULL, current_state->hmi_level());
+ EXPECT_EQ(HmiState::STATE_ID_TTS_SESSION, current_state->state_id());
+ EXPECT_EQ(state1, current_state->parent());
+}
+
+TEST_F(ApplicationImplTest, AddStates_RemoveFirstState) {
+ HmiStatePtr state1 = TestAddHmiState(HMILevel::HMI_FULL,
+ HmiState::STATE_ID_PHONE_CALL,
+ &ApplicationImpl::AddHMIState);
+ // Second state
+ TestAddHmiState(HMILevel::HMI_NONE,
+ HmiState::STATE_ID_NAVI_STREAMING,
+ &ApplicationImpl::AddHMIState);
+ HmiStatePtr state3 = TestAddHmiState(HMILevel::HMI_LIMITED,
+ HmiState::STATE_ID_TTS_SESSION,
+ &ApplicationImpl::AddHMIState);
+ CheckCurrentHMIState();
+
+ // Remove first added state
+ app_impl->RemoveHMIState(state1->state_id());
+ HmiStatePtr current_state = app_impl->CurrentHmiState();
+ EXPECT_EQ(state3, current_state);
+ // Last state does not have a parent
+ EXPECT_EQ(HMILevel::HMI_LIMITED, current_state->hmi_level());
+ EXPECT_EQ(HmiState::STATE_ID_TTS_SESSION, current_state->state_id());
+ EXPECT_EQ(NULL, current_state->parent());
+}
+
+TEST_F(ApplicationImplTest, SetRegularState_RemoveFirstState) {
+ HmiStatePtr state1 = TestAddHmiState(HMILevel::HMI_NONE,
+ HmiState::STATE_ID_NAVI_STREAMING,
+ &ApplicationImpl::AddHMIState);
+ // Set regular state
+ HmiStatePtr state2 = TestAddHmiState(HMILevel::HMI_FULL,
+ HmiState::STATE_ID_REGULAR,
+ &ApplicationImpl::SetRegularState);
+ HmiStatePtr state3 = TestAddHmiState(HMILevel::HMI_LIMITED,
+ HmiState::STATE_ID_TTS_SESSION,
+ &ApplicationImpl::AddHMIState);
+ CheckCurrentHMIState();
+
+ // Remove first state
+ app_impl->RemoveHMIState(state1->state_id());
+ HmiStatePtr current_state = app_impl->CurrentHmiState();
+ EXPECT_EQ(state3, current_state);
+ // Last state has a parent
+ EXPECT_EQ(HMILevel::HMI_FULL, current_state->hmi_level());
+ EXPECT_EQ(HmiState::STATE_ID_TTS_SESSION, current_state->state_id());
+ EXPECT_EQ(state2, current_state->parent());
+}
+
+TEST_F(ApplicationImplTest, SetPostponedState_RemovePostponedState) {
+ // Set postponed hmi state
+ HmiStatePtr state1 = TestAddHmiState(HMILevel::HMI_NONE,
+ HmiState::STATE_ID_POSTPONED,
+ &ApplicationImpl::SetPostponedState);
+
+ // Check that state was setted correctly
+ HmiStatePtr state2 = app_impl->PostponedHmiState();
+ EXPECT_EQ(state1, state2);
+
+ // Check that state was correctly removed
+ app_impl->RemovePostponedState();
+ state2 = app_impl->PostponedHmiState();
+ EXPECT_EQ(NULL, state2);
+}
+
+TEST_F(ApplicationImplTest, AddStateAddRegularState_GetHmiLvlAudioSystemState) {
+ audiostate = AudioStreamingState::ATTENUATED;
+ syst_context = SystemContext::SYSCTXT_ALERT;
+ TestAddHmiState(HMILevel::HMI_FULL,
+ HmiState::STATE_ID_REGULAR,
+ &ApplicationImpl::SetRegularState);
+
+ EXPECT_EQ(test_lvl, app_impl->hmi_level());
+ EXPECT_EQ(audiostate, app_impl->audio_streaming_state());
+ EXPECT_EQ(syst_context, app_impl->system_context());
+
+ audiostate = AudioStreamingState::AUDIBLE;
+ syst_context = SystemContext::SYSCTXT_MENU;
+ TestAddHmiState(HMILevel::HMI_LIMITED,
+ HmiState::STATE_ID_NAVI_STREAMING,
+ &ApplicationImpl::AddHMIState);
+
+ EXPECT_EQ(test_lvl, app_impl->hmi_level());
+ EXPECT_EQ(audiostate, app_impl->audio_streaming_state());
+ EXPECT_EQ(syst_context, app_impl->system_context());
+}
+
+TEST_F(ApplicationImplTest, IsAudioApplication) {
+ EXPECT_FALSE(app_impl->IsAudioApplication());
+ app_impl->set_is_navi(true);
+ app_impl->set_is_media_application(false);
+ app_impl->set_voice_communication_supported(false);
+ EXPECT_TRUE(app_impl->IsAudioApplication());
+ app_impl->set_is_navi(false);
+ app_impl->set_is_media_application(true);
+ app_impl->set_voice_communication_supported(false);
+ EXPECT_TRUE(app_impl->IsAudioApplication());
+ app_impl->set_is_navi(false);
+ app_impl->set_is_media_application(false);
+ app_impl->set_voice_communication_supported(true);
+ EXPECT_TRUE(app_impl->IsAudioApplication());
+ app_impl->set_is_media_application(false);
+ app_impl->set_voice_communication_supported(false);
+ app_impl->set_is_navi(false);
+ EXPECT_FALSE(app_impl->IsAudioApplication());
+}
+
+TEST_F(ApplicationImplTest, AddFile) {
+ AppFile test_file;
+
+ test_file.is_persistent = true;
+ test_file.is_download_complete = false;
+ test_file.file_type = FileType::AUDIO_AAC;
+ test_file.file_name = "test_file 1";
+
+ EXPECT_TRUE(app_impl->AddFile(test_file));
+ test_file.is_download_complete = true;
+ EXPECT_FALSE(app_impl->AddFile(test_file));
+ test_file.file_name = "test_file 2";
+ EXPECT_TRUE(app_impl->AddFile(test_file));
+}
+
+TEST_F(ApplicationImplTest, UpdateFile) {
+ AppFile test_file;
+
+ test_file.is_persistent = true;
+ test_file.is_download_complete = false;
+ test_file.file_type = FileType::AUDIO_AAC;
+ test_file.file_name = "test_file 1";
+
+ EXPECT_FALSE(app_impl->UpdateFile(test_file));
+ EXPECT_TRUE(app_impl->AddFile(test_file));
+ test_file.is_download_complete = true;
+ EXPECT_FALSE(app_impl->AddFile(test_file));
+ EXPECT_TRUE(app_impl->UpdateFile(test_file));
+}
+
+TEST_F(ApplicationImplTest, DeleteFile) {
+ AppFile test_file;
+ test_file.is_persistent = true;
+ test_file.is_download_complete = false;
+ test_file.file_type = FileType::AUDIO_AAC;
+ test_file.file_name = "test_file 1";
+
+ EXPECT_FALSE(app_impl->DeleteFile(test_file.file_name));
+ EXPECT_TRUE(app_impl->AddFile(test_file));
+ EXPECT_TRUE(app_impl->DeleteFile(test_file.file_name));
+ EXPECT_FALSE(app_impl->DeleteFile(test_file.file_name));
+ EXPECT_TRUE(app_impl->AddFile(test_file));
+}
+
+TEST_F(ApplicationImplTest, GetFile) {
+ AppFile test_file;
+ test_file.is_persistent = true;
+ test_file.is_download_complete = true;
+ test_file.file_type = FileType::GRAPHIC_JPEG;
+ test_file.file_name = "test_file 1";
+
+ EXPECT_EQ(NULL, app_impl->GetFile(test_file.file_name));
+ EXPECT_TRUE(app_impl->AddFile(test_file));
+ const AppFile* app_file = app_impl->GetFile(test_file.file_name);
+ EXPECT_EQ(test_file.is_persistent, app_file->is_persistent);
+ EXPECT_EQ(test_file.is_download_complete, app_file->is_download_complete);
+ EXPECT_EQ(test_file.file_type, app_file->file_type);
+}
+
+TEST_F(ApplicationImplTest, SetIconPath) {
+ AppFile test_file;
+ test_file.is_persistent = true;
+ test_file.is_download_complete = false;
+ test_file.file_type = FileType::GRAPHIC_BMP;
+ test_file.file_name = "test_file 1";
+
+ EXPECT_TRUE(app_impl->AddFile(test_file));
+ test_file.file_name = "test_file 2";
+ test_file.file_type = FileType::GRAPHIC_PNG;
+ EXPECT_TRUE(app_impl->AddFile(test_file));
+
+ EXPECT_TRUE(app_impl->set_app_icon_path(test_file.file_name));
+ EXPECT_EQ(test_file.file_name, app_impl->app_icon_path());
+}
+
+TEST_F(ApplicationImplTest, LoadPersistentFiles) {
+ // Precondition
+ // Create test folder with diff files
+
+ app_impl->MarkRegistered();
+ std::string folder_name = "";
+ app_impl->set_folder_name(folder_name);
+
+ file_system::CreateDirectory(directory_name);
+
+ EXPECT_TRUE(file_system::CreateFile(directory_name + "/test_file1.json"));
+ EXPECT_TRUE(file_system::CreateFile(directory_name + "/test_file2.bmp"));
+ EXPECT_TRUE(file_system::CreateFile(directory_name + "/test_file3.jpeg"));
+ EXPECT_TRUE(file_system::CreateFile(directory_name + "/test_file4.png"));
+ EXPECT_TRUE(file_system::CreateFile(directory_name + "/test_file5"));
+ EXPECT_TRUE(file_system::CreateFile(directory_name + "/test_file6.wave"));
+ EXPECT_TRUE(file_system::CreateFile(directory_name + "/test_file7.mp4"));
+ EXPECT_TRUE(file_system::CreateFile(directory_name + "/test_file8.mp3"));
+
+ app_impl->LoadPersistentFiles();
+
+ AppFilesMap files_map = app_impl->getAppFiles();
+
+ EXPECT_EQ(8u, files_map.size());
+ const AppFile* test_file1 =
+ app_impl->GetFile(directory_name + "//test_file1.json");
+ ASSERT_TRUE(test_file1);
+ EXPECT_EQ(FileType::JSON, test_file1->file_type);
+ const AppFile* test_file2 =
+ app_impl->GetFile(directory_name + "//test_file2.bmp");
+ ASSERT_TRUE(test_file2);
+ EXPECT_EQ(FileType::GRAPHIC_BMP, test_file2->file_type);
+ const AppFile* test_file3 =
+ app_impl->GetFile(directory_name + "//test_file3.jpeg");
+ ASSERT_TRUE(test_file3);
+ EXPECT_EQ(FileType::GRAPHIC_JPEG, test_file3->file_type);
+ const AppFile* test_file4 =
+ app_impl->GetFile(directory_name + "//test_file4.png");
+ ASSERT_TRUE(test_file4);
+ EXPECT_EQ(FileType::GRAPHIC_PNG, test_file4->file_type);
+ const AppFile* test_file5 =
+ app_impl->GetFile(directory_name + "//test_file5");
+ ASSERT_TRUE(test_file5);
+ EXPECT_EQ(FileType::BINARY, test_file5->file_type);
+ const AppFile* test_file6 =
+ app_impl->GetFile(directory_name + "//test_file6.wave");
+ ASSERT_TRUE(test_file6);
+ EXPECT_EQ(FileType::AUDIO_WAVE, test_file6->file_type);
+ const AppFile* test_file7 =
+ app_impl->GetFile(directory_name + "//test_file7.mp4");
+ ASSERT_TRUE(test_file7);
+ EXPECT_EQ(FileType::AUDIO_AAC, test_file7->file_type);
+ const AppFile* test_file8 =
+ app_impl->GetFile(directory_name + "//test_file8.mp3");
+ ASSERT_TRUE(test_file8);
+ EXPECT_EQ(FileType::AUDIO_MP3, test_file8->file_type);
+}
+
+TEST_F(ApplicationImplTest, IsCommandLimitsExceeded_SetLimitFromConfig) {
+ std::pair<uint32_t, int32_t> get_frequency;
+ get_frequency.first = 5;
+ get_frequency.second = 1;
+ EXPECT_CALL(mock_application_manager_settings_, read_did_frequency())
+ .WillRepeatedly(ReturnRef(get_frequency));
+ EXPECT_CALL(mock_application_manager_settings_, get_vehicle_data_frequency())
+ .WillRepeatedly(ReturnRef(get_frequency));
+ for (uint32_t i = 0; i < get_frequency.first; i++) {
+ EXPECT_FALSE(app_impl->IsCommandLimitsExceeded(FunctionID::ReadDIDID,
+ TLimitSource::CONFIG_FILE));
+ }
+ EXPECT_TRUE(app_impl->IsCommandLimitsExceeded(FunctionID::ReadDIDID,
+ TLimitSource::CONFIG_FILE));
+
+ for (uint32_t i = 0; i < get_frequency.first; i++) {
+ EXPECT_FALSE(app_impl->IsCommandLimitsExceeded(FunctionID::GetVehicleDataID,
+ TLimitSource::CONFIG_FILE));
+ }
+ EXPECT_TRUE(app_impl->IsCommandLimitsExceeded(FunctionID::GetVehicleDataID,
+ TLimitSource::CONFIG_FILE));
+}
+
+TEST_F(ApplicationImplTest, IsCommandLimitsExceeded_LimitFromPT) {
+ policy_test::MockPolicyHandlerInterface policy_interface;
+ EXPECT_CALL(mock_application_manager_, GetPolicyHandler())
+ .WillRepeatedly(ReturnRef(policy_interface));
+ EXPECT_CALL(policy_interface, GetPriority(policy_app_id, _))
+ .WillRepeatedly(Return(false));
+
+ EXPECT_CALL(policy_interface, GetNotificationsNumber(_))
+ .WillOnce(Return(100u));
+ EXPECT_FALSE(app_impl->IsCommandLimitsExceeded(FunctionID::ReadDIDID,
+ TLimitSource::POLICY_TABLE));
+
+ EXPECT_CALL(policy_interface, GetNotificationsNumber(_))
+ .WillOnce(Return(100u));
+ EXPECT_FALSE(app_impl->IsCommandLimitsExceeded(FunctionID::GetVehicleDataID,
+ TLimitSource::POLICY_TABLE));
+ EXPECT_CALL(policy_interface, GetNotificationsNumber(_))
+ .WillRepeatedly(Return(0));
+ EXPECT_TRUE(app_impl->IsCommandLimitsExceeded(FunctionID::ReadDIDID,
+ TLimitSource::POLICY_TABLE));
+ EXPECT_TRUE(app_impl->IsCommandLimitsExceeded(FunctionID::GetVehicleDataID,
+ TLimitSource::POLICY_TABLE));
+}
+
+TEST_F(ApplicationImplTest, SubscribeToButton_UnsubscribeFromButton) {
+ EXPECT_TRUE(app_impl->SubscribeToButton(ButtonName::PRESET_0));
+ // It is impossible to subsribe to the same button twice
+ EXPECT_FALSE(app_impl->SubscribeToButton(ButtonName::PRESET_0));
+ EXPECT_TRUE(app_impl->IsSubscribedToButton(ButtonName::PRESET_0));
+ EXPECT_TRUE(app_impl->UnsubscribeFromButton(ButtonName::PRESET_0));
+ EXPECT_FALSE(app_impl->IsSubscribedToButton(ButtonName::PRESET_0));
+}
+
+TEST_F(ApplicationImplTest, SubscribeToDefaultButton_UnsubscribeFromButton) {
+ EXPECT_TRUE(app_impl->IsSubscribedToButton(ButtonName::CUSTOM_BUTTON));
+ EXPECT_FALSE(app_impl->SubscribeToButton(ButtonName::CUSTOM_BUTTON));
+}
+
+TEST_F(ApplicationImplTest, SubscribeToSoftButton_UnsubscribeFromSoftButton) {
+ const uint btn_count = 10;
+ for (uint i = 0; i < btn_count; i++) {
+ EXPECT_FALSE(app_impl->IsSubscribedToSoftButton(i));
+ }
+
+ SoftButtonID test_button;
+ for (uint i = 0; i < btn_count; i++) {
+ test_button.insert(i);
+ }
+ app_impl->SubscribeToSoftButtons(FunctionID::ScrollableMessageID,
+ test_button);
+
+ for (uint i = 0; i < btn_count; i++) {
+ EXPECT_TRUE(app_impl->IsSubscribedToSoftButton(i));
+ }
+ app_impl->UnsubscribeFromSoftButtons(FunctionID::ScrollableMessageID);
+
+ for (uint i = 0; i < btn_count; i++) {
+ EXPECT_FALSE(app_impl->IsSubscribedToSoftButton(i));
+ }
+}
+
+TEST_F(ApplicationImplTest, ChangeSupportingAppHMIType_TypeNotNaviNotVoice) {
+ smart_objects::SmartObject type_media;
+ type_media[0] = AppHMIType::MEDIA;
+
+ EXPECT_FALSE(app_impl->is_navi());
+ EXPECT_FALSE(app_impl->is_voice_communication_supported());
+
+ app_impl->set_app_types(type_media);
+ app_impl->ChangeSupportingAppHMIType();
+
+ EXPECT_FALSE(app_impl->is_navi());
+ EXPECT_FALSE(app_impl->is_voice_communication_supported());
+}
+
+TEST_F(ApplicationImplTest, ChangeSupportingAppHMIType_TypeIsVoice) {
+ smart_objects::SmartObject type_comm;
+ type_comm[0] = AppHMIType::COMMUNICATION;
+
+ EXPECT_FALSE(app_impl->is_navi());
+ EXPECT_FALSE(app_impl->is_voice_communication_supported());
+
+ app_impl->set_app_types(type_comm);
+ app_impl->ChangeSupportingAppHMIType();
+
+ EXPECT_FALSE(app_impl->is_navi());
+ EXPECT_TRUE(app_impl->is_voice_communication_supported());
+}
+
+TEST_F(ApplicationImplTest, ChangeSupportingAppHMIType_TypeIsNavi) {
+ smart_objects::SmartObject type_navi;
+ type_navi[0] = AppHMIType::NAVIGATION;
+
+ EXPECT_FALSE(app_impl->is_navi());
+ EXPECT_FALSE(app_impl->is_voice_communication_supported());
+
+ app_impl->set_app_types(type_navi);
+ app_impl->ChangeSupportingAppHMIType();
+
+ EXPECT_TRUE(app_impl->is_navi());
+ EXPECT_FALSE(app_impl->is_voice_communication_supported());
+}
+
+TEST_F(ApplicationImplTest, ChangeSupportingAppHMIType_TypeIsNaviAndVoice) {
+ smart_objects::SmartObject app_types;
+ app_types[0] = AppHMIType::NAVIGATION;
+ app_types[1] = AppHMIType::COMMUNICATION;
+ app_types[2] = AppHMIType::MEDIA;
+
+ EXPECT_FALSE(app_impl->is_navi());
+ EXPECT_FALSE(app_impl->is_voice_communication_supported());
+
+ app_impl->set_app_types(app_types);
+ app_impl->ChangeSupportingAppHMIType();
+
+ EXPECT_TRUE(app_impl->is_navi());
+ EXPECT_TRUE(app_impl->is_voice_communication_supported());
+}
+
+TEST_F(ApplicationImplTest, UpdateHash_AppMngrNotSuspended) {
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendHashUpdateNotification(app_id, _)).Times(1);
+ app_impl->UpdateHash();
+
+ EXPECT_TRUE(app_impl->is_application_data_changed());
+}
+
+TEST_F(ApplicationImplTest, StartStreaming_MobileNavi_StreamingNotApproved) {
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendNaviStartStream(app_id, _));
+ app_impl->StartStreaming(protocol_handler::ServiceType::kMobileNav);
+
+ EXPECT_EQ(0u, app_impl->video_stream_retry_number());
+}
+
+TEST_F(ApplicationImplTest, StartStreaming_Audio_StreamingNotApproved) {
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendAudioStartStream(app_id, _));
+ app_impl->StartStreaming(protocol_handler::ServiceType::kAudio);
+
+ EXPECT_EQ(0u, app_impl->video_stream_retry_number());
+}
+
+TEST_F(ApplicationImplTest, StartStreaming_StreamingApproved) {
+ app_impl->set_video_streaming_approved(true);
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendNaviStartStream(app_id, _)).Times(0);
+ app_impl->StartStreaming(protocol_handler::ServiceType::kMobileNav);
+
+ app_impl->set_audio_streaming_approved(true);
+
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendAudioStartStream(app_id, _)).Times(0);
+ app_impl->StartStreaming(protocol_handler::ServiceType::kAudio);
+}
+
+TEST_F(ApplicationImplTest, SuspendNaviStreaming) {
+ protocol_handler::ServiceType type =
+ protocol_handler::ServiceType::kMobileNav;
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendOnDataStreaming(type, false, _));
+ app_impl->SuspendStreaming(type);
+}
+
+TEST_F(ApplicationImplTest, SuspendAudioStreaming) {
+ protocol_handler::ServiceType type = protocol_handler::ServiceType::kAudio;
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendOnDataStreaming(type, false, _));
+ app_impl->SuspendStreaming(type);
+}
+
+// TODO {AKozoriz} : Fix tests with streaming (APPLINK-19289)
+TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpAudioStreaming) {
+ protocol_handler::ServiceType type = protocol_handler::ServiceType::kAudio;
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendOnDataStreaming(type, false, _));
+ app_impl->SuspendStreaming(type);
+
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, true));
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendOnDataStreaming(type, true, _));
+ app_impl->WakeUpStreaming(type);
+}
+
+TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpNaviStreaming) {
+ protocol_handler::ServiceType type =
+ protocol_handler::ServiceType::kMobileNav;
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendOnDataStreaming(type, false, _));
+ app_impl->SuspendStreaming(type);
+
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, true));
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendOnDataStreaming(type, true, _));
+ app_impl->WakeUpStreaming(type);
+}
+
+TEST_F(ApplicationImplTest, StopStreaming_StreamingApproved) {
+ // Stop navigation streaming
+ protocol_handler::ServiceType type =
+ protocol_handler::ServiceType::kMobileNav;
+ app_impl->set_video_streaming_approved(true);
+
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendOnDataStreaming(type, false, _));
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendNaviStopStream(app_id, _));
+
+ app_impl->StopStreaming(type);
+ EXPECT_FALSE(app_impl->video_streaming_approved());
+
+ // Stop audio streaming
+ app_impl->set_audio_streaming_approved(true);
+ type = protocol_handler::ServiceType::kAudio;
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendOnDataStreaming(type, false, _));
+ EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
+ SendAudioStopStream(app_id, _));
+
+ app_impl->StopStreaming(type);
+ EXPECT_FALSE(app_impl->audio_streaming_approved());
+}
+
+} // namespace application_manager_test
+} // namespace components
+} // namespace test