Pin Chrome's shortcut to the Win10 Start menu on install and OS upgrade.
[chromium-blink-merge.git] / chrome / test / nacl / nacl_browsertest_util.h
blobcfe4971133b902ed902711e7806763ac4c0f5144
1 // Copyright (c) 2012 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.
5 #ifndef CHROME_TEST_NACL_NACL_BROWSERTEST_UTIL_H_
6 #define CHROME_TEST_NACL_NACL_BROWSERTEST_UTIL_H_
8 #include "base/files/file_path.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "chrome/test/base/in_process_browser_test.h"
11 #include "content/public/test/javascript_test_observer.h"
13 // A helper base class that decodes structured automation messages of the form:
14 // {"type": type_name, ...}
15 class StructuredMessageHandler : public content::TestMessageHandler {
16 public:
17 MessageResponse HandleMessage(const std::string& json) override;
19 // This method provides a higher-level interface for handling JSON messages
20 // from the DOM automation controler. Instead of handling a string
21 // containing a JSON-encoded object, this specialization of TestMessageHandler
22 // decodes the string into a dictionary. This makes it easier to send and
23 // receive structured messages. It is assumed the dictionary will always have
24 // a "type" field that indicates the nature of message.
25 virtual MessageResponse HandleStructuredMessage(
26 const std::string& type,
27 base::DictionaryValue* msg) = 0;
29 protected:
30 // The structured message is missing an expected field.
31 MessageResponse MissingField(
32 const std::string& type,
33 const std::string& field) WARN_UNUSED_RESULT;
35 // Something went wrong while decoding the message.
36 MessageResponse InternalError(const std::string& reason) WARN_UNUSED_RESULT;
39 // A simple structured message handler for tests that load nexes.
40 class LoadTestMessageHandler : public StructuredMessageHandler {
41 public:
42 LoadTestMessageHandler();
44 void Log(const std::string& type, const std::string& message);
46 MessageResponse HandleStructuredMessage(const std::string& type,
47 base::DictionaryValue* msg) override;
49 bool test_passed() const {
50 return test_passed_;
53 private:
54 bool test_passed_;
56 DISALLOW_COPY_AND_ASSIGN(LoadTestMessageHandler);
59 class NaClBrowserTestBase : public InProcessBrowserTest {
60 public:
61 NaClBrowserTestBase();
62 ~NaClBrowserTestBase() override;
64 void SetUpCommandLine(base::CommandLine* command_line) override;
66 void SetUpOnMainThread() override;
68 // What variant are we running - newlib, glibc, pnacl, etc?
69 // This is used to compute what directory we're pulling data from, but it can
70 // also be used to affect the behavior of the test.
71 virtual base::FilePath::StringType Variant() = 0;
73 // Where are the files for this class of test located on disk?
74 virtual bool GetDocumentRoot(base::FilePath* document_root);
76 virtual bool IsAPnaclTest();
78 // Map a file relative to the variant directory to a URL served by the test
79 // web server.
80 GURL TestURL(const base::FilePath::StringType& url_fragment);
82 // Load a URL and listen to automation events with a given handler.
83 // Returns true if the test glue function correctly. (The handler should
84 // seperately indicate if the test failed.)
85 bool RunJavascriptTest(const GURL& url, content::TestMessageHandler* handler);
87 // Run a simple test that checks that a nexe loads correctly. Useful for
88 // setting up other tests, such as checking that UMA data was logged.
89 void RunLoadTest(const base::FilePath::StringType& test_file);
91 // Run a test that was originally written to use NaCl's integration testing
92 // jig. These tests were originally driven by NaCl's SCons build in the
93 // nacl_integration test stage on the Chrome waterfall. Changes in the
94 // boundaries between the Chrome and NaCl repos have resulted in many of
95 // these tests having a stronger affinity with the Chrome repo. This method
96 // provides a compatibility layer to simplify turning nacl_integration tests
97 // into browser tests.
98 // |full_url| is true if the full URL is given, otherwise it is a
99 // relative URL.
100 void RunNaClIntegrationTest(const base::FilePath::StringType& url,
101 bool full_url = false);
103 private:
104 bool StartTestServer();
106 scoped_ptr<net::SpawnedTestServer> test_server_;
109 class NaClBrowserTestNewlib : public NaClBrowserTestBase {
110 public:
111 base::FilePath::StringType Variant() override;
114 class NaClBrowserTestGLibc : public NaClBrowserTestBase {
115 public:
116 base::FilePath::StringType Variant() override;
119 class NaClBrowserTestPnacl : public NaClBrowserTestBase {
120 public:
121 base::FilePath::StringType Variant() override;
123 bool IsAPnaclTest() override;
126 // TODO(jvoung): We can remove this and test the Subzero translator
127 // with NaClBrowserTestPnacl once Subzero is automatically chosen
128 // (not behind a flag).
129 class NaClBrowserTestPnaclSubzero : public NaClBrowserTestPnacl {
130 public:
131 void SetUpCommandLine(base::CommandLine* command_line) override;
134 class NaClBrowserTestPnaclNonSfi : public NaClBrowserTestBase {
135 public:
136 void SetUpCommandLine(base::CommandLine* command_line) override;
137 base::FilePath::StringType Variant() override;
140 // "Transitional" here means that this uses nacl_helper in Non-SFI mode.
141 // nacl_helper_nonsfi, which is replacing nacl_helper in Non-SFI mode, is being
142 // launched. In the meanwhile, nacl_helper in Non-SFI is still kept just in
143 // case. When the launching is successfully done, it will be removed.
144 // "Transitional" tests are for ensuring compatibility between those two
145 // binaries.
146 // TODO(hidehiko): Remove the tests when nacl_helper in Non-SFI mode is
147 // removed.
148 class NaClBrowserTestPnaclTransitionalNonSfi
149 : public NaClBrowserTestPnaclNonSfi {
150 public:
151 void SetUpCommandLine(base::CommandLine* command_line) override;
154 class NaClBrowserTestNonSfiMode : public NaClBrowserTestBase {
155 public:
156 void SetUpCommandLine(base::CommandLine* command_line) override;
157 base::FilePath::StringType Variant() override;
160 // TODO(hidehiko): Remove this when clean-up to drop Non-SFI support from
161 // nacl_helper is done. See NaClBrowserTestPnaclTransitionalNonSfi
162 // for more details.
163 class NaClBrowserTestTransitionalNonSfi : public NaClBrowserTestNonSfiMode {
164 public:
165 void SetUpCommandLine(base::CommandLine* command_line) override;
168 // A NaCl browser test only using static files.
169 class NaClBrowserTestStatic : public NaClBrowserTestBase {
170 public:
171 base::FilePath::StringType Variant() override;
172 bool GetDocumentRoot(base::FilePath* document_root) override;
175 // A NaCl browser test that loads from an unpacked chrome extension.
176 // The directory of the unpacked extension files is determined by
177 // the tester's document root.
178 class NaClBrowserTestNewlibExtension : public NaClBrowserTestNewlib {
179 public:
180 void SetUpCommandLine(base::CommandLine* command_line) override;
183 class NaClBrowserTestGLibcExtension : public NaClBrowserTestGLibc {
184 public:
185 void SetUpCommandLine(base::CommandLine* command_line) override;
188 // PNaCl tests take a long time on windows debug builds
189 // and sometimes time out. Disable until it is made faster:
190 // https://code.google.com/p/chromium/issues/detail?id=177555
191 #if (defined(OS_WIN) && !defined(NDEBUG))
192 # define MAYBE_PNACL(test_name) DISABLED_##test_name
193 #else
194 # define MAYBE_PNACL(test_name) test_name
195 #endif
197 // NaCl glibc tests are included for x86 only, as there is no glibc support
198 // for other architectures (ARM/MIPS).
199 #if defined(ARCH_CPU_X86_FAMILY)
200 # define MAYBE_GLIBC(test_name) test_name
201 #else
202 # define MAYBE_GLIBC(test_name) DISABLED_##test_name
203 #endif
205 // Currently, we only support it on x86-32 or ARM architecture.
206 // TODO(hidehiko,mazda): Enable this on x86-64, too, when it is supported.
207 #if defined(OS_LINUX) && !defined(ADDRESS_SANITIZER) && \
208 !defined(THREAD_SANITIZER) && !defined(MEMORY_SANITIZER) && \
209 !defined(LEAK_SANITIZER) && \
210 (defined(ARCH_CPU_X86) || defined(ARCH_CPU_ARMEL))
211 # define MAYBE_NONSFI(test_case) test_case
212 #else
213 # define MAYBE_NONSFI(test_case) DISABLED_##test_case
214 #endif
216 // Sanitizers internally use some syscalls which non-SFI NaCl disallows.
217 #if defined(OS_LINUX) && !defined(ADDRESS_SANITIZER) && \
218 !defined(THREAD_SANITIZER) && !defined(MEMORY_SANITIZER) && \
219 !defined(LEAK_SANITIZER)
220 # define MAYBE_TRANSITIONAL_NONSFI(test_case) test_case
221 #else
222 # define MAYBE_TRANSITIONAL_NONSFI(test_case) DISABLED_##test_case
223 #endif
225 // Similar to MAYBE_NONSFI, this is available only on x86-32, x86-64 or
226 // ARM linux.
227 #if defined(OS_LINUX) && \
228 (defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL))
229 # define MAYBE_PNACL_NONSFI(test_case) test_case
230 #else
231 # define MAYBE_PNACL_NONSFI(test_case) DISABLED_##test_case
232 #endif
234 // Currently, translation from pexe to non-sfi nexe is supported only for
235 // x86-32 or ARM binary.
236 #if defined(OS_LINUX) && (defined(ARCH_CPU_X86) || defined(ARCH_CPU_ARMEL))
237 # define MAYBE_PNACL_TRANSITIONAL_NONSFI(test_case) test_case
238 #else
239 # define MAYBE_PNACL_TRANSITIONAL_NONSFI(test_case) DISABLED_##test_case
240 #endif
243 #define NACL_BROWSER_TEST_F(suite, name, body) \
244 IN_PROC_BROWSER_TEST_F(suite##Newlib, name) \
245 body \
246 IN_PROC_BROWSER_TEST_F(suite##GLibc, MAYBE_GLIBC(name)) \
247 body \
248 IN_PROC_BROWSER_TEST_F(suite##Pnacl, MAYBE_PNACL(name)) \
249 body
251 #endif // CHROME_TEST_NACL_NACL_BROWSERTEST_UTIL_H_