Chromium Code Reviews| Index: webrtc/p2p/base/p2ptransportchannel_unittest.cc | 
| diff --git a/webrtc/p2p/base/p2ptransportchannel_unittest.cc b/webrtc/p2p/base/p2ptransportchannel_unittest.cc | 
| index cf54fc4a27fdcf6dbc4c615ae6216097b0f2dd01..0d64ae3f56baf7eb58d701c32492bb3f0ab9ef37 100644 | 
| --- a/webrtc/p2p/base/p2ptransportchannel_unittest.cc | 
| +++ b/webrtc/p2p/base/p2ptransportchannel_unittest.cc | 
| @@ -210,23 +210,24 @@ class P2PTransportChannelTestBase : public testing::Test, | 
| }; | 
| struct Result { | 
| - Result(const std::string& lt, const std::string& lp, | 
| - const std::string& rt, const std::string& rp, | 
| - const std::string& lt2, const std::string& lp2, | 
| - const std::string& rt2, const std::string& rp2, int wait) | 
| - : local_type(lt), local_proto(lp), remote_type(rt), remote_proto(rp), | 
| - local_type2(lt2), local_proto2(lp2), remote_type2(rt2), | 
| - remote_proto2(rp2), connect_wait(wait) { | 
| - } | 
| - | 
| - std::string local_type; | 
| - std::string local_proto; | 
| - std::string remote_type; | 
| - std::string remote_proto; | 
| - std::string local_type2; | 
| - std::string local_proto2; | 
| - std::string remote_type2; | 
| - std::string remote_proto2; | 
| + Result(const std::string& controlling_type, | 
| + const std::string& controlling_protocol, | 
| + const std::string& controlled_type, | 
| + const std::string& controlled_protocol, | 
| + int wait) | 
| + : controlling_type(controlling_type), | 
| + controlling_protocol(controlling_protocol), | 
| + controlled_type(controlled_type), | 
| + controlled_protocol(controlled_protocol), | 
| + connect_wait(wait) {} | 
| + | 
| + // The expected candidate type and protocol of the controlling ICE agent. | 
| + std::string controlling_type; | 
| + std::string controlling_protocol; | 
| + // The expected candidate type and protocol of the controlled ICE agent. | 
| + std::string controlled_type; | 
| + std::string controlled_protocol; | 
| + // How long to wait before the correct candidate pair is selected. | 
| int connect_wait; | 
| }; | 
| @@ -379,9 +380,11 @@ class P2PTransportChannelTestBase : public testing::Test, | 
| static const Result kPrflxUdpToLocalUdp; | 
| static const Result kStunUdpToLocalUdp; | 
| static const Result kStunUdpToStunUdp; | 
| + static const Result kStunUdpToPrflxUdp; | 
| static const Result kPrflxUdpToStunUdp; | 
| static const Result kLocalUdpToRelayUdp; | 
| static const Result kPrflxUdpToRelayUdp; | 
| + static const Result kRelayUdpToPrflxUdp; | 
| static const Result kLocalTcpToLocalTcp; | 
| static const Result kLocalTcpToPrflxTcp; | 
| static const Result kPrflxTcpToLocalTcp; | 
| @@ -440,30 +443,19 @@ class P2PTransportChannelTestBase : public testing::Test, | 
| void SetAllowTcpListen(int endpoint, bool allow_tcp_listen) { | 
| return GetEndpoint(endpoint)->SetAllowTcpListen(allow_tcp_listen); | 
| } | 
| - bool IsLocalToPrflxOrTheReverse(const Result& expected) { | 
| - return ( | 
| - (expected.local_type == "local" && expected.remote_type == "prflx") || | 
| - (expected.local_type == "prflx" && expected.remote_type == "local")); | 
| - } | 
| // Return true if the approprite parts of the expected Result, based | 
| // on the local and remote candidate of ep1_ch1, match. This can be | 
| // used in an EXPECT_TRUE_WAIT. | 
| bool CheckCandidate1(const Result& expected) { | 
| const std::string& local_type = LocalCandidate(ep1_ch1())->type(); | 
| - const std::string& local_proto = LocalCandidate(ep1_ch1())->protocol(); | 
| + const std::string& local_protocol = LocalCandidate(ep1_ch1())->protocol(); | 
| const std::string& remote_type = RemoteCandidate(ep1_ch1())->type(); | 
| - const std::string& remote_proto = RemoteCandidate(ep1_ch1())->protocol(); | 
| - return ((local_proto == expected.local_proto && | 
| - remote_proto == expected.remote_proto) && | 
| - ((local_type == expected.local_type && | 
| - remote_type == expected.remote_type) || | 
| - // Sometimes we expect local -> prflx or prflx -> local | 
| - // and instead get prflx -> local or local -> prflx, and | 
| - // that's OK. | 
| - (IsLocalToPrflxOrTheReverse(expected) && | 
| - local_type == expected.remote_type && | 
| - remote_type == expected.local_type))); | 
| + const std::string& remote_protocol = RemoteCandidate(ep1_ch1())->protocol(); | 
| + return (local_protocol == expected.controlling_protocol && | 
| + remote_protocol == expected.controlled_protocol && | 
| + local_type == expected.controlling_type && | 
| + remote_type == expected.controlled_type); | 
| 
 
pthatcher1
2016/08/08 22:20:30
I'm so happy to see this cleaned up.
 
 | 
| } | 
| // EXPECT_EQ on the approprite parts of the expected Result, based | 
| @@ -476,41 +468,27 @@ class P2PTransportChannelTestBase : public testing::Test, | 
| } | 
| const std::string& local_type = LocalCandidate(ep1_ch1())->type(); | 
| - const std::string& local_proto = LocalCandidate(ep1_ch1())->protocol(); | 
| + const std::string& local_protocol = LocalCandidate(ep1_ch1())->protocol(); | 
| const std::string& remote_type = RemoteCandidate(ep1_ch1())->type(); | 
| - const std::string& remote_proto = RemoteCandidate(ep1_ch1())->protocol(); | 
| - EXPECT_EQ(expected.local_type, local_type); | 
| - EXPECT_EQ(expected.remote_type, remote_type); | 
| - EXPECT_EQ(expected.local_proto, local_proto); | 
| - EXPECT_EQ(expected.remote_proto, remote_proto); | 
| + const std::string& remote_protocol = RemoteCandidate(ep1_ch1())->protocol(); | 
| + EXPECT_EQ(expected.controlling_type, local_type); | 
| + EXPECT_EQ(expected.controlled_type, remote_type); | 
| + EXPECT_EQ(expected.controlling_protocol, local_protocol); | 
| + EXPECT_EQ(expected.controlled_protocol, remote_protocol); | 
| } | 
| // Return true if the approprite parts of the expected Result, based | 
| // on the local and remote candidate of ep2_ch1, match. This can be | 
| // used in an EXPECT_TRUE_WAIT. | 
| bool CheckCandidate2(const Result& expected) { | 
| - const std::string& local_proto = LocalCandidate(ep2_ch1())->protocol(); | 
| - const std::string& remote_proto = RemoteCandidate(ep2_ch1())->protocol(); | 
| - // Removed remote_type comparision aginst selected connection remote | 
| - // candidate. This is done to handle remote type discrepancy from | 
| - // local to stun based on the test type. | 
| - // For example in case of Open -> NAT, ep2 channels will have LULU | 
| - // and in other cases like NAT -> NAT it will be LUSU. To avoid these | 
| - // mismatches and we are doing comparision in different way. | 
| - // i.e. when don't match its remote type is either local or stun. | 
| - // | 
| - // Update(deadbeef): Also had to remove local type comparison. There | 
| - // is currently an issue where the local type is not updated to stun. | 
| - // So one side may see local<->relay while the other sees relay<->stun. | 
| - // This mean the other side may prioritize prflx<->relay, and won't have | 
| - // a local type of relay no matter how long we wait. | 
| - // TODO(deadbeef): Fix this!! It's causing us to have very sparse test | 
| - // coverage and is a very real bug. | 
| - // | 
| - // TODO(ronghuawu): Refine the test criteria. | 
| - // https://code.google.com/p/webrtc/issues/detail?id=1953 | 
| - return ((local_proto == expected.local_proto2 && | 
| - remote_proto == expected.remote_proto2)); | 
| + const std::string& local_type = LocalCandidate(ep2_ch1())->type(); | 
| + const std::string& local_protocol = LocalCandidate(ep2_ch1())->protocol(); | 
| + const std::string& remote_type = RemoteCandidate(ep2_ch1())->type(); | 
| + const std::string& remote_protocol = RemoteCandidate(ep2_ch1())->protocol(); | 
| + return (local_protocol == expected.controlled_protocol && | 
| + remote_protocol == expected.controlling_protocol && | 
| + local_type == expected.controlled_type && | 
| + remote_type == expected.controlling_type); | 
| } | 
| // EXPECT_EQ on the approprite parts of the expected Result, based | 
| @@ -523,13 +501,13 @@ class P2PTransportChannelTestBase : public testing::Test, | 
| } | 
| const std::string& local_type = LocalCandidate(ep2_ch1())->type(); | 
| - const std::string& local_proto = LocalCandidate(ep2_ch1())->protocol(); | 
| + const std::string& local_protocol = LocalCandidate(ep2_ch1())->protocol(); | 
| const std::string& remote_type = RemoteCandidate(ep2_ch1())->type(); | 
| - const std::string& remote_proto = RemoteCandidate(ep2_ch1())->protocol(); | 
| - EXPECT_EQ(expected.local_type2, local_type); | 
| - EXPECT_EQ(expected.remote_type2, remote_type); | 
| - EXPECT_EQ(expected.local_proto2, local_proto); | 
| - EXPECT_EQ(expected.remote_proto2, remote_proto); | 
| + const std::string& remote_protocol = RemoteCandidate(ep2_ch1())->protocol(); | 
| + EXPECT_EQ(expected.controlled_type, local_type); | 
| + EXPECT_EQ(expected.controlling_type, remote_type); | 
| + EXPECT_EQ(expected.controlled_protocol, local_protocol); | 
| + EXPECT_EQ(expected.controlling_protocol, remote_protocol); | 
| } | 
| void Test(const Result& expected) { | 
| @@ -853,42 +831,90 @@ class P2PTransportChannelTestBase : public testing::Test, | 
| }; | 
| // The tests have only a few outcomes, which we predefine. | 
| -const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: | 
| - kLocalUdpToLocalUdp("local", "udp", "local", "udp", | 
| - "local", "udp", "local", "udp", 1000); | 
| -const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: | 
| - kLocalUdpToStunUdp("local", "udp", "stun", "udp", | 
| - "local", "udp", "stun", "udp", 1000); | 
| -const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: | 
| - kLocalUdpToPrflxUdp("local", "udp", "prflx", "udp", | 
| - "prflx", "udp", "local", "udp", 1000); | 
| -const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: | 
| - kPrflxUdpToLocalUdp("prflx", "udp", "local", "udp", | 
| - "local", "udp", "prflx", "udp", 1000); | 
| -const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: | 
| - kStunUdpToLocalUdp("stun", "udp", "local", "udp", | 
| - "local", "udp", "stun", "udp", 1000); | 
| -const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: | 
| - kStunUdpToStunUdp("stun", "udp", "stun", "udp", | 
| - "stun", "udp", "stun", "udp", 1000); | 
| -const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: | 
| - kPrflxUdpToStunUdp("prflx", "udp", "stun", "udp", | 
| - "local", "udp", "prflx", "udp", 1000); | 
| -const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: | 
| - kLocalUdpToRelayUdp("local", "udp", "relay", "udp", | 
| - "relay", "udp", "local", "udp", 2000); | 
| -const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: | 
| - kPrflxUdpToRelayUdp("prflx", "udp", "relay", "udp", | 
| - "relay", "udp", "prflx", "udp", 2000); | 
| -const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: | 
| - kLocalTcpToLocalTcp("local", "tcp", "local", "tcp", | 
| - "local", "tcp", "local", "tcp", 3000); | 
| -const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: | 
| - kLocalTcpToPrflxTcp("local", "tcp", "prflx", "tcp", | 
| - "prflx", "tcp", "local", "tcp", 3000); | 
| -const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: | 
| - kPrflxTcpToLocalTcp("prflx", "tcp", "local", "tcp", | 
| - "local", "tcp", "prflx", "tcp", 3000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kLocalUdpToLocalUdp("local", | 
| + "udp", | 
| + "local", | 
| + "udp", | 
| + 1000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kLocalUdpToStunUdp("local", | 
| + "udp", | 
| + "stun", | 
| + "udp", | 
| + 1000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kLocalUdpToPrflxUdp("local", | 
| + "udp", | 
| + "prflx", | 
| + "udp", | 
| + 1000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kPrflxUdpToLocalUdp("prflx", | 
| + "udp", | 
| + "local", | 
| + "udp", | 
| + 1000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kStunUdpToLocalUdp("stun", | 
| + "udp", | 
| + "local", | 
| + "udp", | 
| + 1000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kStunUdpToStunUdp("stun", | 
| + "udp", | 
| + "stun", | 
| + "udp", | 
| + 1000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kStunUdpToPrflxUdp("stun", | 
| + "udp", | 
| + "prflx", | 
| + "udp", | 
| + 1000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kPrflxUdpToStunUdp("prflx", | 
| + "udp", | 
| + "stun", | 
| + "udp", | 
| + 1000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kLocalUdpToRelayUdp("local", | 
| + "udp", | 
| + "relay", | 
| + "udp", | 
| + 2000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kPrflxUdpToRelayUdp("prflx", | 
| + "udp", | 
| + "relay", | 
| + "udp", | 
| + 2000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kRelayUdpToPrflxUdp("relay", | 
| + "udp", | 
| + "prflx", | 
| + "udp", | 
| + 2000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kLocalTcpToLocalTcp("local", | 
| + "tcp", | 
| + "local", | 
| + "tcp", | 
| + 3000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kLocalTcpToPrflxTcp("local", | 
| + "tcp", | 
| + "prflx", | 
| + "tcp", | 
| + 3000); | 
| +const P2PTransportChannelTestBase::Result | 
| + P2PTransportChannelTestBase::kPrflxTcpToLocalTcp("prflx", | 
| + "tcp", | 
| + "local", | 
| + "tcp", | 
| + 3000); | 
| // Test the matrix of all the connectivity types we expect to see in the wild. | 
| // Just test every combination of the configs in the Config enum. | 
| @@ -1001,9 +1027,11 @@ class P2PTransportChannelTest : public P2PTransportChannelTestBase { | 
| #define PULU &kPrflxUdpToLocalUdp | 
| #define SULU &kStunUdpToLocalUdp | 
| #define SUSU &kStunUdpToStunUdp | 
| +#define SUPU &kStunUdpToPrflxUdp | 
| #define PUSU &kPrflxUdpToStunUdp | 
| #define LURU &kLocalUdpToRelayUdp | 
| #define PURU &kPrflxUdpToRelayUdp | 
| +#define RUPU &kRelayUdpToPrflxUdp | 
| #define LTLT &kLocalTcpToLocalTcp | 
| #define LTPT &kLocalTcpToPrflxTcp | 
| #define PTLT &kPrflxTcpToLocalTcp | 
| @@ -1018,15 +1046,15 @@ class P2PTransportChannelTest : public P2PTransportChannelTestBase { | 
| // TODO: Rearrange rows/columns from best to worst. | 
| const P2PTransportChannelTest::Result* P2PTransportChannelTest::kMatrix[NUM_CONFIGS][NUM_CONFIGS] = { | 
| // OPEN CONE ADDR PORT SYMM 2CON SCON !UDP !TCP HTTP PRXH PRXS | 
| - /*OP*/ {LULU, LUSU, LUSU, LUSU, LUPU, LUSU, LUPU, PTLT, LTPT, LSRS, NULL, LTPT}, | 
| - /*CO*/ {LULU, LUSU, LUSU, LUSU, LUPU, LUSU, LUPU, NULL, NULL, LSRS, NULL, LTRT}, | 
| - /*AD*/ {LULU, LUSU, LUSU, LUSU, LUPU, LUSU, LUPU, NULL, NULL, LSRS, NULL, LTRT}, | 
| - /*PO*/ {LULU, LUSU, LUSU, LUSU, LURU, LUSU, LURU, NULL, NULL, LSRS, NULL, LTRT}, | 
| + /*OP*/ {LULU, LUSU, LUSU, LUSU, LUPU, LUSU, LUPU, LTPT, LTPT, LSRS, NULL, LTPT}, | 
| + /*CO*/ {SULU, SUSU, SUSU, SUSU, SUPU, SUSU, SUPU, NULL, NULL, LSRS, NULL, LTRT}, | 
| + /*AD*/ {SULU, SUSU, SUSU, SUSU, SUPU, SUSU, SUPU, NULL, NULL, LSRS, NULL, LTRT}, | 
| + /*PO*/ {SULU, SUSU, SUSU, SUSU, RUPU, SUSU, RUPU, NULL, NULL, LSRS, NULL, LTRT}, | 
| /*SY*/ {PULU, PUSU, PUSU, PURU, PURU, PUSU, PURU, NULL, NULL, LSRS, NULL, LTRT}, | 
| - /*2C*/ {LULU, LUSU, LUSU, LUSU, LUPU, LUSU, LUPU, NULL, NULL, LSRS, NULL, LTRT}, | 
| + /*2C*/ {SULU, SUSU, SUSU, SUSU, SUPU, SUSU, SUPU, NULL, NULL, LSRS, NULL, LTRT}, | 
| /*SC*/ {PULU, PUSU, PUSU, PURU, PURU, PUSU, PURU, NULL, NULL, LSRS, NULL, LTRT}, | 
| - /*!U*/ {PTLT, NULL, NULL, NULL, NULL, NULL, NULL, PTLT, LTPT, LSRS, NULL, LTRT}, | 
| - /*!T*/ {LTRT, NULL, NULL, NULL, NULL, NULL, NULL, PTLT, LTRT, LSRS, NULL, LTRT}, | 
| + /*!U*/ {LTPT, NULL, NULL, NULL, NULL, NULL, NULL, LTPT, LTPT, LSRS, NULL, LTRT}, | 
| + /*!T*/ {PTLT, NULL, NULL, NULL, NULL, NULL, NULL, PTLT, LTRT, LSRS, NULL, LTRT}, | 
| /*HT*/ {LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, NULL, LSRS}, | 
| /*PR*/ {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, | 
| /*PR*/ {LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LSRS, NULL, LTRT}, | 
| @@ -1047,23 +1075,18 @@ const P2PTransportChannelTest::Result* P2PTransportChannelTest::kMatrix[NUM_CONF | 
| #define P2P_TEST(x, y) \ | 
| P2P_TEST_DECLARATION(x, y,) | 
| -#define FLAKY_P2P_TEST(x, y) \ | 
| - P2P_TEST_DECLARATION(x, y, DISABLED_) | 
| - | 
| -// TODO(holmer): Disabled due to randomly failing on webrtc buildbots. | 
| -// Issue: webrtc/2383 | 
| -#define P2P_TEST_SET(x) \ | 
| - P2P_TEST(x, OPEN) \ | 
| - FLAKY_P2P_TEST(x, NAT_FULL_CONE) \ | 
| - FLAKY_P2P_TEST(x, NAT_ADDR_RESTRICTED) \ | 
| - FLAKY_P2P_TEST(x, NAT_PORT_RESTRICTED) \ | 
| - P2P_TEST(x, NAT_SYMMETRIC) \ | 
| - FLAKY_P2P_TEST(x, NAT_DOUBLE_CONE) \ | 
| - P2P_TEST(x, NAT_SYMMETRIC_THEN_CONE) \ | 
| - P2P_TEST(x, BLOCK_UDP) \ | 
| - P2P_TEST(x, BLOCK_UDP_AND_INCOMING_TCP) \ | 
| +#define P2P_TEST_SET(x) \ | 
| + P2P_TEST(x, OPEN) \ | 
| + P2P_TEST(x, NAT_FULL_CONE) \ | 
| + P2P_TEST(x, NAT_ADDR_RESTRICTED) \ | 
| + P2P_TEST(x, NAT_PORT_RESTRICTED) \ | 
| + P2P_TEST(x, NAT_SYMMETRIC) \ | 
| + P2P_TEST(x, NAT_DOUBLE_CONE) \ | 
| + P2P_TEST(x, NAT_SYMMETRIC_THEN_CONE) \ | 
| + P2P_TEST(x, BLOCK_UDP) \ | 
| + P2P_TEST(x, BLOCK_UDP_AND_INCOMING_TCP) \ | 
| P2P_TEST(x, BLOCK_ALL_BUT_OUTGOING_HTTP) \ | 
| - P2P_TEST(x, PROXY_HTTPS) \ | 
| + P2P_TEST(x, PROXY_HTTPS) \ | 
| P2P_TEST(x, PROXY_SOCKS) | 
| P2P_TEST_SET(OPEN) | 
| @@ -1814,8 +1837,8 @@ class P2PTransportChannelSameNatTest : public P2PTransportChannelTestBase { | 
| TEST_F(P2PTransportChannelSameNatTest, TestConesBehindSameCone) { | 
| ConfigureEndpoints(NAT_FULL_CONE, NAT_FULL_CONE, NAT_FULL_CONE); | 
| - Test(P2PTransportChannelTestBase::Result( | 
| - "prflx", "udp", "stun", "udp", "stun", "udp", "prflx", "udp", 1000)); | 
| + Test( | 
| + P2PTransportChannelTestBase::Result("prflx", "udp", "stun", "udp", 1000)); | 
| } | 
| // Test what happens when we have multiple available pathways. |