browser_test_base.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_PUBLIC_TEST_BROWSER_TEST_BASE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_PUBLIC_TEST_BROWSER_TEST_BASE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/test/spawned_test_server.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandLine;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilePath;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserTestBase : public testing::Test {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserTestBase();
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BrowserTestBase();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do this so we can be used in a Task.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddRef() {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Release() {}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configures everything for an in process browser test, then invokes
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserMain. BrowserMain ends up invoking RunTestOnMainThreadLoop.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restores state configured in SetUp.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override this to add any custom setup code that needs to be done on the
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // main thread after the browser is created and just before calling
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RunTestOnMainThread().
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpOnMainThread() {}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override this to add command line flags specific to your test.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) {}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need these special methods because SetUp is the bottom of the stack
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that winds up calling your test method, so it is not always an option
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to do what you want by overriding it and calling the superclass version.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override this for things you would normally override SetUp for. It will be
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called before your individual test fixture method is run, but after most
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the overhead initialization has occured.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() {}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override this for things you would normally override TearDown for.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDownInProcessBrowserTestFixture() {}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override this rather than TestBody.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RunTestOnMainThread() = 0;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is invoked from main after browser_init/browser_main have completed.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This prepares for the test by creating a new browser, runs the test
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (RunTestOnMainThread), quits the browsers and returns.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RunTestOnMainThreadLoop() = 0;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the testing server. Guaranteed to be non-NULL.
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const net::SpawnedTestServer* test_server() const {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return test_server_.get();
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer* test_server() { return test_server_.get(); }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is only needed by a test that raises SIGTERM to ensure that a specific
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // codepath is taken.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DisableSIGTERMHandling() {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle_sigterm_ = false;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function is meant only for classes that directly derive from this
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class to construct the test server in their constructor. They might need to
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call this after setting up the paths. Actual test cases should never call
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |test_server_base| is the path, relative to src, to give to the test HTTP
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // server.
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateTestServer(const base::FilePath& test_server_base);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When the test is running in --single-process mode, runs the given task on
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the in-process renderer thread. A nested message loop is run until it
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // returns.
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void PostTaskToInProcessRendererAndWait(const base::Closure& task);
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProxyRunTestOnMainThreadLoop();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Testing server, started on demand.
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<net::SpawnedTestServer> test_server_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handle_sigterm_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_PUBLIC_TEST_BROWSER_TEST_BASE_H_
107