blob: f15011fa7977e1933372982d6270009021fb2dad [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// These tests should run without any network interface (except loopback).
#include <arpa/inet.h>
#include <limits.h>
#include <sys/utsname.h>
#include <gtest/gtest.h>
namespace {
TEST(NoNetworkTest, NonBlockingConnectHostV4) {
int connfd;
ASSERT_GE(connfd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0), 0) << strerror(errno);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
ASSERT_EQ(inet_pton(AF_INET, "192.168.0.1", &addr.sin_addr), 1) << strerror(errno);
addr.sin_port = htons(10000);
ASSERT_EQ(connect(connfd, (const struct sockaddr*)&addr, sizeof(addr)), -1);
ASSERT_EQ(errno, EHOSTUNREACH) << strerror(errno);
ASSERT_EQ(close(connfd), 0) << strerror(errno);
}
TEST(NoNetworkTest, NonBlockingConnectHostV6) {
int connfd;
ASSERT_GE(connfd = socket(AF_INET6, SOCK_STREAM | SOCK_NONBLOCK, 0), 0) << strerror(errno);
struct sockaddr_in6 addr;
addr.sin6_family = AF_INET6;
ASSERT_EQ(inet_pton(AF_INET6, "fc00::1", &addr.sin6_addr), 1) << strerror(errno);
addr.sin6_port = htons(10000);
ASSERT_EQ(connect(connfd, (const struct sockaddr*)&addr, sizeof(addr)), -1);
ASSERT_EQ(errno, EHOSTUNREACH) << strerror(errno);
ASSERT_EQ(close(connfd), 0) << strerror(errno);
}
TEST(NoNetworkTest, NonBlockingConnectNetV4) {
int connfd;
ASSERT_GE(connfd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0), 0) << strerror(errno);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
// multicast address
ASSERT_EQ(inet_pton(AF_INET, "224.0.0.0", &addr.sin_addr), 1) << strerror(errno);
addr.sin_port = htons(10000);
ASSERT_EQ(connect(connfd, (const struct sockaddr*)&addr, sizeof(addr)), -1);
ASSERT_EQ(errno, ENETUNREACH) << strerror(errno);
ASSERT_EQ(close(connfd), 0) << strerror(errno);
}
TEST(NoNetworkTest, NonBlockingConnectNetV6) {
int connfd = socket(AF_INET6, SOCK_STREAM | SOCK_NONBLOCK, 0);
ASSERT_GE(connfd, 0) << "socket failed: " << strerror(errno);
struct sockaddr_in6 addr;
addr.sin6_family = AF_INET6;
// linklocal address
ASSERT_EQ(inet_pton(AF_INET6, "fe80::1", &addr.sin6_addr), 1) << strerror(errno);
addr.sin6_port = htons(10000);
ASSERT_EQ(connect(connfd, (const struct sockaddr*)&addr, sizeof(addr)), -1);
ASSERT_EQ(errno, ENETUNREACH) << strerror(errno);
ASSERT_EQ(close(connfd), 0) << strerror(errno);
}
} // namespace