namespace content {
-class WebRtcGetUserMediaBrowserTest: public WebRtcContentBrowserTest,
- public testing::WithParamInterface<bool> {
+class WebRtcGetUserMediaBrowserTest: public WebRtcContentBrowserTest {
public:
WebRtcGetUserMediaBrowserTest() : trace_log_(NULL) {}
- virtual ~WebRtcGetUserMediaBrowserTest() {}
-
- virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
- WebRtcContentBrowserTest::SetUpCommandLine(command_line);
-
- bool enable_audio_track_processing = GetParam();
- if (enable_audio_track_processing)
- command_line->AppendSwitch(switches::kEnableAudioTrackProcessing);
- }
+ ~WebRtcGetUserMediaBrowserTest() override {}
void StartTracing() {
CHECK(trace_log_ == NULL) << "Can only can start tracing once";
trace_log_ = base::debug::TraceLog::GetInstance();
+ base::debug::TraceOptions trace_options(base::debug::RECORD_UNTIL_FULL);
+ trace_options.enable_sampling = true;
trace_log_->SetEnabled(base::debug::CategoryFilter("video"),
base::debug::TraceLog::RECORDING_MODE,
- base::debug::TraceLog::ENABLE_SAMPLING);
+ trace_options);
// Check that we are indeed recording.
EXPECT_EQ(trace_log_->GetNumTracesRecorded(), 1);
}
void StopTracing() {
- CHECK(message_loop_runner_ == NULL) << "Calling StopTracing more than once";
+ CHECK(message_loop_runner_.get() == NULL)
+ << "Calling StopTracing more than once";
trace_log_->SetDisabled();
message_loop_runner_ = new MessageLoopRunner;
trace_log_->Flush(base::Bind(
// Put getUserMedia to work and let it run for a couple of seconds.
DCHECK(time_to_sample_secs);
ExecuteJavascriptAndWaitForOk(
- base::StringPrintf("%s({video: true});",
+ base::StringPrintf("%s({video: true}, 'myStreamName');",
kGetUserMediaAndGetStreamUp));
// Now the stream is up and running, start collecting traces.
StartTracing();
- // Let the stream run for a while in javascript.
ExecuteJavascriptAndWaitForOk(
- base::StringPrintf("waitAndStopVideoTrack(%d);", time_to_sample_secs));
+ base::StringPrintf("waitAndStopVideoTrack(window['myStreamName'], %d);",
+ time_to_sample_secs));
// Wait until the page title changes to "OK". Do not sleep() here since that
// would stop both this code and the browser underneath.
graph_name, "", "interarrival_time", interarrival_us, "us", true);
}
- void GetSources(std::vector<std::string>* audio_ids,
- std::vector<std::string>* video_ids) {
+ // Runs the JavaScript twoGetUserMedia with |constraints1| and |constraint2|.
+ void RunTwoGetTwoGetUserMediaWithDifferentContraints(
+ const std::string& constraints1,
+ const std::string& constraints2,
+ const std::string& expected_result) {
+ ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
+
GURL url(embedded_test_server()->GetURL("/media/getusermedia.html"));
NavigateToURL(shell(), url);
- std::string sources_as_json = ExecuteJavascriptAndReturnResult(
+ std::string command = "twoGetUserMedia(" + constraints1 + ',' +
+ constraints2 + ')';
+
+ EXPECT_EQ(expected_result, ExecuteJavascriptAndReturnResult(command));
+ }
+
+ void GetInputDevices(std::vector<std::string>* audio_ids,
+ std::vector<std::string>* video_ids) {
+ GURL url(embedded_test_server()->GetURL("/media/getusermedia.html"));
+ NavigateToURL(shell(), url);
+
+ std::string devices_as_json = ExecuteJavascriptAndReturnResult(
"getSources()");
- EXPECT_FALSE(sources_as_json.empty());
+ EXPECT_FALSE(devices_as_json.empty());
int error_code;
std::string error_message;
scoped_ptr<base::Value> value(
- base::JSONReader::ReadAndReturnError(sources_as_json,
+ base::JSONReader::ReadAndReturnError(devices_as_json,
base::JSON_ALLOW_TRAILING_COMMAS,
&error_code,
&error_message));
it != values->end(); ++it) {
const base::DictionaryValue* dict;
std::string kind;
- std::string id;
+ std::string device_id;
ASSERT_TRUE((*it)->GetAsDictionary(&dict));
ASSERT_TRUE(dict->GetString("kind", &kind));
- ASSERT_TRUE(dict->GetString("id", &id));
- ASSERT_FALSE(id.empty());
+ ASSERT_TRUE(dict->GetString("id", &device_id));
+ ASSERT_FALSE(device_id.empty());
EXPECT_TRUE(kind == "audio" || kind == "video");
if (kind == "audio") {
- audio_ids->push_back(id);
+ audio_ids->push_back(device_id);
} else if (kind == "video") {
- video_ids->push_back(id);
+ video_ids->push_back(device_id);
}
}
ASSERT_FALSE(audio_ids->empty());
scoped_refptr<MessageLoopRunner> message_loop_runner_;
};
-static const bool kRunTestsWithFlag[] = { false, true };
-INSTANTIATE_TEST_CASE_P(WebRtcGetUserMediaBrowserTests,
- WebRtcGetUserMediaBrowserTest,
- testing::ValuesIn(kRunTestsWithFlag));
-
// These tests will all make a getUserMedia call with different constraints and
// see that the success callback is called. If the error callback is called or
// none of the callbacks are called the tests will simply time out and fail.
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest, GetVideoStreamAndStop) {
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest, GetVideoStreamAndStop) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
GURL url(embedded_test_server()->GetURL("/media/getusermedia.html"));
base::StringPrintf("%s({video: true});", kGetUserMediaAndStop));
}
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
RenderSameTrackMediastreamAndStop) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
kRenderSameTrackMediastreamAndStop));
}
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
RenderClonedMediastreamAndStop) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
kRenderClonedMediastreamAndStop));
}
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
kRenderClonedTrackMediastreamAndStop) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
kRenderClonedTrackMediastreamAndStop));
}
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
kRenderDuplicatedMediastreamAndStop) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
kRenderDuplicatedMediastreamAndStop));
}
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
GetAudioAndVideoStreamAndStop) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
"%s({video: true, audio: true});", kGetUserMediaAndStop));
}
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
GetAudioAndVideoStreamAndClone) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
ExecuteJavascriptAndWaitForOk("getUserMediaAndClone();");
}
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
RenderVideoTrackInMultipleTagsAndPause) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
GetUserMediaWithMandatorySourceID) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
std::vector<std::string> audio_ids;
std::vector<std::string> video_ids;
- GetSources(&audio_ids, &video_ids);
+ GetInputDevices(&audio_ids, &video_ids);
GURL url(embedded_test_server()->GetURL("/media/getusermedia.html"));
}
}
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
GetUserMediaWithInvalidMandatorySourceID) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
std::vector<std::string> audio_ids;
std::vector<std::string> video_ids;
- GetSources(&audio_ids, &video_ids);
+ GetInputDevices(&audio_ids, &video_ids);
GURL url(embedded_test_server()->GetURL("/media/getusermedia.html"));
video_ids[0])));
}
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
GetUserMediaWithInvalidOptionalSourceID) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
std::vector<std::string> audio_ids;
std::vector<std::string> video_ids;
- GetSources(&audio_ids, &video_ids);
+ GetInputDevices(&audio_ids, &video_ids);
GURL url(embedded_test_server()->GetURL("/media/getusermedia.html"));
video_ids[0])));
}
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest, TwoGetUserMediaAndStop) {
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest, TwoGetUserMediaAndStop) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
GURL url(embedded_test_server()->GetURL("/media/getusermedia.html"));
"twoGetUserMediaAndStop({video: true, audio: true});");
}
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
+ TwoGetUserMediaWithEqualConstraints) {
+ std::string constraints1 = "{video: true, audio: true}";
+ const std::string& constraints2 = constraints1;
+ std::string expected_result = "w=640:h=480-w=640:h=480";
+
+ RunTwoGetTwoGetUserMediaWithDifferentContraints(constraints1, constraints2,
+ expected_result);
+}
+
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
+ TwoGetUserMediaWithSecondVideoCropped) {
+ std::string constraints1 = "{video: true}";
+ std::string constraints2 = "{video: {mandatory: {maxHeight: 360}}}";
+ std::string expected_result = "w=640:h=480-w=640:h=360";
+ RunTwoGetTwoGetUserMediaWithDifferentContraints(constraints1, constraints2,
+ expected_result);
+}
+
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
+ TwoGetUserMediaWithFirstHdSecondVga) {
+ std::string constraints1 =
+ "{video: {mandatory: {minWidth:1280 , minHeight: 720}}}";
+ std::string constraints2 =
+ "{video: {mandatory: {maxWidth:640 , maxHeight: 480}}}";
+ std::string expected_result = "w=1280:h=720-w=640:h=480";
+ RunTwoGetTwoGetUserMediaWithDifferentContraints(constraints1, constraints2,
+ expected_result);
+}
+
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
+ TwoGetUserMediaAndVerifyFrameRate) {
+ ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
+
+ GURL url(embedded_test_server()->GetURL("/media/getusermedia.html"));
+ NavigateToURL(shell(), url);
+
+ std::string constraints1 =
+ "{video: {mandatory: {minWidth:640 , minHeight: 480, "
+ "minFrameRate : 15, maxFrameRate : 15}}}";
+ std::string constraints2 =
+ "{video: {mandatory: {maxWidth:320 , maxHeight: 240,"
+ "minFrameRate : 7, maxFrameRate : 7}}}";
+
+ std::string command = "twoGetUserMediaAndVerifyFrameRate(" +
+ constraints1 + ',' + constraints2 + ", 15, 7)";
+ ExecuteJavascriptAndWaitForOk(command);
+}
+
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
GetUserMediaWithTooHighVideoConstraintsValues) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
large_value);
NavigateToURL(shell(), url);
- // TODO(perkj): A proper error code should be returned by gUM.
- EXPECT_EQ("TrackStartError", ExecuteJavascriptAndReturnResult(call));
+ EXPECT_EQ("ConstraintNotSatisfiedError",
+ ExecuteJavascriptAndReturnResult(call));
+}
+
+// This test makes two getUserMedia requests, one with impossible constraints
+// that should trigger an error, and one with valid constraints. The test
+// verifies getUserMedia can succeed after being given impossible constraints.
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
+ TwoGetUserMediaAndCheckCallbackAfterFailure) {
+ ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
+
+ GURL url(embedded_test_server()->GetURL("/media/getusermedia.html"));
+ NavigateToURL(shell(), url);
+
+ int large_value = 99999;
+ const std::string gum_with_impossible_constraints =
+ GenerateGetUserMediaCall(kGetUserMediaAndExpectFailure,
+ large_value,
+ large_value,
+ large_value,
+ large_value,
+ large_value,
+ large_value);
+ const std::string gum_with_vga_constraints =
+ GenerateGetUserMediaCall(kGetUserMediaAndAnalyseAndStop,
+ 640, 640, 480, 480, 10, 30);
+
+ ASSERT_EQ("ConstraintNotSatisfiedError",
+ ExecuteJavascriptAndReturnResult(gum_with_impossible_constraints));
+
+ ASSERT_EQ("w=640:h=480",
+ ExecuteJavascriptAndReturnResult(gum_with_vga_constraints));
}
// This test will make a simple getUserMedia page, verify that video is playing
// in a simple local <video>, and for a couple of seconds, collect some
// performance traces from VideoCaptureController colorspace conversion and
// potential resizing.
-IN_PROC_BROWSER_TEST_P(
+IN_PROC_BROWSER_TEST_F(
WebRtcGetUserMediaBrowserTest,
TraceVideoCaptureControllerPerformanceDuringGetUserMedia) {
RunGetUserMediaAndCollectMeasures(
}
// This test calls getUserMedia and checks for aspect ratio behavior.
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
TestGetUserMediaAspectRatio4To3) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
}
// This test calls getUserMedia and checks for aspect ratio behavior.
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
TestGetUserMediaAspectRatio16To9) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
}
// This test calls getUserMedia and checks for aspect ratio behavior.
-IN_PROC_BROWSER_TEST_P(WebRtcGetUserMediaBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcGetUserMediaBrowserTest,
TestGetUserMediaAspectRatio1To1) {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());