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_PPAPI_PPAPI_TEST_H_
6#define CHROME_TEST_PPAPI_PPAPI_TEST_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/compiler_specific.h"
12#include "chrome/test/base/in_process_browser_test.h"
13#include "content/public/test/javascript_test_observer.h"
14#include "net/test/spawned_test_server/spawned_test_server.h"
15
16namespace content {
17class RenderViewHost;
18}
19
20class PPAPITestMessageHandler : public content::TestMessageHandler {
21 public:
22  PPAPITestMessageHandler();
23
24  virtual MessageResponse HandleMessage(const std::string& json) OVERRIDE;
25  virtual void Reset() OVERRIDE;
26
27  const std::string& message() const {
28    return message_;
29  }
30
31 private:
32  std::string message_;
33
34  DISALLOW_COPY_AND_ASSIGN(PPAPITestMessageHandler);
35};
36
37class PPAPITestBase : public InProcessBrowserTest {
38 public:
39  PPAPITestBase();
40
41  // InProcessBrowserTest:
42  virtual void SetUp() OVERRIDE;
43  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
44  virtual void SetUpOnMainThread() OVERRIDE;
45
46  virtual std::string BuildQuery(const std::string& base,
47                                 const std::string& test_case) = 0;
48
49  // Returns the URL to load for file: tests.
50  GURL GetTestFileUrl(const std::string& test_case);
51  virtual void RunTest(const std::string& test_case);
52  virtual void RunTestViaHTTP(const std::string& test_case);
53  virtual void RunTestWithSSLServer(const std::string& test_case);
54  virtual void RunTestWithWebSocketServer(const std::string& test_case);
55  virtual void RunTestIfAudioOutputAvailable(const std::string& test_case);
56  virtual void RunTestViaHTTPIfAudioOutputAvailable(
57      const std::string& test_case);
58
59 protected:
60  class InfoBarObserver : public content::NotificationObserver {
61   public:
62    explicit InfoBarObserver(PPAPITestBase* test_base);
63    ~InfoBarObserver();
64
65    void ExpectInfoBarAndAccept(bool should_accept);
66
67   private:
68    // content::NotificationObserver:
69    virtual void Observe(int type,
70                         const content::NotificationSource& source,
71                         const content::NotificationDetails& details) OVERRIDE;
72
73    void VerifyInfoBarState();
74
75    content::NotificationRegistrar registrar_;
76    PPAPITestBase* test_base_;
77    bool expecting_infobar_;
78    bool should_accept_;
79  };
80
81  // Runs the test for a tab given the tab that's already navigated to the
82  // given URL.
83  void RunTestURL(const GURL& test_url);
84  // Gets the URL of the the given |test_case| for the given HTTP test server.
85  // If |extra_params| is non-empty, it will be appended as URL parameters.
86  GURL GetTestURL(const net::SpawnedTestServer& http_server,
87                  const std::string& test_case,
88                  const std::string& extra_params);
89};
90
91// In-process plugin test runner.  See OutOfProcessPPAPITest below for the
92// out-of-process version.
93class PPAPITest : public PPAPITestBase {
94 public:
95  PPAPITest();
96
97  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
98
99  virtual std::string BuildQuery(const std::string& base,
100                                 const std::string& test_case) OVERRIDE;
101 protected:
102  bool in_process_;  // Controls the --ppapi-in-process switch.
103};
104
105class PPAPIPrivateTest : public PPAPITest {
106 protected:
107  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
108};
109
110// Variant of PPAPITest that runs plugins out-of-process to test proxy
111// codepaths.
112class OutOfProcessPPAPITest : public PPAPITest {
113 public:
114  OutOfProcessPPAPITest();
115
116  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
117};
118
119class OutOfProcessPPAPIPrivateTest : public OutOfProcessPPAPITest {
120 protected:
121  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
122};
123
124// NaCl plugin test runner for Newlib runtime.
125class PPAPINaClTest : public PPAPITestBase {
126 public:
127  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
128  virtual void SetUpOnMainThread() OVERRIDE;
129  // PPAPITestBase overrides.
130  virtual void RunTest(const std::string& test_case) OVERRIDE;
131  virtual void RunTestViaHTTP(const std::string& test_case) OVERRIDE;
132  virtual void RunTestWithSSLServer(const std::string& test_case) OVERRIDE;
133  virtual void RunTestWithWebSocketServer(
134      const std::string& test_case) OVERRIDE;
135  virtual void RunTestIfAudioOutputAvailable(
136      const std::string& test_case) OVERRIDE;
137  virtual void RunTestViaHTTPIfAudioOutputAvailable(
138      const std::string& test_case) OVERRIDE;
139};
140
141// NaCl plugin test runner for Newlib runtime.
142class PPAPINaClNewlibTest : public PPAPINaClTest {
143 public:
144  virtual std::string BuildQuery(const std::string& base,
145                                 const std::string& test_case) OVERRIDE;
146};
147
148class PPAPIPrivateNaClNewlibTest : public PPAPINaClNewlibTest {
149 protected:
150  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
151};
152
153// NaCl plugin test runner for GNU-libc runtime.
154class PPAPINaClGLibcTest : public PPAPINaClTest {
155 public:
156  virtual std::string BuildQuery(const std::string& base,
157                                 const std::string& test_case) OVERRIDE;
158};
159
160class PPAPIPrivateNaClGLibcTest : public PPAPINaClGLibcTest {
161 protected:
162  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
163};
164
165// NaCl plugin test runner for the PNaCl + Newlib runtime.
166class PPAPINaClPNaClTest : public PPAPINaClTest {
167 public:
168  virtual std::string BuildQuery(const std::string& base,
169                                 const std::string& test_case) OVERRIDE;
170};
171
172class PPAPIPrivateNaClPNaClTest : public PPAPINaClPNaClTest {
173 protected:
174  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
175};
176
177// Test Non-SFI Mode, using PNaCl toolchain to produce nexes.
178class PPAPINaClPNaClNonSfiTest : public PPAPINaClTest {
179 public:
180  virtual void SetUpCommandLine(base::CommandLine* command_line);
181
182  virtual std::string BuildQuery(const std::string& base,
183                                 const std::string& test_case) OVERRIDE;
184};
185
186class PPAPIPrivateNaClPNaClNonSfiTest : public PPAPINaClPNaClNonSfiTest {
187 protected:
188  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
189};
190
191class PPAPINaClTestDisallowedSockets : public PPAPITestBase {
192 public:
193  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
194
195  virtual std::string BuildQuery(const std::string& base,
196                                 const std::string& test_case) OVERRIDE;
197};
198
199class PPAPIBrokerInfoBarTest : public OutOfProcessPPAPITest {
200 public:
201  // PPAPITestBase override:
202  virtual void SetUpOnMainThread() OVERRIDE;
203};
204
205#endif  // CHROME_TEST_PPAPI_PPAPI_TEST_H_
206