Chromium Code Reviews| Index: chrome/test/ui/ppapi_uitest.cc |
| =================================================================== |
| --- chrome/test/ui/ppapi_uitest.cc (revision 110336) |
| +++ chrome/test/ui/ppapi_uitest.cc (working copy) |
| @@ -6,7 +6,10 @@ |
| #include "base/path_service.h" |
| #include "base/test/test_timeouts.h" |
| #include "build/build_config.h" |
| +#include "content/browser/plugin_service.h" |
| #include "content/public/common/content_switches.h" |
| +#include "content/common/pepper_plugin_registry.h" |
| +#include "chrome/common/chrome_paths.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/test/automation/tab_proxy.h" |
| #include "chrome/test/ui/ui_test.h" |
| @@ -14,6 +17,8 @@ |
| #include "net/test/test_server.h" |
| #include "webkit/plugins/plugin_switches.h" |
| +#include <iostream> |
| + |
| namespace { |
| // Platform-specific filename relative to the chrome executable. |
| @@ -27,24 +32,9 @@ |
| } // namespace |
| -// In-process plugin test runner. See OutOfProcessPPAPITest below for the |
| -// out-of-process version. |
| -class PPAPITest : public UITest { |
| +class PPAPITestBase : public UITest { |
| public: |
| - PPAPITest() { |
| - // Append the switch to register the pepper plugin. |
| - // library name = <out dir>/<test_name>.<library_extension> |
| - // MIME type = application/x-ppapi-<test_name> |
| - FilePath plugin_dir; |
| - PathService::Get(base::DIR_EXE, &plugin_dir); |
| - |
| - FilePath plugin_lib = plugin_dir.Append(library_name); |
| - EXPECT_TRUE(file_util::PathExists(plugin_lib)); |
| - FilePath::StringType pepper_plugin = plugin_lib.value(); |
| - pepper_plugin.append(FILE_PATH_LITERAL(";application/x-ppapi-tests")); |
| - launch_arguments_.AppendSwitchNative(switches::kRegisterPepperPlugins, |
| - pepper_plugin); |
| - |
| + PPAPITestBase() { |
| // The test sends us the result via a cookie. |
| launch_arguments_.AppendSwitch(switches::kEnableFileCookies); |
| @@ -56,9 +46,12 @@ |
| launch_arguments_.AppendSwitch(switches::kDisableSmoothScrolling); |
| } |
| + virtual std::string BuildQuery(const std::string& base, |
| + const std::string& test_case)=0; |
| + |
| void RunTest(const std::string& test_case) { |
| FilePath test_path; |
| - PathService::Get(base::DIR_SOURCE_ROOT, &test_path); |
| + EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_path)); |
| test_path = test_path.Append(FILE_PATH_LITERAL("ppapi")); |
| test_path = test_path.Append(FILE_PATH_LITERAL("tests")); |
| test_path = test_path.Append(FILE_PATH_LITERAL("test_case.html")); |
| @@ -67,20 +60,49 @@ |
| EXPECT_TRUE(file_util::PathExists(test_path)); |
| GURL::Replacements replacements; |
| - std::string query("testcase="); |
| - query += test_case; |
| + std::string query = BuildQuery("", test_case); |
| replacements.SetQuery(query.c_str(), url_parse::Component(0, query.size())); |
| GURL test_url = net::FilePathToFileURL(test_path); |
| RunTestURL(test_url.ReplaceComponents(replacements)); |
| } |
| void RunTestViaHTTP(const std::string& test_case) { |
| - net::TestServer test_server( |
| - net::TestServer::TYPE_HTTP, |
| - FilePath(FILE_PATH_LITERAL("ppapi/tests"))); |
| + FilePath exe_dir = CommandLine::ForCurrentProcess()->GetProgram().DirName(); |
|
dmichael (off chromium)
2011/11/18 20:10:25
nit: could you add a comment explaining why you ne
noelallen1
2011/11/18 20:39:39
Done.
|
| + FilePath src_dir; |
| + ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); |
| + |
| + // TestServer expects a path relative to source. So we must first |
| + // generate absolute paths to SRC and EXE and from there generate |
| + // a relative path. |
| + if (!exe_dir.IsAbsolute()) file_util::AbsolutePath(&exe_dir); |
| + if (!src_dir.IsAbsolute()) file_util::AbsolutePath(&src_dir); |
| + ASSERT_TRUE(exe_dir.IsAbsolute()); |
| + ASSERT_TRUE(src_dir.IsAbsolute()); |
| + |
| + size_t match, exe_size, src_size; |
| + std::vector<FilePath::StringType> src_parts, exe_parts; |
| + |
| + // Determine point at which src and exe diverge, and create a relative path. |
| + exe_dir.GetComponents(&exe_parts); |
| + src_dir.GetComponents(&src_parts); |
| + exe_size = exe_parts.size(); |
| + src_size = src_parts.size(); |
| + for (match = 0; match < exe_size && match < src_size; ++match) { |
| + if (exe_parts[match] != src_parts[match]) |
| + break; |
| + } |
| + FilePath web_dir; |
| + for (size_t tmp_itr = match; tmp_itr < src_size; ++tmp_itr) { |
| + web_dir = web_dir.Append(FILE_PATH_LITERAL("..")); |
| + } |
| + for (; match < exe_size; ++match) { |
| + web_dir = web_dir.Append(exe_parts[match]); |
| + } |
| + |
| + net::TestServer test_server(net::TestServer::TYPE_HTTP, web_dir); |
| ASSERT_TRUE(test_server.Start()); |
| - RunTestURL( |
| - test_server.GetURL("files/test_case.html?testcase=" + test_case)); |
| + std::string query = BuildQuery("files/test_case.html?", test_case); |
| + RunTestURL(test_server.GetURL(query)); |
| } |
| private: |
| @@ -119,6 +141,32 @@ |
| } |
| }; |
| +// In-process plugin test runner. See OutOfProcessPPAPITest below for the |
| +// out-of-process version. |
| +class PPAPITest : public PPAPITestBase { |
| + public: |
| + PPAPITest() { |
| + // Append the switch to register the pepper plugin. |
| + // library name = <out dir>/<test_name>.<library_extension> |
| + // MIME type = application/x-ppapi-<test_name> |
| + FilePath plugin_dir; |
| + EXPECT_TRUE(PathService::Get(base::DIR_EXE, &plugin_dir)); |
| + |
| + FilePath plugin_lib = plugin_dir.Append(library_name); |
| + EXPECT_TRUE(file_util::PathExists(plugin_lib)); |
| + FilePath::StringType pepper_plugin = plugin_lib.value(); |
| + pepper_plugin.append(FILE_PATH_LITERAL(";application/x-ppapi-tests")); |
| + launch_arguments_.AppendSwitchNative(switches::kRegisterPepperPlugins, |
| + pepper_plugin); |
| + } |
| + |
| + std::string BuildQuery(const std::string& base, |
| + const std::string& test_case){ |
| + return StringPrintf("%stestcase=%s", base.c_str(), test_case.c_str()); |
|
dmichael (off chromium)
2011/11/18 20:10:25
optional nit: I guess it's fine, but why not just
noelallen1
2011/11/18 20:39:39
Previous comment from other reviewer to use String
|
| + } |
| + |
| +}; |
| + |
| // Variant of PPAPITest that runs plugins out-of-process to test proxy |
| // codepaths. |
| class OutOfProcessPPAPITest : public PPAPITest { |
| @@ -129,6 +177,27 @@ |
| } |
| }; |
| +// NaCl plugin test runner. |
| +class PPAPINaClTest : public PPAPITestBase { |
| + public: |
| + PPAPINaClTest() { |
| + FilePath plugin_lib; |
| + EXPECT_TRUE(PathService::Get(chrome::FILE_NACL_PLUGIN, &plugin_lib)); |
| + EXPECT_TRUE(file_util::PathExists(plugin_lib)); |
| + |
| + // Enable running NaCl outside of the store. |
| + launch_arguments_.AppendSwitch(switches::kEnableNaCl); |
| + } |
| + |
| + // Append the correct mode and testcase string |
| + std::string BuildQuery(const std::string& base, |
| + const std::string& test_case) { |
| + return StringPrintf("%smode=nacl&testcase=%s", base.c_str(), |
| + test_case.c_str()); |
| + } |
| +}; |
| + |
| + |
| // Use these macros to run the tests for a specific interface. |
| // Most interfaces should be tested with both macros. |
| #define TEST_PPAPI_IN_PROCESS(test_name) \ |
| @@ -151,6 +220,12 @@ |
| } |
| +// NaCl based PPAPI tests |
| +#define TEST_PPAPI_NACL_VIA_HTTP(test_name) \ |
| + TEST_F(PPAPINaClTest, test_name) { \ |
| + RunTestViaHTTP(#test_name); \ |
| +} |
| + |
| // |
| // Interface tests. |
| // |
| @@ -163,6 +238,7 @@ |
| TEST_PPAPI_IN_PROCESS(CursorControl) |
| TEST_PPAPI_OUT_OF_PROCESS(CursorControl) |
| +TEST_PPAPI_NACL_VIA_HTTP(CursorControl) |
| TEST_PPAPI_IN_PROCESS(Instance) |
| // http://crbug.com/91729 |
| @@ -170,15 +246,16 @@ |
| TEST_PPAPI_IN_PROCESS(Graphics2D) |
| TEST_PPAPI_OUT_OF_PROCESS(Graphics2D) |
| +TEST_PPAPI_NACL_VIA_HTTP(Graphics2D) |
| TEST_PPAPI_IN_PROCESS(ImageData) |
| TEST_PPAPI_OUT_OF_PROCESS(ImageData) |
| +TEST_PPAPI_NACL_VIA_HTTP(ImageData) |
| TEST_PPAPI_IN_PROCESS(Buffer) |
| TEST_PPAPI_OUT_OF_PROCESS(Buffer) |
| TEST_PPAPI_IN_PROCESS_VIA_HTTP(URLLoader) |
| - |
| // http://crbug.com/89961 |
| #if defined(OS_WIN) |
| // It often takes too long time (and fails otherwise) on Windows. |
| @@ -186,19 +263,22 @@ |
| #else |
| #define MAYBE_URLLoader FAILS_URLLoader |
| #endif |
| - |
| TEST_F(OutOfProcessPPAPITest, MAYBE_URLLoader) { |
| RunTestViaHTTP("URLLoader"); |
| } |
| + |
| + |
| TEST_PPAPI_IN_PROCESS(PaintAggregator) |
| TEST_PPAPI_OUT_OF_PROCESS(PaintAggregator) |
| +TEST_PPAPI_NACL_VIA_HTTP(PaintAggregator) |
| TEST_PPAPI_IN_PROCESS(Scrollbar) |
| // http://crbug.com/89961 |
| TEST_F(OutOfProcessPPAPITest, FAILS_Scrollbar) { |
| RunTest("Scrollbar"); |
| } |
| +TEST_PPAPI_NACL_VIA_HTTP(Scrollbar) |
| TEST_PPAPI_IN_PROCESS(URLUtil) |
| TEST_PPAPI_OUT_OF_PROCESS(URLUtil) |
| @@ -214,6 +294,7 @@ |
| TEST_F(OutOfProcessPPAPITest, FAILS_Var) { |
| RunTest("Var"); |
| } |
| +TEST_PPAPI_NACL_VIA_HTTP(Var) |
| TEST_PPAPI_IN_PROCESS(VarDeprecated) |
| // Disabled because it times out: http://crbug.com/89961 |
| @@ -240,6 +321,7 @@ |
| TEST_PPAPI_IN_PROCESS(Memory) |
| TEST_PPAPI_OUT_OF_PROCESS(Memory) |
| +TEST_PPAPI_NACL_VIA_HTTP(Memory) |
| TEST_PPAPI_IN_PROCESS(VideoDecoder) |
| TEST_PPAPI_OUT_OF_PROCESS(VideoDecoder) |
| @@ -252,13 +334,18 @@ |
| TEST_F(OutOfProcessPPAPITest, DISABLED_FileIO) { |
| RunTestViaHTTP("FileIO"); |
| } |
| +TEST_PPAPI_NACL_VIA_HTTP(DISABLED_FileIO) |
| + |
| TEST_PPAPI_IN_PROCESS_VIA_HTTP(FileRef) |
| // Disabled because it times out: http://crbug.com/89961 |
| //TEST_PPAPI_OUT_OF_PROCESS_VIA_HTTP(FileRef) |
| +TEST_PPAPI_NACL_VIA_HTTP(FileRef) |
| + |
| TEST_PPAPI_IN_PROCESS_VIA_HTTP(FileSystem) |
| TEST_PPAPI_OUT_OF_PROCESS_VIA_HTTP(FileSystem) |
| +TEST_PPAPI_NACL_VIA_HTTP(FileSystem) |
| // http://crbug.com/96767 and 104384 for aura. |
| #if !defined(OS_MACOSX) && !defined(USE_AURA) |