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 CONTENT_TEST_BROWSER_TEST_H_
6#define CONTENT_TEST_BROWSER_TEST_H_
7
8// We only want to use InProcessBrowserTest in test targets which properly
9// isolate each test case by running each test in a separate process.
10// This way if a test hangs the test launcher can reliably terminate it.
11//
12// InProcessBrowserTest cannot be run more than once in the same address space
13// anyway - otherwise the second test crashes.
14#if defined(HAS_OUT_OF_PROC_TEST_RUNNER)
15
16#include "base/compiler_specific.h"
17#include "testing/gtest/include/gtest/gtest.h"
18
19#define IN_PROC_BROWSER_TEST_(test_case_name, test_name, parent_class,\
20                              parent_id)\
21class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
22 public:\
23  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
24 protected:\
25  virtual void RunTestOnMainThread() OVERRIDE;\
26 private:\
27  virtual void TestBody() OVERRIDE {}\
28  static ::testing::TestInfo* const test_info_;\
29  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
30      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
31};\
32\
33::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
34  ::test_info_ =\
35    ::testing::internal::MakeAndRegisterTestInfo(\
36        #test_case_name, #test_name, "", "", \
37        (parent_id), \
38        parent_class::SetUpTestCase, \
39        parent_class::TearDownTestCase, \
40        new ::testing::internal::TestFactoryImpl<\
41            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
42void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::RunTestOnMainThread()
43
44#define IN_PROC_BROWSER_TEST_F(test_fixture, test_name)\
45  IN_PROC_BROWSER_TEST_(test_fixture, test_name, test_fixture,\
46                    ::testing::internal::GetTypeId<test_fixture>())
47
48#define IN_PROC_BROWSER_TEST_P_(test_case_name, test_name) \
49  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
50      : public test_case_name { \
51   public: \
52    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
53   protected: \
54    virtual void RunTestOnMainThread() OVERRIDE; \
55   private: \
56    virtual void TestBody() OVERRIDE {} \
57    static int AddToRegistry() { \
58      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
59          GetTestCasePatternHolder<test_case_name>(\
60              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
61                  #test_case_name, \
62                  #test_name, \
63                  new ::testing::internal::TestMetaFactory< \
64                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
65      return 0; \
66    } \
67    static int gtest_registering_dummy_; \
68    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
69        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
70  }; \
71  int GTEST_TEST_CLASS_NAME_(test_case_name, \
72                             test_name)::gtest_registering_dummy_ = \
73      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
74  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::RunTestOnMainThread()
75
76// Wrap the real macro with an outer macro to ensure that the parameters are
77// evaluated (e.g., if |test_name| is prefixed with MAYBE_).
78#define IN_PROC_BROWSER_TEST_P(test_case_name, test_name) \
79  IN_PROC_BROWSER_TEST_P_(test_case_name, test_name)
80
81#endif  // defined(HAS_OUT_OF_PROC_TEST_RUNNER)
82
83#endif  // CONTENT_TEST_BROWSER_TEST_H_
84