Google Mock: Как скопировать память из указателя в ложный аргумент?
У меня есть следующая функция издевались с подписью:
uint32 Icc_u_SendMessage(te_IccTransferType e_DataTxType, SW_e_IccMsgType e_MsgType, uint8 *const pui8_DataRef, const uint32 ui32_DataSize, const SW_e_CoreIdent e_MsgDestination)
Интересным аргументом для меня является Arg2 (pui8_DataRef
).
Вызвать тестируемую функцию:
MessageBuffer<ET_t_SignalToGs> s_locPayloadToGs; (Local)
iccReturnValue = c_ICC_Messages::ICC_ui32_SendMessage(c_ICC_Messages::e_TxSendRefCopyData, e_msg, (uint8*)&locPayloadToGs, u_size, e_dst);
Я хотел бы скопировать все содержимое s_locPayloadToGs
для проверок. Проблема с SaveArgPointee()
является то, что третий аргумент (uint8 *
) и я получаю только первый байт.
Как я мог сделать вид memcpy
от ложного аргумента в EXPECT_CALL()
? как следующее:
c_event_transceiver::MessageBuffer<c_event_transceiver::ET_t_SignalToGs> expectedPayload;
EXPECT_CALL(obj_MockIccMessages, ICC_ui32_SendMessage(c_ICC_Messages::e_TxSendRefCopyData,
e_MsgToGs,
_,
sizeof(expectedLocPayload),
c_event_transceiver::a_ConfigMapGsToCore[0].e_core)).WillOnce(DoAll(SaveArgPointee<2>(&expectedPayload), Return(retSendMessage)));
Спасибо
1 ответ
Вы можете определить свое собственное действие:
ACTION_P(SavePayload, expectedPayload)
{
auto beginOfArray = arg2;
auto sizeOfArray = arg3;
auto endOfArray = beginOfArray + sizeOfArray ;
expectedPayload->assign(beginOfArray , endOfArray);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// that only my guess how it is possible to store payload
}
И просто заменить SaveArgPointee<2>(&expectedPayload)
с SavePayload(&expectedPayload)
в ваших тестах.
Но то, что вам действительно нужно, это сопоставление с несколькими аргументами - оно будет соответствовать той полезной нагрузке, что-то вроде этого:
MATCHER_P(matchPayload, expectedPayload)
{
auto beginOfArray = get<2>(arg);
auto sizeOfArray = get<3>(arg);
auto endOfArray = beginOfArray + sizeOfArray ;
return expectedPayload->equalTo(beginOfArray , endOfArray);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// that only my guess how it is possible to compare payloads
}
И использовать его с With(matchPayload())
clausure:
c_event_transceiver::MessageBuffer<c_event_transceiver::ET_t_SignalToGs> expectedPayload;
// expectedPayload - build it to be as this you expect
...
EXPECT_CALL(obj_MockIccMessages, ICC_ui32_SendMessage(c_ICC_Messages::e_TxSendRefCopyData,
e_MsgToGs,
_,
sizeof(expectedLocPayload),
c_event_transceiver::a_ConfigMapGsToCore[0].e_core))
.With(matchPayload(&expectedPayload)).WillOnce(Return(retSendMessage));