1*481dde66SAndroid Build Coastguard Worker // Copyright 2007, Google Inc.
2*481dde66SAndroid Build Coastguard Worker // All rights reserved.
3*481dde66SAndroid Build Coastguard Worker //
4*481dde66SAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
5*481dde66SAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
6*481dde66SAndroid Build Coastguard Worker // met:
7*481dde66SAndroid Build Coastguard Worker //
8*481dde66SAndroid Build Coastguard Worker // * Redistributions of source code must retain the above copyright
9*481dde66SAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
10*481dde66SAndroid Build Coastguard Worker // * Redistributions in binary form must reproduce the above
11*481dde66SAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
12*481dde66SAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
13*481dde66SAndroid Build Coastguard Worker // distribution.
14*481dde66SAndroid Build Coastguard Worker // * Neither the name of Google Inc. nor the names of its
15*481dde66SAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
16*481dde66SAndroid Build Coastguard Worker // this software without specific prior written permission.
17*481dde66SAndroid Build Coastguard Worker //
18*481dde66SAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19*481dde66SAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20*481dde66SAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21*481dde66SAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22*481dde66SAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23*481dde66SAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24*481dde66SAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*481dde66SAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*481dde66SAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*481dde66SAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28*481dde66SAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*481dde66SAndroid Build Coastguard Worker
30*481dde66SAndroid Build Coastguard Worker // Tests that Google Mock constructs can be used in a large number of
31*481dde66SAndroid Build Coastguard Worker // threads concurrently.
32*481dde66SAndroid Build Coastguard Worker
33*481dde66SAndroid Build Coastguard Worker #include "gmock/gmock.h"
34*481dde66SAndroid Build Coastguard Worker #include "gtest/gtest.h"
35*481dde66SAndroid Build Coastguard Worker
36*481dde66SAndroid Build Coastguard Worker namespace testing {
37*481dde66SAndroid Build Coastguard Worker namespace {
38*481dde66SAndroid Build Coastguard Worker
39*481dde66SAndroid Build Coastguard Worker // From gtest-port.h.
40*481dde66SAndroid Build Coastguard Worker using ::testing::internal::ThreadWithParam;
41*481dde66SAndroid Build Coastguard Worker
42*481dde66SAndroid Build Coastguard Worker // The maximum number of test threads (not including helper threads)
43*481dde66SAndroid Build Coastguard Worker // to create.
44*481dde66SAndroid Build Coastguard Worker const int kMaxTestThreads = 50;
45*481dde66SAndroid Build Coastguard Worker
46*481dde66SAndroid Build Coastguard Worker // How many times to repeat a task in a test thread.
47*481dde66SAndroid Build Coastguard Worker const int kRepeat = 50;
48*481dde66SAndroid Build Coastguard Worker
49*481dde66SAndroid Build Coastguard Worker class MockFoo {
50*481dde66SAndroid Build Coastguard Worker public:
51*481dde66SAndroid Build Coastguard Worker MOCK_METHOD1(Bar, int(int n)); // NOLINT
52*481dde66SAndroid Build Coastguard Worker MOCK_METHOD2(Baz, char(const char* s1, const std::string& s2)); // NOLINT
53*481dde66SAndroid Build Coastguard Worker };
54*481dde66SAndroid Build Coastguard Worker
55*481dde66SAndroid Build Coastguard Worker // Helper for waiting for the given thread to finish and then deleting it.
56*481dde66SAndroid Build Coastguard Worker template <typename T>
JoinAndDelete(ThreadWithParam<T> * t)57*481dde66SAndroid Build Coastguard Worker void JoinAndDelete(ThreadWithParam<T>* t) {
58*481dde66SAndroid Build Coastguard Worker t->Join();
59*481dde66SAndroid Build Coastguard Worker delete t;
60*481dde66SAndroid Build Coastguard Worker }
61*481dde66SAndroid Build Coastguard Worker
62*481dde66SAndroid Build Coastguard Worker struct Dummy {};
63*481dde66SAndroid Build Coastguard Worker
64*481dde66SAndroid Build Coastguard Worker // Tests that different mock objects can be used in their respective
65*481dde66SAndroid Build Coastguard Worker // threads. This should generate no Google Test failure.
TestConcurrentMockObjects(Dummy)66*481dde66SAndroid Build Coastguard Worker void TestConcurrentMockObjects(Dummy /* dummy */) {
67*481dde66SAndroid Build Coastguard Worker // Creates a mock and does some typical operations on it.
68*481dde66SAndroid Build Coastguard Worker MockFoo foo;
69*481dde66SAndroid Build Coastguard Worker ON_CALL(foo, Bar(_)).WillByDefault(Return(1));
70*481dde66SAndroid Build Coastguard Worker ON_CALL(foo, Baz(_, _)).WillByDefault(Return('b'));
71*481dde66SAndroid Build Coastguard Worker ON_CALL(foo, Baz(_, "you")).WillByDefault(Return('a'));
72*481dde66SAndroid Build Coastguard Worker
73*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(0)).Times(AtMost(3));
74*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Baz(_, _));
75*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Baz("hi", "you"))
76*481dde66SAndroid Build Coastguard Worker .WillOnce(Return('z'))
77*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(DoDefault());
78*481dde66SAndroid Build Coastguard Worker
79*481dde66SAndroid Build Coastguard Worker EXPECT_EQ(1, foo.Bar(0));
80*481dde66SAndroid Build Coastguard Worker EXPECT_EQ(1, foo.Bar(0));
81*481dde66SAndroid Build Coastguard Worker EXPECT_EQ('z', foo.Baz("hi", "you"));
82*481dde66SAndroid Build Coastguard Worker EXPECT_EQ('a', foo.Baz("hi", "you"));
83*481dde66SAndroid Build Coastguard Worker EXPECT_EQ('b', foo.Baz("hi", "me"));
84*481dde66SAndroid Build Coastguard Worker }
85*481dde66SAndroid Build Coastguard Worker
86*481dde66SAndroid Build Coastguard Worker // Tests invoking methods of the same mock object in multiple threads.
87*481dde66SAndroid Build Coastguard Worker
88*481dde66SAndroid Build Coastguard Worker struct Helper1Param {
89*481dde66SAndroid Build Coastguard Worker MockFoo* mock_foo;
90*481dde66SAndroid Build Coastguard Worker int* count;
91*481dde66SAndroid Build Coastguard Worker };
92*481dde66SAndroid Build Coastguard Worker
Helper1(Helper1Param param)93*481dde66SAndroid Build Coastguard Worker void Helper1(Helper1Param param) {
94*481dde66SAndroid Build Coastguard Worker for (int i = 0; i < kRepeat; i++) {
95*481dde66SAndroid Build Coastguard Worker const char ch = param.mock_foo->Baz("a", "b");
96*481dde66SAndroid Build Coastguard Worker if (ch == 'a') {
97*481dde66SAndroid Build Coastguard Worker // It was an expected call.
98*481dde66SAndroid Build Coastguard Worker (*param.count)++;
99*481dde66SAndroid Build Coastguard Worker } else {
100*481dde66SAndroid Build Coastguard Worker // It was an excessive call.
101*481dde66SAndroid Build Coastguard Worker EXPECT_EQ('\0', ch);
102*481dde66SAndroid Build Coastguard Worker }
103*481dde66SAndroid Build Coastguard Worker
104*481dde66SAndroid Build Coastguard Worker // An unexpected call.
105*481dde66SAndroid Build Coastguard Worker EXPECT_EQ('\0', param.mock_foo->Baz("x", "y")) << "Expected failure.";
106*481dde66SAndroid Build Coastguard Worker
107*481dde66SAndroid Build Coastguard Worker // An uninteresting call.
108*481dde66SAndroid Build Coastguard Worker EXPECT_EQ(1, param.mock_foo->Bar(5));
109*481dde66SAndroid Build Coastguard Worker }
110*481dde66SAndroid Build Coastguard Worker }
111*481dde66SAndroid Build Coastguard Worker
112*481dde66SAndroid Build Coastguard Worker // This should generate 3*kRepeat + 1 failures in total.
TestConcurrentCallsOnSameObject(Dummy)113*481dde66SAndroid Build Coastguard Worker void TestConcurrentCallsOnSameObject(Dummy /* dummy */) {
114*481dde66SAndroid Build Coastguard Worker MockFoo foo;
115*481dde66SAndroid Build Coastguard Worker
116*481dde66SAndroid Build Coastguard Worker ON_CALL(foo, Bar(_)).WillByDefault(Return(1));
117*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Baz(_, "b")).Times(kRepeat).WillRepeatedly(Return('a'));
118*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Baz(_, "c")); // Expected to be unsatisfied.
119*481dde66SAndroid Build Coastguard Worker
120*481dde66SAndroid Build Coastguard Worker // This chunk of code should generate kRepeat failures about
121*481dde66SAndroid Build Coastguard Worker // excessive calls, and 2*kRepeat failures about unexpected calls.
122*481dde66SAndroid Build Coastguard Worker int count1 = 0;
123*481dde66SAndroid Build Coastguard Worker const Helper1Param param = {&foo, &count1};
124*481dde66SAndroid Build Coastguard Worker ThreadWithParam<Helper1Param>* const t =
125*481dde66SAndroid Build Coastguard Worker new ThreadWithParam<Helper1Param>(Helper1, param, nullptr);
126*481dde66SAndroid Build Coastguard Worker
127*481dde66SAndroid Build Coastguard Worker int count2 = 0;
128*481dde66SAndroid Build Coastguard Worker const Helper1Param param2 = {&foo, &count2};
129*481dde66SAndroid Build Coastguard Worker Helper1(param2);
130*481dde66SAndroid Build Coastguard Worker JoinAndDelete(t);
131*481dde66SAndroid Build Coastguard Worker
132*481dde66SAndroid Build Coastguard Worker EXPECT_EQ(kRepeat, count1 + count2);
133*481dde66SAndroid Build Coastguard Worker
134*481dde66SAndroid Build Coastguard Worker // foo's destructor should generate one failure about unsatisfied
135*481dde66SAndroid Build Coastguard Worker // expectation.
136*481dde66SAndroid Build Coastguard Worker }
137*481dde66SAndroid Build Coastguard Worker
138*481dde66SAndroid Build Coastguard Worker // Tests using the same mock object in multiple threads when the
139*481dde66SAndroid Build Coastguard Worker // expectations are partially ordered.
140*481dde66SAndroid Build Coastguard Worker
Helper2(MockFoo * foo)141*481dde66SAndroid Build Coastguard Worker void Helper2(MockFoo* foo) {
142*481dde66SAndroid Build Coastguard Worker for (int i = 0; i < kRepeat; i++) {
143*481dde66SAndroid Build Coastguard Worker foo->Bar(2);
144*481dde66SAndroid Build Coastguard Worker foo->Bar(3);
145*481dde66SAndroid Build Coastguard Worker }
146*481dde66SAndroid Build Coastguard Worker }
147*481dde66SAndroid Build Coastguard Worker
148*481dde66SAndroid Build Coastguard Worker // This should generate no Google Test failures.
TestPartiallyOrderedExpectationsWithThreads(Dummy)149*481dde66SAndroid Build Coastguard Worker void TestPartiallyOrderedExpectationsWithThreads(Dummy /* dummy */) {
150*481dde66SAndroid Build Coastguard Worker MockFoo foo;
151*481dde66SAndroid Build Coastguard Worker Sequence s1, s2;
152*481dde66SAndroid Build Coastguard Worker
153*481dde66SAndroid Build Coastguard Worker {
154*481dde66SAndroid Build Coastguard Worker InSequence dummy;
155*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(0));
156*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(1)).InSequence(s1, s2);
157*481dde66SAndroid Build Coastguard Worker }
158*481dde66SAndroid Build Coastguard Worker
159*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(2))
160*481dde66SAndroid Build Coastguard Worker .Times(2 * kRepeat)
161*481dde66SAndroid Build Coastguard Worker .InSequence(s1)
162*481dde66SAndroid Build Coastguard Worker .RetiresOnSaturation();
163*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(3)).Times(2 * kRepeat).InSequence(s2);
164*481dde66SAndroid Build Coastguard Worker
165*481dde66SAndroid Build Coastguard Worker {
166*481dde66SAndroid Build Coastguard Worker InSequence dummy;
167*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(2)).InSequence(s1, s2);
168*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(4));
169*481dde66SAndroid Build Coastguard Worker }
170*481dde66SAndroid Build Coastguard Worker
171*481dde66SAndroid Build Coastguard Worker foo.Bar(0);
172*481dde66SAndroid Build Coastguard Worker foo.Bar(1);
173*481dde66SAndroid Build Coastguard Worker
174*481dde66SAndroid Build Coastguard Worker ThreadWithParam<MockFoo*>* const t =
175*481dde66SAndroid Build Coastguard Worker new ThreadWithParam<MockFoo*>(Helper2, &foo, nullptr);
176*481dde66SAndroid Build Coastguard Worker Helper2(&foo);
177*481dde66SAndroid Build Coastguard Worker JoinAndDelete(t);
178*481dde66SAndroid Build Coastguard Worker
179*481dde66SAndroid Build Coastguard Worker foo.Bar(2);
180*481dde66SAndroid Build Coastguard Worker foo.Bar(4);
181*481dde66SAndroid Build Coastguard Worker }
182*481dde66SAndroid Build Coastguard Worker
183*481dde66SAndroid Build Coastguard Worker // Tests using Google Mock constructs in many threads concurrently.
TEST(StressTest,CanUseGMockWithThreads)184*481dde66SAndroid Build Coastguard Worker TEST(StressTest, CanUseGMockWithThreads) {
185*481dde66SAndroid Build Coastguard Worker void (*test_routines[])(Dummy dummy) = {
186*481dde66SAndroid Build Coastguard Worker &TestConcurrentMockObjects,
187*481dde66SAndroid Build Coastguard Worker &TestConcurrentCallsOnSameObject,
188*481dde66SAndroid Build Coastguard Worker &TestPartiallyOrderedExpectationsWithThreads,
189*481dde66SAndroid Build Coastguard Worker };
190*481dde66SAndroid Build Coastguard Worker
191*481dde66SAndroid Build Coastguard Worker const int kRoutines = sizeof(test_routines) / sizeof(test_routines[0]);
192*481dde66SAndroid Build Coastguard Worker const int kCopiesOfEachRoutine = kMaxTestThreads / kRoutines;
193*481dde66SAndroid Build Coastguard Worker const int kTestThreads = kCopiesOfEachRoutine * kRoutines;
194*481dde66SAndroid Build Coastguard Worker ThreadWithParam<Dummy>* threads[kTestThreads] = {};
195*481dde66SAndroid Build Coastguard Worker for (int i = 0; i < kTestThreads; i++) {
196*481dde66SAndroid Build Coastguard Worker // Creates a thread to run the test function.
197*481dde66SAndroid Build Coastguard Worker threads[i] = new ThreadWithParam<Dummy>(test_routines[i % kRoutines],
198*481dde66SAndroid Build Coastguard Worker Dummy(), nullptr);
199*481dde66SAndroid Build Coastguard Worker GTEST_LOG_(INFO) << "Thread #" << i << " running . . .";
200*481dde66SAndroid Build Coastguard Worker }
201*481dde66SAndroid Build Coastguard Worker
202*481dde66SAndroid Build Coastguard Worker // At this point, we have many threads running.
203*481dde66SAndroid Build Coastguard Worker for (int i = 0; i < kTestThreads; i++) {
204*481dde66SAndroid Build Coastguard Worker JoinAndDelete(threads[i]);
205*481dde66SAndroid Build Coastguard Worker }
206*481dde66SAndroid Build Coastguard Worker
207*481dde66SAndroid Build Coastguard Worker // Ensures that the correct number of failures have been reported.
208*481dde66SAndroid Build Coastguard Worker const TestInfo* const info = UnitTest::GetInstance()->current_test_info();
209*481dde66SAndroid Build Coastguard Worker const TestResult& result = *info->result();
210*481dde66SAndroid Build Coastguard Worker const int kExpectedFailures = (3 * kRepeat + 1) * kCopiesOfEachRoutine;
211*481dde66SAndroid Build Coastguard Worker GTEST_CHECK_(kExpectedFailures == result.total_part_count())
212*481dde66SAndroid Build Coastguard Worker << "Expected " << kExpectedFailures << " failures, but got "
213*481dde66SAndroid Build Coastguard Worker << result.total_part_count();
214*481dde66SAndroid Build Coastguard Worker }
215*481dde66SAndroid Build Coastguard Worker
216*481dde66SAndroid Build Coastguard Worker } // namespace
217*481dde66SAndroid Build Coastguard Worker } // namespace testing
218*481dde66SAndroid Build Coastguard Worker
main(int argc,char ** argv)219*481dde66SAndroid Build Coastguard Worker int main(int argc, char** argv) {
220*481dde66SAndroid Build Coastguard Worker testing::InitGoogleMock(&argc, argv);
221*481dde66SAndroid Build Coastguard Worker
222*481dde66SAndroid Build Coastguard Worker const int exit_code = RUN_ALL_TESTS(); // Expected to fail.
223*481dde66SAndroid Build Coastguard Worker GTEST_CHECK_(exit_code != 0) << "RUN_ALL_TESTS() did not fail as expected";
224*481dde66SAndroid Build Coastguard Worker
225*481dde66SAndroid Build Coastguard Worker printf("\nPASS\n");
226*481dde66SAndroid Build Coastguard Worker return 0;
227*481dde66SAndroid Build Coastguard Worker }
228