15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/posix/file_descriptor_shuffle.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'Duplicated' file descriptors start at this number 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kDuplicateBase = 1000; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Action { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Type { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CLOSE, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOVE, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DUPLICATE, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Action(Type in_type, int in_fd1, int in_fd2 = -1) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(in_type), 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fd1(in_fd1), 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fd2(in_fd2) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==(const Action& other) const { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return other.type == type && 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other.fd1 == fd1 && 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other.fd2 == fd2; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type type; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int fd1; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int fd2; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InjectionTracer : public InjectionDelegate { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer() 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : next_duplicate_(kDuplicateBase) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Duplicate(int* result, int fd) OVERRIDE { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = next_duplicate_++; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_.push_back(Action(Action::DUPLICATE, *result, fd)); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Move(int src, int dest) OVERRIDE { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_.push_back(Action(Action::MOVE, src, dest)); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Close(int fd) OVERRIDE { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_.push_back(Action(Action::CLOSE, fd)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<Action>& actions() const { return actions_; } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int next_duplicate_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Action> actions_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, Empty) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, tracer.actions().size()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, Noop) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 0, false)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, tracer.actions().size()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, NoopAndClose) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 0, true)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, tracer.actions().size()); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, Simple1) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 1, false)); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, tracer.actions().size()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, Simple2) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 1, false)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(2, 3, false)); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, tracer.actions().size()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1)); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 2, 3)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, Simple3) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 1, true)); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, tracer.actions().size()); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1)); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[1] == Action(Action::CLOSE, 0)); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, Simple4) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(10, 0, true)); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(1, 1, true)); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, tracer.actions().size()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 10, 0)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[1] == Action(Action::CLOSE, 10)); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, Cycle) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 1, false)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(1, 0, false)); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4u, tracer.actions().size()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[0] == 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Action(Action::DUPLICATE, kDuplicateBase, 1)); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 1)); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[2] == Action(Action::MOVE, kDuplicateBase, 0)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[3] == Action(Action::CLOSE, kDuplicateBase)); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, CycleAndClose1) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 1, true)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(1, 0, false)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4u, tracer.actions().size()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[0] == 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Action(Action::DUPLICATE, kDuplicateBase, 1)); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 1)); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[2] == Action(Action::MOVE, kDuplicateBase, 0)); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[3] == Action(Action::CLOSE, kDuplicateBase)); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, CycleAndClose2) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 1, false)); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(1, 0, true)); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4u, tracer.actions().size()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[0] == 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Action(Action::DUPLICATE, kDuplicateBase, 1)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 1)); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[2] == Action(Action::MOVE, kDuplicateBase, 0)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[3] == Action(Action::CLOSE, kDuplicateBase)); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, CycleAndClose3) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 1, true)); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(1, 0, true)); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4u, tracer.actions().size()); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[0] == 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Action(Action::DUPLICATE, kDuplicateBase, 1)); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 1)); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[2] == Action(Action::MOVE, kDuplicateBase, 0)); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[3] == Action(Action::CLOSE, kDuplicateBase)); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, Fanout) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 1, false)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 2, false)); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, tracer.actions().size()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 2)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, FanoutAndClose1) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 1, true)); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 2, false)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3u, tracer.actions().size()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1)); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 2)); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[2] == Action(Action::CLOSE, 0)); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, FanoutAndClose2) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 1, false)); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 2, true)); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3u, tracer.actions().size()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1)); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 2)); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[2] == Action(Action::CLOSE, 0)); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, FanoutAndClose3) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectionTracer tracer; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 1, true)); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 2, true)); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer)); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3u, tracer.actions().size()); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1)); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 2)); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracer.actions()[2] == Action(Action::CLOSE, 0)); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FailingDelegate : public InjectionDelegate { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Duplicate(int* result, int fd) OVERRIDE { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Move(int src, int dest) OVERRIDE { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Close(int fd) OVERRIDE {} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, EmptyWithFailure) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FailingDelegate failing; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &failing)); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, NoopWithFailure) { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FailingDelegate failing; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 0, false)); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PerformInjectiveMultimap(map, &failing)); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileDescriptorShuffleTest, Simple1WithFailure) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectiveMultimap map; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FailingDelegate failing; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.push_back(InjectionArc(0, 1, false)); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PerformInjectiveMultimap(map, &failing)); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 288