158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/media/media_browsertest.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/navigation_controller.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/navigation_entry.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/web_contents.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/base/test_data_util.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Common test results.
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char MediaBrowserTest::kEnded[] = "ENDED";
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char MediaBrowserTest::kError[] = "ERROR";
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char MediaBrowserTest::kFailed[] = "FAILED";
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char MediaBrowserTest::kPluginCrashed[] = "PLUGIN_CRASHED";
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochMediaBrowserTest::MediaBrowserTest() : ignore_plugin_crash_(false) {
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MediaBrowserTest::~MediaBrowserTest() {
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void MediaBrowserTest::RunMediaTestPage(const std::string& html_page,
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                        const media::QueryParams& query_params,
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                        const std::string& expected_title,
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                        bool http) {
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GURL gurl;
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string query = media::GetURLQueryString(query_params);
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<net::SpawnedTestServer> http_test_server;
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (http) {
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    http_test_server.reset(
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        new net::SpawnedTestServer(net::SpawnedTestServer::TYPE_HTTP,
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                   net::SpawnedTestServer::kLocalhost,
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                   media::GetTestDataPath()));
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CHECK(http_test_server->Start());
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    gurl = http_test_server->GetURL("files/" + html_page + "?" + query);
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  } else {
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    gurl = content::GetFileUrlWithQuery(media::GetTestDataFilePath(html_page),
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                        query);
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string final_title = RunTest(gurl, expected_title);
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(expected_title, final_title);
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)std::string MediaBrowserTest::RunTest(const GURL& gurl,
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                      const std::string& expected_title) {
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DVLOG(0) << "Running test URL: " << gurl;
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Observe the web contents for plugin crashes.
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Observe(browser()->tab_strip_model()->GetActiveWebContents());
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::TitleWatcher title_watcher(
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(),
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ASCIIToUTF16(expected_title));
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  AddWaitForTitles(&title_watcher);
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), gurl);
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::string16 result = title_watcher.WaitAndGetTitle();
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return base::UTF16ToASCII(result);
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void MediaBrowserTest::AddWaitForTitles(content::TitleWatcher* title_watcher) {
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kEnded));
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kError));
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kFailed));
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kPluginCrashed));
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MediaBrowserTest::PluginCrashed(const base::FilePath& plugin_path,
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     base::ProcessId plugin_pid) {
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  VLOG(0) << "Plugin crashed: " << plugin_path.value();
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (ignore_plugin_crash_)
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Update document title to quit TitleWatcher early.
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  web_contents()->GetController().GetActiveEntry()
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ->SetTitle(base::ASCIIToUTF16(kPluginCrashed));
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ADD_FAILURE() << "Failing test due to plugin crash.";
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MediaBrowserTest::IgnorePluginCrash() {
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ignore_plugin_crash_ = true;
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
88