libuav original

Dependents:   UAVCAN UAVCAN_Subscriber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers incoming_transfer.cpp Source File

incoming_transfer.cpp

00001 /*
00002  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
00003  */
00004 
00005 #include <algorithm>
00006 #include <gtest/gtest.h>
00007 #include <uavcan/transport/transfer_listener.hpp>
00008 #include "../clock.hpp"
00009 #include "transfer_test_helpers.hpp"
00010 
00011 
00012 static uavcan::RxFrame makeFrame()
00013 {
00014     uavcan::RxFrame frame(uavcan::Frame(123, uavcan::TransferTypeMessageBroadcast, 1, uavcan::NodeID::Broadcast, 0),
00015                           tsMono(123), tsUtc(456), 0);
00016     uint8_t data[8];
00017     for (uint8_t i = 0; i < sizeof(data); i++)
00018     {
00019         data[i] = i;
00020     }
00021     frame.setPayload(data, sizeof(data));
00022     frame.setEndOfTransfer(true);
00023     return frame;
00024 }
00025 
00026 
00027 static bool match(const uavcan::IncomingTransfer& it, const uavcan::RxFrame& frame,
00028                   const uint8_t* payload, unsigned payload_len)
00029 {
00030     // Fields extracted from the frame struct
00031     EXPECT_EQ(it.getMonotonicTimestamp(), frame.getMonotonicTimestamp());
00032     EXPECT_EQ(it.getUtcTimestamp(),       frame.getUtcTimestamp());
00033     EXPECT_EQ(it.getSrcNodeID(),          frame.getSrcNodeID());
00034     EXPECT_EQ(it.getTransferID(),         frame.getTransferID());
00035     EXPECT_EQ(it.getTransferType(),       frame.getTransferType());
00036 
00037     // Payload comparison
00038     static const unsigned BUFLEN = 1024;
00039     uint8_t buf_reference[BUFLEN], buf_actual[BUFLEN];
00040 
00041     if (payload_len > BUFLEN)
00042     {
00043         std::cout << "match(): Payload is too long" << std::endl;
00044         exit(1);
00045     }
00046 
00047     std::fill(buf_reference, buf_reference + BUFLEN, 0);
00048     std::fill(buf_actual, buf_actual + BUFLEN, 0);
00049     std::copy(payload, payload + payload_len, buf_reference);
00050 
00051     EXPECT_EQ(payload_len, it.read(0, buf_actual, payload_len * 3));
00052     EXPECT_EQ(0, it.read(payload_len, buf_actual, payload_len * 3));
00053 
00054     return std::equal(buf_reference, buf_reference + BUFLEN, buf_actual);
00055 }
00056 
00057 
00058 TEST(SingleFrameIncomingTransfer, Basic)
00059 {
00060     using uavcan::RxFrame;
00061     using uavcan::SingleFrameIncomingTransfer;
00062 
00063     const RxFrame frame = makeFrame();
00064     SingleFrameIncomingTransfer it(frame);
00065 
00066     ASSERT_TRUE(match(it, frame, frame.getPayloadPtr(), frame.getPayloadLen()));
00067 }
00068 
00069 
00070 TEST(MultiFrameIncomingTransfer, Basic)
00071 {
00072     using uavcan::RxFrame;
00073     using uavcan::MultiFrameIncomingTransfer;
00074 
00075     uavcan::PoolAllocator<uavcan::MemPoolBlockSize * 100, uavcan::MemPoolBlockSize>  poolmgr;
00076     uavcan::TransferBufferManager bufmgr(256, poolmgr);
00077 
00078     const RxFrame frame = makeFrame();
00079     uavcan::TransferBufferManagerKey bufmgr_key(frame.getSrcNodeID(), frame.getTransferType());
00080     uavcan::TransferBufferAccessor tba(bufmgr, bufmgr_key);
00081 
00082     MultiFrameIncomingTransfer it(frame.getMonotonicTimestamp(), frame.getUtcTimestamp(), frame, tba);
00083 
00084     /*
00085      * Empty read must fail
00086      */
00087     uint8_t data_byte = 0;
00088     ASSERT_GT(0, it.read(0, &data_byte, 1));  // Error - no such buffer
00089 
00090     /*
00091      * Filling the test data
00092      */
00093     const std::string data = "123Hello world";
00094     const uint8_t* const data_ptr = reinterpret_cast<const uint8_t*>(data.c_str());
00095     ASSERT_FALSE(bufmgr.access(bufmgr_key));
00096     ASSERT_TRUE(bufmgr.create(bufmgr_key));
00097     ASSERT_EQ(data.length(), bufmgr.access(bufmgr_key)->write(0, data_ptr, unsigned(data.length())));
00098 
00099     /*
00100      * Check
00101      */
00102     ASSERT_TRUE(match(it, frame, data_ptr, unsigned(data.length())));
00103 
00104     /*
00105      * Buffer release
00106      */
00107     ASSERT_TRUE(bufmgr.access(bufmgr_key));
00108     it.release();
00109     ASSERT_FALSE(bufmgr.access(bufmgr_key));
00110 }