Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(134)

Side by Side Diff: content/browser/media/audio_stream_monitor_unittest.cc

Issue 2698813007: Fix teardown of stale AudioStreamMonitor poll callbacks. (Closed)
Patch Set: Always store callbacks, fix tests. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/media/audio_stream_monitor.h" 5 #include "content/browser/media/audio_stream_monitor.h"
6 6
7 #include <map> 7 #include <map>
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 void SetStreamPower(int stream_id, float power) { 71 void SetStreamPower(int stream_id, float power) {
72 current_power_[stream_id] = power; 72 current_power_[stream_id] = power;
73 } 73 }
74 74
75 void SimulatePollTimerFired() { monitor_->Poll(); } 75 void SimulatePollTimerFired() { monitor_->Poll(); }
76 76
77 void SimulateOffTimerFired() { monitor_->MaybeToggle(); } 77 void SimulateOffTimerFired() { monitor_->MaybeToggle(); }
78 78
79 void ExpectIsPolling(int render_process_id, int stream_id, bool is_polling) { 79 void ExpectIsPolling(int render_process_id, int stream_id, bool is_polling) {
80 const AudioStreamMonitor::StreamID key(render_process_id, stream_id); 80 const AudioStreamMonitor::StreamID key(render_process_id, stream_id);
81 EXPECT_EQ( 81 EXPECT_EQ(is_polling, monitor_->poll_callbacks_.find(key) !=
82 is_polling, 82 monitor_->poll_callbacks_.end());
83 monitor_->poll_callbacks_.find(key) != monitor_->poll_callbacks_.end());
84 EXPECT_EQ(!monitor_->poll_callbacks_.empty(), 83 EXPECT_EQ(!monitor_->poll_callbacks_.empty(),
85 monitor_->poll_timer_.IsRunning()); 84 power_level_monitoring_available()
85 ? monitor_->poll_timer_.IsRunning()
86 : monitor_->IsCurrentlyAudible());
86 } 87 }
87 88
88 void ExpectTabWasRecentlyAudible(bool was_audible, 89 void ExpectTabWasRecentlyAudible(bool was_audible,
89 const base::TimeTicks& last_blurt_time) { 90 const base::TimeTicks& last_blurt_time) {
90 EXPECT_EQ(was_audible, monitor_->was_recently_audible_); 91 EXPECT_EQ(was_audible, monitor_->was_recently_audible_);
91 EXPECT_EQ(last_blurt_time, monitor_->last_blurt_time_); 92 EXPECT_EQ(last_blurt_time, monitor_->last_blurt_time_);
92 EXPECT_EQ(monitor_->was_recently_audible_, 93 EXPECT_EQ(monitor_->was_recently_audible_,
93 monitor_->off_timer_.IsRunning()); 94 monitor_->off_timer_.IsRunning());
94 } 95 }
95 96
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 135
135 static base::TimeDelta holding_period() { 136 static base::TimeDelta holding_period() {
136 return base::TimeDelta::FromMilliseconds( 137 return base::TimeDelta::FromMilliseconds(
137 AudioStreamMonitor::kHoldOnMilliseconds); 138 AudioStreamMonitor::kHoldOnMilliseconds);
138 } 139 }
139 140
140 void StartMonitoring( 141 void StartMonitoring(
141 int render_process_id, 142 int render_process_id,
142 int stream_id, 143 int stream_id,
143 const AudioStreamMonitor::ReadPowerAndClipCallback& callback) { 144 const AudioStreamMonitor::ReadPowerAndClipCallback& callback) {
144 monitor_->StartMonitoringStreamOnUIThread( 145 if (!power_level_monitoring_available() &&
145 render_process_id, stream_id, callback); 146 monitor_->poll_callbacks_.empty()) {
147 ExpectCurrentlyAudibleChangeNotification(true);
148 }
149 monitor_->StartMonitoringStreamOnUIThread(render_process_id, stream_id,
150 callback);
146 } 151 }
147 152
148 void StopMonitoring(int render_process_id, int stream_id) { 153 void StopMonitoring(int render_process_id, int stream_id) {
154 if (!power_level_monitoring_available() &&
155 monitor_->poll_callbacks_.size() == 1u) {
156 ExpectCurrentlyAudibleChangeNotification(false);
157 }
149 monitor_->StopMonitoringStreamOnUIThread(render_process_id, stream_id); 158 monitor_->StopMonitoringStreamOnUIThread(render_process_id, stream_id);
150 } 159 }
151 160
161 bool power_level_monitoring_available() {
162 return AudioStreamMonitor::power_level_monitoring_available();
163 }
164
152 protected: 165 protected:
153 AudioStreamMonitor* monitor_; 166 AudioStreamMonitor* monitor_;
154 167
155 private: 168 private:
156 std::pair<float, bool> ReadPower(int stream_id) { 169 std::pair<float, bool> ReadPower(int stream_id) {
157 return std::make_pair(current_power_[stream_id], false); 170 return std::make_pair(current_power_[stream_id], false);
158 } 171 }
159 172
160 void ExpectWasRecentlyAudible() const { 173 void ExpectWasRecentlyAudible() const {
161 EXPECT_TRUE(monitor_->WasRecentlyAudible()); 174 EXPECT_TRUE(monitor_->WasRecentlyAudible());
162 } 175 }
163 176
164 void ExpectNotRecentlyAudible() const { 177 void ExpectNotRecentlyAudible() const {
165 EXPECT_FALSE(monitor_->WasRecentlyAudible()); 178 EXPECT_FALSE(monitor_->WasRecentlyAudible());
166 } 179 }
167 180
168 MockWebContentsDelegate mock_web_contents_delegate_; 181 MockWebContentsDelegate mock_web_contents_delegate_;
169 base::SimpleTestTickClock clock_; 182 base::SimpleTestTickClock clock_;
170 std::map<int, float> current_power_; 183 std::map<int, float> current_power_;
171 184
172 DISALLOW_COPY_AND_ASSIGN(AudioStreamMonitorTest); 185 DISALLOW_COPY_AND_ASSIGN(AudioStreamMonitorTest);
173 }; 186 };
174 187
175 // Tests that AudioStreamMonitor is polling while it has a 188 // Tests that AudioStreamMonitor is polling while it has a
176 // ReadPowerAndClipCallback, and is not polling at other times. 189 // ReadPowerAndClipCallback, and is not polling at other times.
177 TEST_F(AudioStreamMonitorTest, PollsWhenProvidedACallback) { 190 TEST_F(AudioStreamMonitorTest, PollsWhenProvidedACallback) {
191 if (!power_level_monitoring_available())
192 return;
193
178 EXPECT_FALSE(monitor_->WasRecentlyAudible()); 194 EXPECT_FALSE(monitor_->WasRecentlyAudible());
179 ExpectNotCurrentlyAudible(); 195 ExpectNotCurrentlyAudible();
180 ExpectIsPolling(kRenderProcessId, kStreamId, false); 196 ExpectIsPolling(kRenderProcessId, kStreamId, false);
181 197
182 StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId)); 198 StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId));
183 EXPECT_FALSE(monitor_->WasRecentlyAudible()); 199 EXPECT_FALSE(monitor_->WasRecentlyAudible());
184 ExpectNotCurrentlyAudible(); 200 ExpectNotCurrentlyAudible();
185 ExpectIsPolling(kRenderProcessId, kStreamId, true); 201 ExpectIsPolling(kRenderProcessId, kStreamId, true);
186 202
187 StopMonitoring(kRenderProcessId, kStreamId); 203 StopMonitoring(kRenderProcessId, kStreamId);
188 EXPECT_FALSE(monitor_->WasRecentlyAudible()); 204 EXPECT_FALSE(monitor_->WasRecentlyAudible());
189 ExpectNotCurrentlyAudible(); 205 ExpectNotCurrentlyAudible();
190 ExpectIsPolling(kRenderProcessId, kStreamId, false); 206 ExpectIsPolling(kRenderProcessId, kStreamId, false);
191 } 207 }
192 208
193 // Tests that AudioStreamMonitor debounces the power level readings it's taking, 209 // Tests that AudioStreamMonitor debounces the power level readings it's taking,
194 // which could be fluctuating rapidly between the audible versus silence 210 // which could be fluctuating rapidly between the audible versus silence
195 // threshold. See comments in audio_stream_monitor.h for expected behavior. 211 // threshold. See comments in audio_stream_monitor.h for expected behavior.
196 TEST_F(AudioStreamMonitorTest, 212 TEST_F(AudioStreamMonitorTest,
197 ImpulsesKeepIndicatorOnUntilHoldingPeriodHasPassed) { 213 ImpulsesKeepIndicatorOnUntilHoldingPeriodHasPassed) {
214 if (!power_level_monitoring_available())
215 return;
216
198 StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId)); 217 StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId));
199 218
200 // Expect WebContents will get one call form AudioStreamMonitor to toggle the 219 // Expect WebContents will get one call form AudioStreamMonitor to toggle the
201 // indicator on upon the very first poll. 220 // indicator on upon the very first poll.
202 ExpectRecentlyAudibleChangeNotification(true); 221 ExpectRecentlyAudibleChangeNotification(true);
203 222
204 // Loop, each time testing a slightly longer period of polled silence. The 223 // Loop, each time testing a slightly longer period of polled silence. The
205 // recently audible state should not change while the currently audible one 224 // recently audible state should not change while the currently audible one
206 // should. 225 // should.
207 int num_silence_polls = 1; 226 int num_silence_polls = 1;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 for (int i = 0; i < 10; ++i) { 259 for (int i = 0; i < 10; ++i) {
241 SimulateOffTimerFired(); 260 SimulateOffTimerFired();
242 ExpectTabWasRecentlyAudible(false, last_blurt_time); 261 ExpectTabWasRecentlyAudible(false, last_blurt_time);
243 AdvanceClock(one_polling_interval()); 262 AdvanceClock(one_polling_interval());
244 } 263 }
245 } 264 }
246 265
247 // Tests that the AudioStreamMonitor correctly processes the blurts from two 266 // Tests that the AudioStreamMonitor correctly processes the blurts from two
248 // different streams in the same tab. 267 // different streams in the same tab.
249 TEST_F(AudioStreamMonitorTest, HandlesMultipleStreamsBlurting) { 268 TEST_F(AudioStreamMonitorTest, HandlesMultipleStreamsBlurting) {
269 if (!power_level_monitoring_available())
270 return;
271
250 StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId)); 272 StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId));
251 StartMonitoring( 273 StartMonitoring(
252 kRenderProcessId, kAnotherStreamId, CreatePollCallback(kAnotherStreamId)); 274 kRenderProcessId, kAnotherStreamId, CreatePollCallback(kAnotherStreamId));
253 275
254 base::TimeTicks last_blurt_time; 276 base::TimeTicks last_blurt_time;
255 ExpectTabWasRecentlyAudible(false, last_blurt_time); 277 ExpectTabWasRecentlyAudible(false, last_blurt_time);
256 ExpectNotCurrentlyAudible(); 278 ExpectNotCurrentlyAudible();
257 279
258 // Measure audible sound from the first stream and silence from the second. 280 // Measure audible sound from the first stream and silence from the second.
259 // The tab becomes audible. 281 // The tab becomes audible.
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId)); 358 StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId));
337 StartMonitoring( 359 StartMonitoring(
338 kAnotherRenderProcessId, kStreamId, CreatePollCallback(kStreamId)); 360 kAnotherRenderProcessId, kStreamId, CreatePollCallback(kStreamId));
339 ExpectIsPolling(kRenderProcessId, kStreamId, true); 361 ExpectIsPolling(kRenderProcessId, kStreamId, true);
340 ExpectIsPolling(kAnotherRenderProcessId, kStreamId, true); 362 ExpectIsPolling(kAnotherRenderProcessId, kStreamId, true);
341 StopMonitoring(kAnotherRenderProcessId, kStreamId); 363 StopMonitoring(kAnotherRenderProcessId, kStreamId);
342 ExpectIsPolling(kRenderProcessId, kStreamId, true); 364 ExpectIsPolling(kRenderProcessId, kStreamId, true);
343 ExpectIsPolling(kAnotherRenderProcessId, kStreamId, false); 365 ExpectIsPolling(kAnotherRenderProcessId, kStreamId, false);
344 } 366 }
345 367
368 TEST_F(AudioStreamMonitorTest, RenderProcessGone) {
369 StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId));
370 StartMonitoring(kAnotherRenderProcessId, kStreamId,
371 CreatePollCallback(kStreamId));
372 ExpectIsPolling(kRenderProcessId, kStreamId, true);
373 ExpectIsPolling(kAnotherRenderProcessId, kStreamId, true);
374 monitor_->RenderProcessGone(kRenderProcessId);
375 ExpectIsPolling(kRenderProcessId, kStreamId, false);
376 if (!power_level_monitoring_available())
377 ExpectCurrentlyAudibleChangeNotification(false);
378 monitor_->RenderProcessGone(kAnotherRenderProcessId);
379 ExpectIsPolling(kAnotherRenderProcessId, kStreamId, false);
380 }
381
382 TEST_F(AudioStreamMonitorTest, NoPowerLevelMonitoring) {
383 if (power_level_monitoring_available())
384 return;
385
386 ExpectNotCurrentlyAudible();
387 StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId));
388 ExpectIsCurrentlyAudible();
389 ExpectIsPolling(kRenderProcessId, kStreamId, true);
390
391 StartMonitoring(kAnotherRenderProcessId, kStreamId,
392 CreatePollCallback(kStreamId));
393 ExpectIsCurrentlyAudible();
394 ExpectIsPolling(kAnotherRenderProcessId, kStreamId, true);
395
396 StopMonitoring(kRenderProcessId, kStreamId);
397 ExpectIsCurrentlyAudible();
398 StopMonitoring(kAnotherRenderProcessId, kStreamId);
399 ExpectNotCurrentlyAudible();
400 }
401
346 } // namespace content 402 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/media/audio_stream_monitor.cc ('k') | content/browser/web_contents/web_contents_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698