OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/json/json_reader.h" | |
7 #include "base/strings/stringprintf.h" | 6 #include "base/strings/stringprintf.h" |
8 #include "base/strings/utf_string_conversions.h" | |
9 #include "base/test/trace_event_analyzer.h" | |
10 #include "base/values.h" | 7 #include "base/values.h" |
| 8 #include "content/browser/media/webrtc_content_browsertest_base.h" |
11 #include "content/browser/media/webrtc_internals.h" | 9 #include "content/browser/media/webrtc_internals.h" |
12 #include "content/browser/web_contents/web_contents_impl.h" | 10 #include "content/browser/web_contents/web_contents_impl.h" |
13 #include "content/public/common/content_switches.h" | 11 #include "content/public/common/content_switches.h" |
14 #include "content/public/test/browser_test_utils.h" | 12 #include "content/public/test/browser_test_utils.h" |
15 #include "content/public/test/test_utils.h" | 13 #include "content/public/test/test_utils.h" |
16 #include "content/shell/browser/shell.h" | 14 #include "content/shell/browser/shell.h" |
17 #include "content/test/content_browser_test.h" | |
18 #include "content/test/content_browser_test_utils.h" | 15 #include "content/test/content_browser_test_utils.h" |
19 #include "media/audio/audio_manager.h" | 16 #include "media/audio/audio_manager.h" |
20 #include "net/test/embedded_test_server/embedded_test_server.h" | 17 #include "net/test/embedded_test_server/embedded_test_server.h" |
21 #include "testing/perf/perf_test.h" | |
22 | 18 |
23 #if defined(OS_WIN) | 19 #if defined(OS_WIN) |
24 #include "base/win/windows_version.h" | 20 #include "base/win/windows_version.h" |
25 #endif | 21 #endif |
26 | 22 |
27 using trace_analyzer::TraceAnalyzer; | |
28 using trace_analyzer::Query; | |
29 using trace_analyzer::TraceEventVector; | |
30 | |
31 namespace { | |
32 | |
33 static const char kGetUserMediaAndStop[] = "getUserMediaAndStop"; | |
34 static const char kGetUserMediaAndWaitAndStop[] = "getUserMediaAndWaitAndStop"; | |
35 static const char kGetUserMediaAndAnalyseAndStop[] = | |
36 "getUserMediaAndAnalyseAndStop"; | |
37 | |
38 // Results returned by JS. | |
39 static const char kOK[] = "OK"; | |
40 static const char kGetUserMediaFailed[] = | |
41 "GetUserMedia call failed with code undefined"; | |
42 | |
43 std::string GenerateGetUserMediaCall(const char* function_name, | |
44 int min_width, | |
45 int max_width, | |
46 int min_height, | |
47 int max_height, | |
48 int min_frame_rate, | |
49 int max_frame_rate) { | |
50 return base::StringPrintf( | |
51 "%s({video: {mandatory: {minWidth: %d, maxWidth: %d, " | |
52 "minHeight: %d, maxHeight: %d, minFrameRate: %d, maxFrameRate: %d}, " | |
53 "optional: []}});", | |
54 function_name, | |
55 min_width, | |
56 max_width, | |
57 min_height, | |
58 max_height, | |
59 min_frame_rate, | |
60 max_frame_rate); | |
61 } | |
62 | |
63 std::string GenerateGetUserMediaWithMandatorySourceID( | |
64 const std::string& function_name, | |
65 const std::string& audio_source_id, | |
66 const std::string& video_source_id) { | |
67 const std::string audio_constraint = | |
68 "audio: {mandatory: { sourceId:\"" + audio_source_id + "\"}}, "; | |
69 | |
70 const std::string video_constraint = | |
71 "video: {mandatory: { sourceId:\"" + video_source_id + "\"}}"; | |
72 return function_name + "({" + audio_constraint + video_constraint + "});"; | |
73 } | |
74 | |
75 std::string GenerateGetUserMediaWithOptionalSourceID( | |
76 const std::string& function_name, | |
77 const std::string& audio_source_id, | |
78 const std::string& video_source_id) { | |
79 const std::string audio_constraint = | |
80 "audio: {optional: [{sourceId:\"" + audio_source_id + "\"}]}, "; | |
81 | |
82 const std::string video_constraint = | |
83 "video: {optional: [{ sourceId:\"" + video_source_id + "\"}]}"; | |
84 return function_name + "({" + audio_constraint + video_constraint + "});"; | |
85 } | |
86 | |
87 } | |
88 | |
89 namespace content { | 23 namespace content { |
90 | 24 |
91 class WebrtcBrowserTest: public ContentBrowserTest { | 25 class WebRtcBrowserTest: public WebRtcContentBrowserTest { |
92 public: | 26 public: |
93 WebrtcBrowserTest() : trace_log_(NULL) {} | 27 WebRtcBrowserTest() {} |
94 virtual ~WebrtcBrowserTest() {} | 28 virtual ~WebRtcBrowserTest() {} |
95 | |
96 virtual void SetUp() OVERRIDE { | |
97 // These tests require pixel output. | |
98 UseRealGLContexts(); | |
99 ContentBrowserTest::SetUp(); | |
100 } | |
101 | |
102 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | |
103 // We need fake devices in this test since we want to run on naked VMs. We | |
104 // assume these switches are set by default in content_browsertests. | |
105 ASSERT_TRUE(CommandLine::ForCurrentProcess()->HasSwitch( | |
106 switches::kUseFakeDeviceForMediaStream)); | |
107 ASSERT_TRUE(CommandLine::ForCurrentProcess()->HasSwitch( | |
108 switches::kUseFakeUIForMediaStream)); | |
109 } | |
110 | |
111 void StartTracing() { | |
112 CHECK(trace_log_ == NULL) << "Can only can start tracing once"; | |
113 trace_log_ = base::debug::TraceLog::GetInstance(); | |
114 trace_log_->SetEnabled(base::debug::CategoryFilter("video"), | |
115 base::debug::TraceLog::RECORDING_MODE, | |
116 base::debug::TraceLog::ENABLE_SAMPLING); | |
117 // Check that we are indeed recording. | |
118 EXPECT_EQ(trace_log_->GetNumTracesRecorded(), 1); | |
119 } | |
120 | |
121 void StopTracing() { | |
122 CHECK(message_loop_runner_ == NULL) << "Calling StopTracing more than once"; | |
123 trace_log_->SetDisabled(); | |
124 message_loop_runner_ = new MessageLoopRunner; | |
125 trace_log_->Flush(base::Bind(&WebrtcBrowserTest::OnTraceDataCollected, | |
126 base::Unretained(this))); | |
127 message_loop_runner_->Run(); | |
128 } | |
129 | |
130 void OnTraceDataCollected( | |
131 const scoped_refptr<base::RefCountedString>& events_str_ptr, | |
132 bool has_more_events) { | |
133 CHECK(!has_more_events); | |
134 recorded_trace_data_ = events_str_ptr; | |
135 message_loop_runner_->Quit(); | |
136 } | |
137 | |
138 TraceAnalyzer* CreateTraceAnalyzer() { | |
139 return TraceAnalyzer::Create("[" + recorded_trace_data_->data() + "]"); | |
140 } | |
141 | |
142 void GetSources(std::vector<std::string>* audio_ids, | |
143 std::vector<std::string>* video_ids) { | |
144 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
145 NavigateToURL(shell(), url); | |
146 | |
147 std::string sources_as_json = ExecuteJavascriptAndReturnResult( | |
148 "getSources()"); | |
149 EXPECT_FALSE(sources_as_json.empty()); | |
150 | |
151 int error_code; | |
152 std::string error_message; | |
153 scoped_ptr<base::Value> value( | |
154 base::JSONReader::ReadAndReturnError(sources_as_json, | |
155 base::JSON_ALLOW_TRAILING_COMMAS, | |
156 &error_code, | |
157 &error_message)); | |
158 | |
159 ASSERT_TRUE(value.get() != NULL) << error_message; | |
160 EXPECT_EQ(value->GetType(), base::Value::TYPE_LIST); | |
161 | |
162 base::ListValue* values; | |
163 ASSERT_TRUE(value->GetAsList(&values)); | |
164 | |
165 for (base::ListValue::iterator it = values->begin(); | |
166 it != values->end(); ++it) { | |
167 const base::DictionaryValue* dict; | |
168 std::string kind; | |
169 std::string id; | |
170 ASSERT_TRUE((*it)->GetAsDictionary(&dict)); | |
171 ASSERT_TRUE(dict->GetString("kind", &kind)); | |
172 ASSERT_TRUE(dict->GetString("id", &id)); | |
173 ASSERT_FALSE(id.empty()); | |
174 EXPECT_TRUE(kind == "audio" || kind == "video"); | |
175 if (kind == "audio") { | |
176 audio_ids->push_back(id); | |
177 } else if (kind == "video") { | |
178 video_ids->push_back(id); | |
179 } | |
180 } | |
181 ASSERT_FALSE(audio_ids->empty()); | |
182 ASSERT_FALSE(video_ids->empty()); | |
183 } | |
184 | |
185 protected: | |
186 bool ExecuteJavascript(const std::string& javascript) { | |
187 return ExecuteScript(shell()->web_contents(), javascript); | |
188 } | |
189 | |
190 // Executes |javascript|. The script is required to use | |
191 // window.domAutomationController.send to send a string value back to here. | |
192 std::string ExecuteJavascriptAndReturnResult(const std::string& javascript) { | |
193 std::string result; | |
194 EXPECT_TRUE(ExecuteScriptAndExtractString(shell()->web_contents(), | |
195 javascript, | |
196 &result)); | |
197 return result; | |
198 } | |
199 | |
200 void ExpectTitle(const std::string& expected_title) const { | |
201 base::string16 expected_title16(base::ASCIIToUTF16(expected_title)); | |
202 TitleWatcher title_watcher(shell()->web_contents(), expected_title16); | |
203 EXPECT_EQ(expected_title16, title_watcher.WaitAndGetTitle()); | |
204 } | |
205 | 29 |
206 // Convenience function since most peerconnection-call.html tests just load | 30 // Convenience function since most peerconnection-call.html tests just load |
207 // the page, kick off some javascript and wait for the title to change to OK. | 31 // the page, kick off some javascript and wait for the title to change to OK. |
208 void MakeTypicalPeerConnectionCall(const std::string& javascript) { | 32 void MakeTypicalPeerConnectionCall(const std::string& javascript) { |
209 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 33 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
210 | 34 |
211 GURL url(embedded_test_server()->GetURL("/media/peerconnection-call.html")); | 35 GURL url(embedded_test_server()->GetURL("/media/peerconnection-call.html")); |
212 NavigateToURL(shell(), url); | 36 NavigateToURL(shell(), url); |
213 ExecuteTestAndWaitForOk(javascript); | 37 ExecuteTestAndWaitForOk(javascript); |
214 } | 38 } |
215 | 39 |
216 void ExecuteTestAndWaitForOk(const std::string& javascript) { | 40 void ExecuteTestAndWaitForOk(const std::string& javascript) { |
217 #if defined (OS_ANDROID) | 41 #if defined (OS_ANDROID) |
218 // Always force iSAC 16K on Android for now (Opus is broken). | 42 // Always force iSAC 16K on Android for now (Opus is broken). |
219 ASSERT_TRUE(ExecuteJavascript("forceIsac16KInSdp();")); | 43 ASSERT_TRUE(ExecuteJavascript("forceIsac16KInSdp();")); |
220 #endif | 44 #endif |
221 | 45 |
222 ASSERT_TRUE(ExecuteJavascript(javascript)); | 46 ASSERT_TRUE(ExecuteJavascript(javascript)); |
223 ExpectTitle("OK"); | 47 ExpectTitle("OK"); |
224 } | 48 } |
225 | |
226 private: | |
227 base::debug::TraceLog* trace_log_; | |
228 scoped_refptr<base::RefCountedString> recorded_trace_data_; | |
229 scoped_refptr<MessageLoopRunner> message_loop_runner_; | |
230 }; | 49 }; |
231 | 50 |
232 // These tests will all make a getUserMedia call with different constraints and | |
233 // see that the success callback is called. If the error callback is called or | |
234 // none of the callbacks are called the tests will simply time out and fail. | |
235 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, GetVideoStreamAndStop) { | |
236 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
237 | |
238 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
239 NavigateToURL(shell(), url); | |
240 | |
241 ASSERT_TRUE(ExecuteJavascript( | |
242 base::StringPrintf("%s({video: true});", kGetUserMediaAndStop))); | |
243 | |
244 ExpectTitle("OK"); | |
245 } | |
246 | |
247 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, GetAudioAndVideoStreamAndStop) { | |
248 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
249 | |
250 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
251 NavigateToURL(shell(), url); | |
252 | |
253 ASSERT_TRUE(ExecuteJavascript(base::StringPrintf( | |
254 "%s({video: true, audio: true});", kGetUserMediaAndStop))); | |
255 | |
256 ExpectTitle("OK"); | |
257 } | |
258 | |
259 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, GetAudioAndVideoStreamAndClone) { | |
260 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
261 | |
262 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
263 NavigateToURL(shell(), url); | |
264 | |
265 ASSERT_TRUE(ExecuteJavascript("getUserMediaAndClone();")); | |
266 | |
267 ExpectTitle("OK"); | |
268 } | |
269 | |
270 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, GetUserMediaWithMandatorySourceID_1) { | |
271 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
272 | |
273 std::vector<std::string> audio_ids; | |
274 std::vector<std::string> video_ids; | |
275 GetSources(&audio_ids, &video_ids); | |
276 | |
277 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
278 NavigateToURL(shell(), url); | |
279 | |
280 for (size_t j = 0; j < video_ids.size() / 2; ++j) { | |
281 for (size_t i = 0; i < audio_ids.size(); ++i) { | |
282 EXPECT_EQ(kOK, | |
283 ExecuteJavascriptAndReturnResult( | |
284 GenerateGetUserMediaWithMandatorySourceID( | |
285 kGetUserMediaAndStop, audio_ids[i], video_ids[j]))); | |
286 } | |
287 } | |
288 } | |
289 | |
290 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, GetUserMediaWithMandatorySourceID_2) { | |
291 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
292 | |
293 std::vector<std::string> audio_ids; | |
294 std::vector<std::string> video_ids; | |
295 GetSources(&audio_ids, &video_ids); | |
296 | |
297 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
298 NavigateToURL(shell(), url); | |
299 | |
300 for (size_t j = video_ids.size() / 2; j < video_ids.size(); ++j) { | |
301 for (size_t i = 0; i < audio_ids.size(); ++i) { | |
302 EXPECT_EQ(kOK, | |
303 ExecuteJavascriptAndReturnResult( | |
304 GenerateGetUserMediaWithMandatorySourceID( | |
305 kGetUserMediaAndStop, audio_ids[i], video_ids[j]))); | |
306 } | |
307 } | |
308 } | |
309 | |
310 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, | |
311 GetUserMediaWithInvalidMandatorySourceID) { | |
312 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
313 | |
314 std::vector<std::string> audio_ids; | |
315 std::vector<std::string> video_ids; | |
316 GetSources(&audio_ids, &video_ids); | |
317 | |
318 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
319 | |
320 // Test with invalid mandatory audio sourceID. | |
321 NavigateToURL(shell(), url); | |
322 EXPECT_EQ(kGetUserMediaFailed, | |
323 ExecuteJavascriptAndReturnResult( | |
324 GenerateGetUserMediaWithMandatorySourceID( | |
325 kGetUserMediaAndStop, "something invalid", video_ids[0]))); | |
326 | |
327 // Test with invalid mandatory video sourceID. | |
328 EXPECT_EQ(kGetUserMediaFailed, | |
329 ExecuteJavascriptAndReturnResult( | |
330 GenerateGetUserMediaWithMandatorySourceID( | |
331 kGetUserMediaAndStop, audio_ids[0], "something invalid"))); | |
332 | |
333 // Test with empty mandatory audio sourceID. | |
334 EXPECT_EQ(kGetUserMediaFailed, | |
335 ExecuteJavascriptAndReturnResult( | |
336 GenerateGetUserMediaWithMandatorySourceID( | |
337 kGetUserMediaAndStop, "", video_ids[0]))); | |
338 } | |
339 | |
340 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, GetUserMediaWithOptionalSourceID_1) { | |
341 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
342 | |
343 std::vector<std::string> audio_ids; | |
344 std::vector<std::string> video_ids; | |
345 GetSources(&audio_ids, &video_ids); | |
346 | |
347 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
348 NavigateToURL(shell(), url); | |
349 | |
350 // Test all combinations of mandatory sourceID. | |
351 for (size_t j = 0; j < video_ids.size() / 2; ++j) { | |
352 for (size_t i = 0; i < audio_ids.size(); ++i) { | |
353 EXPECT_EQ(kOK, | |
354 ExecuteJavascriptAndReturnResult( | |
355 GenerateGetUserMediaWithOptionalSourceID( | |
356 kGetUserMediaAndStop, audio_ids[i], video_ids[j]))); | |
357 } | |
358 } | |
359 } | |
360 | |
361 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, GetUserMediaWithOptionalSourceID_2) { | |
362 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
363 | |
364 std::vector<std::string> audio_ids; | |
365 std::vector<std::string> video_ids; | |
366 GetSources(&audio_ids, &video_ids); | |
367 | |
368 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
369 NavigateToURL(shell(), url); | |
370 | |
371 // Test all combinations of mandatory sourceID. | |
372 for (size_t j = video_ids.size() / 2; j < video_ids.size(); ++j) { | |
373 for (size_t i = 0; i < audio_ids.size(); ++i) { | |
374 EXPECT_EQ(kOK, | |
375 ExecuteJavascriptAndReturnResult( | |
376 GenerateGetUserMediaWithOptionalSourceID( | |
377 kGetUserMediaAndStop, audio_ids[i], video_ids[j]))); | |
378 } | |
379 } | |
380 } | |
381 | |
382 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, | |
383 GetUserMediaWithInvalidOptionalSourceID) { | |
384 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
385 | |
386 std::vector<std::string> audio_ids; | |
387 std::vector<std::string> video_ids; | |
388 GetSources(&audio_ids, &video_ids); | |
389 | |
390 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
391 | |
392 // Test with invalid optional audio sourceID. | |
393 NavigateToURL(shell(), url); | |
394 EXPECT_EQ( | |
395 kOK, | |
396 ExecuteJavascriptAndReturnResult(GenerateGetUserMediaWithOptionalSourceID( | |
397 kGetUserMediaAndStop, "something invalid", video_ids[0]))); | |
398 | |
399 // Test with invalid optional video sourceID. | |
400 EXPECT_EQ( | |
401 kOK, | |
402 ExecuteJavascriptAndReturnResult(GenerateGetUserMediaWithOptionalSourceID( | |
403 kGetUserMediaAndStop, audio_ids[0], "something invalid"))); | |
404 | |
405 // Test with empty optional audio sourceID. | |
406 EXPECT_EQ( | |
407 kOK, | |
408 ExecuteJavascriptAndReturnResult(GenerateGetUserMediaWithOptionalSourceID( | |
409 kGetUserMediaAndStop, "", video_ids[0]))); | |
410 } | |
411 | |
412 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 51 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
413 // Timing out on ARM linux bot: http://crbug.com/238490 | 52 // Timing out on ARM linux bot: http://crbug.com/238490 |
414 #define MAYBE_CanSetupVideoCall DISABLED_CanSetupVideoCall | 53 #define MAYBE_CanSetupVideoCall DISABLED_CanSetupVideoCall |
415 #else | 54 #else |
416 #define MAYBE_CanSetupVideoCall CanSetupVideoCall | 55 #define MAYBE_CanSetupVideoCall CanSetupVideoCall |
417 #endif | 56 #endif |
418 | 57 |
419 // These tests will make a complete PeerConnection-based call and verify that | 58 // These tests will make a complete PeerConnection-based call and verify that |
420 // video is playing for the call. | 59 // video is playing for the call. |
421 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, MAYBE_CanSetupVideoCall) { | 60 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, MAYBE_CanSetupVideoCall) { |
422 MakeTypicalPeerConnectionCall("call({video: true});"); | 61 MakeTypicalPeerConnectionCall("call({video: true});"); |
423 } | 62 } |
424 | 63 |
425 // This test will make a simple getUserMedia page, verify that video is playing | |
426 // in a simple local <video>, and for a couple of seconds, collect some | |
427 // performance traces. | |
428 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, TracePerformanceDuringGetUserMedia) { | |
429 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
430 | |
431 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
432 NavigateToURL(shell(), url); | |
433 // Put getUserMedia to work and let it run for a couple of seconds. | |
434 ASSERT_TRUE(ExecuteJavascript(base::StringPrintf( | |
435 "%s({video: true}, 10);", kGetUserMediaAndWaitAndStop))); | |
436 | |
437 // Make sure the stream is up and running, then start collecting traces. | |
438 ExpectTitle("Running..."); | |
439 StartTracing(); | |
440 | |
441 // Wait until the page title changes to "OK". Do not sleep() here since that | |
442 // would stop both this code and the browser underneath. | |
443 ExpectTitle("OK"); | |
444 StopTracing(); | |
445 | |
446 scoped_ptr<TraceAnalyzer> analyzer(CreateTraceAnalyzer()); | |
447 analyzer->AssociateBeginEndEvents(); | |
448 trace_analyzer::TraceEventVector events; | |
449 analyzer->FindEvents( | |
450 Query::EventNameIs("VideoCaptureController::OnIncomingCapturedFrame"), | |
451 &events); | |
452 ASSERT_GT(events.size(), 0u) | |
453 << "Could not collect any samples during test, this is bad"; | |
454 | |
455 std::string duration_us; | |
456 std::string interarrival_us; | |
457 for (size_t i = 0; i != events.size(); ++i) { | |
458 duration_us.append( | |
459 base::StringPrintf("%d,", static_cast<int>(events[i]->duration))); | |
460 } | |
461 | |
462 for (size_t i = 1; i < events.size(); ++i) { | |
463 interarrival_us.append(base::StringPrintf( | |
464 "%d,", | |
465 static_cast<int>(events[i]->timestamp - events[i - 1]->timestamp))); | |
466 } | |
467 | |
468 perf_test::PrintResultList( | |
469 "video_capture", "", "sample_duration", duration_us, "us", true); | |
470 | |
471 perf_test::PrintResultList( | |
472 "video_capture", "", "interarrival_time", interarrival_us, "us", true); | |
473 } | |
474 | |
475 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 64 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
476 // Timing out on ARM linux, see http://crbug.com/240376 | 65 // Timing out on ARM linux, see http://crbug.com/240376 |
477 #define MAYBE_CanSetupAudioAndVideoCall DISABLED_CanSetupAudioAndVideoCall | 66 #define MAYBE_CanSetupAudioAndVideoCall DISABLED_CanSetupAudioAndVideoCall |
478 #else | 67 #else |
479 #define MAYBE_CanSetupAudioAndVideoCall CanSetupAudioAndVideoCall | 68 #define MAYBE_CanSetupAudioAndVideoCall CanSetupAudioAndVideoCall |
480 #endif | 69 #endif |
481 | 70 |
482 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, MAYBE_CanSetupAudioAndVideoCall) { | 71 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, MAYBE_CanSetupAudioAndVideoCall) { |
483 MakeTypicalPeerConnectionCall("call({video: true, audio: true});"); | 72 MakeTypicalPeerConnectionCall("call({video: true, audio: true});"); |
484 } | 73 } |
485 | 74 |
486 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, MANUAL_CanSetupCallAndSendDtmf) { | 75 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, MANUAL_CanSetupCallAndSendDtmf) { |
487 MakeTypicalPeerConnectionCall("callAndSendDtmf(\'123,abc\');"); | 76 MakeTypicalPeerConnectionCall("callAndSendDtmf(\'123,abc\');"); |
488 } | 77 } |
489 | 78 |
490 // TODO(phoglund): this test fails because the peer connection state will be | 79 // TODO(phoglund): this test fails because the peer connection state will be |
491 // stable in the second negotiation round rather than have-local-offer. | 80 // stable in the second negotiation round rather than have-local-offer. |
492 // http://crbug.com/293125. | 81 // http://crbug.com/293125. |
493 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, | 82 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, |
494 DISABLED_CanMakeEmptyCallThenAddStreamsAndRenegotiate) { | 83 DISABLED_CanMakeEmptyCallThenAddStreamsAndRenegotiate) { |
495 const char* kJavascript = | 84 const char* kJavascript = |
496 "callEmptyThenAddOneStreamAndRenegotiate({video: true, audio: true});"; | 85 "callEmptyThenAddOneStreamAndRenegotiate({video: true, audio: true});"; |
497 MakeTypicalPeerConnectionCall(kJavascript); | 86 MakeTypicalPeerConnectionCall(kJavascript); |
498 } | 87 } |
499 | 88 |
500 // Below 2 test will make a complete PeerConnection-based call between pc1 and | 89 // Below 2 test will make a complete PeerConnection-based call between pc1 and |
501 // pc2, and then use the remote stream to setup a call between pc3 and pc4, and | 90 // pc2, and then use the remote stream to setup a call between pc3 and pc4, and |
502 // then verify that video is received on pc3 and pc4. | 91 // then verify that video is received on pc3 and pc4. |
503 // Flaky on win xp. http://crbug.com/304775 | 92 // Flaky on win xp. http://crbug.com/304775 |
504 #if defined(OS_WIN) | 93 #if defined(OS_WIN) |
505 #define MAYBE_CanForwardRemoteStream DISABLED_CanForwardRemoteStream | 94 #define MAYBE_CanForwardRemoteStream DISABLED_CanForwardRemoteStream |
506 #define MAYBE_CanForwardRemoteStream720p DISABLED_CanForwardRemoteStream720p | 95 #define MAYBE_CanForwardRemoteStream720p DISABLED_CanForwardRemoteStream720p |
507 #else | 96 #else |
508 #define MAYBE_CanForwardRemoteStream CanForwardRemoteStream | 97 #define MAYBE_CanForwardRemoteStream CanForwardRemoteStream |
509 #define MAYBE_CanForwardRemoteStream720p CanForwardRemoteStream720p | 98 #define MAYBE_CanForwardRemoteStream720p CanForwardRemoteStream720p |
510 #endif | 99 #endif |
511 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, MAYBE_CanForwardRemoteStream) { | 100 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, MAYBE_CanForwardRemoteStream) { |
512 MakeTypicalPeerConnectionCall( | 101 MakeTypicalPeerConnectionCall( |
513 "callAndForwardRemoteStream({video: true, audio: true});"); | 102 "callAndForwardRemoteStream({video: true, audio: true});"); |
514 } | 103 } |
515 | 104 |
516 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, MAYBE_CanForwardRemoteStream720p) { | 105 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, MAYBE_CanForwardRemoteStream720p) { |
517 const std::string javascript = GenerateGetUserMediaCall( | 106 const std::string javascript = GenerateGetUserMediaCall( |
518 "callAndForwardRemoteStream", 1280, 1280, 720, 720, 30, 30); | 107 "callAndForwardRemoteStream", 1280, 1280, 720, 720, 30, 30); |
519 MakeTypicalPeerConnectionCall(javascript); | 108 MakeTypicalPeerConnectionCall(javascript); |
520 } | 109 } |
521 | 110 |
522 // This test will make a complete PeerConnection-based call but remove the | 111 // This test will make a complete PeerConnection-based call but remove the |
523 // MSID and bundle attribute from the initial offer to verify that | 112 // MSID and bundle attribute from the initial offer to verify that |
524 // video is playing for the call even if the initiating client don't support | 113 // video is playing for the call even if the initiating client don't support |
525 // MSID. http://tools.ietf.org/html/draft-alvestrand-rtcweb-msid-02 | 114 // MSID. http://tools.ietf.org/html/draft-alvestrand-rtcweb-msid-02 |
526 #if defined(OS_WIN) | 115 #if defined(OS_WIN) |
527 // Disabled for win, see http://crbug.com/235089. | 116 // Disabled for win, see http://crbug.com/235089. |
528 #define MAYBE_CanSetupAudioAndVideoCallWithoutMsidAndBundle\ | 117 #define MAYBE_CanSetupAudioAndVideoCallWithoutMsidAndBundle\ |
529 DISABLED_CanSetupAudioAndVideoCallWithoutMsidAndBundle | 118 DISABLED_CanSetupAudioAndVideoCallWithoutMsidAndBundle |
530 #elif defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 119 #elif defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
531 // Timing out on ARM linux, see http://crbug.com/240373 | 120 // Timing out on ARM linux, see http://crbug.com/240373 |
532 #define MAYBE_CanSetupAudioAndVideoCallWithoutMsidAndBundle\ | 121 #define MAYBE_CanSetupAudioAndVideoCallWithoutMsidAndBundle\ |
533 DISABLED_CanSetupAudioAndVideoCallWithoutMsidAndBundle | 122 DISABLED_CanSetupAudioAndVideoCallWithoutMsidAndBundle |
534 #else | 123 #else |
535 #define MAYBE_CanSetupAudioAndVideoCallWithoutMsidAndBundle\ | 124 #define MAYBE_CanSetupAudioAndVideoCallWithoutMsidAndBundle\ |
536 CanSetupAudioAndVideoCallWithoutMsidAndBundle | 125 CanSetupAudioAndVideoCallWithoutMsidAndBundle |
537 #endif | 126 #endif |
538 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, | 127 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, |
539 MAYBE_CanSetupAudioAndVideoCallWithoutMsidAndBundle) { | 128 MAYBE_CanSetupAudioAndVideoCallWithoutMsidAndBundle) { |
540 MakeTypicalPeerConnectionCall("callWithoutMsidAndBundle();"); | 129 MakeTypicalPeerConnectionCall("callWithoutMsidAndBundle();"); |
541 } | 130 } |
542 | 131 |
543 // This test will modify the SDP offer to an unsupported codec, which should | 132 // This test will modify the SDP offer to an unsupported codec, which should |
544 // cause SetLocalDescription to fail. | 133 // cause SetLocalDescription to fail. |
545 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, NegotiateUnsupportedVideoCodec) { | 134 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, NegotiateUnsupportedVideoCodec) { |
546 MakeTypicalPeerConnectionCall("negotiateUnsupportedVideoCodec();"); | 135 MakeTypicalPeerConnectionCall("negotiateUnsupportedVideoCodec();"); |
547 } | 136 } |
548 | 137 |
549 // This test will modify the SDP offer to use no encryption, which should | 138 // This test will modify the SDP offer to use no encryption, which should |
550 // cause SetLocalDescription to fail. | 139 // cause SetLocalDescription to fail. |
551 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, NegotiateNonCryptoCall) { | 140 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, NegotiateNonCryptoCall) { |
552 MakeTypicalPeerConnectionCall("negotiateNonCryptoCall();"); | 141 MakeTypicalPeerConnectionCall("negotiateNonCryptoCall();"); |
553 } | 142 } |
554 | 143 |
555 // This test can negotiate an SDP offer that includes a b=AS:xx to control | 144 // This test can negotiate an SDP offer that includes a b=AS:xx to control |
556 // the bandwidth for audio and video | 145 // the bandwidth for audio and video |
557 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, NegotiateOfferWithBLine) { | 146 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, NegotiateOfferWithBLine) { |
558 MakeTypicalPeerConnectionCall("negotiateOfferWithBLine();"); | 147 MakeTypicalPeerConnectionCall("negotiateOfferWithBLine();"); |
559 } | 148 } |
560 | 149 |
561 // This test will make a complete PeerConnection-based call using legacy SDP | 150 // This test will make a complete PeerConnection-based call using legacy SDP |
562 // settings: GIce, external SDES, and no BUNDLE. | 151 // settings: GIce, external SDES, and no BUNDLE. |
563 #if defined(OS_WIN) | 152 #if defined(OS_WIN) |
564 // Disabled for win7, see http://crbug.com/235089. | 153 // Disabled for win7, see http://crbug.com/235089. |
565 #define MAYBE_CanSetupLegacyCall DISABLED_CanSetupLegacyCall | 154 #define MAYBE_CanSetupLegacyCall DISABLED_CanSetupLegacyCall |
566 #elif defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 155 #elif defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
567 // Timing out on ARM linux, see http://crbug.com/240373 | 156 // Timing out on ARM linux, see http://crbug.com/240373 |
568 #define MAYBE_CanSetupLegacyCall DISABLED_CanSetupLegacyCall | 157 #define MAYBE_CanSetupLegacyCall DISABLED_CanSetupLegacyCall |
569 #else | 158 #else |
570 #define MAYBE_CanSetupLegacyCall CanSetupLegacyCall | 159 #define MAYBE_CanSetupLegacyCall CanSetupLegacyCall |
571 #endif | 160 #endif |
572 | 161 |
573 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, MAYBE_CanSetupLegacyCall) { | 162 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, MAYBE_CanSetupLegacyCall) { |
574 MakeTypicalPeerConnectionCall("callWithLegacySdp();"); | 163 MakeTypicalPeerConnectionCall("callWithLegacySdp();"); |
575 } | 164 } |
576 | 165 |
577 // This test will make a PeerConnection-based call and test an unreliable text | 166 // This test will make a PeerConnection-based call and test an unreliable text |
578 // dataChannel. | 167 // dataChannel. |
579 // TODO(mallinath) - Remove this test after rtp based data channel is disabled. | 168 // TODO(mallinath) - Remove this test after rtp based data channel is disabled. |
580 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, CallWithDataOnly) { | 169 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, CallWithDataOnly) { |
581 MakeTypicalPeerConnectionCall("callWithDataOnly();"); | 170 MakeTypicalPeerConnectionCall("callWithDataOnly();"); |
582 } | 171 } |
583 | 172 |
584 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, CallWithSctpDataOnly) { | 173 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, CallWithSctpDataOnly) { |
585 MakeTypicalPeerConnectionCall("callWithSctpDataOnly();"); | 174 MakeTypicalPeerConnectionCall("callWithSctpDataOnly();"); |
586 } | 175 } |
587 | 176 |
588 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 177 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
589 // Timing out on ARM linux bot: http://crbug.com/238490 | 178 // Timing out on ARM linux bot: http://crbug.com/238490 |
590 #define MAYBE_CallWithDataAndMedia DISABLED_CallWithDataAndMedia | 179 #define MAYBE_CallWithDataAndMedia DISABLED_CallWithDataAndMedia |
591 #else | 180 #else |
592 #define MAYBE_CallWithDataAndMedia CallWithDataAndMedia | 181 #define MAYBE_CallWithDataAndMedia CallWithDataAndMedia |
593 #endif | 182 #endif |
594 | 183 |
595 // This test will make a PeerConnection-based call and test an unreliable text | 184 // This test will make a PeerConnection-based call and test an unreliable text |
596 // dataChannel and audio and video tracks. | 185 // dataChannel and audio and video tracks. |
597 // TODO(mallinath) - Remove this test after rtp based data channel is disabled. | 186 // TODO(mallinath) - Remove this test after rtp based data channel is disabled. |
598 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, MAYBE_CallWithDataAndMedia) { | 187 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, MAYBE_CallWithDataAndMedia) { |
599 MakeTypicalPeerConnectionCall("callWithDataAndMedia();"); | 188 MakeTypicalPeerConnectionCall("callWithDataAndMedia();"); |
600 } | 189 } |
601 | 190 |
602 | 191 |
603 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 192 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
604 // Timing out on ARM linux bot: http://crbug.com/238490 | 193 // Timing out on ARM linux bot: http://crbug.com/238490 |
605 #define MAYBE_CallWithSctpDataAndMedia DISABLED_CallWithSctpDataAndMedia | 194 #define MAYBE_CallWithSctpDataAndMedia DISABLED_CallWithSctpDataAndMedia |
606 #else | 195 #else |
607 #define MAYBE_CallWithSctpDataAndMedia CallWithSctpDataAndMedia | 196 #define MAYBE_CallWithSctpDataAndMedia CallWithSctpDataAndMedia |
608 #endif | 197 #endif |
609 | 198 |
610 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, | 199 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, |
611 MAYBE_CallWithSctpDataAndMedia) { | 200 MAYBE_CallWithSctpDataAndMedia) { |
612 MakeTypicalPeerConnectionCall("callWithSctpDataAndMedia();"); | 201 MakeTypicalPeerConnectionCall("callWithSctpDataAndMedia();"); |
613 } | 202 } |
614 | 203 |
615 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 204 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
616 // Timing out on ARM linux bot: http://crbug.com/238490 | 205 // Timing out on ARM linux bot: http://crbug.com/238490 |
617 #define MAYBE_CallWithDataAndLaterAddMedia DISABLED_CallWithDataAndLaterAddMedia | 206 #define MAYBE_CallWithDataAndLaterAddMedia DISABLED_CallWithDataAndLaterAddMedia |
618 #else | 207 #else |
619 // Temporarily disable the test on all platforms. http://crbug.com/293252 | 208 // Temporarily disable the test on all platforms. http://crbug.com/293252 |
620 #define MAYBE_CallWithDataAndLaterAddMedia DISABLED_CallWithDataAndLaterAddMedia | 209 #define MAYBE_CallWithDataAndLaterAddMedia DISABLED_CallWithDataAndLaterAddMedia |
621 #endif | 210 #endif |
622 | 211 |
623 // This test will make a PeerConnection-based call and test an unreliable text | 212 // This test will make a PeerConnection-based call and test an unreliable text |
624 // dataChannel and later add an audio and video track. | 213 // dataChannel and later add an audio and video track. |
625 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, MAYBE_CallWithDataAndLaterAddMedia) { | 214 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, MAYBE_CallWithDataAndLaterAddMedia) { |
626 MakeTypicalPeerConnectionCall("callWithDataAndLaterAddMedia();"); | 215 MakeTypicalPeerConnectionCall("callWithDataAndLaterAddMedia();"); |
627 } | 216 } |
628 | 217 |
629 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 218 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
630 // Timing out on ARM linux bot: http://crbug.com/238490 | 219 // Timing out on ARM linux bot: http://crbug.com/238490 |
631 #define MAYBE_CallWithNewVideoMediaStream DISABLED_CallWithNewVideoMediaStream | 220 #define MAYBE_CallWithNewVideoMediaStream DISABLED_CallWithNewVideoMediaStream |
632 #else | 221 #else |
633 #define MAYBE_CallWithNewVideoMediaStream CallWithNewVideoMediaStream | 222 #define MAYBE_CallWithNewVideoMediaStream CallWithNewVideoMediaStream |
634 #endif | 223 #endif |
635 | 224 |
636 // This test will make a PeerConnection-based call and send a new Video | 225 // This test will make a PeerConnection-based call and send a new Video |
637 // MediaStream that has been created based on a MediaStream created with | 226 // MediaStream that has been created based on a MediaStream created with |
638 // getUserMedia. | 227 // getUserMedia. |
639 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, MAYBE_CallWithNewVideoMediaStream) { | 228 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, MAYBE_CallWithNewVideoMediaStream) { |
640 MakeTypicalPeerConnectionCall("callWithNewVideoMediaStream();"); | 229 MakeTypicalPeerConnectionCall("callWithNewVideoMediaStream();"); |
641 } | 230 } |
642 | 231 |
643 // This test will make a PeerConnection-based call and send a new Video | 232 // This test will make a PeerConnection-based call and send a new Video |
644 // MediaStream that has been created based on a MediaStream created with | 233 // MediaStream that has been created based on a MediaStream created with |
645 // getUserMedia. When video is flowing, the VideoTrack is removed and an | 234 // getUserMedia. When video is flowing, the VideoTrack is removed and an |
646 // AudioTrack is added instead. | 235 // AudioTrack is added instead. |
647 // TODO(phoglund): This test is manual since not all buildbots has an audio | 236 // TODO(phoglund): This test is manual since not all buildbots has an audio |
648 // input. | 237 // input. |
649 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, MANUAL_CallAndModifyStream) { | 238 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, MANUAL_CallAndModifyStream) { |
650 MakeTypicalPeerConnectionCall( | 239 MakeTypicalPeerConnectionCall( |
651 "callWithNewVideoMediaStreamLaterSwitchToAudio();"); | 240 "callWithNewVideoMediaStreamLaterSwitchToAudio();"); |
652 } | 241 } |
653 | 242 |
654 namespace { | 243 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, AddTwoMediaStreamsToOnePC) { |
655 | |
656 struct UserMediaSizes { | |
657 int min_width; | |
658 int max_width; | |
659 int min_height; | |
660 int max_height; | |
661 int min_frame_rate; | |
662 int max_frame_rate; | |
663 }; | |
664 | |
665 } // namespace | |
666 | |
667 class WebrtcUserMediaBrowserTest | |
668 : public WebrtcBrowserTest, | |
669 public testing::WithParamInterface<UserMediaSizes> { | |
670 public: | |
671 WebrtcUserMediaBrowserTest() : user_media_(GetParam()) {} | |
672 const UserMediaSizes& user_media() const { return user_media_; } | |
673 | |
674 private: | |
675 UserMediaSizes user_media_; | |
676 }; | |
677 | |
678 // This test calls getUserMedia in sequence with different constraints. | |
679 IN_PROC_BROWSER_TEST_P(WebrtcUserMediaBrowserTest, GetUserMediaConstraints) { | |
680 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
681 | |
682 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
683 | |
684 std::string call = GenerateGetUserMediaCall(kGetUserMediaAndStop, | |
685 user_media().min_width, | |
686 user_media().max_width, | |
687 user_media().min_height, | |
688 user_media().max_height, | |
689 user_media().min_frame_rate, | |
690 user_media().max_frame_rate); | |
691 DVLOG(1) << "Calling getUserMedia: " << call; | |
692 NavigateToURL(shell(), url); | |
693 ASSERT_TRUE(ExecuteJavascript(call)); | |
694 ExpectTitle("OK"); | |
695 } | |
696 | |
697 static const UserMediaSizes kAllUserMediaSizes[] = { | |
698 {320, 320, 180, 180, 30, 30}, | |
699 {320, 320, 240, 240, 30, 30}, | |
700 {640, 640, 360, 360, 30, 30}, | |
701 {640, 640, 480, 480, 30, 30}, | |
702 {960, 960, 720, 720, 30, 30}, | |
703 {1280, 1280, 720, 720, 30, 30}, | |
704 {1920, 1920, 1080, 1080, 30, 30}}; | |
705 | |
706 INSTANTIATE_TEST_CASE_P(UserMedia, | |
707 WebrtcUserMediaBrowserTest, | |
708 testing::ValuesIn(kAllUserMediaSizes)); | |
709 | |
710 // This test calls getUserMedia and checks for aspect ratio behavior. | |
711 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, TestGetUserMediaAspectRatio) { | |
712 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
713 | |
714 GURL url(embedded_test_server()->GetURL("/media/getusermedia.html")); | |
715 | |
716 std::string constraints_4_3 = GenerateGetUserMediaCall( | |
717 kGetUserMediaAndAnalyseAndStop, 640, 640, 480, 480, 30, 30); | |
718 std::string constraints_16_9 = GenerateGetUserMediaCall( | |
719 kGetUserMediaAndAnalyseAndStop, 640, 640, 360, 360, 30, 30); | |
720 | |
721 // TODO(mcasas): add more aspect ratios, in particular 16:10 crbug.com/275594. | |
722 | |
723 NavigateToURL(shell(), url); | |
724 ASSERT_TRUE(ExecuteJavascript(constraints_4_3)); | |
725 ExpectTitle("4:3 letterbox"); | |
726 | |
727 NavigateToURL(shell(), url); | |
728 ASSERT_TRUE(ExecuteJavascript(constraints_16_9)); | |
729 ExpectTitle("16:9 letterbox"); | |
730 } | |
731 | |
732 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, AddTwoMediaStreamsToOnePC) { | |
733 MakeTypicalPeerConnectionCall("addTwoMediaStreamsToOneConnection();"); | 244 MakeTypicalPeerConnectionCall("addTwoMediaStreamsToOneConnection();"); |
734 } | 245 } |
735 | 246 |
736 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, | 247 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, |
737 EstablishAudioVideoCallAndMeasureOutputLevel) { | 248 EstablishAudioVideoCallAndMeasureOutputLevel) { |
738 if (!media::AudioManager::Get()->HasAudioOutputDevices()) { | 249 if (!media::AudioManager::Get()->HasAudioOutputDevices()) { |
739 // Bots with no output devices will force the audio code into a different | 250 // Bots with no output devices will force the audio code into a different |
740 // path where it doesn't manage to set either the low or high latency path. | 251 // path where it doesn't manage to set either the low or high latency path. |
741 // This test will compute useless values in that case, so skip running on | 252 // This test will compute useless values in that case, so skip running on |
742 // such bots (see crbug.com/326338). | 253 // such bots (see crbug.com/326338). |
743 LOG(INFO) << "Missing output devices: skipping test..."; | 254 LOG(INFO) << "Missing output devices: skipping test..."; |
744 return; | 255 return; |
745 } | 256 } |
746 | 257 |
747 ASSERT_TRUE(CommandLine::ForCurrentProcess()->HasSwitch( | 258 ASSERT_TRUE(CommandLine::ForCurrentProcess()->HasSwitch( |
748 switches::kUseFakeDeviceForMediaStream)) | 259 switches::kUseFakeDeviceForMediaStream)) |
749 << "Must run with fake devices since the test will explicitly look " | 260 << "Must run with fake devices since the test will explicitly look " |
750 << "for the fake device signal."; | 261 << "for the fake device signal."; |
751 | 262 |
752 MakeTypicalPeerConnectionCall("callAndEnsureAudioIsPlaying();"); | 263 MakeTypicalPeerConnectionCall("callAndEnsureAudioIsPlaying();"); |
753 } | 264 } |
754 | 265 |
755 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, | 266 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, |
756 EstablishAudioVideoCallAndVerifyMutingWorks) { | 267 EstablishAudioVideoCallAndVerifyMutingWorks) { |
757 if (!media::AudioManager::Get()->HasAudioOutputDevices()) { | 268 if (!media::AudioManager::Get()->HasAudioOutputDevices()) { |
758 // Bots with no output devices will force the audio code into a different | 269 // Bots with no output devices will force the audio code into a different |
759 // path where it doesn't manage to set either the low or high latency path. | 270 // path where it doesn't manage to set either the low or high latency path. |
760 // This test will compute useless values in that case, so skip running on | 271 // This test will compute useless values in that case, so skip running on |
761 // such bots (see crbug.com/326338). | 272 // such bots (see crbug.com/326338). |
762 LOG(INFO) << "Missing output devices: skipping test..."; | 273 LOG(INFO) << "Missing output devices: skipping test..."; |
763 return; | 274 return; |
764 } | 275 } |
765 | 276 |
766 ASSERT_TRUE(CommandLine::ForCurrentProcess()->HasSwitch( | 277 ASSERT_TRUE(CommandLine::ForCurrentProcess()->HasSwitch( |
767 switches::kUseFakeDeviceForMediaStream)) | 278 switches::kUseFakeDeviceForMediaStream)) |
768 << "Must run with fake devices since the test will explicitly look " | 279 << "Must run with fake devices since the test will explicitly look " |
769 << "for the fake device signal."; | 280 << "for the fake device signal."; |
770 | 281 |
771 MakeTypicalPeerConnectionCall("callAndEnsureAudioMutingWorks();"); | 282 MakeTypicalPeerConnectionCall("callAndEnsureAudioMutingWorks();"); |
772 } | 283 } |
773 | 284 |
774 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, CallAndVerifyVideoMutingWorks) { | 285 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, CallAndVerifyVideoMutingWorks) { |
775 MakeTypicalPeerConnectionCall("callAndEnsureVideoMutingWorks();"); | 286 MakeTypicalPeerConnectionCall("callAndEnsureVideoMutingWorks();"); |
776 } | 287 } |
777 | 288 |
778 #if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(AR
CH_CPU_ARM_FAMILY)) | 289 #if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(AR
CH_CPU_ARM_FAMILY)) |
779 // Timing out on ARM linux bot: http://crbug.com/238490 | 290 // Timing out on ARM linux bot: http://crbug.com/238490 |
780 // Failing on Windows: http://crbug.com/331035 | 291 // Failing on Windows: http://crbug.com/331035 |
781 #define MAYBE_CallWithAecDump DISABLED_CallWithAecDump | 292 #define MAYBE_CallWithAecDump DISABLED_CallWithAecDump |
782 #else | 293 #else |
783 #define MAYBE_CallWithAecDump CallWithAecDump | 294 #define MAYBE_CallWithAecDump CallWithAecDump |
784 #endif | 295 #endif |
785 | 296 |
786 // This tests will make a complete PeerConnection-based call, verify that | 297 // This tests will make a complete PeerConnection-based call, verify that |
787 // video is playing for the call, and verify that a non-empty AEC dump file | 298 // video is playing for the call, and verify that a non-empty AEC dump file |
788 // exists. The AEC dump is enabled through webrtc-internals, in contrast to | 299 // exists. The AEC dump is enabled through webrtc-internals, in contrast to |
789 // using a command line flag (tested in webrtc_aecdump_browsertest.cc). The HTML | 300 // using a command line flag (tested in webrtc_aecdump_browsertest.cc). The HTML |
790 // and Javascript is bypassed since it would trigger a file picker dialog. | 301 // and Javascript is bypassed since it would trigger a file picker dialog. |
791 // Instead, the dialog callback FileSelected() is invoked directly. In fact, | 302 // Instead, the dialog callback FileSelected() is invoked directly. In fact, |
792 // there's never a webrtc-internals page opened at all since that's not needed. | 303 // there's never a webrtc-internals page opened at all since that's not needed. |
793 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, MAYBE_CallWithAecDump) { | 304 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, MAYBE_CallWithAecDump) { |
794 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 305 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
795 | 306 |
796 // We must navigate somewhere first so that the render process is created. | 307 // We must navigate somewhere first so that the render process is created. |
797 NavigateToURL(shell(), GURL("")); | 308 NavigateToURL(shell(), GURL("")); |
798 | 309 |
799 base::FilePath dump_file; | 310 base::FilePath dump_file; |
800 ASSERT_TRUE(CreateTemporaryFile(&dump_file)); | 311 ASSERT_TRUE(CreateTemporaryFile(&dump_file)); |
801 | 312 |
802 // This fakes the behavior of another open tab with webrtc-internals, and | 313 // This fakes the behavior of another open tab with webrtc-internals, and |
803 // enabling AEC dump in that tab. | 314 // enabling AEC dump in that tab. |
(...skipping 13 matching lines...) Expand all Loading... |
817 | 328 |
818 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 329 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
819 // Timing out on ARM linux bot: http://crbug.com/238490 | 330 // Timing out on ARM linux bot: http://crbug.com/238490 |
820 #define MAYBE_CallWithAecDumpEnabledThenDisabled DISABLED_CallWithAecDumpEnabled
ThenDisabled | 331 #define MAYBE_CallWithAecDumpEnabledThenDisabled DISABLED_CallWithAecDumpEnabled
ThenDisabled |
821 #else | 332 #else |
822 #define MAYBE_CallWithAecDumpEnabledThenDisabled CallWithAecDumpEnabledThenDisab
led | 333 #define MAYBE_CallWithAecDumpEnabledThenDisabled CallWithAecDumpEnabledThenDisab
led |
823 #endif | 334 #endif |
824 | 335 |
825 // As above, but enable and disable dump before starting a call. The file should | 336 // As above, but enable and disable dump before starting a call. The file should |
826 // be created, but should be empty. | 337 // be created, but should be empty. |
827 IN_PROC_BROWSER_TEST_F(WebrtcBrowserTest, | 338 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, |
828 MAYBE_CallWithAecDumpEnabledThenDisabled) { | 339 MAYBE_CallWithAecDumpEnabledThenDisabled) { |
829 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 340 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
830 | 341 |
831 // We must navigate somewhere first so that the render process is created. | 342 // We must navigate somewhere first so that the render process is created. |
832 NavigateToURL(shell(), GURL("")); | 343 NavigateToURL(shell(), GURL("")); |
833 | 344 |
834 base::FilePath dump_file; | 345 base::FilePath dump_file; |
835 ASSERT_TRUE(CreateTemporaryFile(&dump_file)); | 346 ASSERT_TRUE(CreateTemporaryFile(&dump_file)); |
836 | 347 |
837 // This fakes the behavior of another open tab with webrtc-internals, and | 348 // This fakes the behavior of another open tab with webrtc-internals, and |
838 // enabling AEC dump in that tab, then disabling it. | 349 // enabling AEC dump in that tab, then disabling it. |
839 WebRTCInternals::GetInstance()->FileSelected(dump_file, -1, NULL); | 350 WebRTCInternals::GetInstance()->FileSelected(dump_file, -1, NULL); |
840 WebRTCInternals::GetInstance()->DisableAecDump(); | 351 WebRTCInternals::GetInstance()->DisableAecDump(); |
841 | 352 |
842 GURL url(embedded_test_server()->GetURL("/media/peerconnection-call.html")); | 353 GURL url(embedded_test_server()->GetURL("/media/peerconnection-call.html")); |
843 NavigateToURL(shell(), url); | 354 NavigateToURL(shell(), url); |
844 ExecuteTestAndWaitForOk("call({video: true, audio: true});"); | 355 ExecuteTestAndWaitForOk("call({video: true, audio: true});"); |
845 | 356 |
846 EXPECT_TRUE(base::PathExists(dump_file)); | 357 EXPECT_TRUE(base::PathExists(dump_file)); |
847 int64 file_size = 0; | 358 int64 file_size = 0; |
848 EXPECT_TRUE(base::GetFileSize(dump_file, &file_size)); | 359 EXPECT_TRUE(base::GetFileSize(dump_file, &file_size)); |
849 EXPECT_EQ(0, file_size); | 360 EXPECT_EQ(0, file_size); |
850 | 361 |
851 base::DeleteFile(dump_file, false); | 362 base::DeleteFile(dump_file, false); |
852 } | 363 } |
853 | 364 |
854 | |
855 } // namespace content | 365 } // namespace content |
OLD | NEW |