| /* |
| * |
| * Copyright (c) 2015-2017 Nest Labs, Inc. |
| * All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /** |
| * @file |
| * This file implements a unit test suite for <tt>nl::Weave::WeaveFabricState</tt>. |
| * |
| */ |
| |
| #include <stdint.h> |
| #include <string.h> |
| |
| #include <nltest.h> |
| |
| #include <Weave/Core/WeaveCore.h> |
| |
| #include "ToolCommon.h" |
| |
| static const uint64_t kTestNodeId = 0x18B43000002DCF71ULL; |
| static const uint64_t kTestFabricId = 0xFEEDBEEFULL; |
| static const uint16_t kDefaultSubnet = 0x01; |
| static WeaveFabricState sFabricState; |
| |
| /** |
| * Test generating a ULA using the default subnet. |
| */ |
| static void CheckSelectNodeAddress(nlTestSuite *inSuite, void *inContext) |
| { |
| // Bank of psuedorandom test node IDs |
| const uint64_t testIDs[] = |
| { |
| 0x3e383920daadee75, |
| 0xaf17346309a3dc4b, |
| 0x000000000000ae14, |
| 0x3085051285957d2e, |
| 0xee8bffe99277378a, |
| kAnyNodeId |
| }; |
| |
| const size_t numTestIds = sizeof(testIDs) / sizeof(testIDs[0]); |
| |
| for (unsigned int i = 0; i < numTestIds; i++) |
| { |
| IPAddress receivedULA = sFabricState.SelectNodeAddress(testIDs[i]); |
| |
| IPAddress calculatedULA; |
| if (testIDs[i] == kAnyNodeId) |
| { |
| calculatedULA = IPAddress::MakeIPv6Multicast(kIPv6MulticastScope_Link, kIPV6MulticastGroup_AllNodes); |
| } |
| else |
| { |
| calculatedULA = IPAddress::MakeULA(kTestFabricId, kDefaultSubnet, WeaveNodeIdToIPv6InterfaceId(testIDs[i])); |
| } |
| NL_TEST_ASSERT(inSuite, receivedULA == calculatedULA); |
| } |
| } |
| |
| /** |
| * Test generating a ULA using arbitrary subnets. |
| */ |
| static void CheckSelectNodeAddressWithSubnet(nlTestSuite *inSuite, void *inContext) |
| { |
| // Bank of psuedorandom test node IDs |
| const uint64_t testIDs[] = |
| { |
| 0x3e383920daadee75, |
| 0xaf17346309a3dc4b, |
| 0x000000000000ae14, |
| 0x3085051285957d2e, |
| 0xee8bffe99277378a |
| }; |
| |
| const size_t numTestIds = sizeof(testIDs) / sizeof(testIDs[0]); |
| const int subnetTestUpperLimit = 5; |
| |
| for (uint16_t j = 0; j < subnetTestUpperLimit; j++) |
| { |
| for (unsigned int i = 0; i < numTestIds; i++) |
| { |
| IPAddress receivedULA = sFabricState.SelectNodeAddress(testIDs[i], j); |
| IPAddress calculatedULA; |
| calculatedULA = IPAddress::MakeULA(kTestFabricId, j, WeaveNodeIdToIPv6InterfaceId(testIDs[i])); |
| NL_TEST_ASSERT(inSuite, receivedULA == calculatedULA); |
| } |
| } |
| } |
| |
| /** |
| * Set up the test suite. |
| */ |
| static int TestSetup(void *inContext) |
| { |
| (void)sFabricState.Init(); |
| sFabricState.LocalNodeId = kTestNodeId; |
| sFabricState.FabricId = kTestFabricId; |
| sFabricState.DefaultSubnet = kDefaultSubnet; |
| |
| return (SUCCESS); |
| } |
| |
| /** |
| * Tear down the test suite. |
| */ |
| static int TestTeardown(void *inContext) |
| { |
| return (SUCCESS); |
| } |
| |
| /** |
| * Test Suite. It lists all the test functions. |
| */ |
| static const nlTest sTests[] = |
| { |
| // TODO: WeaveFabricState has much more functionality than tested here. A |
| // more thorough collection of tests should be written. |
| NL_TEST_DEF("WeaveFabricState::SelectNodeAddress", CheckSelectNodeAddress), |
| NL_TEST_DEF("WeaveFabricState::SelectNodeAddress", CheckSelectNodeAddressWithSubnet), |
| NL_TEST_SENTINEL() |
| }; |
| |
| int main(void) |
| { |
| nlTestSuite theSuite = |
| { |
| "weave-fabric-state", |
| &sTests[0], |
| TestSetup, |
| TestTeardown |
| |
| }; |
| |
| // Generate machine-readable, comma-separated value (CSV) output. |
| nl_test_set_output_style(OUTPUT_CSV); |
| |
| // Run test suit againt one context. |
| nlTestRunner(&theSuite, NULL); |
| |
| return nlTestRunnerStats(&theSuite); |
| } |