media_browsertest.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
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/path_service.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/stringprintf.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/chrome_paths.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/navigation_controller.h"
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/navigation_entry.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/web_contents.h"
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Common test results.
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char MediaBrowserTest::kEnded[] = "ENDED";
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char MediaBrowserTest::kError[] = "ERROR";
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char MediaBrowserTest::kFailed[] = "FAILED";
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char MediaBrowserTest::kPluginCrashed[] = "PLUGIN_CRASHED";
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochMediaBrowserTest::MediaBrowserTest() : ignore_plugin_crash_(false) {
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MediaBrowserTest::~MediaBrowserTest() {
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void MediaBrowserTest::RunMediaTestPage(
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& html_page, std::vector<StringPair>* query_params,
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& expected_title, bool http) {
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GURL gurl;
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string query = "";
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (query_params != NULL && !query_params->empty()) {
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::vector<StringPair>::const_iterator itr = query_params->begin();
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    query = itr->first + "=" + itr->second;
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ++itr;
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (; itr != query_params->end(); ++itr) {
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      query.append("&" + itr->first + "=" + itr->second);
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (http) {
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_TRUE(test_server()->Start());
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gurl = test_server()->GetURL("files/media/" + html_page + "?" + query);
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  } else {
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::FilePath test_file_path;
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PathService::Get(chrome::DIR_TEST_DATA, &test_file_path);
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    test_file_path = test_file_path.AppendASCII("media")
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   .AppendASCII(html_page);
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    gurl = content::GetFileUrlWithQuery(test_file_path, query);
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 final_title = RunTest(gurl, expected_title);
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16(expected_title), final_title);
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 MediaBrowserTest::RunTest(const GURL& gurl,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         const std::string& expected_title) {
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DVLOG(1) << "Running test URL: " << gurl;
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Observe the web contents for plugin crashes.
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Observe(browser()->tab_strip_model()->GetActiveWebContents());
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::TitleWatcher title_watcher(
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(),
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ASCIIToUTF16(expected_title));
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  AddWaitForTitles(&title_watcher);
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), gurl);
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return title_watcher.WaitAndGetTitle();
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void MediaBrowserTest::AddWaitForTitles(content::TitleWatcher* title_watcher) {
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kEnded));
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kError));
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kFailed));
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kPluginCrashed));
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MediaBrowserTest::PluginCrashed(const base::FilePath& plugin_path,
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     base::ProcessId plugin_pid) {
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  VLOG(0) << "Plugin crashed: " << plugin_path.value();
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (ignore_plugin_crash_)
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Update document title to quit TitleWatcher early.
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  web_contents()->GetController().GetActiveEntry()
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ->SetTitle(base::ASCIIToUTF16(kPluginCrashed));
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ADD_FAILURE() << "Failing test due to plugin crash.";
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MediaBrowserTest::IgnorePluginCrash() {
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ignore_plugin_crash_ = true;
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
95