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