nacl_browsertest_util.h revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
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.
4
5#ifndef CHROME_TEST_NACL_NACL_BROWSERTEST_UTIL_H_
6#define CHROME_TEST_NACL_NACL_BROWSERTEST_UTIL_H_
7
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 "chrome/test/base/javascript_test_observer.h"
12
13// A helper base class that decodes structured automation messages of the form:
14// {"type": type_name, ...}
15class StructuredMessageHandler : public TestMessageHandler {
16 public:
17  virtual MessageResponse HandleMessage(const std::string& json) OVERRIDE;
18
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;
28
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;
34
35  // Something went wrong while decoding the message.
36  MessageResponse InternalError(const std::string& reason) WARN_UNUSED_RESULT;
37};
38
39// A simple structured message handler for tests that load nexes.
40class LoadTestMessageHandler : public StructuredMessageHandler {
41 public:
42  LoadTestMessageHandler();
43
44  void Log(const std::string& type, const std::string& message);
45
46  virtual MessageResponse HandleStructuredMessage(
47      const std::string& type,
48      base::DictionaryValue* msg) OVERRIDE;
49
50  bool test_passed() const {
51    return test_passed_;
52  }
53
54 private:
55  bool test_passed_;
56
57  DISALLOW_COPY_AND_ASSIGN(LoadTestMessageHandler);
58};
59
60class NaClBrowserTestBase : public InProcessBrowserTest {
61 public:
62  NaClBrowserTestBase();
63  virtual ~NaClBrowserTestBase();
64
65  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
66
67  virtual void SetUpOnMainThread() OVERRIDE;
68
69  // What variant are we running - newlib, glibc, pnacl, etc?
70  // This is used to compute what directory we're pulling data from, but it can
71  // also be used to affect the behavior of the test.
72  virtual base::FilePath::StringType Variant() = 0;
73
74  // Where are the files for this class of test located on disk?
75  virtual bool GetDocumentRoot(base::FilePath* document_root);
76
77  virtual bool IsAPnaclTest();
78
79  virtual bool IsPnaclDisabled();
80
81  // Map a file relative to the variant directory to a URL served by the test
82  // web server.
83  GURL TestURL(const base::FilePath::StringType& url_fragment);
84
85  // Load a URL and listen to automation events with a given handler.
86  // Returns true if the test glue function correctly.  (The handler should
87  // seperately indicate if the test failed.)
88  bool RunJavascriptTest(const GURL& url, TestMessageHandler* handler);
89
90  // Run a simple test that checks that a nexe loads correctly.  Useful for
91  // setting up other tests, such as checking that UMA data was logged.
92  void RunLoadTest(const base::FilePath::StringType& test_file);
93
94  // Run a test that was originally written to use NaCl's integration testing
95  // jig. These tests were originally driven by NaCl's SCons build in the
96  // nacl_integration test stage on the Chrome waterfall. Changes in the
97  // boundaries between the Chrome and NaCl repos have resulted in many of
98  // these tests having a stronger affinity with the Chrome repo. This method
99  // provides a compatibility layer to simplify turning nacl_integration tests
100  // into browser tests.
101  void RunNaClIntegrationTest(const base::FilePath::StringType& url_fragment);
102
103 private:
104  bool StartTestServer();
105
106  scoped_ptr<net::SpawnedTestServer> test_server_;
107};
108
109class NaClBrowserTestNewlib : public NaClBrowserTestBase {
110 public:
111  virtual base::FilePath::StringType Variant() OVERRIDE;
112};
113
114class NaClBrowserTestGLibc : public NaClBrowserTestBase {
115 public:
116  virtual base::FilePath::StringType Variant() OVERRIDE;
117};
118
119class NaClBrowserTestPnacl : public NaClBrowserTestBase {
120 public:
121  virtual base::FilePath::StringType Variant() OVERRIDE;
122
123  virtual bool IsAPnaclTest() OVERRIDE;
124};
125
126class NaClBrowserTestPnaclNonSfi : public NaClBrowserTestBase {
127 public:
128  virtual base::FilePath::StringType Variant() OVERRIDE;
129  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
130};
131
132// Class used to test that when --disable-pnacl is specified the PNaCl mime
133// type is not available.
134class NaClBrowserTestPnaclDisabled : public NaClBrowserTestBase {
135 public:
136  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
137
138  virtual base::FilePath::StringType Variant() OVERRIDE;
139
140  virtual bool IsAPnaclTest() OVERRIDE;
141
142  virtual bool IsPnaclDisabled() OVERRIDE;
143};
144
145class NaClBrowserTestNonSfiMode : public NaClBrowserTestBase {
146 public:
147  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
148  virtual base::FilePath::StringType Variant() OVERRIDE;
149};
150
151// A NaCl browser test only using static files.
152class NaClBrowserTestStatic : public NaClBrowserTestBase {
153 public:
154  virtual base::FilePath::StringType Variant() OVERRIDE;
155  virtual bool GetDocumentRoot(base::FilePath* document_root) OVERRIDE;
156};
157
158// PNaCl tests take a long time on windows debug builds
159// and sometimes time out.  Disable until it is made faster:
160// https://code.google.com/p/chromium/issues/detail?id=177555
161#if (defined(OS_WIN) && !defined(NDEBUG))
162#define MAYBE_PNACL(test_name) DISABLED_##test_name
163#else
164#define MAYBE_PNACL(test_name) test_name
165#endif
166
167#if defined(ARCH_CPU_ARM_FAMILY) || defined(ARCH_CPU_MIPS_FAMILY)
168
169// There is no support for Glibc on ARM and MIPS NaCl.
170#define NACL_BROWSER_TEST_F(suite, name, body) \
171IN_PROC_BROWSER_TEST_F(suite##Newlib, name) \
172body \
173IN_PROC_BROWSER_TEST_F(suite##Pnacl, MAYBE_PNACL(name)) \
174body
175
176#else
177
178// Otherwise, we have Glibc, Newlib and Pnacl tests
179#define NACL_BROWSER_TEST_F(suite, name, body) \
180IN_PROC_BROWSER_TEST_F(suite##Newlib, name) \
181body \
182IN_PROC_BROWSER_TEST_F(suite##GLibc, name) \
183body \
184IN_PROC_BROWSER_TEST_F(suite##Pnacl, MAYBE_PNACL(name)) \
185body
186
187#endif
188
189#endif  // CHROME_TEST_NACL_NACL_BROWSERTEST_UTIL_H_
190