|
17 | 17 |
|
18 | 18 | #include <app/clusters/thread-network-directory-server/DefaultThreadNetworkDirectoryStorage.h>
|
19 | 19 | #include <lib/core/CHIPPersistentStorageDelegate.h>
|
| 20 | +#include <lib/support/DefaultStorageKeyAllocator.h> |
20 | 21 | #include <lib/support/TestPersistentStorageDelegate.h>
|
21 | 22 |
|
22 | 23 | #include <cstdint>
|
@@ -79,7 +80,7 @@ TEST_F(TestDefaultThreadNetworkDirectoryStorage, TestAddRemoveNetworks)
|
79 | 80 | const uint8_t datasetA[] = { 1 };
|
80 | 81 | const uint8_t updatedDatasetA[] = { 0x11, 0x11 };
|
81 | 82 | const ThreadNetworkDirectoryStorage::ExtendedPanId panB(UINT64_C(0xe475cafef00df00d));
|
82 |
| - uint8_t datasetB[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; |
| 83 | + const uint8_t datasetB[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; |
83 | 84 | uint8_t mutableBytes[ThreadNetworkDirectoryStorage::kMaxThreadDatasetLen];
|
84 | 85 |
|
85 | 86 | // Add Pan A only
|
@@ -207,4 +208,85 @@ TEST_F(TestDefaultThreadNetworkDirectoryStorage, TestStorageOverflow)
|
207 | 208 | EXPECT_EQ(storage.AddOrUpdateNetwork(ThreadNetworkDirectoryStorage::ExtendedPanId(0u), ByteSpan(dataset)), CHIP_NO_ERROR);
|
208 | 209 | }
|
209 | 210 |
|
| 211 | +TEST_F(TestDefaultThreadNetworkDirectoryStorage, TestAddNetworkStorageFailure) |
| 212 | +{ |
| 213 | + const ThreadNetworkDirectoryStorage::ExtendedPanId panA(UINT64_C(0xd00fd00fdeadbeef)); |
| 214 | + const uint8_t datasetA[] = { 1 }; |
| 215 | + const ThreadNetworkDirectoryStorage::ExtendedPanId panB(UINT64_C(0xe475cafef00df00d)); |
| 216 | + uint8_t datasetB[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; |
| 217 | + |
| 218 | + EXPECT_EQ(storage.AddOrUpdateNetwork(panA, ByteSpan(datasetA)), CHIP_NO_ERROR); |
| 219 | + |
| 220 | + // Make the storage delegate return CHIP_ERROR_PERSISTED_STORAGE_FAILED for writes. |
| 221 | + // Attempting to add a network should fail and state should be unaffected. |
| 222 | + persistentStorageDelegate.SetRejectWrites(true); |
| 223 | + EXPECT_EQ(storage.AddOrUpdateNetwork(panB, ByteSpan(datasetB)), CHIP_ERROR_PERSISTED_STORAGE_FAILED); |
| 224 | + EXPECT_TRUE(storage.ContainsNetwork(panA)); |
| 225 | + EXPECT_FALSE(storage.ContainsNetwork(panB)); |
| 226 | + { |
| 227 | + auto * iterator = storage.IterateNetworkIds(); |
| 228 | + EXPECT_EQ(iterator->Count(), 1u); |
| 229 | + iterator->Release(); |
| 230 | + } |
| 231 | +} |
| 232 | + |
| 233 | +TEST_F(TestDefaultThreadNetworkDirectoryStorage, TestAddNetworkStorageWriteIndexFailure) |
| 234 | +{ |
| 235 | + const ThreadNetworkDirectoryStorage::ExtendedPanId panA(UINT64_C(0xd00fd00fdeadbeef)); |
| 236 | + const uint8_t datasetA[] = { 1 }; |
| 237 | + const ThreadNetworkDirectoryStorage::ExtendedPanId panB(UINT64_C(0xe475cafef00df00d)); |
| 238 | + uint8_t datasetB[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; |
| 239 | + |
| 240 | + EXPECT_EQ(storage.AddOrUpdateNetwork(panA, ByteSpan(datasetA)), CHIP_NO_ERROR); |
| 241 | + |
| 242 | + // White box test: Poison the index key specifically, so the dataset |
| 243 | + // can be written but the subsequent update of the index fails. |
| 244 | + // Attempting to add a network should fail and state should be unaffected. |
| 245 | + StorageKeyName indexKey = DefaultStorageKeyAllocator::ThreadNetworkDirectoryIndex(); |
| 246 | + persistentStorageDelegate.AddPoisonKey(indexKey.KeyName()); |
| 247 | + EXPECT_EQ(storage.AddOrUpdateNetwork(panB, ByteSpan(datasetB)), CHIP_ERROR_PERSISTED_STORAGE_FAILED); |
| 248 | + EXPECT_TRUE(storage.ContainsNetwork(panA)); |
| 249 | + EXPECT_FALSE(storage.ContainsNetwork(panB)); |
| 250 | + { |
| 251 | + auto * iterator = storage.IterateNetworkIds(); |
| 252 | + EXPECT_EQ(iterator->Count(), 1u); |
| 253 | + iterator->Release(); |
| 254 | + } |
| 255 | +} |
| 256 | + |
| 257 | +TEST_F(TestDefaultThreadNetworkDirectoryStorage, TestRemoveNetworkStorageFailure) |
| 258 | +{ |
| 259 | + const ThreadNetworkDirectoryStorage::ExtendedPanId panA(UINT64_C(0xd00f0001)); |
| 260 | + const ThreadNetworkDirectoryStorage::ExtendedPanId panB(UINT64_C(0xd00f0002)); |
| 261 | + const ThreadNetworkDirectoryStorage::ExtendedPanId panC(UINT64_C(0xd00f0003)); |
| 262 | + const uint8_t dataset[] = { 1 }; |
| 263 | + |
| 264 | + // Just in case the test is compiled with CHIP_CONFIG_MAX_FABRICS == 1 |
| 265 | + bool canStorePanC = (storage.Capacity() >= 3); |
| 266 | + |
| 267 | + // Add Pans A, B, and C |
| 268 | + EXPECT_EQ(storage.AddOrUpdateNetwork(panA, ByteSpan(dataset)), CHIP_NO_ERROR); |
| 269 | + EXPECT_EQ(storage.AddOrUpdateNetwork(panB, ByteSpan(dataset)), CHIP_NO_ERROR); |
| 270 | + if (canStorePanC) |
| 271 | + { |
| 272 | + EXPECT_EQ(storage.AddOrUpdateNetwork(panC, ByteSpan(dataset)), CHIP_NO_ERROR); |
| 273 | + } |
| 274 | + |
| 275 | + // Make the storage delegate return CHIP_ERROR_PERSISTED_STORAGE_FAILED for writes. |
| 276 | + // Attempting to remove a network should fail and state should be unaffected. |
| 277 | + persistentStorageDelegate.SetRejectWrites(true); |
| 278 | + EXPECT_EQ(storage.RemoveNetwork(panA), CHIP_ERROR_PERSISTED_STORAGE_FAILED); |
| 279 | + EXPECT_TRUE(storage.ContainsNetwork(panA)); |
| 280 | + EXPECT_TRUE(storage.ContainsNetwork(panB)); |
| 281 | + if (canStorePanC) |
| 282 | + { |
| 283 | + EXPECT_TRUE(storage.ContainsNetwork(panC)); |
| 284 | + } |
| 285 | + { |
| 286 | + auto * iterator = storage.IterateNetworkIds(); |
| 287 | + EXPECT_EQ(iterator->Count(), canStorePanC ? 3u : 2u); |
| 288 | + iterator->Release(); |
| 289 | + } |
| 290 | +} |
| 291 | + |
210 | 292 | } // namespace
|
0 commit comments