Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: UAVCAN UAVCAN_Subscriber
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 }
Generated on Tue Jul 12 2022 17:17:32 by
