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 }