1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/test/media_router/media_router_integration_browsertest.h"
7 #include "base/files/file_util.h"
8 #include "base/json/json_reader.h"
9 #include "base/path_service.h"
10 #include "base/strings/stringprintf.h"
11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/ui/browser_finder.h"
13 #include "chrome/browser/ui/tabs/tab_strip_model.h"
14 #include "chrome/browser/ui/webui/media_router/media_router_dialog_controller.h"
15 #include "chrome/test/base/ui_test_utils.h"
16 #include "content/public/test/browser_test_utils.h"
17 #include "content/public/test/test_navigation_observer.h"
18 #include "content/public/test/test_utils.h"
19 #include "net/base/filename_util.h"
20 #include "testing/gtest/include/gtest/gtest.h"
22 namespace media_router
{
24 MediaRouterIntegrationBrowserTest::MediaRouterIntegrationBrowserTest() {
27 MediaRouterIntegrationBrowserTest::~MediaRouterIntegrationBrowserTest() {
30 void MediaRouterIntegrationBrowserTest::ExecuteJavaScriptAPI(
31 content::WebContents
* web_contents
,
32 const std::string
& script
) {
36 content::ExecuteScriptAndExtractString(web_contents
, script
, &result
));
38 // Read the test result, the test result set by javascript is a
39 // JSON string with the following format:
40 // {"passed": "<true/false>", "errorMessage": "<error_message>"}
41 scoped_ptr
<base::Value
> value
=
42 base::JSONReader::Read(result
, base::JSON_ALLOW_TRAILING_COMMAS
);
44 // Convert to dictionary.
45 base::DictionaryValue
* dict_value
= nullptr;
46 ASSERT_TRUE(value
->GetAsDictionary(&dict_value
));
48 // Extract the fields.
50 ASSERT_TRUE(dict_value
->GetBoolean("passed", &passed
));
51 std::string error_message
;
52 ASSERT_TRUE(dict_value
->GetString("errorMessage", &error_message
));
54 EXPECT_TRUE(passed
) << error_message
;
57 void MediaRouterIntegrationBrowserTest::OpenTestPage(
58 base::FilePath::StringPieceType file_name
) {
59 base::FilePath base_dir
;
60 ASSERT_TRUE(PathService::Get(base::DIR_EXE
, &base_dir
));
61 base::FilePath full_path
=
62 base_dir
.Append(FILE_PATH_LITERAL("media_router/browser_test_resources/"))
64 ASSERT_TRUE(PathExists(full_path
));
65 ui_test_utils::NavigateToURL(browser(), net::FilePathToFileURL(full_path
));
68 void MediaRouterIntegrationBrowserTest::ChooseSink(
69 content::WebContents
* web_contents
,
70 const std::string
& sink_id
) {
71 MediaRouterDialogController
* controller
=
72 MediaRouterDialogController::GetOrCreateForWebContents(web_contents
);
73 content::WebContents
* dialog_contents
= controller
->GetMediaRouterDialog();
74 ASSERT_TRUE(dialog_contents
);
75 std::string script
= base::StringPrintf(
76 "window.document.getElementById('media-router-container')."
77 "showOrCreateRoute_({'id': '%s', 'name': ''}, null)",
79 ASSERT_TRUE(content::ExecuteScript(dialog_contents
, script
));
82 IN_PROC_BROWSER_TEST_F(MediaRouterIntegrationBrowserTest
, MANUAL_Basic
) {
83 OpenTestPage(FILE_PATH_LITERAL("basic_test.html"));
84 content::WebContents
* web_contents
=
85 browser()->tab_strip_model()->GetActiveWebContents();
86 ASSERT_TRUE(web_contents
);
87 content::TestNavigationObserver
test_navigation_observer(web_contents
, 1);
88 test_navigation_observer
.StartWatchingNewWebContents();
89 ExecuteJavaScriptAPI(web_contents
, "startSession();");
90 test_navigation_observer
.Wait();
91 ChooseSink(web_contents
, "id1");
92 ExecuteJavaScriptAPI(web_contents
, "checkSession();");
93 Wait(base::TimeDelta::FromSeconds(5));
94 ExecuteJavaScriptAPI(web_contents
, "stopSession();");
97 } // namespace media_router