TRACE_WRAPPER
void
trace_ppb_net_address_private_create_from_ipv4_address(const uint8_t ip[4], uint16_t port,
                                                       struct PP_NetAddress_Private *addr_out)
{
    trace_info("[PPB] {zilch} %s\n", __func__+6);
    return ppb_net_address_private_create_from_ipv4_address(ip, port, addr_out);
}
TEST(ppb_net_address_private, ipv4_equality)
{
    const uint8_t ip[4] = {192, 168, 1, 2};
    const uint16_t port1 = 1234;
    const uint16_t port2 = 5678;

    struct PP_NetAddress_Private addr1;
    struct PP_NetAddress_Private addr2;

    ppb_net_address_private_create_from_ipv4_address(ip, port1, &addr1);
    ppb_net_address_private_create_from_ipv4_address(ip, port2, &addr2);

    // different ports, hence are different
    ASSERT_EQ(ppb_net_address_private_are_equal(&addr1, &addr2), PP_FALSE);
    ASSERT_EQ(ppb_net_address_private_are_hosts_equal(&addr1, &addr2), PP_TRUE);

    ppb_net_address_private_create_from_ipv4_address(ip, port2, &addr1);
    ppb_net_address_private_create_from_ipv4_address(ip, port2, &addr2);

    // should be equal
    ASSERT_EQ(ppb_net_address_private_are_equal(&addr1, &addr2), PP_TRUE);
    ASSERT_EQ(ppb_net_address_private_are_hosts_equal(&addr1, &addr2), PP_TRUE);
}
TEST(ppb_net_address_private, ipv4_replace_port)
{
    const uint8_t ip[4] = {192, 168, 1, 2};
    const uint16_t port1 = 1234;
    const uint16_t port2 = 1234;

    struct PP_NetAddress_Private addr1;
    struct PP_NetAddress_Private addr2;

    ppb_net_address_private_create_from_ipv4_address(ip, port1, &addr1);
    ASSERT_EQ(ppb_net_address_private_get_port(&addr1), port1);

    ppb_net_address_private_replace_port(&addr1, port2, &addr2);
    ASSERT_EQ(ppb_net_address_private_get_port(&addr2), port2);
}
TEST(ppb_net_address_private, ipv4_compose_decompose)
{
    const uint8_t ip[4] = {192, 168, 1, 2};
    const uint16_t port = 1234;
    uint8_t ip_out[sizeof(ip)] = {};
    struct PP_NetAddress_Private addr;

    ppb_net_address_private_create_from_ipv4_address(ip, port, &addr);

    ppb_net_address_private_get_address(&addr, ip_out, sizeof(ip_out));
    ASSERT_EQ(memcmp(ip, ip_out, sizeof(ip)), 0);

    ASSERT_EQ(ppb_net_address_private_get_port(&addr), port);
    ASSERT_EQ(ppb_net_address_private_get_family(&addr), PP_NETADDRESSFAMILY_PRIVATE_IPV4);
    ASSERT_EQ(ppb_net_address_private_get_scope_id(&addr), 0);
}
TEST(ppb_net_address_private, ipv4_describe)
{
    const uint8_t ip[4] = {192, 168, 1, 2};
    const uint16_t port = 1234;

    struct PP_NetAddress_Private addr;
    struct PP_Var s;

    ppb_net_address_private_create_from_ipv4_address(ip, port, &addr);
    s = ppb_net_address_private_describe(0, &addr, PP_TRUE);
    ASSERT_STREQ(ppb_var_var_to_utf8(s, NULL), "192.168.1.2:1234");
    ppb_var_release(s);

    s = ppb_net_address_private_describe(0, &addr, PP_FALSE);
    ASSERT_STREQ(ppb_var_var_to_utf8(s, NULL), "192.168.1.2");
    ppb_var_release(s);
}
TEST(ppb_net_address_private, ill_formed_PP_NetAddress_Private)
{
    const uint8_t ip[4] = {192, 168, 1, 2};
    const uint16_t port = 1234;

    struct PP_NetAddress_Private addr1;
    struct PP_NetAddress_Private addr2 = {};
    struct PP_NetAddress_Private addr3 = {};
    struct PP_Var s;
    uint8_t ip_out[4];

    ppb_net_address_private_create_from_ipv4_address(ip, port, &addr1);

    ASSERT_EQ(ppb_net_address_private_are_equal(&addr1, &addr2), PP_FALSE);
    ASSERT_EQ(ppb_net_address_private_are_hosts_equal(&addr1, &addr2), PP_FALSE);
    ASSERT_EQ(ppb_net_address_private_get_family(&addr2), PP_NETADDRESSFAMILY_PRIVATE_UNSPECIFIED);
    ASSERT_EQ(ppb_net_address_private_get_port(&addr2), 0);

    ASSERT_EQ(ppb_net_address_private_get_address(&addr2, ip_out, sizeof(ip_out)), PP_FALSE);
    ASSERT_EQ(ppb_net_address_private_replace_port(&addr2, port, &addr3), PP_FALSE);

    s = ppb_net_address_private_describe(0, &addr2, PP_TRUE);
    ASSERT_EQ(s.type, PP_VARTYPE_UNDEFINED);
}