browser_test_base.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/test/test_server.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandLine;
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilePath;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserTestBase : public testing::Test {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserTestBase();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BrowserTestBase();
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do this so we can be used in a Task.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddRef() {}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Release() {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configures everything for an in process browser test, then invokes
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserMain. BrowserMain ends up invoking RunTestOnMainThreadLoop.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restores state configured in SetUp.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override this to add any custom setup code that needs to be done on the
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // main thread after the browser is created and just before calling
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RunTestOnMainThread().
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpOnMainThread() {}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override this to add command line flags specific to your test.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) {}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need these special methods because SetUp is the bottom of the stack
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that winds up calling your test method, so it is not always an option
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to do what you want by overriding it and calling the superclass version.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override this for things you would normally override SetUp for. It will be
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called before your individual test fixture method is run, but after most
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the overhead initialization has occured.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() {}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override this for things you would normally override TearDown for.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDownInProcessBrowserTestFixture() {}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override this rather than TestBody.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RunTestOnMainThread() = 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is invoked from main after browser_init/browser_main have completed.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This prepares for the test by creating a new browser, runs the test
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (RunTestOnMainThread), quits the browsers and returns.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RunTestOnMainThreadLoop() = 0;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the testing server. Guaranteed to be non-NULL.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::TestServer* test_server() const { return test_server_.get(); }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestServer* test_server() { return test_server_.get(); }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is only needed by a test that raises SIGTERM to ensure that a specific
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // codepath is taken.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DisableSIGTERMHandling() {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle_sigterm_ = false;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function is meant only for classes that directly derive from this
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class to construct the test server in their constructor. They might need to
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call this after setting up the paths. Actual test cases should never call
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |test_server_base| is the path, relative to src, to give to the test HTTP
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // server.
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateTestServer(const base::FilePath& test_server_base);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProxyRunTestOnMainThreadLoop();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Testing server, started on demand.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::TestServer> test_server_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handle_sigterm_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_PUBLIC_TEST_BROWSER_TEST_BASE_H_
99