mirror of https://github.com/ARMmbed/mbed-os.git
171 lines
5.7 KiB
C++
171 lines
5.7 KiB
C++
/*
|
|
* Copyright (c) 2018, Arm Limited and affiliates
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "gtest/gtest.h"
|
|
#include "features/netsocket/SocketAddress.h"
|
|
#include <iostream>
|
|
|
|
class TestSocketAddress: public testing::Test {
|
|
protected:
|
|
SocketAddress *address;
|
|
virtual void SetUp()
|
|
{
|
|
address = new SocketAddress;
|
|
}
|
|
|
|
virtual void TearDown()
|
|
{
|
|
delete address;
|
|
}
|
|
void isEqual(SocketAddress addr1, SocketAddress addr2)
|
|
{
|
|
EXPECT_EQ(std::string(addr1.get_ip_address()), std::string(addr2.get_ip_address()));
|
|
EXPECT_EQ(addr1.get_addr().version, addr2.get_addr().version);
|
|
EXPECT_TRUE(0 == memcmp(addr1.get_addr().bytes, addr2.get_addr().bytes, NSAPI_IPv4_BYTES));
|
|
EXPECT_TRUE(0 == memcmp(addr1.get_ip_bytes(), addr2.get_ip_bytes(), NSAPI_IP_BYTES));
|
|
EXPECT_EQ(addr1.get_ip_version(), addr2.get_ip_version());
|
|
EXPECT_EQ(addr1.get_port(), addr2.get_port());
|
|
}
|
|
};
|
|
|
|
TEST_F(TestSocketAddress, constructor_default)
|
|
{
|
|
EXPECT_TRUE(address);
|
|
EXPECT_EQ(NULL, address->get_ip_address());
|
|
EXPECT_EQ(0, address->get_port());
|
|
EXPECT_EQ(NSAPI_UNSPEC, address->get_ip_version());
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, constructor_address_ip4)
|
|
{
|
|
SocketAddress addr("127.0.0.1", 80);
|
|
EXPECT_EQ(std::string("127.0.0.1"), std::string(addr.get_ip_address()));
|
|
EXPECT_EQ(80, addr.get_port());
|
|
EXPECT_EQ(NSAPI_IPv4, addr.get_ip_version());
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, constructor_address_ip6)
|
|
{
|
|
SocketAddress addr("1234:5678:9abc:def0:1234:5678::def0", 80);
|
|
EXPECT_EQ(80, addr.get_port());
|
|
EXPECT_EQ(NSAPI_IPv6, addr.get_ip_version());
|
|
// Note that a missing zero is added between two neighbouring colons
|
|
EXPECT_EQ(std::string("1234:5678:9abc:def0:1234:5678:0:def0"), std::string(addr.get_ip_address()));
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, constructor_address_ip6_invalid)
|
|
{
|
|
SocketAddress addr("zzzz:yyyy:xxxx:def0:1234:5678:9abc:def0", 80);
|
|
EXPECT_EQ(80, addr.get_port());
|
|
EXPECT_EQ(NSAPI_UNSPEC, addr.get_ip_version());
|
|
EXPECT_EQ(NULL, addr.get_ip_address());
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, constructor_address_bytes_ip4)
|
|
{
|
|
uint8_t addrBytes[NSAPI_IP_BYTES] = {127, 0, 0, 2};
|
|
|
|
SocketAddress addr(addrBytes, NSAPI_IPv4, 80);
|
|
EXPECT_EQ(std::string("127.0.0.2"), std::string(addr.get_ip_address()));
|
|
EXPECT_EQ(80, addr.get_port());
|
|
EXPECT_EQ(NSAPI_IPv4, addr.get_ip_version());
|
|
EXPECT_TRUE(0 == memcmp(addrBytes, static_cast<const uint8_t *>(addr.get_ip_bytes()), sizeof(addrBytes)));
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, constructor_address_bytes_ip6)
|
|
{
|
|
uint8_t addrBytes[NSAPI_IP_BYTES] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
|
|
|
|
SocketAddress addr(addrBytes, NSAPI_IPv6, 80);
|
|
// the leading zeroes are removed
|
|
EXPECT_EQ(std::string("1:203:405:607:809:a0b:c0d:e0f"), std::string(addr.get_ip_address()));
|
|
EXPECT_EQ(80, addr.get_port());
|
|
EXPECT_EQ(NSAPI_IPv6, addr.get_ip_version());
|
|
EXPECT_TRUE(0 == memcmp(addrBytes, static_cast<const uint8_t *>(addr.get_ip_bytes()), NSAPI_IP_BYTES));
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, constructor_copy)
|
|
{
|
|
SocketAddress addr(*address);
|
|
EXPECT_EQ(address->get_ip_address(), addr.get_ip_address());
|
|
EXPECT_EQ(address->get_port(), addr.get_port());
|
|
EXPECT_EQ(address->get_ip_version(), addr.get_ip_version());
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, assignment_and_equality_operator_ip4)
|
|
{
|
|
SocketAddress addr;
|
|
address->set_ip_address("127.0.0.2");
|
|
address->set_port(81);
|
|
// First verify assignment operator (including return value) using equality operator.
|
|
EXPECT_EQ((addr = *address), *address);
|
|
// Then check inequality operator
|
|
EXPECT_FALSE(addr != *address);
|
|
// Now proceed to check that the equality operator really works.
|
|
isEqual(addr, *address);
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, assignment_and_equality_operator_ip6)
|
|
{
|
|
SocketAddress addr;
|
|
address->set_ip_address("0:0:0:0:0:ffff:7f00:1");
|
|
address->set_port(81);
|
|
// First verify assignment operator (including return value) using equality operator.
|
|
EXPECT_EQ((addr = *address), *address);
|
|
// Then check inequality operator
|
|
EXPECT_FALSE(addr != *address);
|
|
// Now proceed to check that the equality operator really works.
|
|
isEqual(addr, *address);
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, equality_null_check)
|
|
{
|
|
address->set_ip_address("127.0.0.2");
|
|
EXPECT_NE(*address, static_cast<SocketAddress>(NULL));
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, equality_wrong_version)
|
|
{
|
|
SocketAddress addr4("127.0.0.1", 80);
|
|
SocketAddress addr6("0:0:0:0:0:ffff:7f00:1", 80); // This is converted 127.0.0.1
|
|
EXPECT_NE(addr4, addr6); // But they should still be inequal.
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, bool_operator_false)
|
|
{
|
|
EXPECT_FALSE(*address ? true : false);
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, bool_operator_ip4_true)
|
|
{
|
|
SocketAddress addr("127.0.0.1", 80);
|
|
EXPECT_TRUE(addr ? true : false);
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, bool_operator_ip6_true)
|
|
{
|
|
SocketAddress addr("1234:5678:9abc:def0:1234:5678:9abc:def0", 80);
|
|
EXPECT_TRUE(addr ? true : false);
|
|
}
|
|
|
|
TEST_F(TestSocketAddress, bool_operator_ip6_false)
|
|
{
|
|
SocketAddress addr("0:0:0:0:0:0:0:0", 80);
|
|
EXPECT_FALSE(addr ? true : false);
|
|
}
|
|
|