Serenity Operating System
at master 166 lines 4.0 kB view raw
1/* 2 * Copyright (c) 2020-2022, the SerenityOS developers. 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibTest/TestCase.h> 8 9#include <AK/Endian.h> 10#include <AK/IPv4Address.h> 11 12TEST_CASE(should_default_contructor_with_0s) 13{ 14 constexpr IPv4Address addr {}; 15 16 static_assert(addr.is_zero()); 17 18 EXPECT(addr.is_zero()); 19} 20 21TEST_CASE(should_construct_from_c_array) 22{ 23 constexpr auto addr = [] { 24 const u8 a[4] = { 1, 2, 3, 4 }; 25 return IPv4Address(a); 26 }(); 27 28 static_assert(!addr.is_zero()); 29 30 EXPECT(!addr.is_zero()); 31} 32 33TEST_CASE(should_construct_from_u32) 34{ 35 constexpr auto addr = [] { 36 const NetworkOrdered<u32> a = 0x11'22'33'44; 37 return IPv4Address(a); 38 }(); 39 40 static_assert(!addr.is_zero()); 41 42 EXPECT(!addr.is_zero()); 43} 44 45TEST_CASE(should_get_octets_by_byte_offset) 46{ 47 constexpr IPv4Address addr(1, 25, 39, 42); 48 49 static_assert(1 == addr[0]); 50 static_assert(25 == addr[1]); 51 static_assert(39 == addr[2]); 52 static_assert(42 == addr[3]); 53 54 EXPECT_EQ(1, addr[0]); 55 EXPECT_EQ(25, addr[1]); 56 EXPECT_EQ(39, addr[2]); 57 EXPECT_EQ(42, addr[3]); 58} 59 60TEST_CASE(should_convert_to_string) 61{ 62 constexpr IPv4Address addr(1, 25, 39, 42); 63 64 EXPECT_EQ("1.25.39.42", addr.to_deprecated_string()); 65} 66 67TEST_CASE(should_make_ipv4_address_from_string) 68{ 69 auto const addr = IPv4Address::from_string("192.168.0.1"sv); 70 71 EXPECT(addr.has_value()); 72 EXPECT_EQ(192, addr.value()[0]); 73 EXPECT_EQ(168, addr.value()[1]); 74 EXPECT_EQ(0, addr.value()[2]); 75 EXPECT_EQ(1, addr.value()[3]); 76} 77 78TEST_CASE(should_make_empty_optional_from_bad_string) 79{ 80 auto const addr = IPv4Address::from_string("bad string"sv); 81 82 EXPECT(!addr.has_value()); 83} 84 85TEST_CASE(should_make_empty_optional_from_out_of_range_values) 86{ 87 auto const addr = IPv4Address::from_string("192.168.0.500"sv); 88 89 EXPECT(!addr.has_value()); 90} 91 92TEST_CASE(should_fill_d_octet_from_1_part) 93{ 94 auto const addr = IPv4Address::from_string("1"sv); 95 96 EXPECT(addr.has_value()); 97 EXPECT_EQ(0, addr.value()[0]); 98 EXPECT_EQ(0, addr.value()[1]); 99 EXPECT_EQ(0, addr.value()[2]); 100 EXPECT_EQ(1, addr.value()[3]); 101} 102 103TEST_CASE(should_fill_a_and_d_octets_from_2_parts) 104{ 105 auto const addr = IPv4Address::from_string("192.1"sv); 106 107 EXPECT(addr.has_value()); 108 EXPECT_EQ(192, addr.value()[0]); 109 EXPECT_EQ(0, addr.value()[1]); 110 EXPECT_EQ(0, addr.value()[2]); 111 EXPECT_EQ(1, addr.value()[3]); 112} 113 114TEST_CASE(should_fill_a_b_d_octets_from_3_parts) 115{ 116 auto const addr = IPv4Address::from_string("192.168.1"sv); 117 118 EXPECT(addr.has_value()); 119 EXPECT_EQ(192, addr.value()[0]); 120 EXPECT_EQ(168, addr.value()[1]); 121 EXPECT_EQ(0, addr.value()[2]); 122 EXPECT_EQ(1, addr.value()[3]); 123} 124 125TEST_CASE(should_convert_to_in_addr_t) 126{ 127 constexpr IPv4Address addr(1, 2, 3, 4); 128 129 static_assert(0x04'03'02'01u == addr.to_in_addr_t()); 130 131 EXPECT_EQ(0x04'03'02'01u, addr.to_in_addr_t()); 132} 133 134TEST_CASE(should_convert_to_u32) 135{ 136 constexpr IPv4Address addr(1, 2, 3, 4); 137 138 static_assert(0x04'03'02'01u == addr.to_in_addr_t()); 139 140 EXPECT_EQ(0x04'03'02'01u, addr.to_u32()); 141} 142 143TEST_CASE(should_compare) 144{ 145 constexpr IPv4Address addr_a(1, 2, 3, 4); 146 constexpr IPv4Address addr_b(1, 2, 3, 5); 147 148 static_assert(addr_a != addr_b); 149 static_assert(addr_a == addr_a); 150 151 EXPECT(addr_a != addr_b); 152 EXPECT(addr_a == addr_a); 153} 154 155TEST_CASE(netmask_from_cidr) 156{ 157 EXPECT(IPv4Address::netmask_from_cidr(24) == IPv4Address(255, 255, 255, 0)); 158 159 EXPECT(IPv4Address::netmask_from_cidr(0) == IPv4Address(0, 0, 0, 0)); 160 EXPECT(IPv4Address::netmask_from_cidr(32) == IPv4Address(255, 255, 255, 255)); 161 162 EXPECT(IPv4Address::netmask_from_cidr(28) == IPv4Address(255, 255, 255, 240)); 163 EXPECT(IPv4Address::netmask_from_cidr(22) == IPv4Address(255, 255, 252, 0)); 164 EXPECT(IPv4Address::netmask_from_cidr(14) == IPv4Address(255, 252, 0, 0)); 165 EXPECT(IPv4Address::netmask_from_cidr(6) == IPv4Address(252, 0, 0, 0)); 166}