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

Dependents:   UAVCAN UAVCAN_Subscriber

Committer:
RuslanUrya
Date:
Sat Apr 14 10:25:32 2018 +0000
Revision:
0:dfe6edabb8ec
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RuslanUrya 0:dfe6edabb8ec 1 /*
RuslanUrya 0:dfe6edabb8ec 2 * Copyright (C) 2015 Pavel Kirienko <pavel.kirienko@gmail.com>
RuslanUrya 0:dfe6edabb8ec 3 */
RuslanUrya 0:dfe6edabb8ec 4
RuslanUrya 0:dfe6edabb8ec 5 #include <gtest/gtest.h>
RuslanUrya 0:dfe6edabb8ec 6 #include <uavcan/protocol/dynamic_node_id_server/centralized/storage.hpp>
RuslanUrya 0:dfe6edabb8ec 7 #include "../../helpers.hpp"
RuslanUrya 0:dfe6edabb8ec 8 #include "../memory_storage_backend.hpp"
RuslanUrya 0:dfe6edabb8ec 9
RuslanUrya 0:dfe6edabb8ec 10
RuslanUrya 0:dfe6edabb8ec 11 TEST(dynamic_node_id_server_centralized_Storage, Initialization)
RuslanUrya 0:dfe6edabb8ec 12 {
RuslanUrya 0:dfe6edabb8ec 13 using namespace uavcan::dynamic_node_id_server::centralized;
RuslanUrya 0:dfe6edabb8ec 14 using namespace uavcan::dynamic_node_id_server;
RuslanUrya 0:dfe6edabb8ec 15
RuslanUrya 0:dfe6edabb8ec 16 // No data in the storage - initializing empty
RuslanUrya 0:dfe6edabb8ec 17 {
RuslanUrya 0:dfe6edabb8ec 18 MemoryStorageBackend storage;
RuslanUrya 0:dfe6edabb8ec 19 Storage stor(storage);
RuslanUrya 0:dfe6edabb8ec 20
RuslanUrya 0:dfe6edabb8ec 21 ASSERT_EQ(0, storage.getNumKeys());
RuslanUrya 0:dfe6edabb8ec 22 ASSERT_LE(0, stor.init());
RuslanUrya 0:dfe6edabb8ec 23
RuslanUrya 0:dfe6edabb8ec 24 ASSERT_EQ(0, storage.getNumKeys());
RuslanUrya 0:dfe6edabb8ec 25 ASSERT_EQ(0, stor.getSize());
RuslanUrya 0:dfe6edabb8ec 26
RuslanUrya 0:dfe6edabb8ec 27 ASSERT_FALSE(stor.isNodeIDOccupied(1));
RuslanUrya 0:dfe6edabb8ec 28 ASSERT_FALSE(stor.isNodeIDOccupied(0));
RuslanUrya 0:dfe6edabb8ec 29 }
RuslanUrya 0:dfe6edabb8ec 30 // Nonempty storage, many items
RuslanUrya 0:dfe6edabb8ec 31 {
RuslanUrya 0:dfe6edabb8ec 32 MemoryStorageBackend storage;
RuslanUrya 0:dfe6edabb8ec 33 Storage stor(storage);
RuslanUrya 0:dfe6edabb8ec 34
RuslanUrya 0:dfe6edabb8ec 35 storage.set("occupation_mask", "0e000000000000000000000000000000"); // node ID 1, 2, 3
RuslanUrya 0:dfe6edabb8ec 36 ASSERT_LE(0, stor.init()); // OK
RuslanUrya 0:dfe6edabb8ec 37
RuslanUrya 0:dfe6edabb8ec 38 ASSERT_EQ(1, storage.getNumKeys());
RuslanUrya 0:dfe6edabb8ec 39 ASSERT_EQ(3, stor.getSize());
RuslanUrya 0:dfe6edabb8ec 40
RuslanUrya 0:dfe6edabb8ec 41 ASSERT_TRUE(stor.isNodeIDOccupied(1));
RuslanUrya 0:dfe6edabb8ec 42 ASSERT_TRUE(stor.isNodeIDOccupied(2));
RuslanUrya 0:dfe6edabb8ec 43 ASSERT_TRUE(stor.isNodeIDOccupied(3));
RuslanUrya 0:dfe6edabb8ec 44 ASSERT_FALSE(stor.isNodeIDOccupied(0));
RuslanUrya 0:dfe6edabb8ec 45 ASSERT_FALSE(stor.isNodeIDOccupied(4));
RuslanUrya 0:dfe6edabb8ec 46
RuslanUrya 0:dfe6edabb8ec 47 UniqueID uid_1;
RuslanUrya 0:dfe6edabb8ec 48 uid_1[0] = 1;
RuslanUrya 0:dfe6edabb8ec 49
RuslanUrya 0:dfe6edabb8ec 50 UniqueID uid_2;
RuslanUrya 0:dfe6edabb8ec 51 uid_2[0] = 2;
RuslanUrya 0:dfe6edabb8ec 52
RuslanUrya 0:dfe6edabb8ec 53 UniqueID uid_3;
RuslanUrya 0:dfe6edabb8ec 54 uid_3[0] = 3;
RuslanUrya 0:dfe6edabb8ec 55
RuslanUrya 0:dfe6edabb8ec 56 ASSERT_FALSE(stor.getNodeIDForUniqueID(uid_1).isValid());
RuslanUrya 0:dfe6edabb8ec 57 ASSERT_FALSE(stor.getNodeIDForUniqueID(uid_2).isValid());
RuslanUrya 0:dfe6edabb8ec 58 ASSERT_FALSE(stor.getNodeIDForUniqueID(uid_3).isValid());
RuslanUrya 0:dfe6edabb8ec 59 ASSERT_FALSE(stor.isNodeIDOccupied(127));
RuslanUrya 0:dfe6edabb8ec 60
RuslanUrya 0:dfe6edabb8ec 61 storage.set("01000000000000000000000000000000", "1");
RuslanUrya 0:dfe6edabb8ec 62 storage.set("02000000000000000000000000000000", "2");
RuslanUrya 0:dfe6edabb8ec 63 storage.set("03000000000000000000000000000000", "3");
RuslanUrya 0:dfe6edabb8ec 64
RuslanUrya 0:dfe6edabb8ec 65 ASSERT_EQ(1, stor.getNodeIDForUniqueID(uid_1).get());
RuslanUrya 0:dfe6edabb8ec 66 ASSERT_EQ(2, stor.getNodeIDForUniqueID(uid_2).get());
RuslanUrya 0:dfe6edabb8ec 67 ASSERT_EQ(3, stor.getNodeIDForUniqueID(uid_3).get());
RuslanUrya 0:dfe6edabb8ec 68 ASSERT_FALSE(stor.isNodeIDOccupied(127));
RuslanUrya 0:dfe6edabb8ec 69 }
RuslanUrya 0:dfe6edabb8ec 70 }
RuslanUrya 0:dfe6edabb8ec 71
RuslanUrya 0:dfe6edabb8ec 72
RuslanUrya 0:dfe6edabb8ec 73 TEST(dynamic_node_id_server_centralized_Storage, Basic)
RuslanUrya 0:dfe6edabb8ec 74 {
RuslanUrya 0:dfe6edabb8ec 75 using namespace uavcan::dynamic_node_id_server::centralized;
RuslanUrya 0:dfe6edabb8ec 76
RuslanUrya 0:dfe6edabb8ec 77 MemoryStorageBackend storage;
RuslanUrya 0:dfe6edabb8ec 78 Storage stor(storage);
RuslanUrya 0:dfe6edabb8ec 79
RuslanUrya 0:dfe6edabb8ec 80 ASSERT_EQ(0, storage.getNumKeys());
RuslanUrya 0:dfe6edabb8ec 81 ASSERT_LE(0, stor.init());
RuslanUrya 0:dfe6edabb8ec 82 storage.print();
RuslanUrya 0:dfe6edabb8ec 83 ASSERT_EQ(0, storage.getNumKeys());
RuslanUrya 0:dfe6edabb8ec 84
RuslanUrya 0:dfe6edabb8ec 85 /*
RuslanUrya 0:dfe6edabb8ec 86 * Adding one entry to the log, making sure it appears in the storage
RuslanUrya 0:dfe6edabb8ec 87 */
RuslanUrya 0:dfe6edabb8ec 88 uavcan::dynamic_node_id_server::UniqueID unique_id;
RuslanUrya 0:dfe6edabb8ec 89 unique_id[0] = 1;
RuslanUrya 0:dfe6edabb8ec 90 ASSERT_LE(0, stor.add(1, unique_id));
RuslanUrya 0:dfe6edabb8ec 91
RuslanUrya 0:dfe6edabb8ec 92 ASSERT_EQ("02000000000000000000000000000000", storage.get("occupation_mask"));
RuslanUrya 0:dfe6edabb8ec 93 ASSERT_EQ("1", storage.get("01000000000000000000000000000000"));
RuslanUrya 0:dfe6edabb8ec 94
RuslanUrya 0:dfe6edabb8ec 95 ASSERT_EQ(2, storage.getNumKeys());
RuslanUrya 0:dfe6edabb8ec 96 ASSERT_EQ(1, stor.getSize());
RuslanUrya 0:dfe6edabb8ec 97
RuslanUrya 0:dfe6edabb8ec 98 /*
RuslanUrya 0:dfe6edabb8ec 99 * Adding another entry while storage is failing
RuslanUrya 0:dfe6edabb8ec 100 */
RuslanUrya 0:dfe6edabb8ec 101 storage.failOnSetCalls(true);
RuslanUrya 0:dfe6edabb8ec 102
RuslanUrya 0:dfe6edabb8ec 103 ASSERT_EQ(2, storage.getNumKeys());
RuslanUrya 0:dfe6edabb8ec 104
RuslanUrya 0:dfe6edabb8ec 105 unique_id[0] = 2;
RuslanUrya 0:dfe6edabb8ec 106 ASSERT_GT(0, stor.add(2, unique_id));
RuslanUrya 0:dfe6edabb8ec 107
RuslanUrya 0:dfe6edabb8ec 108 ASSERT_EQ(2, storage.getNumKeys()); // No new entries, we failed
RuslanUrya 0:dfe6edabb8ec 109
RuslanUrya 0:dfe6edabb8ec 110 ASSERT_EQ(1, stor.getSize());
RuslanUrya 0:dfe6edabb8ec 111
RuslanUrya 0:dfe6edabb8ec 112 /*
RuslanUrya 0:dfe6edabb8ec 113 * Adding a lot of entries
RuslanUrya 0:dfe6edabb8ec 114 */
RuslanUrya 0:dfe6edabb8ec 115 storage.failOnSetCalls(false);
RuslanUrya 0:dfe6edabb8ec 116
RuslanUrya 0:dfe6edabb8ec 117 uavcan::NodeID node_id(2);
RuslanUrya 0:dfe6edabb8ec 118 while (stor.getSize() < 127)
RuslanUrya 0:dfe6edabb8ec 119 {
RuslanUrya 0:dfe6edabb8ec 120 ASSERT_LE(0, stor.add(node_id, unique_id));
RuslanUrya 0:dfe6edabb8ec 121
RuslanUrya 0:dfe6edabb8ec 122 ASSERT_TRUE(stor.getNodeIDForUniqueID(unique_id).isValid());
RuslanUrya 0:dfe6edabb8ec 123 ASSERT_TRUE(stor.isNodeIDOccupied(node_id));
RuslanUrya 0:dfe6edabb8ec 124
RuslanUrya 0:dfe6edabb8ec 125 node_id = uint8_t(uavcan::min(node_id.get() + 1U, 127U));
RuslanUrya 0:dfe6edabb8ec 126 unique_id[0] = uint8_t(unique_id[0] + 1U);
RuslanUrya 0:dfe6edabb8ec 127 }
RuslanUrya 0:dfe6edabb8ec 128
RuslanUrya 0:dfe6edabb8ec 129 storage.print();
RuslanUrya 0:dfe6edabb8ec 130 }