| // Copyright 2016 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License 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. |
| // |
| |
| // Tests for audio volume handler. |
| |
| #include "audio_volume_handler_mock.h" |
| |
| #include <memory> |
| #include <string> |
| |
| #include <base/files/file_path.h> |
| #include <base/files/file_util.h> |
| #include <base/files/scoped_temp_dir.h> |
| #include <brillo/key_value_store.h> |
| #include <brillo/strings/string_utils.h> |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include "audio_device_handler.h" |
| |
| using base::FilePath; |
| using base::PathExists; |
| using base::ScopedTempDir; |
| using brillo::string_utils::ToString; |
| using std::stoi; |
| using testing::_; |
| |
| namespace brillo { |
| |
| class AudioVolumeHandlerTest : public testing::Test { |
| public: |
| void SetUp() override { |
| EXPECT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| volume_file_path_ = temp_dir_.path().Append("vol_file"); |
| handler_.SetVolumeFilePathForTesting(volume_file_path_); |
| } |
| |
| void SetupHandlerVolumeFile() { |
| handler_.kv_store_ = std::unique_ptr<KeyValueStore>(new KeyValueStore); |
| handler_.GenerateVolumeFile(); |
| } |
| |
| AudioVolumeHandlerMock handler_; |
| FilePath volume_file_path_; |
| |
| private: |
| ScopedTempDir temp_dir_; |
| }; |
| |
| // Test that the volume file is formatted correctly. |
| TEST_F(AudioVolumeHandlerTest, FileGeneration) { |
| SetupHandlerVolumeFile(); |
| KeyValueStore kv_store; |
| kv_store.Load(volume_file_path_); |
| for (auto stream : handler_.kSupportedStreams_) { |
| std::string value; |
| ASSERT_EQ(handler_.kMinIndex_, 0); |
| ASSERT_EQ(handler_.kMaxIndex_, 100); |
| for (auto device : AudioDeviceHandler::kSupportedOutputDevices_) { |
| ASSERT_TRUE(kv_store.GetString(handler_.kCurrentIndexKey_ + "." + |
| ToString(stream) + "." + |
| ToString(device), |
| &value)); |
| ASSERT_EQ(handler_.kDefaultCurrentIndex_, stoi(value)); |
| } |
| } |
| } |
| |
| // Test GetVolumeCurrentIndex. |
| TEST_F(AudioVolumeHandlerTest, GetVolumeForStreamDeviceTuple) { |
| handler_.kv_store_ = std::unique_ptr<KeyValueStore>(new KeyValueStore); |
| handler_.kv_store_->SetString(handler_.kCurrentIndexKey_ + ".1.2", "100"); |
| ASSERT_EQ( |
| handler_.GetVolumeCurrentIndex(static_cast<audio_stream_type_t>(1), 2), |
| 100); |
| } |
| |
| // Test SetVolumeCurrentIndex. |
| TEST_F(AudioVolumeHandlerTest, SetVolumeForStreamDeviceTuple) { |
| handler_.kv_store_ = std::unique_ptr<KeyValueStore>(new KeyValueStore); |
| handler_.PersistVolumeConfiguration( |
| static_cast<audio_stream_type_t>(1), 2, 100); |
| std::string value; |
| auto key = handler_.kCurrentIndexKey_ + ".1.2"; |
| handler_.kv_store_->GetString(key, &value); |
| ASSERT_EQ(stoi(value), 100); |
| } |
| |
| // Test that a new volume file is generated if it doesn't exist. |
| TEST_F(AudioVolumeHandlerTest, InitNoFile) { |
| EXPECT_CALL(handler_, InitAPSAllStreams()); |
| handler_.Init(nullptr); |
| EXPECT_TRUE(PathExists(volume_file_path_)); |
| } |
| |
| // Test that a new volume file isn't generated it already exists. |
| TEST_F(AudioVolumeHandlerTest, InitFilePresent) { |
| KeyValueStore kv_store; |
| kv_store.SetString("foo", "100"); |
| kv_store.Save(volume_file_path_); |
| EXPECT_CALL(handler_, InitAPSAllStreams()); |
| handler_.Init(nullptr); |
| EXPECT_TRUE(PathExists(volume_file_path_)); |
| std::string value; |
| handler_.kv_store_->GetString("foo", &value); |
| EXPECT_EQ(stoi(value), 100); |
| } |
| |
| TEST_F(AudioVolumeHandlerTest, ProcessEventEmpty) { |
| struct input_event event; |
| event.type = 0; |
| event.code = 0; |
| event.value = 0; |
| EXPECT_CALL(handler_, AdjustVolumeActiveStreams(_)).Times(0); |
| handler_.ProcessEvent(event); |
| } |
| |
| TEST_F(AudioVolumeHandlerTest, ProcessEventKeyUp) { |
| struct input_event event; |
| event.type = EV_KEY; |
| event.code = KEY_VOLUMEUP; |
| event.value = 1; |
| EXPECT_CALL(handler_, AdjustVolumeActiveStreams(1)); |
| handler_.ProcessEvent(event); |
| } |
| |
| TEST_F(AudioVolumeHandlerTest, ProcessEventKeyDown) { |
| struct input_event event; |
| event.type = EV_KEY; |
| event.code = KEY_VOLUMEDOWN; |
| event.value = 1; |
| EXPECT_CALL(handler_, AdjustVolumeActiveStreams(-1)); |
| handler_.ProcessEvent(event); |
| } |
| |
| TEST_F(AudioVolumeHandlerTest, SelectStream) { |
| EXPECT_EQ(handler_.GetVolumeControlStream(), AUDIO_STREAM_DEFAULT); |
| handler_.SetVolumeControlStream(AUDIO_STREAM_MUSIC); |
| EXPECT_EQ(handler_.GetVolumeControlStream(), AUDIO_STREAM_MUSIC); |
| } |
| |
| TEST_F(AudioVolumeHandlerTest, ComputeNewVolume) { |
| EXPECT_EQ(handler_.GetNewVolumeIndex(50, 1, AUDIO_STREAM_MUSIC), 51); |
| EXPECT_EQ(handler_.GetNewVolumeIndex(50, -1, AUDIO_STREAM_MUSIC), 49); |
| handler_.step_sizes_[AUDIO_STREAM_MUSIC] = 10; |
| EXPECT_EQ(handler_.GetNewVolumeIndex(50, 1, AUDIO_STREAM_MUSIC), 60); |
| EXPECT_EQ(handler_.GetNewVolumeIndex(50, -1, AUDIO_STREAM_MUSIC), 40); |
| SetupHandlerVolumeFile(); |
| EXPECT_EQ(handler_.GetNewVolumeIndex(100, 1, AUDIO_STREAM_MUSIC), 100); |
| EXPECT_EQ(handler_.GetNewVolumeIndex(0, -1, AUDIO_STREAM_MUSIC), 0); |
| } |
| |
| TEST_F(AudioVolumeHandlerTest, GetSetMaxSteps) { |
| EXPECT_EQ(handler_.GetVolumeMaxSteps(AUDIO_STREAM_MUSIC), 100); |
| EXPECT_EQ(handler_.SetVolumeMaxSteps(AUDIO_STREAM_MUSIC, 0), EINVAL); |
| EXPECT_EQ(handler_.GetVolumeMaxSteps(AUDIO_STREAM_MUSIC), 100); |
| EXPECT_EQ(handler_.SetVolumeMaxSteps(AUDIO_STREAM_MUSIC, 100), 0); |
| EXPECT_EQ(handler_.GetVolumeMaxSteps(AUDIO_STREAM_MUSIC), 100); |
| EXPECT_EQ(handler_.SetVolumeMaxSteps(AUDIO_STREAM_MUSIC, -1), EINVAL); |
| EXPECT_EQ(handler_.SetVolumeMaxSteps(AUDIO_STREAM_MUSIC, 101), EINVAL); |
| } |
| |
| TEST_F(AudioVolumeHandlerTest, GetSetVolumeIndex) { |
| SetupHandlerVolumeFile(); |
| EXPECT_CALL(handler_, TriggerCallback(AUDIO_STREAM_MUSIC, _, 0)); |
| EXPECT_EQ(handler_.SetVolumeIndex( |
| AUDIO_STREAM_MUSIC, AUDIO_DEVICE_OUT_WIRED_HEADSET, 0), |
| 0); |
| EXPECT_CALL(handler_, TriggerCallback(AUDIO_STREAM_MUSIC, 0, 50)); |
| EXPECT_EQ(handler_.SetVolumeIndex( |
| AUDIO_STREAM_MUSIC, AUDIO_DEVICE_OUT_WIRED_HEADSET, 50), |
| 0); |
| EXPECT_CALL(handler_, TriggerCallback(AUDIO_STREAM_MUSIC, 50, 100)); |
| EXPECT_EQ(handler_.SetVolumeIndex( |
| AUDIO_STREAM_MUSIC, AUDIO_DEVICE_OUT_WIRED_HEADSET, 100), |
| 0); |
| EXPECT_EQ(handler_.SetVolumeIndex( |
| AUDIO_STREAM_MUSIC, AUDIO_DEVICE_OUT_WIRED_HEADSET, -1), |
| EINVAL); |
| EXPECT_EQ(handler_.SetVolumeIndex( |
| AUDIO_STREAM_MUSIC, AUDIO_DEVICE_OUT_WIRED_HEADSET, 101), |
| EINVAL); |
| EXPECT_EQ(handler_.SetVolumeMaxSteps(AUDIO_STREAM_MUSIC, 10), 0); |
| EXPECT_EQ(handler_.GetVolumeIndex(AUDIO_STREAM_MUSIC, |
| AUDIO_DEVICE_OUT_WIRED_HEADSET), |
| 10); |
| EXPECT_EQ(handler_.SetVolumeIndex( |
| AUDIO_STREAM_MUSIC, AUDIO_DEVICE_OUT_WIRED_HEADSET, 11), |
| EINVAL); |
| EXPECT_CALL(handler_, TriggerCallback(AUDIO_STREAM_MUSIC, 100, 50)); |
| EXPECT_EQ(handler_.SetVolumeIndex( |
| AUDIO_STREAM_MUSIC, AUDIO_DEVICE_OUT_WIRED_HEADSET, 5), |
| 0); |
| EXPECT_EQ(handler_.SetVolumeMaxSteps(AUDIO_STREAM_MUSIC, 20), 0); |
| EXPECT_EQ(handler_.GetVolumeIndex(AUDIO_STREAM_MUSIC, |
| AUDIO_DEVICE_OUT_WIRED_HEADSET), |
| 10); |
| } |
| |
| } // namespace brillo |