outgoing_transfer_registry.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #include <algorithm>
6 #include <gtest/gtest.h>
8 #include "../clock.hpp"
10 
11 
12 TEST(OutgoingTransferRegistry, Basic)
13 {
17 
18  otr.cleanup(tsMono(1000));
19 
20  static const int NUM_KEYS = 5;
21  const OutgoingTransferRegistryKey keys[NUM_KEYS] =
22  {
23  OutgoingTransferRegistryKey(123, uavcan::TransferTypeServiceRequest, 42),
24  OutgoingTransferRegistryKey(321, uavcan::TransferTypeMessageBroadcast, 0),
25  OutgoingTransferRegistryKey(213, uavcan::TransferTypeServiceRequest, 2),
26  OutgoingTransferRegistryKey(312, uavcan::TransferTypeServiceRequest, 4),
27  OutgoingTransferRegistryKey(456, uavcan::TransferTypeServiceRequest, 2)
28  };
29 
30  ASSERT_EQ(0, otr.accessOrCreate(keys[0], tsMono(1000000))->get());
31  ASSERT_EQ(0, otr.accessOrCreate(keys[1], tsMono(1000000))->get());
32  ASSERT_EQ(0, otr.accessOrCreate(keys[2], tsMono(1000000))->get());
33  ASSERT_EQ(0, otr.accessOrCreate(keys[3], tsMono(1000000))->get());
34  ASSERT_FALSE(otr.accessOrCreate(keys[4], tsMono(1000000))); // OOM
35 
36  /*
37  * Incrementing a little
38  */
39  otr.accessOrCreate(keys[0], tsMono(2000000))->increment();
40  otr.accessOrCreate(keys[0], tsMono(4000000))->increment();
41  otr.accessOrCreate(keys[0], tsMono(3000000))->increment();
42  ASSERT_EQ(3, otr.accessOrCreate(keys[0], tsMono(5000000))->get());
43 
44  otr.accessOrCreate(keys[2], tsMono(2000000))->increment();
45  otr.accessOrCreate(keys[2], tsMono(3000000))->increment();
46  ASSERT_EQ(2, otr.accessOrCreate(keys[2], tsMono(6000000))->get());
47 
48  otr.accessOrCreate(keys[3], tsMono(9000000))->increment();
49  ASSERT_EQ(1, otr.accessOrCreate(keys[3], tsMono(4000000))->get());
50 
51  ASSERT_EQ(0, otr.accessOrCreate(keys[1], tsMono(4000000))->get());
52 
53  ASSERT_FALSE(otr.accessOrCreate(keys[4], tsMono(1000000))); // Still OOM
54 
55  /*
56  * Checking existence
57  * Exist: 0, 1, 2, 3
58  * Does not exist: 4
59  */
60  ASSERT_TRUE(otr.exists(keys[1].getDataTypeID(), keys[1].getTransferType()));
61  ASSERT_TRUE(otr.exists(keys[0].getDataTypeID(), keys[0].getTransferType()));
62  ASSERT_TRUE(otr.exists(keys[3].getDataTypeID(), keys[3].getTransferType()));
63  ASSERT_TRUE(otr.exists(keys[2].getDataTypeID(), keys[2].getTransferType()));
64 
65  ASSERT_FALSE(otr.exists(keys[1].getDataTypeID(), keys[2].getTransferType())); // Invalid combination
66  ASSERT_FALSE(otr.exists(keys[0].getDataTypeID(), keys[1].getTransferType())); // Invalid combination
67  ASSERT_FALSE(otr.exists(keys[4].getDataTypeID(), keys[4].getTransferType())); // Plain missing
68 
69  /*
70  * Cleaning up
71  */
72  otr.cleanup(tsMono(4000001)); // Kills 1, 3
73  ASSERT_EQ(0, otr.accessOrCreate(keys[1], tsMono(1000000))->get());
74  ASSERT_EQ(0, otr.accessOrCreate(keys[3], tsMono(1000000))->get());
75  otr.accessOrCreate(keys[1], tsMono(5000000))->increment();
76  otr.accessOrCreate(keys[3], tsMono(5000000))->increment();
77 
78  ASSERT_EQ(3, otr.accessOrCreate(keys[0], tsMono(5000000))->get());
79  ASSERT_EQ(2, otr.accessOrCreate(keys[2], tsMono(6000000))->get());
80 
81  otr.cleanup(tsMono(5000001)); // Kills 1, 3 (He needs a bath, Jud. He stinks of the ground you buried him in.), 0
82  ASSERT_EQ(0, otr.accessOrCreate(keys[0], tsMono(1000000))->get());
83  ASSERT_EQ(0, otr.accessOrCreate(keys[1], tsMono(1000000))->get());
84  ASSERT_EQ(0, otr.accessOrCreate(keys[3], tsMono(1000000))->get());
85 
86  ASSERT_EQ(2, otr.accessOrCreate(keys[2], tsMono(1000000))->get());
87 
88  otr.cleanup(tsMono(5000001)); // Frees some memory for 4
89  ASSERT_EQ(0, otr.accessOrCreate(keys[0], tsMono(1000000))->get());
90 }
TEST
TEST(OutgoingTransferRegistry, Basic)
Definition: outgoing_transfer_registry.cpp:12
outgoing_transfer_registry.hpp
get
ROSCPP_DECL bool get(const std::string &key, bool &b)
uavcan::OutgoingTransferRegistryKey
Definition: outgoing_transfer_registry.hpp:19
uavcan::OutgoingTransferRegistry::accessOrCreate
TransferID * accessOrCreate(const OutgoingTransferRegistryKey &key, MonotonicTime new_deadline)
Definition: uc_outgoing_transfer_registry.cpp:27
uavcan::TransferTypeServiceRequest
@ TransferTypeServiceRequest
Definition: transfer.hpp:21
uavcan::PoolAllocator
Definition: dynamic_memory.hpp:51
uavcan::TransferTypeMessageBroadcast
@ TransferTypeMessageBroadcast
Definition: transfer.hpp:22
transfer_test_helpers.hpp
uavcan::OutgoingTransferRegistry::exists
bool exists(DataTypeID dtid, TransferType tt) const
Definition: uc_outgoing_transfer_registry.cpp:45
uavcan::OutgoingTransferRegistry
Definition: outgoing_transfer_registry.hpp:64
tsMono
uavcan::MonotonicTime tsMono(uint64_t usec)
Definition: libuavcan/libuavcan/test/clock.hpp:97
uavcan::OutgoingTransferRegistry::cleanup
void cleanup(MonotonicTime ts)
Definition: uc_outgoing_transfer_registry.cpp:50
uavcan::TransferID::increment
void increment()
Definition: transfer.hpp:94


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:02