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));
Другие вопросы по тегам