/ tests / nodeinfo_children_test.cpp
nodeinfo_children_test.cpp
  1  // SPDX-FileCopyrightText: Copyright (C) 2024-2025 Marek Küthe <m.k@mk16.de>
  2  //
  3  // SPDX-License-Identifier: GPL-3.0-or-later
  4  
  5  #include <gtest/gtest.h>
  6  #include <memory>
  7  #include <sstream>
  8  #include <tins/tins.h>
  9  #include "nodeinfo.hpp"
 10  
 11  using namespace crazytrace;
 12  
 13  class NodeInfoChildrenTest : public testing::Test
 14  {
 15      protected:
 16          // cppcheck-suppress duplInheritedMember
 17          static void SetUpTestSuite()
 18          {
 19              testing::Test::SetUpTestSuite();
 20  
 21              root_node = std::make_unique<NodeInfo>();
 22              root_node->set_mac_address(Tins::HWAddress<6>("52:54:00:b2:fa:7f"));
 23              root_node->add_address(Tins::IPv6Address("fd00::"));
 24  
 25              child_node1 = std::make_shared<NodeInfo>();
 26              child_node1->set_hoplimit(20);
 27              child_node1->add_address(Tins::IPv6Address("fd00::11"));
 28              child_node1->add_address(Tins::IPv6Address("fd00::12"));
 29              root_node->add_node(child_node1);
 30  
 31              child_node2 = std::make_shared<NodeInfo>();
 32              child_node2->set_hoplimit(30);
 33              child_node2->add_address(Tins::IPv6Address("fd00::21"));
 34              root_node->add_node(child_node2);
 35  
 36              child_node3 = std::make_shared<NodeInfo>();
 37              child_node3->add_address(Tins::IPv6Address("fd00::3"));
 38  
 39              child_node3_child1 = std::make_shared<NodeInfo>();
 40              child_node3_child1->add_address(Tins::IPv6Address("fd00::3:1"));
 41              child_node3->add_node(child_node3_child1);
 42  
 43              child_node3_child2 = std::make_shared<NodeInfo>();
 44              child_node3_child2->add_address(Tins::IPv6Address("fd00::3:2"));
 45  
 46              child_node3_child2_child1 = std::make_shared<NodeInfo>();
 47              child_node3_child2_child1->add_address(
 48                  Tins::IPv6Address("fd00::3:2:1"));
 49              child_node3_child2->add_node(child_node3_child2_child1);
 50  
 51              child_node3->add_node(child_node3_child2);
 52              root_node->add_node(child_node3);
 53          }
 54  
 55          // NOLINTBEGIN(cppcoreguidelines-avoid-non-const-global-variables)
 56          static std::unique_ptr<NodeInfo> root_node;
 57          static std::shared_ptr<NodeInfo> child_node1;
 58          static std::shared_ptr<NodeInfo> child_node2;
 59          static std::shared_ptr<NodeInfo> child_node3;
 60          static std::shared_ptr<NodeInfo> child_node3_child1;
 61          static std::shared_ptr<NodeInfo> child_node3_child2;
 62          static std::shared_ptr<NodeInfo> child_node3_child2_child1;
 63          // NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables)
 64  };
 65  
 66  // NOLINTBEGIN(cppcoreguidelines-avoid-non-const-global-variables)
 67  std::unique_ptr<NodeInfo> NodeInfoChildrenTest::root_node;
 68  std::shared_ptr<NodeInfo> NodeInfoChildrenTest::child_node1;
 69  std::shared_ptr<NodeInfo> NodeInfoChildrenTest::child_node2;
 70  std::shared_ptr<NodeInfo> NodeInfoChildrenTest::child_node3;
 71  std::shared_ptr<NodeInfo> NodeInfoChildrenTest::child_node3_child1;
 72  std::shared_ptr<NodeInfo> NodeInfoChildrenTest::child_node3_child2;
 73  std::shared_ptr<NodeInfo> NodeInfoChildrenTest::child_node3_child2_child1;
 74  
 75  // NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables)
 76  
 77  TEST_F(NodeInfoChildrenTest, Print)
 78  {
 79      /* Testing the print function */
 80      std::ostringstream test_output;
 81  
 82      test_output << *root_node;
 83      EXPECT_EQ(test_output.str(),
 84                "NodeInfo: hoplimit=64 fd00:: 52:54:00:b2:fa:7f");
 85      test_output.str("");
 86  
 87      root_node->print(test_output);
 88      EXPECT_EQ(
 89          test_output.str(),
 90          "NodeInfo: hoplimit=64 fd00:: 52:54:00:b2:fa:7f\nChilds:\n\tNodeInfo: "
 91          "hoplimit=20 fd00::11 fd00::12\n\tNodeInfo: hoplimit=30 "
 92          "fd00::21\n\tNodeInfo: hoplimit=64 fd00::3\n\tChilds:\n\t\tNodeInfo: "
 93          "hoplimit=64 fd00::3:1\n\t\tNodeInfo: hoplimit=64 "
 94          "fd00::3:2\n\t\tChilds:\n\t\t\tNodeInfo: hoplimit=64 fd00::3:2:1\n");
 95      test_output.str("");
 96  
 97      child_node3_child2->print(test_output);
 98      EXPECT_EQ(test_output.str(),
 99                "NodeInfo: hoplimit=64 fd00::3:2\nChilds:\n\tNodeInfo: "
100                "hoplimit=64 fd00::3:2:1\n");
101  }
102  
103  TEST_F(NodeInfoChildrenTest, MaxDepth)
104  {
105      EXPECT_EQ(root_node->max_depth(), 4);
106      EXPECT_EQ(child_node3_child2->max_depth(), 2);
107      EXPECT_EQ(child_node1->max_depth(), 1);
108  }
109  
110  TEST_F(NodeInfoChildrenTest, GetRouteTo)
111  {
112      auto route1 = child_node3->get_route_to(Tins::IPv6Address("fd00::3:2:1"));
113      EXPECT_EQ(route1.size(), 2);
114      EXPECT_EQ(route1.at(1), child_node3_child2);
115      EXPECT_EQ(route1.at(0), child_node3_child2_child1);
116  
117      auto route2 = child_node1->get_route_to(Tins::IPv6Address("fd00::12"));
118      EXPECT_EQ(route2.size(), 0);
119  
120      auto route3 = root_node->get_route_to(Tins::IPv6Address("fd00::12"));
121      EXPECT_EQ(route3.size(), 1);
122      EXPECT_EQ(route3.at(0), child_node1);
123  }