Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set, in google mock, a void* argument to a set of values?

Tags:

googlemock

I am using google mock to unit test my code, and I am trying to return, as an output argument, a set of values through a void*.

uint32_t bigEndianTestValues[BIG_ENDIAN_FIELD_MAX_ELEMENTS] = {0xDEADBEEF, 0xFFFF0000, 0x00000000, 0x00A00F10, 0x11234211};

for (int i = 0; i < BIG_ENDIAN_FIELD_MAX_ELEMENTS; ++i)
{
   EXPECT_CALL( deviceWindow, get(_,sizeof(bigEndianTestValues[0]),_,_) )
   .WillOnce(SetArgPointee<2>(bigEndianTestValues[i]))
   .RetiresOnSaturation();
}

My mock contains a method call as follows

MOCK_METHOD4(get, void(const size_t, const size_t, void*, nNIAPALS100::tStatus&));

But I get the following error

....\include\gmock/gmock-actions.h(693) : error C2100: illegal indirection
....\gmock/gmock-actions.h(369) : see reference to function template instantiation 'void testing::internal::SetArgumentPointeeAction<N,A,kIsProto>::Perform<void,std::tr1::tuple<T0,T1,T2,T3>>(const ArgumentTuple &) const' being compiled with
            [
                N=0x02,
                A=uint32_t,
                kIsProto=false,
                T0=size_t,
                T1=size_t,
                T2=void *,
                T3=nNIAPALS100::tStatus &,
                ArgumentTuple=std::tr1::tuple<size_t,size_t,void *,nNIAPALS100::tStatus &>
            ]
            z:\Perforce\jperetzm_JPERETZM-DT\ThirdPartyExports\googlemock\export\1.6\1.6.0a0\includes\gmock\include\gmock/gmock-actions.h(368) : while compiling class template member function 'void testing::Polymor
    phicAction<Impl>::MonomorphicImpl<F>::Perform(const std::tr1::tuple<T0,T1,T2,T3> &)'
            with
            [
                Impl=testing::internal::SetArgumentPointeeAction<0x02,uint32_t,false>,
                F=void (size_t,size_t,void *,nNIAPALS100::tStatus &),
                T0=size_t,
                T1=size_t,
                T2=void *,
                T3=nNIAPALS100::tStatus &
            ]
....\include\gmock/gmock-actions.h(356) : see reference to class template instantiation 'testing::PolymorphicAction<Impl>::MonomorphicImpl<F>' being compiled
            with
            [
                Impl=testing::internal::SetArgumentPointeeAction<0x02,uint32_t,false>,
                F=void (size_t,size_t,void *,nNIAPALS100::tStatus &)
            ]
....\StorageMapRaw_Test.cpp(471) : see reference to function template instantiation 'testing::PolymorphicAction<Impl>::operator testing::Action<F>(void) const<F>' being compiled with
            [
                Impl=testing::internal::SetArgumentPointeeAction<0x02,uint32_t,false>,
                F=void (size_t,size_t,void *,nNIAPALS100::tStatus &)
            ]
....include\gmock/gmock-actions.h(693) : error C2440: '=' : cannot convert from 'const uint32_t' to 'void *const 'Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast storageMap_test_win64U_x64_msvc90_debug - 2 error(s), 0 warning(s)

It seems that I need to cast the void* to an uint32_t*. Any idea how to do it?

like image 725
Peretz Avatar asked Jul 24 '13 21:07

Peretz


People also ask

How do you mock Google?

first, you use some simple macros to describe the interface you want to mock, and they will expand to the implementation of your mock class; next, you create some mock objects and specify its expectations and behavior using an intuitive syntax; then you exercise code that uses the mock objects.

What is Expect_call?

EXPECT_CALL not only defines the behavior, but also sets an expectation that the method must be called with the given arguments, for the given number of times (and in the given order when you specify the order too).

What is mock in Gtest?

Mock are like objects, defined in such a way to mimick the real-deal by supplying controlled behavior. For instance, to test a stock tick application, you'd create a fake stock data provider that created fake stock quotes to test your code with. Think of the word mock, literally means 'to mimic'.


1 Answers

SetArgPointee and other standard actions are type-safe. They will not allow you to do such unsafe assignment. You have to write a custom action that will do the typecasting:

ACTION_P(SetArg2ToInt32, value) { *static_cast<uint32_t*>(arg2) = value; }

...

EXPECT_CALL(deviceWindow, get(_,sizeof(bigEndianTestValues[0]),_,_))
  .WillOnce(SetArg2ToInt32(bigEndianTestValues[i]))
like image 103
VladLosev Avatar answered Oct 02 '22 14:10

VladLosev