Tests: refectored IncomingTransferEmulator, CAN iface mock supports pushRx(RxFrame)

This commit is contained in:
Pavel Kirienko
2014-02-18 12:20:35 +04:00
parent a9a86bc151
commit 7039711027
3 changed files with 74 additions and 54 deletions
+9 -1
View File
@@ -8,6 +8,7 @@
#include <vector>
#include <gtest/gtest.h>
#include <uavcan/internal/transport/can_io.hpp>
#include <uavcan/internal/transport/transfer.hpp>
#include "../../common.hpp"
@@ -41,11 +42,18 @@ public:
, clockmock(clockmock)
{ }
void pushRx(uavcan::CanFrame frame)
void pushRx(const uavcan::CanFrame& frame)
{
rx.push(FrameWithTime(frame, clockmock.monotonic));
}
void pushRx(const uavcan::RxFrame& frame)
{
uavcan::CanFrame can_frame;
EXPECT_TRUE(frame.compile(can_frame));
rx.push(FrameWithTime(can_frame, frame.getMonotonicTimestamp()));
}
bool matchAndPopTx(const uavcan::CanFrame& frame, uint64_t tx_deadline)
{
if (tx.empty())
+4 -53
View File
@@ -6,67 +6,18 @@
#include "transfer_test_helpers.hpp"
class Emulator
class Emulator : public IncomingTransferEmulatorBase
{
uavcan::TransferListenerBase& target_;
const uavcan::DataTypeDescriptor type_;
uint64_t ts_;
uavcan::TransferID tid_;
uavcan::NodeID dst_node_id_;
public:
Emulator(uavcan::TransferListenerBase& target, const uavcan::DataTypeDescriptor& type,
uavcan::NodeID dst_node_id = 127)
: target_(target)
, type_(type)
, ts_(0)
, dst_node_id_(dst_node_id)
: IncomingTransferEmulatorBase(type, dst_node_id)
, target_(target)
{ }
Transfer makeTransfer(uavcan::TransferType transfer_type, uint8_t source_node_id, const std::string& payload)
{
ts_ += 100;
const uavcan::NodeID dst_node_id = (transfer_type == uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST)
? uavcan::NodeID::BROADCAST : dst_node_id_;
const Transfer tr(ts_, ts_ + 1000000000ul, transfer_type, tid_, source_node_id, dst_node_id, payload);
tid_.increment();
return tr;
}
void send(const std::vector<std::vector<uavcan::RxFrame> >& sers)
{
unsigned int index = 0;
while (true)
{
// Sending all transfers concurrently
bool all_empty = true;
for (std::vector<std::vector<uavcan::RxFrame> >::const_iterator it = sers.begin(); it != sers.end(); ++it)
{
if (it->size() <= index)
continue;
all_empty = false;
std::cout << "Emulator: Sending: " << it->at(index).toString() << std::endl;
target_.handleFrame(it->at(index));
}
index++;
if (all_empty)
break;
}
}
void send(const Transfer* transfers, unsigned int num_transfers)
{
std::vector<std::vector<uavcan::RxFrame> > sers;
while (num_transfers--)
sers.push_back(serializeTransfer(*transfers++, type_));
send(sers);
}
template <int SIZE>
void send(const Transfer (&transfers)[SIZE])
{
send(transfers, SIZE);
}
void sendOneFrame(const uavcan::RxFrame& frame) { target_.handleFrame(frame); }
};
@@ -205,3 +205,64 @@ std::vector<uavcan::RxFrame> serializeTransfer(const Transfer& transfer, const u
}
class IncomingTransferEmulatorBase
{
const uavcan::DataTypeDescriptor type_;
uint64_t ts_;
uavcan::TransferID tid_;
uavcan::NodeID dst_node_id_;
public:
IncomingTransferEmulatorBase(const uavcan::DataTypeDescriptor& type, uavcan::NodeID dst_node_id = 127)
: type_(type)
, ts_(0)
, dst_node_id_(dst_node_id)
{ }
virtual ~IncomingTransferEmulatorBase() { }
Transfer makeTransfer(uavcan::TransferType transfer_type, uint8_t source_node_id, const std::string& payload)
{
ts_ += 100;
const uavcan::NodeID dst_node_id = (transfer_type == uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST)
? uavcan::NodeID::BROADCAST : dst_node_id_;
const Transfer tr(ts_, ts_ + 1000000000ul, transfer_type, tid_, source_node_id, dst_node_id, payload);
tid_.increment();
return tr;
}
virtual void sendOneFrame(const uavcan::RxFrame& frame) = 0;
void send(const std::vector<std::vector<uavcan::RxFrame> >& sers)
{
unsigned int index = 0;
while (true)
{
// Sending all transfers concurrently
bool all_empty = true;
for (std::vector<std::vector<uavcan::RxFrame> >::const_iterator it = sers.begin(); it != sers.end(); ++it)
{
if (it->size() <= index)
continue;
all_empty = false;
std::cout << "Incoming Transfer Emulator: Sending: " << it->at(index).toString() << std::endl;
sendOneFrame(it->at(index));
}
index++;
if (all_empty)
break;
}
}
void send(const Transfer* transfers, unsigned int num_transfers)
{
std::vector<std::vector<uavcan::RxFrame> > sers;
while (num_transfers--)
sers.push_back(serializeTransfer(*transfers++, type_));
send(sers);
}
template <int SIZE> void send(const Transfer (&transfers)[SIZE]) { send(transfers, SIZE); }
};