15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2009 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)// This test is a simple sanity check to make sure gmock is able to build/link 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly. It just instantiates a mock object and runs through a couple of 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the basic mock features. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gmock matchers and actions that we use below. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyOf; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Eq; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::SetArgumentPointee; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::WithArg; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simple class that we can mock out the behavior for. Everything is virtual 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for easy mocking. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SampleClass { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SampleClass() {} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SampleClass() {} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int ReturnSomething() { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReturnNothingConstly() const { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OutputParam(int* a) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int ReturnSecond(int a, int b) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return b; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Declare a mock for the class. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockSampleClass : public SampleClass { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(ReturnSomething, int()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(ReturnNothingConstly, void()); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OutputParam, void(int* a)); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(ReturnSecond, int(int a, int b)); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a couple of custom actions. Custom actions can be used for adding 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// more complex behavior into your mock...though if you start needing these, ask 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if you're asking your mock to do too much. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(ReturnVal) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the first argument received. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return arg0; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(ReturnSecond) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the second argument. This basically implemetns ReturnSecond. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return arg1; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GmockTest, SimpleMatchAndActions) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Basic test of some simple gmock matchers, actions, and cardinality 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expectations. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSampleClass mock; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock, ReturnSomething()) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(1)) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(2)) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(3)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, mock.ReturnSomething()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, mock.ReturnSomething()); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, mock.ReturnSomething()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock, ReturnNothingConstly()).Times(2); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock.ReturnNothingConstly(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock.ReturnNothingConstly(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GmockTest, AssignArgument) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Capture an argument for examination. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSampleClass mock; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock, OutputParam(_)) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(SetArgumentPointee<0>(5)); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int arg = 0; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock.OutputParam(&arg); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, arg); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GmockTest, SideEffects) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Capture an argument for examination. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSampleClass mock; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock, OutputParam(_)) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(SetArgumentPointee<0>(5)); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int arg = 0; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock.OutputParam(&arg); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, arg); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GmockTest, CustomAction_ReturnSecond) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test a mock of the ReturnSecond behavior using an action that provides an 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // alternate implementation of the function. Danger here though, this is 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // starting to add too much behavior of the mock, which means the mock 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implementation might start to have bugs itself. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSampleClass mock; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock, ReturnSecond(_, AnyOf(Eq(4), Eq(5)))) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnSecond()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, mock.ReturnSecond(-1, 4)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, mock.ReturnSecond(0, 5)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, mock.ReturnSecond(0xdeadbeef, 4)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, mock.ReturnSecond(112358, 4)); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, mock.ReturnSecond(1337, 5)); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GmockTest, CustomAction_ReturnVal) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Alternate implemention of ReturnSecond using a more general custom action, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and a WithArg adapter to bridge the interfaces. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSampleClass mock; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock, ReturnSecond(_, AnyOf(Eq(4), Eq(5)))) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(WithArg<1>(ReturnVal())); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, mock.ReturnSecond(-1, 4)); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, mock.ReturnSecond(0, 5)); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, mock.ReturnSecond(0xdeadbeef, 4)); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, mock.ReturnSecond(112358, 4)); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, mock.ReturnSecond(1337, 5)); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 138