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
libuavcan/test/protocol/dynamic_node_id_server/centralized/storage.cpp@0:dfe6edabb8ec, 2018-04-14 (annotated)
- Committer:
- RuslanUrya
- Date:
- Sat Apr 14 10:25:32 2018 +0000
- Revision:
- 0:dfe6edabb8ec
Initial commit
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |