/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0/ * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ #include #include #include #include #include #include #include "Settings/DeviceSettingsManager.h" #include "Settings/MockSetting.h" #include "Settings/SettingsManager.h" #include "Settings/SettingObserverInterface.h" namespace alexaClientSDK { namespace settings { namespace test { enum TestSettingId { TEST_ID_INT = 0, TEST_ID_STRING, TEST_ID_CHAR }; /// @defgroup Define initial, new and default values to be used in the test. /// @{ constexpr int INITIAL_INT_VALUE = 20; constexpr int NEW_INT_VALUE = -20; constexpr int DEFAULT_INT_VALUE = 0; constexpr char DEFAULT_CHAR_VALUE = 'a'; /// @} /// General timeout for tests to fail. static const std::chrono::seconds TEST_TIMEOUT(10); /// Settings stub that just set the value immediately. template class SettingStub : public SettingInterface { public: SetSettingResult setLocalChange(const ValueT& value) override { this->m_value = value; return SetSettingResult::ENQUEUED; } bool setAvsChange(const ValueT& value) override { return false; } bool clearData(const ValueT& value) override { return true; } explicit SettingStub(const ValueT& value) : SettingInterface{value} { } }; /// Just an empty observer. template class TestObserver : public SettingT::ObserverType { public: void onSettingNotification(const typename SettingT::ValueType& value, SettingNotifications notification) override { } }; /// @defgroup Define settings types used in the tests. /// @{ using SettingInt = SettingStub; using SettingString = SettingStub; using SettingBool = MockSetting; /// @} /// Test class. class SettingsManagerTest : public testing::Test { public: void SetUp() override; protected: /// Settings Manager. std::shared_ptr> m_manager; }; void SettingsManagerTest::SetUp() { auto customerDataManager = std::make_shared>(); std::tuple, SettingConfiguration, SettingConfiguration> settingConfigs; m_manager = std::make_shared>(customerDataManager, settingConfigs); } /// Test add settings and setting the setting value. TEST_F(SettingsManagerTest, test_setExistingSetting) { auto setting = std::make_shared(INITIAL_INT_VALUE); auto expectedResult = std::pair{true, NEW_INT_VALUE}; EXPECT_TRUE((m_manager->addSetting(setting))); EXPECT_EQ((m_manager->setValue(NEW_INT_VALUE)), SetSettingResult::ENQUEUED); EXPECT_EQ((m_manager->getValue(DEFAULT_INT_VALUE)), expectedResult); } /// Test set value for setting that hasn't been registered. TEST_F(SettingsManagerTest, test_setSettingUnavailable) { auto customerDataManager = std::make_shared>(); std::tuple, SettingConfiguration> settingConfigs; SettingsManager manager{customerDataManager, settingConfigs}; EXPECT_EQ((m_manager->setValue(NEW_INT_VALUE)), SetSettingResult::UNAVAILABLE_SETTING); } /// Test get value for setting that hasn't been registered. TEST_F(SettingsManagerTest, test_getExistingSetting) { auto setting = std::make_shared(INITIAL_INT_VALUE); auto expectedResult = std::pair{true, INITIAL_INT_VALUE}; EXPECT_TRUE((m_manager->addSetting(setting))); EXPECT_EQ((m_manager->getValue(DEFAULT_INT_VALUE)), expectedResult); } /// Test get value for setting that hasn't been registered. TEST_F(SettingsManagerTest, test_getSettingUnavailable) { auto expectedResult = std::pair{false, DEFAULT_INT_VALUE}; EXPECT_EQ((m_manager->getValue(DEFAULT_INT_VALUE)), expectedResult); } /// Test registering a setting that already exists. TEST_F(SettingsManagerTest, test_addExistingSetting) { auto setting1 = std::make_shared(INITIAL_INT_VALUE); auto setting2 = std::make_shared(INITIAL_INT_VALUE); EXPECT_TRUE((m_manager->addSetting(setting1))); EXPECT_FALSE((m_manager->addSetting(setting2))); } /// Test addObserver for a setting that exists. TEST_F(SettingsManagerTest, test_addObserver) { auto setting = std::make_shared(INITIAL_INT_VALUE); auto observer = std::make_shared>(); EXPECT_TRUE((m_manager->addSetting(setting))); EXPECT_TRUE((m_manager->addObserver(observer))); } /// Test addObserver for a setting that doesn't exist. TEST_F(SettingsManagerTest, test_addObserverFailed) { auto observer = std::make_shared>(); EXPECT_FALSE((m_manager->addObserver(observer))); } /// Test addObserver for a setting that exists. TEST_F(SettingsManagerTest, test_removeObserver) { auto setting = std::make_shared(INITIAL_INT_VALUE); auto observer = std::make_shared>(); EXPECT_TRUE((m_manager->addSetting(setting))); EXPECT_TRUE((m_manager->addObserver(observer))); m_manager->removeObserver(observer); } /// Test addObserver for a setting that doesn't exist. TEST_F(SettingsManagerTest, test_removeObserverFailed) { auto observer = std::make_shared>(); m_manager->removeObserver(observer); } /// Test manager operations for string setting. TEST_F(SettingsManagerTest, test_setExistingStringSetting) { std::string initialValue = ""; auto setting = std::make_shared(initialValue); EXPECT_TRUE((m_manager->addSetting(setting))); EXPECT_EQ((m_manager->setValue("test")), SetSettingResult::ENQUEUED); } /// Test manager getting a clearData callback will call clearData on the setting. TEST_F(SettingsManagerTest, test_clearDataInSettingManagerCallsClearDataInSetting) { auto setting = std::make_shared(DEFAULT_CHAR_VALUE); EXPECT_TRUE((m_manager->addSetting(setting))); avsCommon::utils::WaitEvent waitEvent; EXPECT_CALL(*setting, clearData(DEFAULT_CHAR_VALUE)).WillOnce(testing::InvokeWithoutArgs([&waitEvent] { waitEvent.wakeUp(); return true; })); m_manager->clearData(); // Wait till last expectation is met. ASSERT_TRUE(waitEvent.wait(TEST_TIMEOUT)); } } // namespace test } // namespace settings } // namespace alexaClientSDK