1// Copyright 2006, Google Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8//     * Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10//     * Redistributions in binary form must reproduce the above
11// copyright notice, this list of conditions and the following disclaimer
12// in the documentation and/or other materials provided with the
13// distribution.
14//     * Neither the name of Google Inc. nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30// Author: eefacm@gmail.com (Sean Mcafee)
31
32// Unit test for Google Test XML output.
33//
34// A user can specify XML output in a Google Test program to run via
35// either the GTEST_OUTPUT environment variable or the --gtest_output
36// flag.  This is used for testing such functionality.
37//
38// This program will be invoked from a Python unit test.  Don't run it
39// directly.
40
41#include "gtest/gtest.h"
42
43using ::testing::InitGoogleTest;
44using ::testing::TestEventListeners;
45using ::testing::TestWithParam;
46using ::testing::UnitTest;
47using ::testing::Test;
48using ::testing::Types;
49using ::testing::Values;
50
51class SuccessfulTest : public Test {
52};
53
54TEST_F(SuccessfulTest, Succeeds) {
55  SUCCEED() << "This is a success.";
56  ASSERT_EQ(1, 1);
57}
58
59class FailedTest : public Test {
60};
61
62TEST_F(FailedTest, Fails) {
63  ASSERT_EQ(1, 2);
64}
65
66class DisabledTest : public Test {
67};
68
69TEST_F(DisabledTest, DISABLED_test_not_run) {
70  FAIL() << "Unexpected failure: Disabled test should not be run";
71}
72
73TEST(MixedResultTest, Succeeds) {
74  EXPECT_EQ(1, 1);
75  ASSERT_EQ(1, 1);
76}
77
78TEST(MixedResultTest, Fails) {
79  EXPECT_EQ(1, 2);
80  ASSERT_EQ(2, 3);
81}
82
83TEST(MixedResultTest, DISABLED_test) {
84  FAIL() << "Unexpected failure: Disabled test should not be run";
85}
86
87TEST(XmlQuotingTest, OutputsCData) {
88  FAIL() << "XML output: "
89            "<?xml encoding=\"utf-8\"><top><![CDATA[cdata text]]></top>";
90}
91
92// Helps to test that invalid characters produced by test code do not make
93// it into the XML file.
94TEST(InvalidCharactersTest, InvalidCharactersInMessage) {
95  FAIL() << "Invalid characters in brackets [\x1\x2]";
96}
97
98class PropertyRecordingTest : public Test {
99};
100
101TEST_F(PropertyRecordingTest, OneProperty) {
102  RecordProperty("key_1", "1");
103}
104
105TEST_F(PropertyRecordingTest, IntValuedProperty) {
106  RecordProperty("key_int", 1);
107}
108
109TEST_F(PropertyRecordingTest, ThreeProperties) {
110  RecordProperty("key_1", "1");
111  RecordProperty("key_2", "2");
112  RecordProperty("key_3", "3");
113}
114
115TEST_F(PropertyRecordingTest, TwoValuesForOneKeyUsesLastValue) {
116  RecordProperty("key_1", "1");
117  RecordProperty("key_1", "2");
118}
119
120TEST(NoFixtureTest, RecordProperty) {
121  RecordProperty("key", "1");
122}
123
124void ExternalUtilityThatCallsRecordProperty(const char* key, int value) {
125  testing::Test::RecordProperty(key, value);
126}
127
128void ExternalUtilityThatCallsRecordProperty(const char* key,
129                                            const char* value) {
130  testing::Test::RecordProperty(key, value);
131}
132
133TEST(NoFixtureTest, ExternalUtilityThatCallsRecordIntValuedProperty) {
134  ExternalUtilityThatCallsRecordProperty("key_for_utility_int", 1);
135}
136
137TEST(NoFixtureTest, ExternalUtilityThatCallsRecordStringValuedProperty) {
138  ExternalUtilityThatCallsRecordProperty("key_for_utility_string", "1");
139}
140
141// Verifies that the test parameter value is output in the 'value_param'
142// XML attribute for value-parameterized tests.
143class ValueParamTest : public TestWithParam<int> {};
144TEST_P(ValueParamTest, HasValueParamAttribute) {}
145TEST_P(ValueParamTest, AnotherTestThatHasValueParamAttribute) {}
146INSTANTIATE_TEST_CASE_P(Single, ValueParamTest, Values(33, 42));
147
148// Verifies that the type parameter name is output in the 'type_param'
149// XML attribute for typed tests.
150template <typename T> class TypedTest : public Test {};
151typedef Types<int, long> TypedTestTypes;
152TYPED_TEST_CASE(TypedTest, TypedTestTypes);
153TYPED_TEST(TypedTest, HasTypeParamAttribute) {}
154
155// Verifies that the type parameter name is output in the 'type_param'
156// XML attribute for type-parameterized tests.
157template <typename T> class TypeParameterizedTestCase : public Test {};
158TYPED_TEST_CASE_P(TypeParameterizedTestCase);
159TYPED_TEST_P(TypeParameterizedTestCase, HasTypeParamAttribute) {}
160REGISTER_TYPED_TEST_CASE_P(TypeParameterizedTestCase, HasTypeParamAttribute);
161typedef Types<int, long> TypeParameterizedTestCaseTypes;
162INSTANTIATE_TYPED_TEST_CASE_P(Single,
163                              TypeParameterizedTestCase,
164                              TypeParameterizedTestCaseTypes);
165
166int main(int argc, char** argv) {
167  InitGoogleTest(&argc, argv);
168
169  if (argc > 1 && strcmp(argv[1], "--shut_down_xml") == 0) {
170    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
171    delete listeners.Release(listeners.default_xml_generator());
172  }
173  return RUN_ALL_TESTS();
174}
175