* Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
* ubs-engine is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
#include <gtest/gtest.h>
#include "ubse_error.h"
#include "ubse_net_util.h"
namespace ubse::ut::utils {
using namespace ubse::utils;
const size_t IPV4_MAX_LEN = 4;
TEST(UbseNetUtilTest, IsPortVaLid)
{
EXPECT_TRUE(UbseNetUtil::IsPortVaLid(1024));
EXPECT_TRUE(UbseNetUtil::IsPortVaLid(65535));
EXPECT_FALSE(UbseNetUtil::IsPortVaLid(1023));
EXPECT_FALSE(UbseNetUtil::IsPortVaLid(65536));
}
TEST(ValidIpv4AddrTest, ValidIP)
{
std::string validIP = "192.168.1.1";
EXPECT_TRUE(UbseNetUtil::ValidIpv4Addr(validIP));
}
TEST(ValidIpv4AddrTest, InvalidIP)
{
std::string invalidIP = "256.256.256.256";
EXPECT_FALSE(UbseNetUtil::ValidIpv4Addr(invalidIP));
}
TEST(ValidIpv4AddrTest, EmptyString)
{
std::string emptyString = "";
EXPECT_FALSE(UbseNetUtil::ValidIpv4Addr(emptyString));
}
TEST(ValidIpv6AddrTest, ValidAddress)
{
std::string validIpv6 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";
EXPECT_TRUE(UbseNetUtil::ValidIpv6Addr(validIpv6));
}
TEST(ValidIpv6AddrTest, InvalidAddress)
{
std::string invalidIpv6 = "2001::0db8::85a3";
EXPECT_FALSE(UbseNetUtil::ValidIpv6Addr(invalidIpv6));
}
TEST(ValidIpv6AddrTest, EmptyString)
{
std::string emptyString = "";
EXPECT_FALSE(UbseNetUtil::ValidIpv6Addr(emptyString));
}
TEST(ValidIpv6AddrTest, NonIpString)
{
std::string nonIpString = "Hello, World!";
EXPECT_FALSE(UbseNetUtil::ValidIpv6Addr(nonIpString));
}
TEST(ValidIpv6AddrTest, Ipv4Address)
{
std::string ipv4Address = "192.168.1.1";
EXPECT_FALSE(UbseNetUtil::ValidIpv6Addr(ipv4Address));
}
TEST(UbseNetUtilTest, IpV4ToInt_ValidIp)
{
std::string ip = "192.168.1.1";
uint32_t intIp = 0;
EXPECT_EQ(UbseNetUtil::IpV4ToInt(ip, intIp), UBSE_OK);
EXPECT_EQ(intIp, 3232235777U);
ip = "255.255.255.255";
intIp = 0;
EXPECT_EQ(UbseNetUtil::IpV4ToInt(ip, intIp), UBSE_OK);
EXPECT_EQ(intIp, 4294967295U);
ip = "0.0.0.0";
intIp = 0;
EXPECT_EQ(UbseNetUtil::IpV4ToInt(ip, intIp), UBSE_OK);
EXPECT_EQ(intIp, 0U);
}
TEST(UbseNetUtilTest, IpV4ToInt_InvalidIp)
{
std::string ip = "256.1.1.1";
uint32_t intIp = 0;
EXPECT_EQ(UbseNetUtil::IpV4ToInt(ip, intIp), UBSE_ERROR);
ip = "192.168.1";
intIp = 0;
EXPECT_EQ(UbseNetUtil::IpV4ToInt(ip, intIp), UBSE_ERROR);
ip = "";
intIp = 0;
EXPECT_EQ(UbseNetUtil::IpV4ToInt(ip, intIp), UBSE_ERROR);
ip = "192:168:1:1";
intIp = 0;
EXPECT_EQ(UbseNetUtil::IpV4ToInt(ip, intIp), UBSE_ERROR);
}
TEST(UbseNetUtilTest, IntToIpV4_Normal)
{
uint32_t intIp = 3232235777U;
EXPECT_EQ(UbseNetUtil::IntToIpV4(intIp), "192.168.1.1");
intIp = 4294967295U;
EXPECT_EQ(UbseNetUtil::IntToIpV4(intIp), "255.255.255.255");
intIp = 0U;
EXPECT_EQ(UbseNetUtil::IntToIpV4(intIp), "0.0.0.0");
}
TEST(UbseNetUtilTest, IntToIpV4_RoundTrip)
{
std::string originalIp = "10.20.30.40";
uint32_t intIp = 0;
EXPECT_EQ(UbseNetUtil::IpV4ToInt(originalIp, intIp), UBSE_OK);
EXPECT_EQ(UbseNetUtil::IntToIpV4(intIp), originalIp);
}
TEST(UbseNetUtilTest, ParseIpRangeToList_ValidRange)
{
std::string range = "192.168.1.1-192.168.1.3";
std::vector<std::string> ips{};
UbseNetUtil::ParseIpRangeToList(range, ips);
EXPECT_EQ(ips.size(), 3U);
EXPECT_EQ(ips[0], "192.168.1.1");
EXPECT_EQ(ips[1], "192.168.1.2");
EXPECT_EQ(ips[2], "192.168.1.3");
}
TEST(UbseNetUtilTest, ParseIpRangeToList_SingleIp)
{
std::string range = "192.168.1.100-192.168.1.100";
std::vector<std::string> ips{};
UbseNetUtil::ParseIpRangeToList(range, ips);
EXPECT_EQ(ips.size(), 1U);
EXPECT_EQ(ips[0], "192.168.1.100");
}
TEST(UbseNetUtilTest, ParseIpRangeToList_InvalidRange_StartGreaterThanEnd)
{
std::string range = "192.168.1.10-192.168.1.5";
std::vector<std::string> ips{};
UbseNetUtil::ParseIpRangeToList(range, ips);
EXPECT_TRUE(ips.empty());
}
TEST(UbseNetUtilTest, ParseIpRangeToList_InvalidFormat_NoSeparator)
{
std::string range = "192.168.1.1";
std::vector<std::string> ips{};
UbseNetUtil::ParseIpRangeToList(range, ips);
EXPECT_TRUE(ips.empty());
}
TEST(UbseNetUtilTest, ParseIpRangeToList_InvalidFormat_MultipleSeparators)
{
std::string range = "192.168.1.1-192.168.1.10-192.168.1.20";
std::vector<std::string> ips{};
UbseNetUtil::ParseIpRangeToList(range, ips);
EXPECT_TRUE(ips.empty());
}
TEST(UbseNetUtilTest, ParseIpRangeToList_InvalidStartIp)
{
std::string range = "256.1.1.1-192.168.1.10";
std::vector<std::string> ips{};
UbseNetUtil::ParseIpRangeToList(range, ips);
EXPECT_TRUE(ips.empty());
}
TEST(UbseNetUtilTest, ParseIpRangeToList_InvalidEndIp)
{
std::string range = "192.168.1.1-256.1.1.10";
std::vector<std::string> ips{};
UbseNetUtil::ParseIpRangeToList(range, ips);
EXPECT_TRUE(ips.empty());
}
TEST(UbseNetUtilTest, ParseIpRangeToList_EmptyRange)
{
std::string range = "";
std::vector<std::string> ips{};
UbseNetUtil::ParseIpRangeToList(range, ips);
EXPECT_TRUE(ips.empty());
}
TEST(UbseNetUtilTest, Ipv4StringToArr_ValidIp)
{
std::string ip = "192.168.1.1";
uint8_t arr[IPV4_MAX_LEN] = {0};
EXPECT_TRUE(UbseNetUtil::Ipv4StringToArr(ip, arr));
EXPECT_EQ(arr[0], 192);
EXPECT_EQ(arr[1], 168);
EXPECT_EQ(arr[2], 1);
EXPECT_EQ(arr[3], 1);
}
TEST(UbseNetUtilTest, Ipv4StringToArr_InvalidIp)
{
std::string ip = "256.256.256.256";
uint8_t arr[IPV4_MAX_LEN] = {0};
EXPECT_FALSE(UbseNetUtil::Ipv4StringToArr(ip, arr));
}
TEST(UbseNetUtilTest, Ipv4StringToArr_EmptyIp)
{
std::string ip = "";
uint8_t arr[IPV4_MAX_LEN] = {0};
EXPECT_FALSE(UbseNetUtil::Ipv4StringToArr(ip, arr));
}
TEST(UbseNetUtilTest, Ipv4StringToArr_MemoryCopyFail)
{
std::string ip = "192.168.1.1";
uint8_t* arr = nullptr;
EXPECT_FALSE(UbseNetUtil::Ipv4StringToArr(ip, arr));
}
TEST(UbseNetUtilTest, Ipv4ArrToString_ValidArr)
{
uint8_t arr[4] = {192, 168, 1, 1};
EXPECT_EQ(UbseNetUtil::Ipv4ArrToString(arr), "192.168.1.1");
uint8_t arrMaxValue[4] = {255, 255, 255, 255};
EXPECT_EQ(UbseNetUtil::Ipv4ArrToString(arrMaxValue), "255.255.255.255");
uint8_t arrMinValue[4] = {0, 0, 0, 0};
EXPECT_EQ(UbseNetUtil::Ipv4ArrToString(arrMinValue), "0.0.0.0");
uint8_t* arrNullptr = nullptr;
EXPECT_EQ(UbseNetUtil::Ipv4ArrToString(arrNullptr), "");
}
TEST(UbseNetUtilTest, Ipv4ArrToString_RoundTrip)
{
std::string originalIp = "10.20.30.40";
uint8_t arr[4] = {0};
EXPECT_TRUE(UbseNetUtil::Ipv4StringToArr(originalIp, arr));
EXPECT_EQ(UbseNetUtil::Ipv4ArrToString(arr), originalIp);
}
TEST(UbseNetUtilTest, Ipv6ArrToString_Normal)
{
uint8_t arr[16] = {0x20, 0x01, 0x0d, 0xb8, 0x85, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x34};
std::string expected = "2001:db8:85a3::8a2e:370:7334";
ASSERT_EQ(UbseNetUtil::Ipv6ArrToString(arr), expected);
}
TEST(UbseNetUtilTest, Ipv6ArrToString_AllZero)
{
uint8_t arr[16] = {0};
std::string expected = "::";
ASSERT_EQ(UbseNetUtil::Ipv6ArrToString(arr), expected);
}
TEST(UbseNetUtilTest, IsSpecialIP)
{
EXPECT_TRUE(UbseNetUtil::IsSpecialIP("0.0.0.0"));
EXPECT_TRUE(UbseNetUtil::IsSpecialIP("127.0.0.1"));
EXPECT_TRUE(UbseNetUtil::IsSpecialIP("127.0.0.255"));
EXPECT_TRUE(UbseNetUtil::IsSpecialIP("127.255.255.255"));
EXPECT_TRUE(UbseNetUtil::IsSpecialIP("169.254.0.1"));
EXPECT_TRUE(UbseNetUtil::IsSpecialIP("169.254.100.200"));
EXPECT_TRUE(UbseNetUtil::IsSpecialIP("169.254.255.255"));
EXPECT_FALSE(UbseNetUtil::IsSpecialIP("192.168.1.1"));
EXPECT_FALSE(UbseNetUtil::IsSpecialIP("10.0.0.1"));
EXPECT_FALSE(UbseNetUtil::IsSpecialIP("172.16.0.1"));
EXPECT_FALSE(UbseNetUtil::IsSpecialIP("8.8.8.8"));
EXPECT_FALSE(UbseNetUtil::IsSpecialIP(""));
EXPECT_FALSE(UbseNetUtil::IsSpecialIP("invalid"));
EXPECT_FALSE(UbseNetUtil::IsSpecialIP("256.256.256.256"));
}
TEST(UbseNetUtilTest, GetIpInfo)
{
std::vector<std::string> ips{};
EXPECT_EQ(UbseNetUtil::GetIpInfo(ips), UBSE_OK);
EXPECT_TRUE(!ips.empty());
}
TEST(ParseIpStringTest, ValidIpv4)
{
std::string ipStr = "192.168.1.1";
ubse::nodeController::UbseIpAddr out{};
EXPECT_TRUE(parseIpString(ipStr, out));
EXPECT_EQ(out.type, ubse::nodeController::UbseIpType::UBSE_IP_V4);
EXPECT_EQ(out.ipv4.addr[0], 192);
EXPECT_EQ(out.ipv4.addr[1], 168);
EXPECT_EQ(out.ipv4.addr[2], 1);
EXPECT_EQ(out.ipv4.addr[3], 1);
}
TEST(ParseIpStringTest, ValidIpv6)
{
std::string ipStr = "2001:db8::1";
ubse::nodeController::UbseIpAddr out{};
EXPECT_TRUE(parseIpString(ipStr, out));
EXPECT_EQ(out.type, ubse::nodeController::UbseIpType::UBSE_IP_V6);
}
TEST(ParseIpStringTest, ValidIpv6Full)
{
std::string ipStr = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";
ubse::nodeController::UbseIpAddr out{};
EXPECT_TRUE(parseIpString(ipStr, out));
EXPECT_EQ(out.type, ubse::nodeController::UbseIpType::UBSE_IP_V6);
}
TEST(ParseIpStringTest, InvalidIp)
{
std::string ipStr = "invalid-ip";
ubse::nodeController::UbseIpAddr out{};
EXPECT_FALSE(parseIpString(ipStr, out));
}
TEST(ParseIpStringTest, EmptyString)
{
std::string ipStr = "";
ubse::nodeController::UbseIpAddr out{};
EXPECT_FALSE(parseIpString(ipStr, out));
}
}