Chromium Code Reviews| Index: chromeos/audio/cras_audio_handler_unittest.cc |
| diff --git a/chromeos/audio/cras_audio_handler_unittest.cc b/chromeos/audio/cras_audio_handler_unittest.cc |
| index 7ec72df18fa4354b38413884f88c771a07f803f1..1014e310526014b89fdd469cf04dcd6da3324976 100644 |
| --- a/chromeos/audio/cras_audio_handler_unittest.cc |
| +++ b/chromeos/audio/cras_audio_handler_unittest.cc |
| @@ -421,6 +421,22 @@ class CrasAudioHandlerTest : public testing::Test { |
| return cras_audio_handler_->hdmi_rediscovering(); |
| } |
| + // Simulating CrasAudioHandler::SetupAudioOutputState during initializing |
| + // audio state by using fake_cras_audio_client_ to SetOutputNodeVolume, |
| + // so that we can disable the auto OutputNodeVolumeChanged signal. |
| + void SetupAudioOutputStateDuringInitialization() { |
| + cras_audio_handler_->initializing_audio_state_ = true; |
| + uint64_t active_output_node_id = |
| + cras_audio_handler_->GetPrimaryActiveOutputNode(); |
| + int output_volume = cras_audio_handler_->GetOutputVolumePercent(); |
| + cras_audio_handler_->init_node_id_ = active_output_node_id; |
|
Daniel Erat
2016/08/04 23:08:59
please don't reach directly into the object being
Qiang(Joe) Xu
2016/08/04 23:41:03
Sorry wrong local branch.
|
| + cras_audio_handler_->init_volume_ = output_volume; |
| + cras_audio_handler_->automated_volume_change_reasons_.push_back( |
| + CrasAudioHandler::VOLUME_CHANGE_INITIALIZING_AUDIO_STATE); |
| + fake_cras_audio_client_->SetOutputNodeVolume(active_output_node_id, |
| + output_volume); |
| + } |
| + |
| protected: |
| base::MessageLoopForUI message_loop_; |
| CrasAudioHandler* cras_audio_handler_; // Not owned. |
| @@ -1972,12 +1988,12 @@ TEST_F(CrasAudioHandlerTest, SetOutputVolumePercent) { |
| SetUpCrasAudioHandler(audio_nodes); |
| EXPECT_EQ(0, test_observer_->output_volume_changed_count()); |
| - cras_audio_handler_->SetOutputVolumePercent(60); |
| + const int kVolume = 60; |
| + cras_audio_handler_->SetOutputVolumePercent(kVolume); |
| // Verify the output volume is changed to the designated value, |
| // OnOutputNodeVolumeChanged event is fired, and the device volume value |
| - // is saved the preferences. |
| - const int kVolume = 60; |
| + // is saved in the preferences. |
| EXPECT_EQ(kVolume, cras_audio_handler_->GetOutputVolumePercent()); |
| EXPECT_EQ(1, test_observer_->output_volume_changed_count()); |
| AudioDevice device; |
| @@ -1986,6 +2002,115 @@ TEST_F(CrasAudioHandlerTest, SetOutputVolumePercent) { |
| EXPECT_EQ(kVolume, audio_pref_handler_->GetOutputVolumeValue(&device)); |
| } |
| +TEST_F(CrasAudioHandlerTest, SetOutputVolumePercentWithoutNotifyingObservers) { |
| + AudioNodeList audio_nodes; |
| + audio_nodes.push_back(kInternalSpeaker); |
| + SetUpCrasAudioHandler(audio_nodes); |
| + EXPECT_EQ(0, test_observer_->output_volume_changed_count()); |
| + |
| + const int kVolume1 = 60; |
| + const int kVolume2 = 80; |
| + cras_audio_handler_->SetOutputVolumePercentWithoutNotifyingObservers( |
| + kVolume1, CrasAudioHandler::VOLUME_CHANGE_MAXIMIZE_MODE_SCREENSHOT); |
| + // Verify the output volume is changed to the designated value, |
| + // OnOutputNodeVolumeChanged event is not fired, and the device volume value |
| + // is saved in the preferences. |
| + EXPECT_EQ(kVolume1, cras_audio_handler_->GetOutputVolumePercent()); |
| + EXPECT_EQ(0, test_observer_->output_volume_changed_count()); |
| + AudioDevice device; |
| + EXPECT_TRUE(cras_audio_handler_->GetPrimaryActiveOutputDevice(&device)); |
| + EXPECT_EQ(device.id, kInternalSpeaker.id); |
| + EXPECT_EQ(kVolume1, audio_pref_handler_->GetOutputVolumeValue(&device)); |
| + |
| + // Make another SetOutputVolumePercentWithoutNotifyingObservers call to make |
| + // sure everything is right. |
| + cras_audio_handler_->SetOutputVolumePercentWithoutNotifyingObservers( |
| + kVolume2, CrasAudioHandler::VOLUME_CHANGE_MAXIMIZE_MODE_SCREENSHOT); |
| + EXPECT_EQ(kVolume2, cras_audio_handler_->GetOutputVolumePercent()); |
| + EXPECT_EQ(0, test_observer_->output_volume_changed_count()); |
| + EXPECT_TRUE(cras_audio_handler_->GetPrimaryActiveOutputDevice(&device)); |
| + EXPECT_EQ(device.id, kInternalSpeaker.id); |
| + EXPECT_EQ(kVolume2, audio_pref_handler_->GetOutputVolumeValue(&device)); |
| + |
| + // Make a final SetOutputVolumePercent call to check if |
| + // SetOutputVolumePercentWithoutNotifyingObservers may block subsequent |
| + // notifying observers. |
| + cras_audio_handler_->SetOutputVolumePercent(kVolume1); |
| + EXPECT_EQ(kVolume1, cras_audio_handler_->GetOutputVolumePercent()); |
| + EXPECT_EQ(1, test_observer_->output_volume_changed_count()); |
| + EXPECT_TRUE(cras_audio_handler_->GetPrimaryActiveOutputDevice(&device)); |
| + EXPECT_EQ(device.id, kInternalSpeaker.id); |
| + EXPECT_EQ(kVolume1, audio_pref_handler_->GetOutputVolumeValue(&device)); |
| +} |
| + |
| +TEST_F(CrasAudioHandlerTest, |
| + SetupAudioOutputStateDuringInitializationWithCrasReady) { |
| + AudioNodeList audio_nodes; |
| + audio_nodes.push_back(kInternalSpeaker); |
| + SetUpCrasAudioHandler(audio_nodes); |
| + EXPECT_EQ(0, test_observer_->output_volume_changed_count()); |
| + |
| + const int kDefaultVolume = 75; |
| + EXPECT_EQ(kDefaultVolume, cras_audio_handler_->GetOutputVolumePercent()); |
| + |
| + // Disable the auto OutputNodeVolumeChanged signal. |
| + fake_cras_audio_client_->set_notify_volume_change_with_delay(true); |
| + |
| + SetupAudioOutputStateDuringInitialization(); |
| + EXPECT_EQ(0, test_observer_->output_volume_changed_count()); |
| + EXPECT_EQ(kDefaultVolume, cras_audio_handler_->GetOutputVolumePercent()); |
| + |
| + // The correct initialization OutputNodeVolumeChanged event is fired. We |
| + // should avoid notify observers. |
| + fake_cras_audio_client_->NotifyOutputNodeVolumeChangedForTesting( |
| + kInternalSpeaker.id, kDefaultVolume); |
| + EXPECT_EQ(0, test_observer_->output_volume_changed_count()); |
| + EXPECT_EQ(kDefaultVolume, cras_audio_handler_->GetOutputVolumePercent()); |
| + |
| + // The later OutputNodeVolumeChanged event after initialization should notify |
| + // observers. |
| + const int kVolume = 60; |
| + fake_cras_audio_client_->NotifyOutputNodeVolumeChangedForTesting( |
| + kInternalSpeaker.id, kVolume); |
| + EXPECT_EQ(1, test_observer_->output_volume_changed_count()); |
| + EXPECT_EQ(kVolume, cras_audio_handler_->GetOutputVolumePercent()); |
| +} |
| + |
| +TEST_F(CrasAudioHandlerTest, |
| + SetupAudioOutputStateDuringInitializationWithCrasDropRequest) { |
| + AudioNodeList audio_nodes; |
| + audio_nodes.push_back(kInternalSpeaker); |
| + SetUpCrasAudioHandler(audio_nodes); |
| + EXPECT_EQ(0, test_observer_->output_volume_changed_count()); |
| + |
| + const int kDefaultVolume = 75; |
| + EXPECT_EQ(kDefaultVolume, cras_audio_handler_->GetOutputVolumePercent()); |
| + |
| + // Disable the auto OutputNodeVolumeChanged signal. |
| + fake_cras_audio_client_->set_notify_volume_change_with_delay(true); |
| + |
| + SetupAudioOutputStateDuringInitialization(); |
| + EXPECT_EQ(0, test_observer_->output_volume_changed_count()); |
| + EXPECT_EQ(kDefaultVolume, cras_audio_handler_->GetOutputVolumePercent()); |
| + |
| + // A wrong initialization OutputNodeVolumeChanged event is fired. This may |
| + // happen when Cras is not ready and drops request. The approach we use is |
| + // to log warning message, clear the penging automated volume change reasons, |
| + // and notify observers about this change. |
| + const int kVolume1 = 30; |
| + fake_cras_audio_client_->NotifyOutputNodeVolumeChangedForTesting( |
| + kInternalSpeaker.id, kVolume1); |
| + EXPECT_EQ(1, test_observer_->output_volume_changed_count()); |
| + EXPECT_EQ(kVolume1, cras_audio_handler_->GetOutputVolumePercent()); |
| + |
| + // The later OutputNodeVolumeChanged event should notify observers. |
| + const int kVolume2 = 60; |
| + fake_cras_audio_client_->NotifyOutputNodeVolumeChangedForTesting( |
| + kInternalSpeaker.id, kVolume2); |
| + EXPECT_EQ(2, test_observer_->output_volume_changed_count()); |
| + EXPECT_EQ(kVolume2, cras_audio_handler_->GetOutputVolumePercent()); |
| +} |
| + |
| TEST_F(CrasAudioHandlerTest, SetOutputVolumeWithDelayedSignal) { |
| AudioNodeList audio_nodes; |
| audio_nodes.push_back(kInternalSpeaker); |