1// Copyright 2014 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. 4 5#include "content/test/ppapi/ppapi_test.h" 6 7#include "base/command_line.h" 8#include "base/files/file_path.h" 9#include "base/files/file_util.h" 10#include "base/path_service.h" 11#include "base/strings/string_util.h" 12#include "base/strings/stringprintf.h" 13#include "content/public/browser/web_contents.h" 14#include "content/public/common/content_switches.h" 15#include "content/shell/browser/shell.h" 16#include "net/base/filename_util.h" 17#include "ppapi/shared_impl/ppapi_switches.h" 18#include "ppapi/shared_impl/test_harness_utils.h" 19 20#if defined(OS_CHROMEOS) 21#include "chromeos/audio/cras_audio_handler.h" 22#endif 23 24namespace content { 25 26PPAPITestMessageHandler::PPAPITestMessageHandler() { 27} 28 29TestMessageHandler::MessageResponse PPAPITestMessageHandler::HandleMessage( 30 const std::string& json) { 31 std::string trimmed; 32 base::TrimString(json, "\"", &trimmed); 33 if (trimmed == "...") 34 return CONTINUE; 35 message_ = trimmed; 36 return DONE; 37} 38 39void PPAPITestMessageHandler::Reset() { 40 TestMessageHandler::Reset(); 41 message_.clear(); 42} 43 44PPAPITestBase::PPAPITestBase() { } 45 46void PPAPITestBase::SetUpCommandLine(base::CommandLine* command_line) { 47 // The test sends us the result via a cookie. 48 command_line->AppendSwitch(switches::kEnableFileCookies); 49 50 // Some stuff is hung off of the testing interface which is not enabled 51 // by default. 52 command_line->AppendSwitch(switches::kEnablePepperTesting); 53 54 // Smooth scrolling confuses the scrollbar test. 55 command_line->AppendSwitch(switches::kDisableSmoothScrolling); 56 57 // Allow manual garbage collection. 58 command_line->AppendSwitchASCII(switches::kJavaScriptFlags, "--expose_gc"); 59} 60 61GURL PPAPITestBase::GetTestFileUrl(const std::string& test_case) { 62 base::FilePath test_path; 63 EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_path)); 64 test_path = test_path.Append(FILE_PATH_LITERAL("ppapi")); 65 test_path = test_path.Append(FILE_PATH_LITERAL("tests")); 66 test_path = test_path.Append(FILE_PATH_LITERAL("test_case.html")); 67 68 // Sanity check the file name. 69 EXPECT_TRUE(base::PathExists(test_path)); 70 GURL test_url = net::FilePathToFileURL(test_path); 71 72 GURL::Replacements replacements; 73 std::string query = BuildQuery(std::string(), test_case); 74 replacements.SetQuery(query.c_str(), url::Component(0, query.size())); 75 return test_url.ReplaceComponents(replacements); 76} 77 78void PPAPITestBase::RunTest(const std::string& test_case) { 79 GURL url = GetTestFileUrl(test_case); 80 RunTestURL(url); 81} 82 83void PPAPITestBase::RunTestAndReload(const std::string& test_case) { 84 GURL url = GetTestFileUrl(test_case); 85 RunTestURL(url); 86 // If that passed, we simply run the test again, which navigates again. 87 RunTestURL(url); 88} 89 90void PPAPITestBase::RunTestURL(const GURL& test_url) { 91 // See comment above TestingInstance in ppapi/test/testing_instance.h. 92 // Basically it sends messages using the DOM automation controller. The 93 // value of "..." means it's still working and we should continue to wait, 94 // any other value indicates completion (in this case it will start with 95 // "PASS" or "FAIL"). This keeps us from timing out on waits for long tests. 96 PPAPITestMessageHandler handler; 97 JavascriptTestObserver observer(shell()->web_contents(), &handler); 98 shell()->LoadURL(test_url); 99 100 ASSERT_TRUE(observer.Run()) << handler.error_message(); 101 EXPECT_STREQ("PASS", handler.message().c_str()); 102} 103 104PPAPITest::PPAPITest() : in_process_(true) { 105} 106 107void PPAPITest::SetUpCommandLine(base::CommandLine* command_line) { 108 PPAPITestBase::SetUpCommandLine(command_line); 109 110 // Append the switch to register the pepper plugin. 111 // library name = <out dir>/<test_name>.<library_extension> 112 // MIME type = application/x-ppapi-<test_name> 113 base::FilePath plugin_dir; 114 EXPECT_TRUE(PathService::Get(base::DIR_MODULE, &plugin_dir)); 115 116 base::FilePath plugin_lib = plugin_dir.Append(ppapi::GetTestLibraryName()); 117 EXPECT_TRUE(base::PathExists(plugin_lib)); 118 base::FilePath::StringType pepper_plugin = plugin_lib.value(); 119 pepper_plugin.append(FILE_PATH_LITERAL(";application/x-ppapi-tests")); 120 command_line->AppendSwitchNative(switches::kRegisterPepperPlugins, 121 pepper_plugin); 122 123 if (in_process_) 124 command_line->AppendSwitch(switches::kPpapiInProcess); 125} 126 127std::string PPAPITest::BuildQuery(const std::string& base, 128 const std::string& test_case){ 129 return base::StringPrintf("%stestcase=%s", base.c_str(), test_case.c_str()); 130} 131 132OutOfProcessPPAPITest::OutOfProcessPPAPITest() { 133 in_process_ = false; 134} 135 136void OutOfProcessPPAPITest::SetUp() { 137#if defined(OS_CHROMEOS) 138 chromeos::CrasAudioHandler::InitializeForTesting(); 139#endif 140 ContentBrowserTest::SetUp(); 141} 142 143void OutOfProcessPPAPITest::TearDown() { 144 ContentBrowserTest::TearDown(); 145#if defined(OS_CHROMEOS) 146 chromeos::CrasAudioHandler::Shutdown(); 147#endif 148} 149 150} // namespace content 151