| Index: chrome/test/media_router/media_router_e2e_browsertest.cc
|
| diff --git a/chrome/test/media_router/media_router_e2e_browsertest.cc b/chrome/test/media_router/media_router_e2e_browsertest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..546d1194aa2f4de5327bee3466931dd653c65e1f
|
| --- /dev/null
|
| +++ b/chrome/test/media_router/media_router_e2e_browsertest.cc
|
| @@ -0,0 +1,150 @@
|
| +// Copyright 2015 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/test/media_router/media_router_e2e_browsertest.h"
|
| +
|
| +#include "base/command_line.h"
|
| +#include "base/stl_util.h"
|
| +#include "chrome/browser/media/router/media_router.h"
|
| +#include "chrome/browser/media/router/media_router_mojo_impl.h"
|
| +#include "chrome/browser/media/router/media_router_mojo_impl_factory.h"
|
| +#include "chrome/browser/media/router/media_source.h"
|
| +#include "chrome/browser/media/router/media_source_helper.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/sessions/session_tab_helper.h"
|
| +#include "chrome/browser/ui/browser_finder.h"
|
| +#include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| +#include "chrome/test/base/ui_test_utils.h"
|
| +#include "content/public/test/test_utils.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +// Use the following command to run e2e browser tests:
|
| +// ./out/Debug/browser_tests --user-data-dir=<empty user data dir> \
|
| +// --extension-unpacked=<mr extension dir> \
|
| +// --receiver=<chromecast device name> \
|
| +// --enable-pixel-output-in-tests --run-manual \
|
| +// --gtest_filter=MediaRouterE2EBrowserTest.<test case name> \
|
| +// --enable-logging=stderr \
|
| +// --whitelisted-extension-id=enhhojjnijigcajfphajepfemndkmdlo \
|
| +// --ui-test-action-timeout=200000 \
|
| +// --enable-media-router
|
| +
|
| +namespace {
|
| +// Command line argument to specify receiver,
|
| +const char kReceiver[] = "receiver";
|
| +// URL to launch Castv2Player_Staging app on Chromecast
|
| +const char kCastAppPresentationUrl[] =
|
| + "https://google.com/cast#__castAppId__=BE6E4473";
|
| +} // namespace
|
| +
|
| +namespace media_router {
|
| +
|
| +MediaRouterE2EBrowserTest::MediaRouterE2EBrowserTest()
|
| + : media_router_(nullptr) {
|
| +}
|
| +
|
| +MediaRouterE2EBrowserTest::~MediaRouterE2EBrowserTest() {
|
| +}
|
| +
|
| +void MediaRouterE2EBrowserTest::SetUpOnMainThread() {
|
| + MediaRouterBaseBrowserTest::SetUpOnMainThread();
|
| + media_router_ =
|
| + MediaRouterMojoImplFactory::GetApiForBrowserContext(browser()->profile());
|
| + DCHECK(media_router_);
|
| +}
|
| +
|
| +void MediaRouterE2EBrowserTest::TearDownOnMainThread() {
|
| + MediaRouterBaseBrowserTest::TearDownOnMainThread();
|
| + media_router_ = nullptr;
|
| +}
|
| +
|
| +void MediaRouterE2EBrowserTest::OnRouteResponseReceived(
|
| + scoped_ptr<MediaRoute> route,
|
| + const std::string& error) {
|
| + ASSERT_TRUE(route.get());
|
| + route_id_ = route->media_route_id();
|
| +}
|
| +
|
| +void MediaRouterE2EBrowserTest::CreateMediaRoute(const MediaSource& source) {
|
| + DCHECK(media_router_);
|
| + observer_.reset(new TestMediaSinksObserver(media_router_, source));
|
| +
|
| + DVLOG(1) << "Receiver name: " << receiver_;
|
| + // Wait for MediaSinks compatible with |source| to be discovered.
|
| + Wait(base::TimeDelta::FromSeconds(30), base::TimeDelta::FromSeconds(1),
|
| + base::Bind(&MediaRouterE2EBrowserTest::IsDeviceDiscoveried,
|
| + base::Unretained(this)));
|
| +
|
| + const auto& sink_map = observer_->sink_map;
|
| + const auto it = sink_map.find(receiver_);
|
| + const MediaSink& sink = it->second;
|
| +
|
| + // The callback will set route_id_ when invoked.
|
| + media_router_->CreateRoute(
|
| + source.id(), sink.id(),
|
| + base::Bind(&MediaRouterE2EBrowserTest::OnRouteResponseReceived,
|
| + base::Unretained(this)));
|
| +
|
| + // Wait for the route request to be fulfilled (and route to be started).
|
| + Wait(base::TimeDelta::FromSeconds(30), base::TimeDelta::FromSeconds(1),
|
| + base::Bind(&MediaRouterE2EBrowserTest::IsRouteCreated,
|
| + base::Unretained(this)));
|
| +}
|
| +
|
| +void MediaRouterE2EBrowserTest::StopMediaRoute() {
|
| + ASSERT_FALSE(route_id_.empty());
|
| +
|
| + media_router_->CloseRoute(route_id_);
|
| +
|
| + observer_.reset();
|
| + route_id_.clear();
|
| +}
|
| +
|
| +void MediaRouterE2EBrowserTest::ParseCommandLine() {
|
| + MediaRouterBaseBrowserTest::ParseCommandLine();
|
| + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
|
| +
|
| + receiver_ = command_line->GetSwitchValueASCII(kReceiver);
|
| + ASSERT_FALSE(receiver_.empty());
|
| +}
|
| +
|
| +bool MediaRouterE2EBrowserTest::IsDeviceDiscoveried() const {
|
| + return ContainsKey(observer_->sink_map, receiver_);
|
| +}
|
| +
|
| +bool MediaRouterE2EBrowserTest::IsRouteCreated() const {
|
| + return !route_id_.empty();
|
| +}
|
| +
|
| +// Test cases
|
| +
|
| +IN_PROC_BROWSER_TEST_F(MediaRouterE2EBrowserTest, MANUAL_TabMirroring) {
|
| + EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
|
| + EXPECT_EQ(1, browser()->tab_strip_model()->count());
|
| +
|
| + ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
|
| + browser(), GURL("chrome://extensions"), 1);
|
| + int tab_id = SessionTabHelper::IdForTab(
|
| + browser()->tab_strip_model()->GetActiveWebContents());
|
| +
|
| + // Wait for 30 seconds to make sure the route is stable.
|
| + CreateMediaRoute(MediaSourceForTab(tab_id));
|
| + Wait(base::TimeDelta::FromSeconds(30));
|
| +
|
| + // Wait for 10 seconds to make sure route has been stopped.
|
| + StopMediaRoute();
|
| + Wait(base::TimeDelta::FromSeconds(10));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(MediaRouterE2EBrowserTest, MANUAL_CastApp) {
|
| + // Wait for 30 seconds to make sure the route is stable.
|
| + CreateMediaRoute(MediaSourceForPresentationUrl(kCastAppPresentationUrl));
|
| + Wait(base::TimeDelta::FromSeconds(30));
|
| +
|
| + // Wait for 10 seconds to make sure route has been stopped.
|
| + StopMediaRoute();
|
| + Wait(base::TimeDelta::FromSeconds(10));
|
| +}
|
| +
|
| +} // namespace media_router
|
|
|