Index: chrome/browser/media/audio_stream_monitor_unittest.cc |
diff --git a/chrome/browser/media/audio_stream_monitor_unittest.cc b/chrome/browser/media/audio_stream_monitor_unittest.cc |
deleted file mode 100644 |
index 58c4adbbcef579bc7c6b09736bcc1abc0d189697..0000000000000000000000000000000000000000 |
--- a/chrome/browser/media/audio_stream_monitor_unittest.cc |
+++ /dev/null |
@@ -1,278 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/media/audio_stream_monitor.h" |
- |
-#include <map> |
-#include <utility> |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/test/simple_test_tick_clock.h" |
-#include "chrome/test/base/testing_profile.h" |
-#include "content/public/browser/invalidate_type.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/browser/web_contents_delegate.h" |
-#include "content/public/test/test_browser_thread_bundle.h" |
-#include "media/audio/audio_power_monitor.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using ::testing::InvokeWithoutArgs; |
- |
-namespace { |
- |
-const int kStreamId = 3; |
-const int kAnotherStreamId = 6; |
- |
-// Used to confirm audio indicator state changes occur at the correct times. |
-class MockWebContentsDelegate : public content::WebContentsDelegate { |
- public: |
- MOCK_METHOD2(NavigationStateChanged, |
- void(const content::WebContents* source, |
- content::InvalidateTypes changed_flags)); |
-}; |
- |
-} // namespace |
- |
-class AudioStreamMonitorTest : public testing::Test { |
- public: |
- AudioStreamMonitorTest() { |
- // Start |clock_| at non-zero. |
- clock_.Advance(base::TimeDelta::FromSeconds(1000000)); |
- |
- // Create a WebContents instance and set it to use our mock delegate. |
- web_contents_.reset(content::WebContents::Create( |
- content::WebContents::CreateParams(&profile_, NULL))); |
- web_contents_->SetDelegate(&mock_web_contents_delegate_); |
- |
- // Create an AudioStreamMonitor instance whose lifecycle is tied to that of |
- // |web_contents_|, and override its clock with the test clock. |
- AudioStreamMonitor::CreateForWebContents(web_contents_.get()); |
- CHECK(audio_stream_monitor()); |
- const_cast<base::TickClock*&>(audio_stream_monitor()->clock_) = &clock_; |
- } |
- |
- AudioStreamMonitor* audio_stream_monitor() { |
- return AudioStreamMonitor::FromWebContents(web_contents_.get()); |
- } |
- |
- base::TimeTicks GetTestClockTime() { return clock_.NowTicks(); } |
- |
- void AdvanceClock(const base::TimeDelta& delta) { clock_.Advance(delta); } |
- |
- AudioStreamMonitor::ReadPowerAndClipCallback CreatePollCallback( |
- int stream_id) { |
- return base::Bind( |
- &AudioStreamMonitorTest::ReadPower, base::Unretained(this), stream_id); |
- } |
- |
- void SetStreamPower(int stream_id, float power) { |
- current_power_[stream_id] = power; |
- } |
- |
- void SimulatePollTimerFired() { audio_stream_monitor()->Poll(); } |
- |
- void SimulateOffTimerFired() { audio_stream_monitor()->MaybeToggle(); } |
- |
- void ExpectIsPolling(int stream_id, bool is_polling) { |
- AudioStreamMonitor* const monitor = audio_stream_monitor(); |
- EXPECT_EQ(is_polling, |
- monitor->poll_callbacks_.find(stream_id) != |
- monitor->poll_callbacks_.end()); |
- EXPECT_EQ(!monitor->poll_callbacks_.empty(), |
- monitor->poll_timer_.IsRunning()); |
- } |
- |
- void ExpectTabWasRecentlyAudible(bool was_audible, |
- const base::TimeTicks& last_blurt_time) { |
- AudioStreamMonitor* const monitor = audio_stream_monitor(); |
- EXPECT_EQ(was_audible, monitor->was_recently_audible_); |
- EXPECT_EQ(last_blurt_time, monitor->last_blurt_time_); |
- EXPECT_EQ(monitor->was_recently_audible_, monitor->off_timer_.IsRunning()); |
- } |
- |
- void ExpectWebContentsWillBeNotifiedOnce(bool should_be_audible) { |
- EXPECT_CALL(mock_web_contents_delegate_, |
- NavigationStateChanged(web_contents_.get(), |
- content::INVALIDATE_TYPE_TAB)) |
- .WillOnce(InvokeWithoutArgs( |
- this, |
- should_be_audible |
- ? &AudioStreamMonitorTest::ExpectIsNotifyingForToggleOn |
- : &AudioStreamMonitorTest::ExpectIsNotifyingForToggleOff)) |
- .RetiresOnSaturation(); |
- } |
- |
- static base::TimeDelta one_polling_interval() { |
- return base::TimeDelta::FromSeconds(1) / |
- AudioStreamMonitor::kPowerMeasurementsPerSecond; |
- } |
- |
- static base::TimeDelta holding_period() { |
- return base::TimeDelta::FromMilliseconds( |
- AudioStreamMonitor::kHoldOnMilliseconds); |
- } |
- |
- private: |
- std::pair<float, bool> ReadPower(int stream_id) { |
- return std::make_pair(current_power_[stream_id], false); |
- } |
- |
- void ExpectIsNotifyingForToggleOn() { |
- EXPECT_TRUE(audio_stream_monitor()->WasRecentlyAudible()); |
- } |
- |
- void ExpectIsNotifyingForToggleOff() { |
- EXPECT_FALSE(audio_stream_monitor()->WasRecentlyAudible()); |
- } |
- |
- content::TestBrowserThreadBundle browser_thread_bundle_; |
- TestingProfile profile_; |
- MockWebContentsDelegate mock_web_contents_delegate_; |
- base::SimpleTestTickClock clock_; |
- std::map<int, float> current_power_; |
- scoped_ptr<content::WebContents> web_contents_; |
- |
- DISALLOW_COPY_AND_ASSIGN(AudioStreamMonitorTest); |
-}; |
- |
-// Tests that AudioStreamMonitor is polling while it has a |
-// ReadPowerAndClipCallback, and is not polling at other times. |
-TEST_F(AudioStreamMonitorTest, PollsWhenProvidedACallback) { |
- EXPECT_FALSE(audio_stream_monitor()->WasRecentlyAudible()); |
- ExpectIsPolling(kStreamId, false); |
- |
- audio_stream_monitor()->StartMonitoringStream(kStreamId, |
- CreatePollCallback(kStreamId)); |
- EXPECT_FALSE(audio_stream_monitor()->WasRecentlyAudible()); |
- ExpectIsPolling(kStreamId, true); |
- |
- audio_stream_monitor()->StopMonitoringStream(kStreamId); |
- EXPECT_FALSE(audio_stream_monitor()->WasRecentlyAudible()); |
- ExpectIsPolling(kStreamId, false); |
-} |
- |
-// Tests that AudioStreamMonitor debounces the power level readings it's taking, |
-// which could be fluctuating rapidly between the audible versus silence |
-// threshold. See comments in audio_stream_monitor.h for expected behavior. |
-TEST_F(AudioStreamMonitorTest, |
- ImpulsesKeepIndicatorOnUntilHoldingPeriodHasPassed) { |
- audio_stream_monitor()->StartMonitoringStream(kStreamId, |
- CreatePollCallback(kStreamId)); |
- |
- // Expect WebContents will get one call form AudioStreamMonitor to toggle the |
- // indicator on upon the very first poll. |
- ExpectWebContentsWillBeNotifiedOnce(true); |
- |
- // Loop, each time testing a slightly longer period of polled silence. The |
- // indicator should remain on throughout. |
- int num_silence_polls = 0; |
- base::TimeTicks last_blurt_time; |
- do { |
- // Poll an audible signal, and expect tab indicator state is on. |
- SetStreamPower(kStreamId, media::AudioPowerMonitor::max_power()); |
- last_blurt_time = GetTestClockTime(); |
- SimulatePollTimerFired(); |
- ExpectTabWasRecentlyAudible(true, last_blurt_time); |
- AdvanceClock(one_polling_interval()); |
- |
- // Poll a silent signal repeatedly, ensuring that the indicator is being |
- // held on during the holding period. |
- SetStreamPower(kStreamId, media::AudioPowerMonitor::zero_power()); |
- for (int i = 0; i < num_silence_polls; ++i) { |
- SimulatePollTimerFired(); |
- ExpectTabWasRecentlyAudible(true, last_blurt_time); |
- // Note: Redundant off timer firings should not have any effect. |
- SimulateOffTimerFired(); |
- ExpectTabWasRecentlyAudible(true, last_blurt_time); |
- AdvanceClock(one_polling_interval()); |
- } |
- |
- ++num_silence_polls; |
- } while (GetTestClockTime() < last_blurt_time + holding_period()); |
- |
- // At this point, the clock has just advanced to beyond the holding period, so |
- // the next firing of the off timer should turn off the tab indicator. Also, |
- // make sure it stays off for several cycles thereafter. |
- ExpectWebContentsWillBeNotifiedOnce(false); |
- for (int i = 0; i < 10; ++i) { |
- SimulateOffTimerFired(); |
- ExpectTabWasRecentlyAudible(false, last_blurt_time); |
- AdvanceClock(one_polling_interval()); |
- } |
-} |
- |
-// Tests that the AudioStreamMonitor correctly processes the blurts from two |
-// different streams in the same tab. |
-TEST_F(AudioStreamMonitorTest, HandlesMultipleStreamsBlurting) { |
- audio_stream_monitor()->StartMonitoringStream(kStreamId, |
- CreatePollCallback(kStreamId)); |
- audio_stream_monitor()->StartMonitoringStream( |
- kAnotherStreamId, |
- CreatePollCallback(kAnotherStreamId)); |
- |
- base::TimeTicks last_blurt_time; |
- ExpectTabWasRecentlyAudible(false, last_blurt_time); |
- |
- // Measure audible sound from the first stream and silence from the second. |
- // The indicator turns on (i.e., tab was recently audible). |
- ExpectWebContentsWillBeNotifiedOnce(true); |
- SetStreamPower(kStreamId, media::AudioPowerMonitor::max_power()); |
- SetStreamPower(kAnotherStreamId, media::AudioPowerMonitor::zero_power()); |
- last_blurt_time = GetTestClockTime(); |
- SimulatePollTimerFired(); |
- ExpectTabWasRecentlyAudible(true, last_blurt_time); |
- |
- // Halfway through the holding period, the second stream joins in. The |
- // indicator stays on. |
- AdvanceClock(holding_period() / 2); |
- SimulateOffTimerFired(); |
- SetStreamPower(kAnotherStreamId, media::AudioPowerMonitor::max_power()); |
- last_blurt_time = GetTestClockTime(); |
- SimulatePollTimerFired(); // Restarts holding period. |
- ExpectTabWasRecentlyAudible(true, last_blurt_time); |
- |
- // Now, measure silence from both streams. After an entire holding period |
- // has passed (since the second stream joined in), the indicator should turn |
- // off. |
- ExpectWebContentsWillBeNotifiedOnce(false); |
- AdvanceClock(holding_period()); |
- SimulateOffTimerFired(); |
- SetStreamPower(kStreamId, media::AudioPowerMonitor::zero_power()); |
- SetStreamPower(kAnotherStreamId, media::AudioPowerMonitor::zero_power()); |
- SimulatePollTimerFired(); |
- ExpectTabWasRecentlyAudible(false, last_blurt_time); |
- |
- // Now, measure silence from the first stream and audible sound from the |
- // second. The indicator turns back on. |
- ExpectWebContentsWillBeNotifiedOnce(true); |
- SetStreamPower(kAnotherStreamId, media::AudioPowerMonitor::max_power()); |
- last_blurt_time = GetTestClockTime(); |
- SimulatePollTimerFired(); |
- ExpectTabWasRecentlyAudible(true, last_blurt_time); |
- |
- // From here onwards, both streams are silent. Halfway through the holding |
- // period, the indicator should not have changed. |
- SetStreamPower(kAnotherStreamId, media::AudioPowerMonitor::zero_power()); |
- AdvanceClock(holding_period() / 2); |
- SimulatePollTimerFired(); |
- SimulateOffTimerFired(); |
- ExpectTabWasRecentlyAudible(true, last_blurt_time); |
- |
- // Just past the holding period, the indicator should be turned off. |
- ExpectWebContentsWillBeNotifiedOnce(false); |
- AdvanceClock(holding_period() - (GetTestClockTime() - last_blurt_time)); |
- SimulateOffTimerFired(); |
- ExpectTabWasRecentlyAudible(false, last_blurt_time); |
- |
- // Polling should not turn the indicator back while both streams are remaining |
- // silent. |
- for (int i = 0; i < 100; ++i) { |
- AdvanceClock(one_polling_interval()); |
- SimulatePollTimerFired(); |
- ExpectTabWasRecentlyAudible(false, last_blurt_time); |
- } |
-} |