Руслан Урядинский / libuavcan

Dependents:   UAVCAN UAVCAN_Subscriber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers iface_mock.cpp Source File

iface_mock.cpp

00001 /*
00002  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
00003  */
00004 
00005 #include <gtest/gtest.h>
00006 #include "can.hpp"
00007 
00008 TEST(CanDriverMock, Basic)
00009 {
00010     using uavcan::CanFrame;
00011     using uavcan::CanSelectMasks;
00012 
00013     SystemClockMock clockmock;
00014     CanDriverMock driver(3, clockmock);
00015 
00016     const uavcan::CanFrame* pending_tx[uavcan::MaxCanIfaces] = { };
00017 
00018     ASSERT_EQ(3, driver.getNumIfaces());
00019 
00020     // All WR, no RD
00021     CanSelectMasks masks;
00022     masks.write = 7;
00023     masks.read = 7;
00024     EXPECT_LT(0, driver.select(masks, pending_tx, uavcan::MonotonicTime::fromUSec(100)));
00025     EXPECT_EQ(7, masks.write);
00026     EXPECT_EQ(0, masks.read);
00027 
00028     for (unsigned i = 0; i < 3; i++)
00029     {
00030         driver.ifaces.at(i).writeable = false;
00031     }
00032 
00033     // No WR, no RD
00034     masks.write = 7;
00035     masks.read = 7;
00036     EXPECT_EQ(0, driver.select(masks, pending_tx, uavcan::MonotonicTime::fromUSec(100)));
00037     EXPECT_EQ(0, masks.write);
00038     EXPECT_EQ(0, masks.read);
00039     EXPECT_EQ(100, clockmock.monotonic);
00040     EXPECT_EQ(100, clockmock.utc);
00041 
00042     // No WR, #1 RD
00043     const CanFrame fr1 = makeCanFrame(123, "foo", EXT);
00044     driver.ifaces.at(1).pushRx(fr1);
00045     masks.write = 7;
00046     masks.read = 6;
00047     EXPECT_LT(0, driver.select(masks, pending_tx, uavcan::MonotonicTime::fromUSec(100)));
00048     EXPECT_EQ(0, masks.write);
00049     EXPECT_EQ(2, masks.read);
00050     CanFrame fr2;
00051     uavcan::MonotonicTime ts_monotonic;
00052     uavcan::UtcTime ts_utc;
00053     uavcan::CanIOFlags flags = 0;
00054     EXPECT_EQ(1, driver.getIface(1)->receive(fr2, ts_monotonic, ts_utc, flags));
00055     EXPECT_EQ(0, flags);
00056     EXPECT_EQ(fr1, fr2);
00057     EXPECT_EQ(100, ts_monotonic.toUSec());
00058     EXPECT_EQ(0, ts_utc.toUSec());
00059 
00060     // #0 WR, #1 RD, Select failure
00061     driver.ifaces.at(0).writeable = true;
00062     driver.select_failure = true;
00063     masks.write = 1;
00064     masks.read = 7;
00065     EXPECT_EQ(-1, driver.select(masks, pending_tx, uavcan::MonotonicTime::fromUSec(100)));
00066     EXPECT_EQ(1, masks.write);                               // Leaving masks unchanged - the library must ignore them
00067     EXPECT_EQ(7, masks.read);
00068 }
00069 
00070 TEST(CanDriverMock, Loopback)
00071 {
00072     using uavcan::CanFrame;
00073     using uavcan::CanSelectMasks;
00074 
00075     SystemClockMock clockmock;
00076     CanDriverMock driver(1, clockmock);
00077 
00078     const uavcan::CanFrame* pending_tx[uavcan::MaxCanIfaces] = { };
00079 
00080     CanSelectMasks masks;
00081     masks.write = 1;
00082     masks.read = 1;
00083     EXPECT_LT(0, driver.select(masks, pending_tx, uavcan::MonotonicTime::fromUSec(100)));
00084     EXPECT_EQ(1, masks.write);
00085     EXPECT_EQ(0, masks.read);
00086 
00087     clockmock.advance(200);
00088 
00089     CanFrame fr1;
00090     fr1.id = 123 | CanFrame::FlagEFF;
00091     EXPECT_EQ(1, driver.getIface(0)->send(fr1, uavcan::MonotonicTime::fromUSec(10000), uavcan::CanIOFlagLoopback));
00092 
00093     masks.write = 0;
00094     masks.read = 1;
00095     EXPECT_LT(0, driver.select(masks, pending_tx, uavcan::MonotonicTime::fromUSec(100)));
00096     EXPECT_EQ(0, masks.write);
00097     EXPECT_EQ(1, masks.read);
00098 
00099     CanFrame fr2;
00100     uavcan::MonotonicTime ts_monotonic;
00101     uavcan::UtcTime ts_utc;
00102     uavcan::CanIOFlags flags = 0;
00103     EXPECT_EQ(1, driver.getIface(0)->receive(fr2, ts_monotonic, ts_utc, flags));
00104     EXPECT_EQ(uavcan::CanIOFlagLoopback, flags);
00105     EXPECT_EQ(fr1, fr2);
00106     EXPECT_EQ(200, ts_monotonic.toUSec());
00107     EXPECT_EQ(0, ts_utc.toUSec());
00108 }