1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <arpa/inet.h> 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <errno.h> 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <fcntl.h> 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <netinet/in.h> 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <pthread.h> 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <sys/types.h> 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <sys/socket.h> 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <sys/stat.h> 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <map> 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "gmock/gmock.h" 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "gtest/gtest.h" 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "nacl_io/kernel_intercept.h" 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "nacl_io/kernel_proxy.h" 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "nacl_io/ossocket.h" 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "nacl_io/ostypes.h" 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifdef PROVIDES_SOCKET_API 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using namespace nacl_io; 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using namespace sdk_util; 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace { 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class SocketTest : public ::testing::Test { 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SocketTest() {} 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void SetUp() { 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(0, ki_push_state_for_testing()); 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(0, ki_init(&kp_)); 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void TearDown() { 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ki_uninit(); 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) KernelProxy kp_; 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 47bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} // namespace 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Accept) { 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) struct sockaddr addr = {}; 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) socklen_t len = 0; 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_accept(123, NULL, &len), 0); 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_accept(123, &addr, NULL), 0); 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_accept(123, NULL, NULL), 0); 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_accept(-1, &addr, &len), 0); 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_accept(0, &addr, &len), 0); 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Bind) { 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const struct sockaddr const_addr = {}; 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) socklen_t len = 0; 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_bind(123, NULL, len), 0); 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_bind(-1, &const_addr, len), 0); 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_bind(0, &const_addr, len), 0); 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Connect) { 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const struct sockaddr const_addr = {}; 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) socklen_t len = 0; 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_connect(123, NULL, len), 0); 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_connect(-1, &const_addr, len), 0); 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_connect(0, &const_addr, len), 0); 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Getpeername) { 90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) struct sockaddr addr = {}; 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) socklen_t len = 0; 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getpeername(123, NULL, &len), 0); 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getpeername(123, &addr, NULL), 0); 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getpeername(123, NULL, NULL), 0); 98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getpeername(-1, &addr, &len), 0); 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getpeername(0, &addr, &len), 0); 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Getsockname) { 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) struct sockaddr addr = {}; 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) socklen_t len = 0; 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getsockname(123, NULL, &len), 0); 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getsockname(123, &addr, NULL), 0); 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getsockname(123, NULL, NULL), 0); 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getsockname(-1, &addr, &len), 0); 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getsockname(0, &addr, &len), 0); 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Getsockopt) { 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) socklen_t len = 10; 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) char optval[len]; 124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, optval, NULL), 0); 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, NULL, &len), 0); 128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, NULL, NULL), 0); 130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getsockopt(-1, SOL_SOCKET, SO_ACCEPTCONN, optval, &len), 0); 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_getsockopt(0, SOL_SOCKET, SO_ACCEPTCONN, optval, &len), 0); 134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Listen) { 138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_listen(-1, 123), 0); 139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_listen(0, 123), 0); 141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Recv) { 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) size_t len = 10; 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) char buf[len]; 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_recv(123, NULL, len, 0), 0); 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_recv(-1, buf, len, 0), 0); 151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_recv(0, buf, len, 0), 0); 153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Recvfrom) { 157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) size_t len = 10; 158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) char buf[len]; 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) struct sockaddr addr = {}; 160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) socklen_t addrlen = 4; 161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_recvfrom(123, NULL, len, 0, &addr, &addrlen), 0); 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_recvfrom(123, buf, len, 0, &addr, NULL), 0); 165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_recvfrom(-1, buf, len, 0, &addr, &addrlen), 0); 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_recvfrom(0, buf, len, 0, &addr, &addrlen), 0); 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Recvmsg) { 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) struct msghdr msg = {}; 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_recvmsg(123, NULL, 0), 0); 176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_recvmsg(-1, &msg, 0), 0); 178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_recvmsg(0, &msg, 0), 0); 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Send) { 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) size_t len = 10; 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) char buf[len]; 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_send(123, NULL, len, 0), 0); 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_send(-1, buf, len, 0), 0); 190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_send(0, buf, len, 0), 0); 192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Sendto) { 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) size_t len = 10; 197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) char buf[len]; 198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) struct sockaddr addr = {}; 199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) socklen_t addrlen = 4; 200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_sendto(123, NULL, len, 0, &addr, addrlen), 0); 202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_sendto(-1, buf, len, 0, &addr, addrlen), 0); 204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_sendto(0, buf, len, 0, &addr, addrlen), 0); 206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Sendmsg) { 210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) struct msghdr msg = {}; 211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_sendmsg(123, NULL, 0), 0); 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_sendmsg(-1, &msg, 0), 0); 215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_sendmsg(0, &msg, 0), 0); 217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Setsockopt) { 221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) socklen_t len = 10; 222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) char optval[len]; 223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Passing a bad address as optval should generate EFAULT 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(-1, ki_setsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, NULL, len)); 226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Passing a bad socket descriptor should generate EBADF 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(-1, ki_setsockopt(-1, SOL_SOCKET, SO_ACCEPTCONN, optval, len)); 230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Passing an FD that is valid but not a socket should generate ENOTSOCK 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(-1, ki_setsockopt(0, SOL_SOCKET, SO_ACCEPTCONN, optval, len)); 234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Shutdown) { 238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_shutdown(-1, SHUT_RDWR), 0); 239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EBADF); 240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_shutdown(0, SHUT_RDWR), 0); 241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, ENOTSOCK); 242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Socket) { 245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_socket(AF_UNIX, SOCK_STREAM, 0), 0); 246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EAFNOSUPPORT); 247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_socket(AF_INET, SOCK_RAW, 0), 0); 248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EPROTONOSUPPORT); 249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SocketTest, Socketpair) { 252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int sv[2]; 253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_socketpair(AF_INET, SOCK_STREAM, 0, NULL), 0); 254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EFAULT); 255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0); 256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EAFNOSUPPORT); 257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_socketpair(AF_INET, SOCK_STREAM, 0, sv), 0); 258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EPROTONOSUPPORT); 259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_LT(ki_socketpair(AF_INET6, SOCK_STREAM, 0, sv), 0); 260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(errno, EPROTONOSUPPORT); 261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(SocketUtilityFunctions, Htonl) { 264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint32_t host_long = 0x44332211; 265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint32_t network_long = htonl(host_long); 266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint8_t network_bytes[4]; 267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch memcpy(network_bytes, &network_long, 4); 268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(network_bytes[0], 0x44); 269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(network_bytes[1], 0x33); 270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(network_bytes[2], 0x22); 271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(network_bytes[3], 0x11); 272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(SocketUtilityFunctions, Htons) { 275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint16_t host_short = 0x2211; 276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint16_t network_short = htons(host_short); 277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint8_t network_bytes[2]; 278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch memcpy(network_bytes, &network_short, 2); 279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(network_bytes[0], 0x22); 280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(network_bytes[1], 0x11); 281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static struct in_addr generate_ipv4_addr(uint8_t* tuple) { 2843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch unsigned char addr[4]; 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) addr[0] = static_cast<unsigned char>(tuple[0]); 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) addr[1] = static_cast<unsigned char>(tuple[1]); 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) addr[2] = static_cast<unsigned char>(tuple[2]); 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) addr[3] = static_cast<unsigned char>(tuple[3]); 289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch struct in_addr real_addr; 290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch memcpy(&real_addr, addr, 4); 291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return real_addr; 2923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 2933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static struct in6_addr generate_ipv6_addr(uint16_t* tuple) { 2953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch unsigned char addr[16]; 2963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (int i = 0; i < 8; i++) { 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) addr[2*i] = (tuple[i] >> 8) & 0xFF; 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) addr[2*i+1] = tuple[i] & 0xFF; 2993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch struct in6_addr real_addr; 301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch memcpy(&real_addr, addr, 16); 302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return real_addr; 3033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 3043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(SocketUtilityFunctions, Inet_addr) { 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fails for if string contains non-integers. 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(INADDR_NONE, inet_addr("foobar")); 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fails if there are too many quads 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(INADDR_NONE, inet_addr("0.0.0.0.0")); 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fails if a single element is > 255 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(INADDR_NONE, inet_addr("999.0.0.0")); 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fails if a single element is negative. 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(INADDR_NONE, inet_addr("-55.0.0.0")); 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // In tripple, notation third integer cannot be larger 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // and 16bit unsigned int. 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(INADDR_NONE, inet_addr("1.2.66000")); 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Success cases. 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Normal dotted-quad address. 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32_t expected_addr = ntohl(0x07060504); 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(expected_addr, inet_addr("7.6.5.4")); 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_addr = ntohl(0xffffffff); 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(expected_addr, inet_addr("255.255.255.255")); 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Tripple case 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_addr = ntohl(1 << 24 | 2 << 16 | 3); 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(expected_addr, inet_addr("1.2.3")); 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_addr = ntohl(1 << 24 | 2 << 16 | 300); 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(expected_addr, inet_addr("1.2.300")); 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Double case 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_addr = ntohl(1 << 24 | 20000); 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(expected_addr, inet_addr("1.20000")); 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_addr = ntohl(1 << 24 | 2); 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(expected_addr, inet_addr("1.2")); 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Single case 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_addr = ntohl(255); 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(expected_addr, inet_addr("255")); 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_addr = ntohl(4000000000U); 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(expected_addr, inet_addr("4000000000")); 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(SocketUtilityFunctions, Inet_aton) { 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct in_addr addr; 3503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Failure cases 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0, inet_aton("foobar", &addr)); 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0, inet_aton("0.0.0.0.0", &addr)); 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0, inet_aton("999.0.0.0", &addr)); 3553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Success cases 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32_t expected_addr = htonl(0xff020304); 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_NE(0, inet_aton("255.2.3.4", &addr)); 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(expected_addr, addr.s_addr); 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_addr = htonl(0x01000002); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_NE(0, inet_aton("1.2", &addr)); 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(expected_addr, addr.s_addr); 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_addr = htonl(0x01020003); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_NE(0, inet_aton("1.2.3", &addr)); 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(expected_addr, addr.s_addr); 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_addr = htonl(0x0000100); 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_NE(0, inet_aton("256", &addr)); 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(expected_addr, addr.s_addr); 3723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 3733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(SocketUtilityFunctions, Inet_ntoa) { 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct { 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned char addr_tuple[4]; 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* output; 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } tests[] = { 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 0, 0, 0, 0 }, "0.0.0.0" }, 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 127, 0, 0, 1 }, "127.0.0.1" }, 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 255, 255, 255, 255 }, "255.255.255.255" }, 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 3833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) char* stringified_addr = inet_ntoa(generate_ipv4_addr(tests[i].addr_tuple)); 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(NULL != stringified_addr); 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STREQ(tests[i].output, stringified_addr); 3883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(SocketUtilityFunctions, Inet_ntop_ipv4) { 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct { 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned char addr_tuple[4]; 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* output; 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } tests[] = { 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 0, 0, 0, 0 }, "0.0.0.0" }, 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 127, 0, 0, 1 }, "127.0.0.1" }, 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 255, 255, 255, 255 }, "255.255.255.255" }, 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) char stringified_addr[INET_ADDRSTRLEN]; 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct in_addr real_addr = generate_ipv4_addr(tests[i].addr_tuple); 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr, 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) stringified_addr, INET_ADDRSTRLEN)); 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STREQ(tests[i].output, stringified_addr); 4073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(SocketUtilityFunctions, Inet_ntop_ipv6) { 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct { 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned short addr_tuple[8]; 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* output; 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } tests[] = { 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 0, 0, 0, 0, 0, 0, 0, 0 }, "::" }, 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 1, 2, 3, 0, 0, 0, 0, 0 }, "1:2:3::" }, 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 0, 0, 0, 0, 0, 1, 2, 3 }, "::1:2:3" }, 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 0x1234, 0xa, 0x12, 0x0000, 0x5678, 0x9abc, 0xdef, 0xffff }, 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "1234:a:12:0:5678:9abc:def:ffff" }, 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff }, 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" }, 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 0, 0, 0, 0, 0, 0xffff, 0x101, 0x101 }, "::ffff:1.1.1.1" }, 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { { 0, 0, 0, 0, 0, 0, 0x101, 0x101 }, "::1.1.1.1" }, 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) char stringified_addr[INET6_ADDRSTRLEN]; 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct in6_addr real_addr = generate_ipv6_addr(tests[i].addr_tuple); 4293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr, 4303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch stringified_addr, INET6_ADDRSTRLEN)); 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STREQ(tests[i].output, stringified_addr); 4323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 4333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 4343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 4353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochTEST(SocketUtilityFunctions, Inet_ntop_failure) { 4363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char addr_name[INET6_ADDRSTRLEN]; 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint16_t addr6_tuple[8] = { 0xffff, 0xffff, 0xffff, 0xffff, 4383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 0xffff, 0xffff, 0xffff, 0xffff }; 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t addr_tuple[4] = { 255, 255, 255, 255 }; 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct in6_addr ipv6_addr = generate_ipv6_addr(addr6_tuple); 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct in_addr ipv4_addr = generate_ipv4_addr(addr_tuple); 4423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(NULL, inet_ntop(AF_UNIX, &ipv6_addr, 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) addr_name, INET6_ADDRSTRLEN)); 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(EAFNOSUPPORT, errno); 4463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(NULL, inet_ntop(AF_INET, &ipv4_addr, 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) addr_name, INET_ADDRSTRLEN - 1)); 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ENOSPC, errno); 4503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(NULL, inet_ntop(AF_INET6, &ipv6_addr, 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) addr_name, INET6_ADDRSTRLEN / 2)); 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ENOSPC, errno); 4543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 4553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(SocketUtilityFunctions, Inet_pton) { 457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) struct { 458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int family; 459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* input; 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* output; // NULL means output should match input 461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } tests[] = { 462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { AF_INET, "127.127.12.0", NULL }, 463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { AF_INET, "0.0.0.0", NULL }, 464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { AF_INET6, "0:0:0:0:0:0:0:0", "::" }, 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { AF_INET6, "1234:5678:9abc:def0:1234:5678:9abc:def0", NULL }, 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { AF_INET6, "1:2:3:4:5:6:7:8", NULL }, 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { AF_INET6, "a:b:c:d:e:f:1:2", NULL }, 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { AF_INET6, "A:B:C:D:E:F:1:2", "a:b:c:d:e:f:1:2" }, 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { AF_INET6, "::", "::" }, 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { AF_INET6, "::12", "::12" }, 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { AF_INET6, "::1:2:3", "::1:2:3" }, 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { AF_INET6, "12::", "12::" }, 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { AF_INET6, "1:2::", "1:2::" }, 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { AF_INET6, "12:0:0:0:0:0:0:0", "12::" }, 4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { AF_INET6, "1:2:3::4:5", "1:2:3::4:5" }, 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { AF_INET6, "::ffff:1.1.1.1", "::ffff:1.1.1.1" }, 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { AF_INET6, "ffff::1.1.1.1", "ffff::101:101" }, 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { AF_INET6, "::1.1.1.1", "::1.1.1.1" }, 480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint8_t addr[16]; 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(inet_pton(tests[i].family, tests[i].input, addr)) 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "inet_pton failed for " << tests[i].input; 486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* expected = tests[i].output ? tests[i].output : tests[i].input; 487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char out_buffer[256]; 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(out_buffer, 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) inet_ntop(tests[i].family, addr, out_buffer, sizeof(out_buffer))); 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_STREQ(expected, out_buffer); 491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(SocketUtilityFunctions, Inet_pton_failure) { 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // All these are examples of strings that do not map 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // to IP address. inet_pton returns 0 on failure. 497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint8_t addr[16]; 498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.24312", &addr)); 499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.24 ", &addr)); 500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0.1", &addr)); 501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12. 0", &addr)); 502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET, " 127.127.12.0", &addr)); 503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0.", &addr)); 504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET, ".127.127.12.0", &addr)); 505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0x0", &addr)); 506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET6, ":::", &addr)); 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET6, "0:::0", &addr)); 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET6, "0::0:0::1", &addr)); 510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1: 2", &addr)); 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET6, " 0:0:0:0:0:0:1:2", &addr)); 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:2 ", &addr)); 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET6, ":0:0:0:0:0:0:1:2", &addr)); 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:2:4", &addr)); 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:0.0.0.0", &addr)); 516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET6, "::0.0.0.0:1", &addr)); 517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET6, "::0.0.0.0.0", &addr)); 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, inet_pton(AF_INET6, "::1.2.3.4.5.6.7.8", &addr)); 519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 521ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(SocketUtilityFunctions, Ntohs) { 522ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint8_t network_bytes[2] = { 0x22, 0x11 }; 523ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint16_t network_short; 524ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch memcpy(&network_short, network_bytes, 2); 525ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint16_t host_short = ntohs(network_short); 526ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(host_short, 0x2211); 527ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 529ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(SocketUtilityFunctions, Ntohl) { 530ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint8_t network_bytes[4] = { 0x44, 0x33, 0x22, 0x11 }; 531ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint32_t network_long; 532ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch memcpy(&network_long, network_bytes, 4); 533ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint32_t host_long = ntohl(network_long); 534ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(host_long, 0x44332211); 535ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 536ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 537bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // PROVIDES_SOCKETPAIR_API 538