Repository: mesos Updated Branches: refs/heads/master 50696fa2f -> 963513722
http://git-wip-us.apache.org/repos/asf/mesos/blob/96351372/src/tests/routing_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/routing_tests.cpp b/src/tests/routing_tests.cpp deleted file mode 100644 index e4f1bcf..0000000 --- a/src/tests/routing_tests.cpp +++ /dev/null @@ -1,1416 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 <signal.h> -#include <unistd.h> - -#include <linux/version.h> - -#include <sys/types.h> -#include <sys/wait.h> - -#include <gtest/gtest.h> - -#include <process/clock.hpp> -#include <process/gtest.hpp> - -#include <stout/foreach.hpp> -#include <stout/gtest.hpp> -#include <stout/hashmap.hpp> -#include <stout/ip.hpp> -#include <stout/mac.hpp> -#include <stout/net.hpp> -#include <stout/stringify.hpp> - -#include "linux/routing/handle.hpp" -#include "linux/routing/route.hpp" -#include "linux/routing/utils.hpp" - -#include "linux/routing/diagnosis/diagnosis.hpp" - -#include "linux/routing/filter/basic.hpp" -#include "linux/routing/filter/handle.hpp" -#include "linux/routing/filter/icmp.hpp" -#include "linux/routing/filter/ip.hpp" - -#include "linux/routing/link/link.hpp" - -#include "linux/routing/queueing/fq_codel.hpp" -#include "linux/routing/queueing/htb.hpp" -#include "linux/routing/queueing/ingress.hpp" -#include "linux/routing/queueing/statistics.hpp" - -using namespace process; - -using namespace routing; -using namespace routing::filter; -using namespace routing::queueing; - -using std::endl; -using std::set; -using std::string; -using std::vector; - -namespace mesos { -namespace internal { -namespace tests { - - -static const string TEST_VETH_LINK = "veth-test"; -static const string TEST_PEER_LINK = "veth-peer"; - - -class RoutingTest : public ::testing::Test -{ -protected: - virtual void SetUp() - { - ASSERT_SOME(routing::check()) - << "-------------------------------------------------------------\n" - << "We cannot run any routing tests because either your libnl\n" - << "library or kernel is not new enough. You can either upgrade,\n" - << "or disable this test case\n" - << "-------------------------------------------------------------"; - } -}; - - -// Tests that require setting up virtual ethernet on host. -class RoutingVethTest : public RoutingTest -{ -protected: - virtual void SetUp() - { - RoutingTest::SetUp(); - - // Clean up the test links, in case it wasn't cleaned up properly - // from previous tests. - link::remove(TEST_VETH_LINK); - - ASSERT_SOME_FALSE(link::exists(TEST_VETH_LINK)); - ASSERT_SOME_FALSE(link::exists(TEST_PEER_LINK)); - } - - virtual void TearDown() - { - link::remove(TEST_VETH_LINK); - } -}; - - -TEST_F(RoutingTest, PortRange) -{ - Try<ip::PortRange> ports = ip::PortRange::fromBeginEnd(1, 0); - EXPECT_ERROR(ports); - - ports = ip::PortRange::fromBeginEnd(4, 11); - EXPECT_ERROR(ports); - - ports = ip::PortRange::fromBeginEnd(4, 7); - ASSERT_SOME(ports); - EXPECT_EQ(4u, ports.get().begin()); - EXPECT_EQ(7u, ports.get().end()); - EXPECT_EQ(0xfffc, ports.get().mask()); - EXPECT_EQ("[4,7]", stringify(ports.get())); - - ports = ip::PortRange::fromBeginEnd(10, 10); - ASSERT_SOME(ports); - EXPECT_EQ(10u, ports.get().begin()); - EXPECT_EQ(10u, ports.get().end()); - EXPECT_EQ(0xffff, ports.get().mask()); - EXPECT_EQ("[10,10]", stringify(ports.get())); - - ports = ip::PortRange::fromBeginMask(20, 0xffff); - ASSERT_SOME(ports); - EXPECT_EQ(20u, ports.get().begin()); - EXPECT_EQ(20u, ports.get().end()); - EXPECT_EQ(0xffff, ports.get().mask()); - EXPECT_EQ("[20,20]", stringify(ports.get())); - - ports = ip::PortRange::fromBeginMask(1024, 0xfff8); - ASSERT_SOME(ports); - EXPECT_EQ(1024u, ports.get().begin()); - EXPECT_EQ(1031u, ports.get().end()); - EXPECT_EQ(0xfff8, ports.get().mask()); - EXPECT_EQ("[1024,1031]", stringify(ports.get())); -} - - -TEST_F(RoutingTest, RouteTable) -{ - Try<vector<route::Rule> > table = route::table(); - EXPECT_SOME(table); - - Result<net::IP> gateway = route::defaultGateway(); - EXPECT_FALSE(gateway.isError()); -} - - -TEST_F(RoutingTest, LinkIndex) -{ - Try<set<string> > links = net::links(); - ASSERT_SOME(links); - - foreach (const string& link, links.get()) { - EXPECT_SOME_NE(0, link::index(link)); - } - - EXPECT_NONE(link::index("not-exist")); -} - - -TEST_F(RoutingTest, LinkName) -{ - Try<set<string> > links = net::links(); - ASSERT_SOME(links); - - foreach (const string& link, links.get()) { - EXPECT_SOME_NE(0, link::index(link)); - EXPECT_SOME_EQ(link, link::name(link::index(link).get())); - } -} - - -TEST_F(RoutingTest, LinkStatistics) -{ - Try<set<string> > links = net::links(); - ASSERT_SOME(links); - - foreach (const string& link, links.get()) { - Result<hashmap<string, uint64_t> > statistics = link::statistics(link); - - ASSERT_SOME(statistics); - EXPECT_TRUE(statistics.get().contains("rx_packets")); - EXPECT_TRUE(statistics.get().contains("rx_bytes")); - EXPECT_TRUE(statistics.get().contains("tx_packets")); - EXPECT_TRUE(statistics.get().contains("tx_bytes")); - } - - EXPECT_NONE(link::statistics("not-exist")); -} - - -TEST_F(RoutingTest, LinkExists) -{ - Try<set<string> > links = net::links(); - ASSERT_SOME(links); - - foreach (const string& link, links.get()) { - EXPECT_SOME_TRUE(link::exists(link)); - } - - EXPECT_SOME_FALSE(link::exists("not-exist")); -} - - -TEST_F(RoutingTest, Eth0) -{ - Result<string> eth0 = link::eth0(); - EXPECT_FALSE(eth0.isError()); - - if (eth0.isSome()) { - ASSERT_SOME_TRUE(link::exists(eth0.get())); - } -} - - -TEST_F(RoutingTest, Lo) -{ - Result<string> lo = link::lo(); - EXPECT_FALSE(lo.isError()); - - if (lo.isSome()) { - ASSERT_SOME_TRUE(link::exists(lo.get())); - } -} - - -TEST_F(RoutingTest, INETSockets) -{ - Try<vector<diagnosis::socket::Info> > infos = - diagnosis::socket::infos(AF_INET, diagnosis::socket::state::ALL); - - EXPECT_SOME(infos); - - foreach (const diagnosis::socket::Info& info, infos.get()) { - // Both source and destination IPs should be present since - // 'AF_INET' is asked for. - EXPECT_SOME(info.sourceIP); - EXPECT_SOME(info.destinationIP); - } -} - - -TEST_F(RoutingVethTest, ROOT_LinkCreate) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - EXPECT_SOME_NE(0, link::index(TEST_VETH_LINK)); - EXPECT_SOME_NE(0, link::index(TEST_PEER_LINK)); - - // Test the case where the veth (with the same name) already exists. - EXPECT_SOME_FALSE(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); -} - - -TEST_F(RoutingVethTest, ROOT_LinkRemove) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::remove(TEST_VETH_LINK)); - EXPECT_SOME_FALSE(link::remove(TEST_VETH_LINK)); - EXPECT_SOME_FALSE(link::remove(TEST_PEER_LINK)); -} - - -// An old glibc might not have this symbol. -#ifndef CLONE_NEWNET -#define CLONE_NEWNET 0x40000000 -#endif - - -// Entry point of the child process (used in clone()). -static int child(void*) -{ - // Wait to be killed. - while (true) { - sleep(1); - } - - // Should not reach here. - ABORT("Child process should not reach here"); -} - - -TEST_F(RoutingVethTest, ROOT_LinkCreatePid) -{ - // Stack used in the child process. - unsigned long long stack[32]; - - pid_t pid = ::clone(child, &stack[31], CLONE_NEWNET | SIGCHLD, NULL); - ASSERT_NE(-1, pid); - - // In parent process. - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, pid)); - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - - // The peer should not exist in parent network namespace. - EXPECT_SOME_FALSE(link::exists(TEST_PEER_LINK)); - - // TODO(jieyu): Enter the child network namespace and make sure that - // the TEST_PEER_LINK is there. - - EXPECT_SOME_NE(0, link::index(TEST_VETH_LINK)); - - // Kill the child process. - ASSERT_NE(-1, kill(pid, SIGKILL)); - - // Wait for the child process. - int status; - EXPECT_NE(-1, waitpid((pid_t) -1, &status, 0)); - ASSERT_TRUE(WIFSIGNALED(status)); - EXPECT_EQ(SIGKILL, WTERMSIG(status)); -} - - -TEST_F(RoutingVethTest, ROOT_LinkWait) -{ - AWAIT_READY(link::removed(TEST_VETH_LINK)); - - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - Future<Nothing> removed = link::removed(TEST_VETH_LINK); - EXPECT_TRUE(removed.isPending()); - - ASSERT_SOME_TRUE(link::remove(TEST_VETH_LINK)); - AWAIT_READY(removed); -} - - -TEST_F(RoutingVethTest, ROOT_LinkSetUp) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - EXPECT_SOME_FALSE(link::isUp(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::setUp(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::isUp(TEST_VETH_LINK)); - - EXPECT_SOME_FALSE(link::isUp(TEST_PEER_LINK)); - EXPECT_SOME_TRUE(link::setUp(TEST_PEER_LINK)); - EXPECT_SOME_TRUE(link::isUp(TEST_PEER_LINK)); - - EXPECT_NONE(link::isUp("non-exist")); - EXPECT_SOME_FALSE(link::setUp("non-exist")); -} - - -TEST_F(RoutingVethTest, ROOT_LinkSetMAC) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - uint8_t bytes[6] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc}; - - EXPECT_SOME_TRUE(link::setMAC(TEST_VETH_LINK, net::MAC(bytes))); - EXPECT_SOME_TRUE(link::setMAC(TEST_PEER_LINK, net::MAC(bytes))); - - Result<net::MAC> mac = net::mac(TEST_VETH_LINK); - - ASSERT_SOME(mac); - EXPECT_EQ(mac.get(), net::MAC(bytes)); - - mac = net::mac(TEST_PEER_LINK); - - ASSERT_SOME(mac); - EXPECT_EQ(mac.get(), net::MAC(bytes)); - - EXPECT_SOME_FALSE(link::setMAC("non-exist", net::MAC(bytes))); - - // Kernel will reject a multicast MAC address. - uint8_t multicast[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - EXPECT_ERROR(link::setMAC(TEST_VETH_LINK, net::MAC(multicast))); -} - - -TEST_F(RoutingVethTest, ROOT_LinkMTU) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - EXPECT_SOME_TRUE(link::setMTU(TEST_VETH_LINK, 10000)); - - Result<unsigned int> mtu = link::mtu(TEST_VETH_LINK); - ASSERT_SOME(mtu); - EXPECT_EQ(10000u, mtu.get()); - - EXPECT_NONE(link::mtu("not-exist")); - EXPECT_SOME_FALSE(link::setMTU("not-exist", 1500)); -} - - -TEST_F(RoutingVethTest, ROOT_IngressQdisc) -{ - // Test for a qdisc on a nonexistent interface should fail. - EXPECT_SOME_FALSE(ingress::exists("noSuchInterface")); - - EXPECT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - // Interface exists but does not have an ingress qdisc. - EXPECT_SOME_FALSE(ingress::exists(TEST_VETH_LINK)); - EXPECT_SOME_FALSE(ingress::exists(TEST_PEER_LINK)); - - // Interfaces without qdisc established no data. - EXPECT_NONE(ingress::statistics(TEST_VETH_LINK)); - EXPECT_NONE(ingress::statistics(TEST_PEER_LINK)); - - // Try to create an ingress qdisc on a nonexistent interface. - EXPECT_ERROR(ingress::create("noSuchInterface")); - - // Create an ingress qdisc on an existing interface. - EXPECT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - // Interface exists and has an ingress qdisc. - EXPECT_SOME_TRUE(ingress::exists(TEST_VETH_LINK)); - EXPECT_SOME_FALSE(ingress::exists(TEST_PEER_LINK)); - - // Interfaces which exist return at least the core statisitcs. - Result<hashmap<string, uint64_t>> stats = ingress::statistics(TEST_VETH_LINK); - ASSERT_SOME(stats); - EXPECT_TRUE(stats.get().contains(statistics::PACKETS)); - EXPECT_TRUE(stats.get().contains(statistics::BYTES)); - EXPECT_TRUE(stats.get().contains(statistics::RATE_BPS)); - EXPECT_TRUE(stats.get().contains(statistics::RATE_PPS)); - EXPECT_TRUE(stats.get().contains(statistics::QLEN)); - EXPECT_TRUE(stats.get().contains(statistics::BACKLOG)); - EXPECT_TRUE(stats.get().contains(statistics::DROPS)); - EXPECT_TRUE(stats.get().contains(statistics::REQUEUES)); - EXPECT_TRUE(stats.get().contains(statistics::OVERLIMITS)); - - // Interface without qdisc returns no data. - EXPECT_NONE(ingress::statistics(TEST_PEER_LINK)); - - // Try to create a second ingress qdisc on an existing interface. - EXPECT_SOME_FALSE(ingress::create(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(ingress::exists(TEST_VETH_LINK)); - EXPECT_SOME_FALSE(ingress::exists(TEST_PEER_LINK)); - - // Remove the ingress qdisc. - EXPECT_SOME_TRUE(ingress::remove(TEST_VETH_LINK)); - EXPECT_SOME_FALSE(ingress::exists(TEST_VETH_LINK)); - EXPECT_SOME_FALSE(ingress::exists(TEST_PEER_LINK)); - - // Try to remove it from a nonexistent interface. - EXPECT_SOME_FALSE(ingress::remove("noSuchInterface")); - - // Remove the ingress qdisc when it does not exist. - EXPECT_SOME_FALSE(ingress::remove(TEST_VETH_LINK)); - EXPECT_SOME_FALSE(ingress::exists(TEST_VETH_LINK)); - EXPECT_SOME_FALSE(ingress::exists(TEST_PEER_LINK)); -} - - -TEST_F(RoutingVethTest, ROOT_HTBQdisc) -{ - // Test for a qdisc on a nonexistent interface should fail. - EXPECT_SOME_FALSE(htb::exists("noSuchInterface", EGRESS_ROOT)); - - EXPECT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - // This test uses a common handle throughout - const Handle handle = Handle(1, 0); - - // Interface exists but does not have an htb qdisc. - EXPECT_SOME_FALSE(htb::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(htb::exists(TEST_PEER_LINK, EGRESS_ROOT)); - - // Interfaces without qdisc established no data. - EXPECT_NONE(htb::statistics(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_NONE(htb::statistics(TEST_PEER_LINK, EGRESS_ROOT)); - - // Try to create an htb qdisc on a nonexistent interface. - EXPECT_ERROR(htb::create("noSuchInterface", EGRESS_ROOT, handle)); - - // Create an htb qdisc on an existing interface. - EXPECT_SOME_TRUE(htb::create(TEST_VETH_LINK, EGRESS_ROOT, handle)); - - // Interface exists and has an htb qdisc. - EXPECT_SOME_TRUE(htb::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(htb::exists(TEST_PEER_LINK, EGRESS_ROOT)); - - // Interfaces which exist return at least the core statisitcs. - Result<hashmap<string, uint64_t>> stats = - htb::statistics(TEST_VETH_LINK, EGRESS_ROOT); - ASSERT_SOME(stats); - EXPECT_TRUE(stats.get().contains(statistics::PACKETS)); - EXPECT_TRUE(stats.get().contains(statistics::BYTES)); - EXPECT_TRUE(stats.get().contains(statistics::RATE_BPS)); - EXPECT_TRUE(stats.get().contains(statistics::RATE_PPS)); - EXPECT_TRUE(stats.get().contains(statistics::QLEN)); - EXPECT_TRUE(stats.get().contains(statistics::BACKLOG)); - EXPECT_TRUE(stats.get().contains(statistics::DROPS)); - EXPECT_TRUE(stats.get().contains(statistics::REQUEUES)); - EXPECT_TRUE(stats.get().contains(statistics::OVERLIMITS)); - - // Interface without htb qdisc returns no data. - EXPECT_NONE(htb::statistics(TEST_PEER_LINK, EGRESS_ROOT)); - - // Try to create a second htb qdisc on an existing interface. - EXPECT_SOME_FALSE(htb::create(TEST_VETH_LINK, EGRESS_ROOT, handle)); - EXPECT_SOME_TRUE(htb::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(htb::exists(TEST_PEER_LINK, EGRESS_ROOT)); - - // Remove the htb qdisc. - EXPECT_SOME_TRUE(htb::remove(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(htb::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(htb::exists(TEST_PEER_LINK, EGRESS_ROOT)); - - // Try to remove it from a nonexistent interface. - EXPECT_SOME_FALSE(htb::remove("noSuchInterface", EGRESS_ROOT)); - - // Remove the htb qdisc when it does not exist. - EXPECT_SOME_FALSE(htb::remove(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(htb::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(htb::exists(TEST_PEER_LINK, EGRESS_ROOT)); - - // Try to create an htb qdisc on a nonexistent interface and - // default handle. - EXPECT_ERROR(htb::create("noSuchInterface", EGRESS_ROOT, None())); - - // Create an htb qdisc on an existing interface. - EXPECT_SOME_TRUE(htb::create(TEST_VETH_LINK, EGRESS_ROOT, None())); - - // Interface exists and has an htb qdisc. - EXPECT_SOME_TRUE(htb::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(htb::exists(TEST_PEER_LINK, EGRESS_ROOT)); - - // Remove the htb qdisc. - EXPECT_SOME_TRUE(htb::remove(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(htb::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(htb::exists(TEST_PEER_LINK, EGRESS_ROOT)); -} - - -TEST_F(RoutingVethTest, ROOT_FqCodeQdisc) -{ - // Test for a qdisc on a nonexistent interface should fail. - EXPECT_SOME_FALSE(fq_codel::exists("noSuchInterface", EGRESS_ROOT)); - - EXPECT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - // This test uses a common handle throughout - const Handle handle = Handle(1, 0); - - // Interface exists but does not have an fq_codel qdisc. - EXPECT_SOME_FALSE(fq_codel::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(fq_codel::exists(TEST_PEER_LINK, EGRESS_ROOT)); - - // Interfaces without qdisc established no data. - EXPECT_NONE(fq_codel::statistics(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_NONE(fq_codel::statistics(TEST_PEER_LINK, EGRESS_ROOT)); - - // Try to create an fq_codel qdisc on a nonexistent interface. - EXPECT_ERROR(fq_codel::create("noSuchInterface", EGRESS_ROOT, handle)); - - // Create an fq_codel qdisc on an existing interface. - EXPECT_SOME_TRUE(fq_codel::create(TEST_VETH_LINK, EGRESS_ROOT, handle)); - - // Interface exists and has an fq_codel qdisc. - EXPECT_SOME_TRUE(fq_codel::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(fq_codel::exists(TEST_PEER_LINK, EGRESS_ROOT)); - - // Interfaces which exist return at least the core statisitcs. - Result<hashmap<string, uint64_t>> stats = - fq_codel::statistics(TEST_VETH_LINK, EGRESS_ROOT); - ASSERT_SOME(stats); - EXPECT_TRUE(stats.get().contains(statistics::PACKETS)); - EXPECT_TRUE(stats.get().contains(statistics::BYTES)); - EXPECT_TRUE(stats.get().contains(statistics::RATE_BPS)); - EXPECT_TRUE(stats.get().contains(statistics::RATE_PPS)); - EXPECT_TRUE(stats.get().contains(statistics::QLEN)); - EXPECT_TRUE(stats.get().contains(statistics::BACKLOG)); - EXPECT_TRUE(stats.get().contains(statistics::DROPS)); - EXPECT_TRUE(stats.get().contains(statistics::REQUEUES)); - EXPECT_TRUE(stats.get().contains(statistics::OVERLIMITS)); - - // Interface without fq_codel qdisc returns no data. - EXPECT_NONE(fq_codel::statistics(TEST_PEER_LINK, EGRESS_ROOT)); - - // Try to create a second fq_codel qdisc on an existing interface. - EXPECT_SOME_FALSE(fq_codel::create(TEST_VETH_LINK, EGRESS_ROOT, handle)); - EXPECT_SOME_TRUE(fq_codel::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(fq_codel::exists(TEST_PEER_LINK, EGRESS_ROOT)); - - // Remove the fq_codel qdisc. - EXPECT_SOME_TRUE(fq_codel::remove(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(fq_codel::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(fq_codel::exists(TEST_PEER_LINK, EGRESS_ROOT)); - - // Try to remove it from a nonexistent interface. - EXPECT_SOME_FALSE(fq_codel::remove("noSuchInterface", EGRESS_ROOT)); - - // Remove the fq_codel qdisc when it does not exist. - EXPECT_SOME_FALSE(fq_codel::remove(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(fq_codel::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(fq_codel::exists(TEST_PEER_LINK, EGRESS_ROOT)); - - // Try to create an fq_codel qdisc on a nonexistent interface and - // default handle. - EXPECT_ERROR(fq_codel::create("noSuchInterface", EGRESS_ROOT, None())); - - // Create an fq_codel qdisc on an existing interface. - EXPECT_SOME_TRUE(fq_codel::create(TEST_VETH_LINK, EGRESS_ROOT, None())); - - // Interface exists and has an fq_codel qdisc. - EXPECT_SOME_TRUE(fq_codel::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(fq_codel::exists(TEST_PEER_LINK, EGRESS_ROOT)); - - // Remove the fq_codel qdisc. - EXPECT_SOME_TRUE(fq_codel::remove(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(fq_codel::exists(TEST_VETH_LINK, EGRESS_ROOT)); - EXPECT_SOME_FALSE(fq_codel::exists(TEST_PEER_LINK, EGRESS_ROOT)); -} - - -TEST_F(RoutingVethTest, ROOT_FqCodelClassifier) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - const Handle handle = Handle(1, 0); - ASSERT_SOME_TRUE(fq_codel::create(TEST_VETH_LINK, EGRESS_ROOT, handle)); - - EXPECT_SOME_TRUE(basic::create( - TEST_VETH_LINK, - handle, - ETH_P_ALL, - None(), - Handle(handle, 0))); - - EXPECT_SOME_TRUE(basic::exists(TEST_VETH_LINK, handle, ETH_P_ALL)); - - EXPECT_SOME_TRUE(basic::create( - TEST_VETH_LINK, - handle, - ETH_P_ARP, - None(), - Handle(handle, 0))); - - // There is a kernel bug which could cause this test fail. Please - // make sure your kernel, if newer than 3.14, has commit: - // b057df24a7536cce6c372efe9d0e3d1558afedf4 - // (https://git.kernel.org/cgit/linux/kernel/git/davem/net.git). - // Please fix your kernel if you see this failure. - EXPECT_SOME_TRUE(basic::exists(TEST_VETH_LINK, handle, ETH_P_ARP)); - - EXPECT_SOME_TRUE(icmp::create( - TEST_VETH_LINK, - handle, - icmp::Classifier(None()), - None(), - Handle(handle, 0))); - - EXPECT_SOME_TRUE(icmp::exists( - TEST_VETH_LINK, - handle, - icmp::Classifier(None()))); - - Result<net::MAC> mac = net::mac(TEST_VETH_LINK); - ASSERT_SOME(mac); - - net::IP ip = net::IP(0x01020304); // 1.2.3.4 - - Try<ip::PortRange> sourcePorts = - ip::PortRange::fromBeginEnd(1024, 1027); - ASSERT_SOME(sourcePorts); - - Try<ip::PortRange> destinationPorts = - ip::PortRange::fromBeginEnd(2000, 2000); - ASSERT_SOME(destinationPorts); - - ip::Classifier classifier = - ip::Classifier( - mac.get(), - ip, - sourcePorts.get(), - destinationPorts.get()); - - EXPECT_SOME_TRUE(ip::create( - TEST_VETH_LINK, - handle, - classifier, - None(), - Handle(handle, 1))); - - EXPECT_SOME_TRUE(ip::exists(TEST_VETH_LINK, handle, classifier)); -} - - -TEST_F(RoutingVethTest, ROOT_ARPFilterCreate) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - EXPECT_SOME_TRUE(basic::create( - TEST_VETH_LINK, - ingress::HANDLE, - ETH_P_ARP, - None(), - action::Redirect(TEST_PEER_LINK))); - - EXPECT_SOME_TRUE(basic::exists(TEST_VETH_LINK, ingress::HANDLE, ETH_P_ARP)); -} - - -TEST_F(RoutingVethTest, ROOT_ARPFilterCreateDuplicated) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - set<string> links; - links.insert(TEST_PEER_LINK); - - EXPECT_SOME_TRUE(basic::create( - TEST_VETH_LINK, - ingress::HANDLE, - ETH_P_ARP, - None(), - action::Mirror(links))); - - EXPECT_SOME_TRUE(basic::exists(TEST_VETH_LINK, ingress::HANDLE, ETH_P_ARP)); - - EXPECT_SOME_FALSE(basic::create( - TEST_VETH_LINK, - ingress::HANDLE, - ETH_P_ARP, - None(), - action::Redirect(TEST_PEER_LINK))); -} - - -TEST_F(RoutingVethTest, ROOT_ARPFilterRemove) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - set<string> links; - links.insert(TEST_PEER_LINK); - - EXPECT_SOME_TRUE(basic::create( - TEST_VETH_LINK, - ingress::HANDLE, - ETH_P_ARP, - None(), - action::Mirror(links))); - - EXPECT_SOME_TRUE(basic::exists(TEST_VETH_LINK, ingress::HANDLE, ETH_P_ARP)); - EXPECT_SOME_TRUE(basic::remove(TEST_VETH_LINK, ingress::HANDLE, ETH_P_ARP)); - EXPECT_SOME_FALSE(basic::exists(TEST_VETH_LINK, ingress::HANDLE, ETH_P_ARP)); -} - - -TEST_F(RoutingVethTest, ROOT_ARPFilterUpdate) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - set<string> links; - links.insert(TEST_PEER_LINK); - - EXPECT_SOME_FALSE(basic::update( - TEST_VETH_LINK, - ingress::HANDLE, - ETH_P_ARP, - action::Mirror(links))); - - EXPECT_SOME_TRUE(basic::create( - TEST_VETH_LINK, - ingress::HANDLE, - ETH_P_ARP, - None(), - action::Redirect(TEST_PEER_LINK))); - - EXPECT_SOME_TRUE(basic::exists(TEST_VETH_LINK, ingress::HANDLE, ETH_P_ARP)); - - EXPECT_SOME_TRUE(basic::update( - TEST_VETH_LINK, - ingress::HANDLE, - ETH_P_ARP, - action::Mirror(links))); - - EXPECT_SOME_TRUE(basic::exists(TEST_VETH_LINK, ingress::HANDLE, ETH_P_ARP)); -} - - -TEST_F(RoutingVethTest, ROOT_ICMPFilterCreate) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - net::IP ip = net::IP(0x01020304); // 1.2.3.4 - - EXPECT_SOME_TRUE(icmp::create( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(ip), - None(), - action::Redirect(TEST_PEER_LINK))); - - EXPECT_SOME_TRUE(icmp::exists( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(ip))); - - Result<vector<icmp::Classifier> > classifiers = - icmp::classifiers(TEST_VETH_LINK, ingress::HANDLE); - - ASSERT_SOME(classifiers); - ASSERT_EQ(1u, classifiers.get().size()); - EXPECT_SOME_EQ(ip, classifiers.get().front().destinationIP); -} - - -TEST_F(RoutingVethTest, ROOT_ICMPFilterCreateDuplicated) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - set<string> links; - links.insert(TEST_PEER_LINK); - - EXPECT_SOME_TRUE(icmp::create( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(None()), - None(), - action::Mirror(links))); - - EXPECT_SOME_TRUE(icmp::exists( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(None()))); - - EXPECT_SOME_FALSE(icmp::create( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(None()), - None(), - action::Mirror(links))); -} - - -TEST_F(RoutingVethTest, ROOT_ICMPFilterCreateMultiple) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - net::IP ip1 = net::IP(0x01020304); // 1.2.3.4 - net::IP ip2 = net::IP(0x05060708); // 5.6.7.8 - - EXPECT_SOME_TRUE(icmp::create( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(ip1), - Priority(1, 1), - action::Redirect(TEST_PEER_LINK))); - - EXPECT_SOME_TRUE(icmp::create( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(ip2), - Priority(1, 2), - action::Redirect(TEST_PEER_LINK))); - - Result<vector<icmp::Classifier> > classifiers = - icmp::classifiers(TEST_VETH_LINK, ingress::HANDLE); - - ASSERT_SOME(classifiers); - ASSERT_EQ(2u, classifiers.get().size()); - EXPECT_SOME_EQ(ip1, classifiers.get().front().destinationIP); - EXPECT_SOME_EQ(ip2, classifiers.get().back().destinationIP); -} - - -TEST_F(RoutingVethTest, ROOT_ICMPFilterRemove) -{ - ASSERT_SOME(link::create( - TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - EXPECT_SOME_TRUE(icmp::create( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(None()), - None(), - action::Redirect(TEST_PEER_LINK))); - - EXPECT_SOME_TRUE(icmp::exists( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(None()))); - - EXPECT_SOME_TRUE(icmp::remove( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(None()))); - - EXPECT_SOME_FALSE(icmp::exists( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(None()))); -} - - -TEST_F(RoutingVethTest, ROOT_ICMPFilterUpdate) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - net::IP ip = net::IP(0x01020304); // 1.2.3.4 - - set<string> links; - links.insert(TEST_PEER_LINK); - - EXPECT_SOME_FALSE(icmp::update( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(None()), - action::Mirror(links))); - - EXPECT_SOME_TRUE(icmp::create( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(None()), - None(), - action::Redirect(TEST_PEER_LINK))); - - EXPECT_SOME_TRUE(icmp::exists( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(None()))); - - EXPECT_SOME_FALSE(icmp::update( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(ip), - action::Mirror(links))); - - EXPECT_SOME_TRUE(icmp::update( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(None()), - action::Mirror(links))); - - EXPECT_SOME_TRUE(icmp::exists( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(None()))); - - EXPECT_SOME_FALSE(icmp::exists( - TEST_VETH_LINK, - ingress::HANDLE, - icmp::Classifier(ip))); -} - - -TEST_F(RoutingVethTest, ROOT_IPFilterCreate) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - Result<net::MAC> mac = net::mac(TEST_VETH_LINK); - ASSERT_SOME(mac); - - net::IP ip = net::IP(0x01020304); // 1.2.3.4 - - Try<ip::PortRange> sourcePorts = - ip::PortRange::fromBeginEnd(1024, 1027); - - ASSERT_SOME(sourcePorts); - - Try<ip::PortRange> destinationPorts = - ip::PortRange::fromBeginEnd(2000, 2000); - - ASSERT_SOME(destinationPorts); - - ip::Classifier classifier = - ip::Classifier( - mac.get(), - ip, - sourcePorts.get(), - destinationPorts.get()); - - EXPECT_SOME_TRUE(ip::create( - TEST_VETH_LINK, - ingress::HANDLE, - classifier, - None(), - action::Redirect(TEST_PEER_LINK))); - - EXPECT_SOME_TRUE(ip::exists(TEST_VETH_LINK, ingress::HANDLE, classifier)); - - Result<vector<ip::Classifier> > classifiers = - ip::classifiers(TEST_VETH_LINK, ingress::HANDLE); - - ASSERT_SOME(classifiers); - ASSERT_EQ(1u, classifiers.get().size()); - EXPECT_SOME_EQ(mac.get(), classifiers.get().front().destinationMAC); - EXPECT_SOME_EQ(ip, classifiers.get().front().destinationIP); - - EXPECT_SOME_EQ( - sourcePorts.get(), - classifiers.get().front().sourcePorts); - - EXPECT_SOME_EQ( - destinationPorts.get(), - classifiers.get().front().destinationPorts); -} - - -TEST_F(RoutingVethTest, ROOT_IPFilterCreate2) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - net::IP ip(0x12345678); - - EXPECT_SOME_TRUE(ip::create( - TEST_VETH_LINK, - ingress::HANDLE, - ip::Classifier(None(), ip, None(), None()), - None(), - action::Redirect(TEST_PEER_LINK))); - - EXPECT_SOME_TRUE(ip::exists( - TEST_VETH_LINK, - ingress::HANDLE, - ip::Classifier(None(), ip, None(), None()))); - - Result<vector<ip::Classifier> > classifiers = - ip::classifiers(TEST_VETH_LINK, ingress::HANDLE); - - ASSERT_SOME(classifiers); - ASSERT_EQ(1u, classifiers.get().size()); - EXPECT_NONE(classifiers.get().front().destinationMAC); - EXPECT_SOME_EQ(ip, classifiers.get().front().destinationIP); - EXPECT_NONE(classifiers.get().front().sourcePorts); - EXPECT_NONE(classifiers.get().front().destinationPorts); -} - - -TEST_F(RoutingVethTest, ROOT_IPFilterCreateDuplicated) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - Result<net::MAC> mac = net::mac(TEST_VETH_LINK); - ASSERT_SOME(mac); - - net::IP ip = net::IP(0x01020304); // 1.2.3.4 - - Try<ip::PortRange> sourcePorts = - ip::PortRange::fromBeginEnd(1024, 1027); - - ASSERT_SOME(sourcePorts); - - Try<ip::PortRange> destinationPorts = - ip::PortRange::fromBeginEnd(2000, 2000); - - ASSERT_SOME(destinationPorts); - - ip::Classifier classifier = - ip::Classifier( - mac.get(), - ip, - sourcePorts.get(), - destinationPorts.get()); - - EXPECT_SOME_TRUE(ip::create( - TEST_VETH_LINK, - ingress::HANDLE, - classifier, - None(), - action::Redirect(TEST_PEER_LINK))); - - EXPECT_SOME_TRUE(ip::exists(TEST_VETH_LINK, ingress::HANDLE, classifier)); - - EXPECT_SOME_FALSE(ip::create( - TEST_VETH_LINK, - ingress::HANDLE, - classifier, - None(), - action::Redirect(TEST_PEER_LINK))); -} - - -TEST_F(RoutingVethTest, ROOT_IPFilterCreateMultiple) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - Result<net::MAC> mac = net::mac(TEST_VETH_LINK); - ASSERT_SOME(mac); - - net::IP ip = net::IP(0x01020304); // 1.2.3.4 - - Try<ip::PortRange> sourcePorts1 = - ip::PortRange::fromBeginEnd(1024, 1027); - - ASSERT_SOME(sourcePorts1); - - Try<ip::PortRange> destinationPorts1 = - ip::PortRange::fromBeginEnd(2000, 2000); - - ASSERT_SOME(destinationPorts1); - - Try<ip::PortRange> sourcePorts2 = - ip::PortRange::fromBeginEnd(3024, 3025); - - ASSERT_SOME(sourcePorts2); - - Try<ip::PortRange> destinationPorts2 = - ip::PortRange::fromBeginEnd(4000, 4003); - - ASSERT_SOME(destinationPorts2); - - ip::Classifier classifier1 = - ip::Classifier( - mac.get(), - ip, - sourcePorts1.get(), - destinationPorts1.get()); - - ip::Classifier classifier2 = - ip::Classifier( - mac.get(), - ip, - sourcePorts2.get(), - destinationPorts2.get()); - - EXPECT_SOME_TRUE(ip::create( - TEST_VETH_LINK, - ingress::HANDLE, - classifier1, - Priority(2, 1), - action::Redirect(TEST_PEER_LINK))); - - EXPECT_SOME_TRUE(ip::create( - TEST_VETH_LINK, - ingress::HANDLE, - classifier2, - Priority(2, 2), - action::Redirect(TEST_PEER_LINK))); - - Result<vector<ip::Classifier> > classifiers = - ip::classifiers(TEST_VETH_LINK, ingress::HANDLE); - - ASSERT_SOME(classifiers); - ASSERT_EQ(2u, classifiers.get().size()); - - EXPECT_SOME_EQ(mac.get(), classifiers.get().front().destinationMAC); - EXPECT_SOME_EQ(ip, classifiers.get().front().destinationIP); - - EXPECT_SOME_EQ( - sourcePorts1.get(), - classifiers.get().front().sourcePorts); - - EXPECT_SOME_EQ( - destinationPorts1.get(), - classifiers.get().front().destinationPorts); - - EXPECT_SOME_EQ(mac.get(), classifiers.get().back().destinationMAC); - EXPECT_SOME_EQ(ip, classifiers.get().back().destinationIP); - - EXPECT_SOME_EQ( - sourcePorts2.get(), - classifiers.get().back().sourcePorts); - - EXPECT_SOME_EQ( - destinationPorts2.get(), - classifiers.get().back().destinationPorts); -} - - -TEST_F(RoutingVethTest, ROOT_IPFilterRemove) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - Result<net::MAC> mac = net::mac(TEST_VETH_LINK); - ASSERT_SOME(mac); - - net::IP ip = net::IP(0x01020304); // 1.2.3.4 - - Try<ip::PortRange> sourcePorts1 = - ip::PortRange::fromBeginEnd(1024, 1027); - - ASSERT_SOME(sourcePorts1); - - Try<ip::PortRange> destinationPorts1 = - ip::PortRange::fromBeginEnd(2000, 2000); - - ASSERT_SOME(destinationPorts1); - - Try<ip::PortRange> sourcePorts2 = - ip::PortRange::fromBeginEnd(3024, 3025); - - ASSERT_SOME(sourcePorts2); - - Try<ip::PortRange> destinationPorts2 = - ip::PortRange::fromBeginEnd(4000, 4003); - - ASSERT_SOME(destinationPorts2); - - ip::Classifier classifier1 = - ip::Classifier( - mac.get(), - ip, - sourcePorts1.get(), - destinationPorts1.get()); - - ip::Classifier classifier2 = - ip::Classifier( - mac.get(), - ip, - sourcePorts2.get(), - destinationPorts2.get()); - - EXPECT_SOME_TRUE(ip::create( - TEST_VETH_LINK, - ingress::HANDLE, - classifier1, - None(), - action::Redirect(TEST_PEER_LINK))); - - EXPECT_SOME_TRUE(ip::create( - TEST_VETH_LINK, - ingress::HANDLE, - classifier2, - None(), - action::Redirect(TEST_PEER_LINK))); - - EXPECT_SOME_TRUE(ip::remove(TEST_VETH_LINK, ingress::HANDLE, classifier1)); - EXPECT_SOME_FALSE(ip::exists(TEST_VETH_LINK, ingress::HANDLE, classifier1)); - - EXPECT_SOME_TRUE(ip::remove(TEST_VETH_LINK, ingress::HANDLE, classifier2)); - EXPECT_SOME_FALSE(ip::exists(TEST_VETH_LINK, ingress::HANDLE, classifier2)); - - Result<vector<ip::Classifier> > classifiers = - ip::classifiers(TEST_VETH_LINK, ingress::HANDLE); - - ASSERT_SOME(classifiers); - EXPECT_EQ(0u, classifiers.get().size()); -} - - -// Test the workaround introduced for MESOS-1617. -TEST_F(RoutingVethTest, ROOT_HandleGeneration) -{ - ASSERT_SOME(link::create(TEST_VETH_LINK, TEST_PEER_LINK, None())); - - EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK)); - EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK)); - - ASSERT_SOME_TRUE(ingress::create(TEST_VETH_LINK)); - - Result<net::MAC> mac = net::mac(TEST_VETH_LINK); - ASSERT_SOME(mac); - - net::IP ip = net::IP(0x01020304); // 1.2.3.4 - - Try<ip::PortRange> sourcePorts1 = - ip::PortRange::fromBeginEnd(1024, 1027); - - ASSERT_SOME(sourcePorts1); - - Try<ip::PortRange> destinationPorts1 = - ip::PortRange::fromBeginEnd(2000, 2000); - - ASSERT_SOME(destinationPorts1); - - Try<ip::PortRange> sourcePorts2 = - ip::PortRange::fromBeginEnd(3024, 3025); - - ASSERT_SOME(sourcePorts2); - - Try<ip::PortRange> destinationPorts2 = - ip::PortRange::fromBeginEnd(4000, 4003); - - ASSERT_SOME(destinationPorts2); - - ip::Classifier classifier1 = - ip::Classifier( - mac.get(), - ip, - sourcePorts1.get(), - destinationPorts1.get()); - - ip::Classifier classifier2 = - ip::Classifier( - mac.get(), - ip, - sourcePorts2.get(), - destinationPorts2.get()); - - // Use handle 800:00:fff for the first filter. - EXPECT_SOME_TRUE(ip::create( - TEST_VETH_LINK, - ingress::HANDLE, - classifier1, - Priority(2, 1), - U32Handle(0x800, 0x0, 0xfff), - action::Redirect(TEST_PEER_LINK))); - - // With the workaround, this filter should be assigned a handle - // different than 800:00:fff. - EXPECT_SOME_TRUE(ip::create( - TEST_VETH_LINK, - ingress::HANDLE, - classifier2, - Priority(2, 1), - action::Redirect(TEST_PEER_LINK))); - - // Try to remove the second filter. If we don't have the workaround, - // removing the second filter will return false since the kernel - // will find the handle matches the first filter. - EXPECT_SOME_TRUE(ip::remove(TEST_VETH_LINK, ingress::HANDLE, classifier2)); -} - -} // namespace tests { -} // namespace internal { -} // namespace mesos { http://git-wip-us.apache.org/repos/asf/mesos/blob/96351372/src/tests/sched_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/sched_tests.cpp b/src/tests/sched_tests.cpp deleted file mode 100644 index 00723d0..0000000 --- a/src/tests/sched_tests.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 "linux/sched.hpp" - -#include <process/gtest.hpp> -#include <process/reap.hpp> - -#include <gtest/gtest.h> - -#include <stout/gtest.hpp> - -using sched::Policy; - -namespace mesos { -namespace internal { -namespace tests { - -// TODO(idownes): Test the priority and preemption behavior for -// running competing SCHED_OTHER and SCHED_IDLE tasks. - -TEST(SchedTest, ROOT_PolicySelf) -{ - Try<Policy> original = sched::policy::get(); - ASSERT_SOME(original); - - Policy different = (original.get() == Policy::OTHER ? Policy::IDLE - : Policy::OTHER); - - // Change our own scheduling policy. - EXPECT_SOME(sched::policy::set(different)); - EXPECT_SOME_EQ(different, sched::policy::get()); - - // Change it back. - EXPECT_SOME(sched::policy::set(original.get())); - EXPECT_SOME_EQ(original.get(), sched::policy::get()); -} - - -// Change the scheduling policy of a different process (our child). -TEST(SchedTest, ROOT_PolicyChild) -{ - Try<Policy> original = sched::policy::get(); - ASSERT_SOME(original); - - Policy different = (original.get() == Policy::OTHER ? Policy::IDLE - : Policy::OTHER); - - pid_t pid = ::fork(); - ASSERT_NE(-1, pid); - - if (pid == 0) { - // Child. - sleep(10); - - ABORT("Child process should not reach here"); - } - - // Continue in parent. - // Check the child has inherited our policy. - EXPECT_SOME_EQ(original.get(), sched::policy::get(pid)); - - // Check we can change the child's policy. - EXPECT_SOME(sched::policy::set(different, pid)); - EXPECT_SOME_EQ(different, sched::policy::get(pid)); - - process::Future<Option<int>> status = process::reap(pid); - - // Kill the child process. - ASSERT_NE(-1, ::kill(pid, SIGKILL)); - - // Wait for the child process. - AWAIT_READY(status); - ASSERT_SOME(status.get()); - EXPECT_TRUE(WIFSIGNALED(status.get().get())); - EXPECT_EQ(SIGKILL, WTERMSIG(status.get().get())); -} - -} // namespace tests { -} // namespace internal { -} // namespace mesos { http://git-wip-us.apache.org/repos/asf/mesos/blob/96351372/src/tests/setns_test_helper.cpp ---------------------------------------------------------------------- diff --git a/src/tests/setns_test_helper.cpp b/src/tests/setns_test_helper.cpp deleted file mode 100644 index eff1e6e..0000000 --- a/src/tests/setns_test_helper.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 <stout/foreach.hpp> -#include <stout/subcommand.hpp> -#include <stout/try.hpp> - -#include "linux/ns.hpp" - -#include "tests/setns_test_helper.hpp" - -#include <set> -#include <string> - -using std::set; -using std::string; - -const char SetnsTestHelper::NAME[] = "SetnsTestHelper"; - -int SetnsTestHelper::execute() -{ - // Get all the available namespaces. - set<string> namespaces = ns::namespaces(); - - // Note: /proc has not been remounted so we can look up pid 1's - // namespaces, even if we're in a separate pid namespace. - foreach (const string& ns, namespaces) { - if (ns == "pid") { - // ns::setns() does not (currently) support pid namespaces so - // this should return an error. - Try<Nothing> setns = ns::setns(1, ns); - if (!setns.isError()) { - return 1; - } - } else if (ns == "user") { - // ns::setns() will also fail with user namespaces, so we skip - // for now. See MESOS-3083. - continue; - } else { - Try<Nothing> setns = ns::setns(1, ns); - if (!setns.isSome()) { - return 1; - } - } - } - - return 0; -} http://git-wip-us.apache.org/repos/asf/mesos/blob/96351372/src/tests/setns_test_helper.hpp ---------------------------------------------------------------------- diff --git a/src/tests/setns_test_helper.hpp b/src/tests/setns_test_helper.hpp deleted file mode 100644 index 51d6378..0000000 --- a/src/tests/setns_test_helper.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -#ifndef __SETNS_TEST_HELPER_HPP__ -#define __SETNS_TEST_HELPER_HPP__ - -#include <stout/subcommand.hpp> - -class SetnsTestHelper : public Subcommand -{ -public: - static const char NAME[]; - - SetnsTestHelper() : Subcommand(NAME) {} - -protected: - virtual int execute(); -}; - -#endif // __SETNS_TEST_HELPER_HPP__ http://git-wip-us.apache.org/repos/asf/mesos/blob/96351372/src/tests/setns_test_helper_main.cpp ---------------------------------------------------------------------- diff --git a/src/tests/setns_test_helper_main.cpp b/src/tests/setns_test_helper_main.cpp deleted file mode 100644 index 00d3816..0000000 --- a/src/tests/setns_test_helper_main.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 <stout/subcommand.hpp> - -#include "tests/setns_test_helper.hpp" - -int main(int argc, char** argv) -{ - return Subcommand::dispatch( - None(), - argc, - argv, - new SetnsTestHelper()); -}
