| //===-- Unittests for inet_aton -------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "src/arpa/inet/htonl.h" |
| #include "src/arpa/inet/inet_aton.h" |
| #include "test/UnitTest/Test.h" |
| |
| namespace LIBC_NAMESPACE_DECL { |
| |
| TEST(LlvmLibcInetAton, ValidTest) { |
| in_addr a; |
| |
| // a.b.c.d |
| a.s_addr = 0; |
| ASSERT_EQ(1, inet_aton("127.1.2.4", &a)); |
| ASSERT_EQ(htonl(0x7f010204), a.s_addr); |
| |
| // a.b.c |
| a.s_addr = 0; |
| ASSERT_EQ(1, inet_aton("127.1.4", &a)); |
| ASSERT_EQ(htonl(0x7f010004), a.s_addr); |
| |
| // a.b |
| a.s_addr = 0; |
| ASSERT_EQ(1, inet_aton("127.1", &a)); |
| ASSERT_EQ(htonl(0x7f000001), a.s_addr); |
| |
| // a |
| a.s_addr = 0; |
| ASSERT_EQ(1, inet_aton("0x7f000001", &a)); |
| ASSERT_EQ(htonl(0x7f000001), a.s_addr); |
| |
| // Hex (0x) and mixed-case hex digits. |
| a.s_addr = 0; |
| ASSERT_EQ(1, inet_aton("0xFf.0.0.1", &a)); |
| ASSERT_EQ(htonl(0xff000001), a.s_addr); |
| |
| // Hex (0X) and mixed-case hex digits. |
| a.s_addr = 0; |
| ASSERT_EQ(1, inet_aton("0XfF.0.0.1", &a)); |
| ASSERT_EQ(htonl(0xff000001), a.s_addr); |
| |
| // Octal. |
| a.s_addr = 0; |
| ASSERT_EQ(1, inet_aton("0177.0.0.1", &a)); |
| ASSERT_EQ(htonl(0x7f000001), a.s_addr); |
| |
| a.s_addr = 0; |
| ASSERT_EQ(1, inet_aton("036", &a)); |
| ASSERT_EQ(htonl(036U), a.s_addr); |
| } |
| |
| TEST(LlvmLibcInetAton, InvalidTest) { |
| ASSERT_EQ(0, inet_aton("", nullptr)); // Empty. |
| ASSERT_EQ(0, inet_aton("x", nullptr)); // Leading junk. |
| ASSERT_EQ(0, inet_aton("127.0.0.1x", nullptr)); // Trailing junk. |
| ASSERT_EQ(0, inet_aton("09.0.0.1", nullptr)); // Invalid octal. |
| ASSERT_EQ(0, inet_aton("0xg.0.0.1", nullptr)); // Invalid hex. |
| ASSERT_EQ(0, inet_aton("1.2.3.4.5", nullptr)); // Too many dots. |
| ASSERT_EQ(0, inet_aton("1.2.3.4.", nullptr)); // Trailing dot. |
| |
| // Out of range a.b.c.d form. |
| ASSERT_EQ(0, inet_aton("999.0.0.1", nullptr)); |
| ASSERT_EQ(0, inet_aton("0.999.0.1", nullptr)); |
| ASSERT_EQ(0, inet_aton("0.0.999.1", nullptr)); |
| ASSERT_EQ(0, inet_aton("0.0.0.999", nullptr)); |
| |
| // Out of range a.b.c form. |
| ASSERT_EQ(0, inet_aton("256.0.0", nullptr)); |
| ASSERT_EQ(0, inet_aton("0.256.0", nullptr)); |
| ASSERT_EQ(0, inet_aton("0.0.0x10000", nullptr)); |
| |
| // Out of range a.b form. |
| ASSERT_EQ(0, inet_aton("256.0", nullptr)); |
| ASSERT_EQ(0, inet_aton("0.0x1000000", nullptr)); |
| |
| // Out of range a form. |
| ASSERT_EQ(0, inet_aton("0x100000000", nullptr)); |
| |
| // 64-bit overflow. |
| ASSERT_EQ(0, inet_aton("0x10000000000000000", nullptr)); |
| |
| // Out of range octal. |
| ASSERT_EQ(0, inet_aton("0400.0.0.1", nullptr)); |
| } |
| |
| } // namespace LIBC_NAMESPACE_DECL |