libuav original

Dependents:   UAVCAN UAVCAN_Subscriber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers outgoing_transfer_registry.cpp Source File

outgoing_transfer_registry.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/outgoing_transfer_registry.hpp>
00008 #include "../clock.hpp"
00009 #include "transfer_test_helpers.hpp"
00010 
00011 
00012 TEST(OutgoingTransferRegistry, Basic)
00013 {
00014     using uavcan::OutgoingTransferRegistryKey;
00015     uavcan::PoolAllocator<uavcan::MemPoolBlockSize * 2, uavcan::MemPoolBlockSize> poolmgr;
00016     uavcan::OutgoingTransferRegistry otr(poolmgr);
00017 
00018     otr.cleanup(tsMono(1000));
00019 
00020     static const int NUM_KEYS = 5;
00021     const OutgoingTransferRegistryKey keys[NUM_KEYS] =
00022     {
00023         OutgoingTransferRegistryKey(123, uavcan::TransferTypeServiceRequest,   42),
00024         OutgoingTransferRegistryKey(321, uavcan::TransferTypeMessageBroadcast, 0),
00025         OutgoingTransferRegistryKey(213, uavcan::TransferTypeServiceRequest,   2),
00026         OutgoingTransferRegistryKey(312, uavcan::TransferTypeServiceRequest,   4),
00027         OutgoingTransferRegistryKey(456, uavcan::TransferTypeServiceRequest,   2)
00028     };
00029 
00030     ASSERT_EQ(0, otr.accessOrCreate(keys[0], tsMono(1000000))->get());
00031     ASSERT_EQ(0, otr.accessOrCreate(keys[1], tsMono(1000000))->get());
00032     ASSERT_EQ(0, otr.accessOrCreate(keys[2], tsMono(1000000))->get());
00033     ASSERT_EQ(0, otr.accessOrCreate(keys[3], tsMono(1000000))->get());
00034     ASSERT_FALSE(otr.accessOrCreate(keys[4], tsMono(1000000)));        // OOM
00035 
00036     /*
00037      * Incrementing a little
00038      */
00039     otr.accessOrCreate(keys[0], tsMono(2000000))->increment();
00040     otr.accessOrCreate(keys[0], tsMono(4000000))->increment();
00041     otr.accessOrCreate(keys[0], tsMono(3000000))->increment();
00042     ASSERT_EQ(3, otr.accessOrCreate(keys[0], tsMono(5000000))->get());
00043 
00044     otr.accessOrCreate(keys[2], tsMono(2000000))->increment();
00045     otr.accessOrCreate(keys[2], tsMono(3000000))->increment();
00046     ASSERT_EQ(2, otr.accessOrCreate(keys[2], tsMono(6000000))->get());
00047 
00048     otr.accessOrCreate(keys[3], tsMono(9000000))->increment();
00049     ASSERT_EQ(1, otr.accessOrCreate(keys[3], tsMono(4000000))->get());
00050 
00051     ASSERT_EQ(0, otr.accessOrCreate(keys[1], tsMono(4000000))->get());
00052 
00053     ASSERT_FALSE(otr.accessOrCreate(keys[4], tsMono(1000000)));        // Still OOM
00054 
00055     /*
00056      * Checking existence
00057      * Exist: 0, 1, 2, 3
00058      * Does not exist: 4
00059      */
00060     ASSERT_TRUE(otr.exists(keys[1].getDataTypeID(), keys[1].getTransferType()));
00061     ASSERT_TRUE(otr.exists(keys[0].getDataTypeID(), keys[0].getTransferType()));
00062     ASSERT_TRUE(otr.exists(keys[3].getDataTypeID(), keys[3].getTransferType()));
00063     ASSERT_TRUE(otr.exists(keys[2].getDataTypeID(), keys[2].getTransferType()));
00064 
00065     ASSERT_FALSE(otr.exists(keys[1].getDataTypeID(), keys[2].getTransferType()));  // Invalid combination
00066     ASSERT_FALSE(otr.exists(keys[0].getDataTypeID(), keys[1].getTransferType()));  // Invalid combination
00067     ASSERT_FALSE(otr.exists(keys[4].getDataTypeID(), keys[4].getTransferType()));  // Plain missing
00068 
00069     /*
00070      * Cleaning up
00071      */
00072     otr.cleanup(tsMono(4000001));    // Kills 1, 3
00073     ASSERT_EQ(0, otr.accessOrCreate(keys[1], tsMono(1000000))->get());
00074     ASSERT_EQ(0, otr.accessOrCreate(keys[3], tsMono(1000000))->get());
00075     otr.accessOrCreate(keys[1], tsMono(5000000))->increment();
00076     otr.accessOrCreate(keys[3], tsMono(5000000))->increment();
00077 
00078     ASSERT_EQ(3, otr.accessOrCreate(keys[0], tsMono(5000000))->get());
00079     ASSERT_EQ(2, otr.accessOrCreate(keys[2], tsMono(6000000))->get());
00080 
00081     otr.cleanup(tsMono(5000001));    // Kills 1, 3 (He needs a bath, Jud. He stinks of the ground you buried him in.), 0
00082     ASSERT_EQ(0, otr.accessOrCreate(keys[0], tsMono(1000000))->get());
00083     ASSERT_EQ(0, otr.accessOrCreate(keys[1], tsMono(1000000))->get());
00084     ASSERT_EQ(0, otr.accessOrCreate(keys[3], tsMono(1000000))->get());
00085 
00086     ASSERT_EQ(2, otr.accessOrCreate(keys[2], tsMono(1000000))->get());
00087 
00088     otr.cleanup(tsMono(5000001));    // Frees some memory for 4
00089     ASSERT_EQ(0, otr.accessOrCreate(keys[0], tsMono(1000000))->get());
00090 }