| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 int type_preference_ = 0; | 222 int type_preference_ = 0; |
| 223 }; | 223 }; |
| 224 | 224 |
| 225 class TestChannel : public sigslot::has_slots<> { | 225 class TestChannel : public sigslot::has_slots<> { |
| 226 public: | 226 public: |
| 227 // Takes ownership of |p1| (but not |p2|). | 227 // Takes ownership of |p1| (but not |p2|). |
| 228 TestChannel(Port* p1) | 228 TestChannel(Port* p1) |
| 229 : ice_mode_(ICEMODE_FULL), | 229 : ice_mode_(ICEMODE_FULL), |
| 230 port_(p1), | 230 port_(p1), |
| 231 complete_count_(0), | 231 complete_count_(0), |
| 232 conn_(NULL), | 232 conn_(nullptr), |
| 233 remote_request_(), | 233 remote_request_(), |
| 234 nominated_(false) { | 234 nominated_(false) { |
| 235 port_->SignalPortComplete.connect(this, &TestChannel::OnPortComplete); | 235 port_->SignalPortComplete.connect(this, &TestChannel::OnPortComplete); |
| 236 port_->SignalUnknownAddress.connect(this, &TestChannel::OnUnknownAddress); | 236 port_->SignalUnknownAddress.connect(this, &TestChannel::OnUnknownAddress); |
| 237 port_->SignalDestroyed.connect(this, &TestChannel::OnSrcPortDestroyed); | 237 port_->SignalDestroyed.connect(this, &TestChannel::OnSrcPortDestroyed); |
| 238 } | 238 } |
| 239 | 239 |
| 240 int complete_count() { return complete_count_; } | 240 int complete_count() { return complete_count_; } |
| 241 Connection* conn() { return conn_; } | 241 Connection* conn() { return conn_; } |
| 242 const SocketAddress& remote_address() { return remote_address_; } | 242 const SocketAddress& remote_address() { return remote_address_; } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 256 &TestChannel::OnConnectionReadyToSend); | 256 &TestChannel::OnConnectionReadyToSend); |
| 257 connection_ready_to_send_ = false; | 257 connection_ready_to_send_ = false; |
| 258 } | 258 } |
| 259 void OnConnectionStateChange(Connection* conn) { | 259 void OnConnectionStateChange(Connection* conn) { |
| 260 if (conn->write_state() == Connection::STATE_WRITABLE) { | 260 if (conn->write_state() == Connection::STATE_WRITABLE) { |
| 261 conn->set_use_candidate_attr(true); | 261 conn->set_use_candidate_attr(true); |
| 262 nominated_ = true; | 262 nominated_ = true; |
| 263 } | 263 } |
| 264 } | 264 } |
| 265 void AcceptConnection(const Candidate& remote_candidate) { | 265 void AcceptConnection(const Candidate& remote_candidate) { |
| 266 ASSERT_TRUE(remote_request_.get() != NULL); | 266 ASSERT_TRUE(remote_request_.get() != nullptr); |
| 267 Candidate c = remote_candidate; | 267 Candidate c = remote_candidate; |
| 268 c.set_address(remote_address_); | 268 c.set_address(remote_address_); |
| 269 conn_ = port_->CreateConnection(c, Port::ORIGIN_MESSAGE); | 269 conn_ = port_->CreateConnection(c, Port::ORIGIN_MESSAGE); |
| 270 conn_->SignalDestroyed.connect(this, &TestChannel::OnDestroyed); | 270 conn_->SignalDestroyed.connect(this, &TestChannel::OnDestroyed); |
| 271 port_->SendBindingResponse(remote_request_.get(), remote_address_); | 271 port_->SendBindingResponse(remote_request_.get(), remote_address_); |
| 272 remote_request_.reset(); | 272 remote_request_.reset(); |
| 273 } | 273 } |
| 274 void Ping() { | 274 void Ping() { |
| 275 Ping(0); | 275 Ping(0); |
| 276 } | 276 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 300 ASSERT_EQ(port_.get(), port); | 300 ASSERT_EQ(port_.get(), port); |
| 301 if (!remote_address_.IsNil()) { | 301 if (!remote_address_.IsNil()) { |
| 302 ASSERT_EQ(remote_address_, addr); | 302 ASSERT_EQ(remote_address_, addr); |
| 303 } | 303 } |
| 304 const cricket::StunUInt32Attribute* priority_attr = | 304 const cricket::StunUInt32Attribute* priority_attr = |
| 305 msg->GetUInt32(STUN_ATTR_PRIORITY); | 305 msg->GetUInt32(STUN_ATTR_PRIORITY); |
| 306 const cricket::StunByteStringAttribute* mi_attr = | 306 const cricket::StunByteStringAttribute* mi_attr = |
| 307 msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY); | 307 msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY); |
| 308 const cricket::StunUInt32Attribute* fingerprint_attr = | 308 const cricket::StunUInt32Attribute* fingerprint_attr = |
| 309 msg->GetUInt32(STUN_ATTR_FINGERPRINT); | 309 msg->GetUInt32(STUN_ATTR_FINGERPRINT); |
| 310 EXPECT_TRUE(priority_attr != NULL); | 310 EXPECT_TRUE(priority_attr != nullptr); |
| 311 EXPECT_TRUE(mi_attr != NULL); | 311 EXPECT_TRUE(mi_attr != nullptr); |
| 312 EXPECT_TRUE(fingerprint_attr != NULL); | 312 EXPECT_TRUE(fingerprint_attr != nullptr); |
| 313 remote_address_ = addr; | 313 remote_address_ = addr; |
| 314 remote_request_.reset(CopyStunMessage(msg)); | 314 remote_request_.reset(CopyStunMessage(msg)); |
| 315 remote_frag_ = rf; | 315 remote_frag_ = rf; |
| 316 } | 316 } |
| 317 | 317 |
| 318 void OnDestroyed(Connection* conn) { | 318 void OnDestroyed(Connection* conn) { |
| 319 ASSERT_EQ(conn_, conn); | 319 ASSERT_EQ(conn_, conn); |
| 320 LOG(INFO) << "OnDestroy connection " << conn << " deleted"; | 320 LOG(INFO) << "OnDestroy connection " << conn << " deleted"; |
| 321 conn_ = NULL; | 321 conn_ = nullptr; |
| 322 // When the connection is destroyed, also clear these fields so future | 322 // When the connection is destroyed, also clear these fields so future |
| 323 // connections are possible. | 323 // connections are possible. |
| 324 remote_request_.reset(); | 324 remote_request_.reset(); |
| 325 remote_address_.Clear(); | 325 remote_address_.Clear(); |
| 326 } | 326 } |
| 327 | 327 |
| 328 void OnSrcPortDestroyed(PortInterface* port) { | 328 void OnSrcPortDestroyed(PortInterface* port) { |
| 329 Port* destroyed_src = port_.release(); | 329 Port* destroyed_src = port_.release(); |
| 330 ASSERT_EQ(destroyed_src, port); | 330 ASSERT_EQ(destroyed_src, port); |
| 331 } | 331 } |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 | 647 |
| 648 // Ensure redundant SignalClose events on TcpConnection won't break tcp | 648 // Ensure redundant SignalClose events on TcpConnection won't break tcp |
| 649 // reconnection. Chromium will fire SignalClose for all outstanding IPC | 649 // reconnection. Chromium will fire SignalClose for all outstanding IPC |
| 650 // packets during reconnection. | 650 // packets during reconnection. |
| 651 tcp_conn1->socket()->SignalClose(tcp_conn1->socket(), 0); | 651 tcp_conn1->socket()->SignalClose(tcp_conn1->socket(), 0); |
| 652 tcp_conn2->socket()->SignalClose(tcp_conn2->socket(), 0); | 652 tcp_conn2->socket()->SignalClose(tcp_conn2->socket(), 0); |
| 653 | 653 |
| 654 // Speed up destroying ch2's connection such that the test is ready to | 654 // Speed up destroying ch2's connection such that the test is ready to |
| 655 // accept a new connection from ch1 before ch1's connection destroys itself. | 655 // accept a new connection from ch1 before ch1's connection destroys itself. |
| 656 ch2->conn()->Destroy(); | 656 ch2->conn()->Destroy(); |
| 657 EXPECT_TRUE_WAIT(ch2->conn() == NULL, kDefaultTimeout); | 657 EXPECT_TRUE_WAIT(ch2->conn() == nullptr, kDefaultTimeout); |
| 658 } | 658 } |
| 659 | 659 |
| 660 void TestTcpReconnect(bool ping_after_disconnected, | 660 void TestTcpReconnect(bool ping_after_disconnected, |
| 661 bool send_after_disconnected) { | 661 bool send_after_disconnected) { |
| 662 Port* port1 = CreateTcpPort(kLocalAddr1); | 662 Port* port1 = CreateTcpPort(kLocalAddr1); |
| 663 port1->SetIceRole(cricket::ICEROLE_CONTROLLING); | 663 port1->SetIceRole(cricket::ICEROLE_CONTROLLING); |
| 664 Port* port2 = CreateTcpPort(kLocalAddr2); | 664 Port* port2 = CreateTcpPort(kLocalAddr2); |
| 665 port2->SetIceRole(cricket::ICEROLE_CONTROLLED); | 665 port2->SetIceRole(cricket::ICEROLE_CONTROLLED); |
| 666 | 666 |
| 667 port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT); | 667 port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 EXPECT_EQ(ch1.conn()->write_state(), Connection::STATE_WRITABLE); | 722 EXPECT_EQ(ch1.conn()->write_state(), Connection::STATE_WRITABLE); |
| 723 // Since the reconnection never happens, the connections should have been | 723 // Since the reconnection never happens, the connections should have been |
| 724 // destroyed after the timeout. | 724 // destroyed after the timeout. |
| 725 EXPECT_TRUE_WAIT(!ch1.conn(), kTcpReconnectTimeout + kDefaultTimeout); | 725 EXPECT_TRUE_WAIT(!ch1.conn(), kTcpReconnectTimeout + kDefaultTimeout); |
| 726 EXPECT_TRUE(!ch2.conn()); | 726 EXPECT_TRUE(!ch2.conn()); |
| 727 } | 727 } |
| 728 | 728 |
| 729 // Tear down and ensure that goes smoothly. | 729 // Tear down and ensure that goes smoothly. |
| 730 ch1.Stop(); | 730 ch1.Stop(); |
| 731 ch2.Stop(); | 731 ch2.Stop(); |
| 732 EXPECT_TRUE_WAIT(ch1.conn() == NULL, kDefaultTimeout); | 732 EXPECT_TRUE_WAIT(ch1.conn() == nullptr, kDefaultTimeout); |
| 733 EXPECT_TRUE_WAIT(ch2.conn() == NULL, kDefaultTimeout); | 733 EXPECT_TRUE_WAIT(ch2.conn() == nullptr, kDefaultTimeout); |
| 734 } | 734 } |
| 735 | 735 |
| 736 IceMessage* CreateStunMessage(int type) { | 736 IceMessage* CreateStunMessage(int type) { |
| 737 IceMessage* msg = new IceMessage(); | 737 IceMessage* msg = new IceMessage(); |
| 738 msg->SetType(type); | 738 msg->SetType(type); |
| 739 msg->SetTransactionID("TESTTESTTEST"); | 739 msg->SetTransactionID("TESTTESTTEST"); |
| 740 return msg; | 740 return msg; |
| 741 } | 741 } |
| 742 IceMessage* CreateStunMessageWithUsername(int type, | 742 IceMessage* CreateStunMessageWithUsername(int type, |
| 743 const std::string& username) { | 743 const std::string& username) { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 821 EXPECT_EQ(0, ch2.complete_count()); | 821 EXPECT_EQ(0, ch2.complete_count()); |
| 822 | 822 |
| 823 // Acquire addresses. | 823 // Acquire addresses. |
| 824 ch1.Start(); | 824 ch1.Start(); |
| 825 ch2.Start(); | 825 ch2.Start(); |
| 826 ASSERT_EQ_SIMULATED_WAIT(1, ch1.complete_count(), kDefaultTimeout, clock); | 826 ASSERT_EQ_SIMULATED_WAIT(1, ch1.complete_count(), kDefaultTimeout, clock); |
| 827 ASSERT_EQ_SIMULATED_WAIT(1, ch2.complete_count(), kDefaultTimeout, clock); | 827 ASSERT_EQ_SIMULATED_WAIT(1, ch2.complete_count(), kDefaultTimeout, clock); |
| 828 | 828 |
| 829 // Send a ping from src to dst. This may or may not make it. | 829 // Send a ping from src to dst. This may or may not make it. |
| 830 ch1.CreateConnection(GetCandidate(port2)); | 830 ch1.CreateConnection(GetCandidate(port2)); |
| 831 ASSERT_TRUE(ch1.conn() != NULL); | 831 ASSERT_TRUE(ch1.conn() != nullptr); |
| 832 EXPECT_TRUE_SIMULATED_WAIT(ch1.conn()->connected(), kDefaultTimeout, | 832 EXPECT_TRUE_SIMULATED_WAIT(ch1.conn()->connected(), kDefaultTimeout, |
| 833 clock); // for TCP connect | 833 clock); // for TCP connect |
| 834 ch1.Ping(); | 834 ch1.Ping(); |
| 835 SIMULATED_WAIT(!ch2.remote_address().IsNil(), kShortTimeout, clock); | 835 SIMULATED_WAIT(!ch2.remote_address().IsNil(), kShortTimeout, clock); |
| 836 | 836 |
| 837 if (accept) { | 837 if (accept) { |
| 838 // We are able to send a ping from src to dst. This is the case when | 838 // We are able to send a ping from src to dst. This is the case when |
| 839 // sending to UDP ports and cone NATs. | 839 // sending to UDP ports and cone NATs. |
| 840 EXPECT_TRUE(ch1.remote_address().IsNil()); | 840 EXPECT_TRUE(ch1.remote_address().IsNil()); |
| 841 EXPECT_EQ(ch2.remote_fragment(), port1->username_fragment()); | 841 EXPECT_EQ(ch2.remote_fragment(), port1->username_fragment()); |
| 842 | 842 |
| 843 // Ensure the ping came from the same address used for src. | 843 // Ensure the ping came from the same address used for src. |
| 844 // This is the case unless the source NAT was symmetric. | 844 // This is the case unless the source NAT was symmetric. |
| 845 if (same_addr1) EXPECT_EQ(ch2.remote_address(), GetAddress(port1)); | 845 if (same_addr1) EXPECT_EQ(ch2.remote_address(), GetAddress(port1)); |
| 846 EXPECT_TRUE(same_addr2); | 846 EXPECT_TRUE(same_addr2); |
| 847 | 847 |
| 848 // Send a ping from dst to src. | 848 // Send a ping from dst to src. |
| 849 ch2.AcceptConnection(GetCandidate(port1)); | 849 ch2.AcceptConnection(GetCandidate(port1)); |
| 850 ASSERT_TRUE(ch2.conn() != NULL); | 850 ASSERT_TRUE(ch2.conn() != nullptr); |
| 851 ch2.Ping(); | 851 ch2.Ping(); |
| 852 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, | 852 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, |
| 853 ch2.conn()->write_state(), kDefaultTimeout, clock); | 853 ch2.conn()->write_state(), kDefaultTimeout, clock); |
| 854 } else { | 854 } else { |
| 855 // We can't send a ping from src to dst, so flip it around. This will happen | 855 // We can't send a ping from src to dst, so flip it around. This will happen |
| 856 // when the destination NAT is addr/port restricted or symmetric. | 856 // when the destination NAT is addr/port restricted or symmetric. |
| 857 EXPECT_TRUE(ch1.remote_address().IsNil()); | 857 EXPECT_TRUE(ch1.remote_address().IsNil()); |
| 858 EXPECT_TRUE(ch2.remote_address().IsNil()); | 858 EXPECT_TRUE(ch2.remote_address().IsNil()); |
| 859 | 859 |
| 860 // Send a ping from dst to src. Again, this may or may not make it. | 860 // Send a ping from dst to src. Again, this may or may not make it. |
| 861 ch2.CreateConnection(GetCandidate(port1)); | 861 ch2.CreateConnection(GetCandidate(port1)); |
| 862 ASSERT_TRUE(ch2.conn() != NULL); | 862 ASSERT_TRUE(ch2.conn() != nullptr); |
| 863 ch2.Ping(); | 863 ch2.Ping(); |
| 864 SIMULATED_WAIT(ch2.conn()->write_state() == Connection::STATE_WRITABLE, | 864 SIMULATED_WAIT(ch2.conn()->write_state() == Connection::STATE_WRITABLE, |
| 865 kShortTimeout, clock); | 865 kShortTimeout, clock); |
| 866 | 866 |
| 867 if (same_addr1 && same_addr2) { | 867 if (same_addr1 && same_addr2) { |
| 868 // The new ping got back to the source. | 868 // The new ping got back to the source. |
| 869 EXPECT_TRUE(ch1.conn()->receiving()); | 869 EXPECT_TRUE(ch1.conn()->receiving()); |
| 870 EXPECT_EQ(Connection::STATE_WRITABLE, ch2.conn()->write_state()); | 870 EXPECT_EQ(Connection::STATE_WRITABLE, ch2.conn()->write_state()); |
| 871 | 871 |
| 872 // First connection may not be writable if the first ping did not get | 872 // First connection may not be writable if the first ping did not get |
| (...skipping 13 matching lines...) Expand all Loading... |
| 886 // However, since we have now sent a ping to the source IP, we should be | 886 // However, since we have now sent a ping to the source IP, we should be |
| 887 // able to get a ping from it. This gives us the real source address. | 887 // able to get a ping from it. This gives us the real source address. |
| 888 ch1.Ping(); | 888 ch1.Ping(); |
| 889 EXPECT_TRUE_SIMULATED_WAIT(!ch2.remote_address().IsNil(), kDefaultTimeout, | 889 EXPECT_TRUE_SIMULATED_WAIT(!ch2.remote_address().IsNil(), kDefaultTimeout, |
| 890 clock); | 890 clock); |
| 891 EXPECT_FALSE(ch2.conn()->receiving()); | 891 EXPECT_FALSE(ch2.conn()->receiving()); |
| 892 EXPECT_TRUE(ch1.remote_address().IsNil()); | 892 EXPECT_TRUE(ch1.remote_address().IsNil()); |
| 893 | 893 |
| 894 // Pick up the actual address and establish the connection. | 894 // Pick up the actual address and establish the connection. |
| 895 ch2.AcceptConnection(GetCandidate(port1)); | 895 ch2.AcceptConnection(GetCandidate(port1)); |
| 896 ASSERT_TRUE(ch2.conn() != NULL); | 896 ASSERT_TRUE(ch2.conn() != nullptr); |
| 897 ch2.Ping(); | 897 ch2.Ping(); |
| 898 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, | 898 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, |
| 899 ch2.conn()->write_state(), kDefaultTimeout, | 899 ch2.conn()->write_state(), kDefaultTimeout, |
| 900 clock); | 900 clock); |
| 901 } else if (!same_addr2 && possible) { | 901 } else if (!same_addr2 && possible) { |
| 902 // The new ping came in, but from an unexpected address. This will happen | 902 // The new ping came in, but from an unexpected address. This will happen |
| 903 // when the destination NAT is symmetric. | 903 // when the destination NAT is symmetric. |
| 904 EXPECT_FALSE(ch1.remote_address().IsNil()); | 904 EXPECT_FALSE(ch1.remote_address().IsNil()); |
| 905 EXPECT_FALSE(ch1.conn()->receiving()); | 905 EXPECT_FALSE(ch1.conn()->receiving()); |
| 906 | 906 |
| 907 // Update our address and complete the connection. | 907 // Update our address and complete the connection. |
| 908 ch1.AcceptConnection(GetCandidate(port2)); | 908 ch1.AcceptConnection(GetCandidate(port2)); |
| 909 ch1.Ping(); | 909 ch1.Ping(); |
| 910 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, | 910 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, |
| 911 ch1.conn()->write_state(), kDefaultTimeout, | 911 ch1.conn()->write_state(), kDefaultTimeout, |
| 912 clock); | 912 clock); |
| 913 } else { // (!possible) | 913 } else { // (!possible) |
| 914 // There should be s no way for the pings to reach each other. Check it. | 914 // There should be s no way for the pings to reach each other. Check it. |
| 915 EXPECT_TRUE(ch1.remote_address().IsNil()); | 915 EXPECT_TRUE(ch1.remote_address().IsNil()); |
| 916 EXPECT_TRUE(ch2.remote_address().IsNil()); | 916 EXPECT_TRUE(ch2.remote_address().IsNil()); |
| 917 ch1.Ping(); | 917 ch1.Ping(); |
| 918 SIMULATED_WAIT(!ch2.remote_address().IsNil(), kShortTimeout, clock); | 918 SIMULATED_WAIT(!ch2.remote_address().IsNil(), kShortTimeout, clock); |
| 919 EXPECT_TRUE(ch1.remote_address().IsNil()); | 919 EXPECT_TRUE(ch1.remote_address().IsNil()); |
| 920 EXPECT_TRUE(ch2.remote_address().IsNil()); | 920 EXPECT_TRUE(ch2.remote_address().IsNil()); |
| 921 } | 921 } |
| 922 } | 922 } |
| 923 | 923 |
| 924 // Everything should be good, unless we know the situation is impossible. | 924 // Everything should be good, unless we know the situation is impossible. |
| 925 ASSERT_TRUE(ch1.conn() != NULL); | 925 ASSERT_TRUE(ch1.conn() != nullptr); |
| 926 ASSERT_TRUE(ch2.conn() != NULL); | 926 ASSERT_TRUE(ch2.conn() != nullptr); |
| 927 if (possible) { | 927 if (possible) { |
| 928 EXPECT_TRUE(ch1.conn()->receiving()); | 928 EXPECT_TRUE(ch1.conn()->receiving()); |
| 929 EXPECT_EQ(Connection::STATE_WRITABLE, ch1.conn()->write_state()); | 929 EXPECT_EQ(Connection::STATE_WRITABLE, ch1.conn()->write_state()); |
| 930 EXPECT_TRUE(ch2.conn()->receiving()); | 930 EXPECT_TRUE(ch2.conn()->receiving()); |
| 931 EXPECT_EQ(Connection::STATE_WRITABLE, ch2.conn()->write_state()); | 931 EXPECT_EQ(Connection::STATE_WRITABLE, ch2.conn()->write_state()); |
| 932 } else { | 932 } else { |
| 933 EXPECT_FALSE(ch1.conn()->receiving()); | 933 EXPECT_FALSE(ch1.conn()->receiving()); |
| 934 EXPECT_NE(Connection::STATE_WRITABLE, ch1.conn()->write_state()); | 934 EXPECT_NE(Connection::STATE_WRITABLE, ch1.conn()->write_state()); |
| 935 EXPECT_FALSE(ch2.conn()->receiving()); | 935 EXPECT_FALSE(ch2.conn()->receiving()); |
| 936 EXPECT_NE(Connection::STATE_WRITABLE, ch2.conn()->write_state()); | 936 EXPECT_NE(Connection::STATE_WRITABLE, ch2.conn()->write_state()); |
| 937 } | 937 } |
| 938 | 938 |
| 939 // Tear down and ensure that goes smoothly. | 939 // Tear down and ensure that goes smoothly. |
| 940 ch1.Stop(); | 940 ch1.Stop(); |
| 941 ch2.Stop(); | 941 ch2.Stop(); |
| 942 EXPECT_TRUE_SIMULATED_WAIT(ch1.conn() == NULL, kDefaultTimeout, clock); | 942 EXPECT_TRUE_SIMULATED_WAIT(ch1.conn() == nullptr, kDefaultTimeout, clock); |
| 943 EXPECT_TRUE_SIMULATED_WAIT(ch2.conn() == NULL, kDefaultTimeout, clock); | 943 EXPECT_TRUE_SIMULATED_WAIT(ch2.conn() == nullptr, kDefaultTimeout, clock); |
| 944 } | 944 } |
| 945 | 945 |
| 946 class FakePacketSocketFactory : public rtc::PacketSocketFactory { | 946 class FakePacketSocketFactory : public rtc::PacketSocketFactory { |
| 947 public: | 947 public: |
| 948 FakePacketSocketFactory() | 948 FakePacketSocketFactory() |
| 949 : next_udp_socket_(NULL), | 949 : next_udp_socket_(nullptr), |
| 950 next_server_tcp_socket_(NULL), | 950 next_server_tcp_socket_(nullptr), |
| 951 next_client_tcp_socket_(NULL) { | 951 next_client_tcp_socket_(nullptr) {} |
| 952 } | |
| 953 ~FakePacketSocketFactory() override { } | 952 ~FakePacketSocketFactory() override { } |
| 954 | 953 |
| 955 AsyncPacketSocket* CreateUdpSocket(const SocketAddress& address, | 954 AsyncPacketSocket* CreateUdpSocket(const SocketAddress& address, |
| 956 uint16_t min_port, | 955 uint16_t min_port, |
| 957 uint16_t max_port) override { | 956 uint16_t max_port) override { |
| 958 EXPECT_TRUE(next_udp_socket_ != NULL); | 957 EXPECT_TRUE(next_udp_socket_ != nullptr); |
| 959 AsyncPacketSocket* result = next_udp_socket_; | 958 AsyncPacketSocket* result = next_udp_socket_; |
| 960 next_udp_socket_ = NULL; | 959 next_udp_socket_ = nullptr; |
| 961 return result; | 960 return result; |
| 962 } | 961 } |
| 963 | 962 |
| 964 AsyncPacketSocket* CreateServerTcpSocket(const SocketAddress& local_address, | 963 AsyncPacketSocket* CreateServerTcpSocket(const SocketAddress& local_address, |
| 965 uint16_t min_port, | 964 uint16_t min_port, |
| 966 uint16_t max_port, | 965 uint16_t max_port, |
| 967 int opts) override { | 966 int opts) override { |
| 968 EXPECT_TRUE(next_server_tcp_socket_ != NULL); | 967 EXPECT_TRUE(next_server_tcp_socket_ != nullptr); |
| 969 AsyncPacketSocket* result = next_server_tcp_socket_; | 968 AsyncPacketSocket* result = next_server_tcp_socket_; |
| 970 next_server_tcp_socket_ = NULL; | 969 next_server_tcp_socket_ = nullptr; |
| 971 return result; | 970 return result; |
| 972 } | 971 } |
| 973 | 972 |
| 974 // TODO: |proxy_info| and |user_agent| should be set | 973 // TODO: |proxy_info| and |user_agent| should be set |
| 975 // per-factory and not when socket is created. | 974 // per-factory and not when socket is created. |
| 976 AsyncPacketSocket* CreateClientTcpSocket(const SocketAddress& local_address, | 975 AsyncPacketSocket* CreateClientTcpSocket(const SocketAddress& local_address, |
| 977 const SocketAddress& remote_address, | 976 const SocketAddress& remote_address, |
| 978 const rtc::ProxyInfo& proxy_info, | 977 const rtc::ProxyInfo& proxy_info, |
| 979 const std::string& user_agent, | 978 const std::string& user_agent, |
| 980 int opts) override { | 979 int opts) override { |
| 981 EXPECT_TRUE(next_client_tcp_socket_ != NULL); | 980 EXPECT_TRUE(next_client_tcp_socket_ != nullptr); |
| 982 AsyncPacketSocket* result = next_client_tcp_socket_; | 981 AsyncPacketSocket* result = next_client_tcp_socket_; |
| 983 next_client_tcp_socket_ = NULL; | 982 next_client_tcp_socket_ = nullptr; |
| 984 return result; | 983 return result; |
| 985 } | 984 } |
| 986 | 985 |
| 987 void set_next_udp_socket(AsyncPacketSocket* next_udp_socket) { | 986 void set_next_udp_socket(AsyncPacketSocket* next_udp_socket) { |
| 988 next_udp_socket_ = next_udp_socket; | 987 next_udp_socket_ = next_udp_socket; |
| 989 } | 988 } |
| 990 void set_next_server_tcp_socket(AsyncPacketSocket* next_server_tcp_socket) { | 989 void set_next_server_tcp_socket(AsyncPacketSocket* next_server_tcp_socket) { |
| 991 next_server_tcp_socket_ = next_server_tcp_socket; | 990 next_server_tcp_socket_ = next_server_tcp_socket; |
| 992 } | 991 } |
| 993 void set_next_client_tcp_socket(AsyncPacketSocket* next_client_tcp_socket) { | 992 void set_next_client_tcp_socket(AsyncPacketSocket* next_client_tcp_socket) { |
| 994 next_client_tcp_socket_ = next_client_tcp_socket; | 993 next_client_tcp_socket_ = next_client_tcp_socket; |
| 995 } | 994 } |
| 996 rtc::AsyncResolverInterface* CreateAsyncResolver() override { | 995 rtc::AsyncResolverInterface* CreateAsyncResolver() override { |
| 997 return NULL; | 996 return nullptr; |
| 998 } | 997 } |
| 999 | 998 |
| 1000 private: | 999 private: |
| 1001 AsyncPacketSocket* next_udp_socket_; | 1000 AsyncPacketSocket* next_udp_socket_; |
| 1002 AsyncPacketSocket* next_server_tcp_socket_; | 1001 AsyncPacketSocket* next_server_tcp_socket_; |
| 1003 AsyncPacketSocket* next_client_tcp_socket_; | 1002 AsyncPacketSocket* next_client_tcp_socket_; |
| 1004 }; | 1003 }; |
| 1005 | 1004 |
| 1006 class FakeAsyncPacketSocket : public AsyncPacketSocket { | 1005 class FakeAsyncPacketSocket : public AsyncPacketSocket { |
| 1007 public: | 1006 public: |
| 1008 // Returns current local address. Address may be set to NULL if the | 1007 // Returns current local address. Address may be set to null if the |
| 1009 // socket is not bound yet (GetState() returns STATE_BINDING). | 1008 // socket is not bound yet (GetState() returns STATE_BINDING). |
| 1010 virtual SocketAddress GetLocalAddress() const { | 1009 virtual SocketAddress GetLocalAddress() const { |
| 1011 return SocketAddress(); | 1010 return SocketAddress(); |
| 1012 } | 1011 } |
| 1013 | 1012 |
| 1014 // Returns remote address. Returns zeroes if this is not a client TCP socket. | 1013 // Returns remote address. Returns zeroes if this is not a client TCP socket. |
| 1015 virtual SocketAddress GetRemoteAddress() const { | 1014 virtual SocketAddress GetRemoteAddress() const { |
| 1016 return SocketAddress(); | 1015 return SocketAddress(); |
| 1017 } | 1016 } |
| 1018 | 1017 |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1353 std::unique_ptr<TestPort> lport( | 1352 std::unique_ptr<TestPort> lport( |
| 1354 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); | 1353 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); |
| 1355 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); | 1354 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); |
| 1356 lport->SetIceTiebreaker(kTiebreaker1); | 1355 lport->SetIceTiebreaker(kTiebreaker1); |
| 1357 lport->PrepareAddress(); | 1356 lport->PrepareAddress(); |
| 1358 ASSERT_FALSE(lport->Candidates().empty()); | 1357 ASSERT_FALSE(lport->Candidates().empty()); |
| 1359 Connection* conn = lport->CreateConnection(lport->Candidates()[0], | 1358 Connection* conn = lport->CreateConnection(lport->Candidates()[0], |
| 1360 Port::ORIGIN_MESSAGE); | 1359 Port::ORIGIN_MESSAGE); |
| 1361 conn->Ping(0); | 1360 conn->Ping(0); |
| 1362 | 1361 |
| 1363 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout); | 1362 ASSERT_TRUE_WAIT(lport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1364 IceMessage* msg = lport->last_stun_msg(); | 1363 IceMessage* msg = lport->last_stun_msg(); |
| 1365 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); | 1364 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); |
| 1366 conn->OnReadPacket(lport->last_stun_buf()->data<char>(), | 1365 conn->OnReadPacket(lport->last_stun_buf()->data<char>(), |
| 1367 lport->last_stun_buf()->size(), | 1366 lport->last_stun_buf()->size(), |
| 1368 rtc::PacketTime()); | 1367 rtc::PacketTime()); |
| 1369 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout); | 1368 ASSERT_TRUE_WAIT(lport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1370 msg = lport->last_stun_msg(); | 1369 msg = lport->last_stun_msg(); |
| 1371 EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type()); | 1370 EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type()); |
| 1372 | 1371 |
| 1373 // If the tiebreaker value is different from port, we expect a error | 1372 // If the tiebreaker value is different from port, we expect a error |
| 1374 // response. | 1373 // response. |
| 1375 lport->Reset(); | 1374 lport->Reset(); |
| 1376 lport->AddCandidateAddress(kLocalAddr2); | 1375 lport->AddCandidateAddress(kLocalAddr2); |
| 1377 // Creating a different connection as |conn| is receiving. | 1376 // Creating a different connection as |conn| is receiving. |
| 1378 Connection* conn1 = lport->CreateConnection(lport->Candidates()[1], | 1377 Connection* conn1 = lport->CreateConnection(lport->Candidates()[1], |
| 1379 Port::ORIGIN_MESSAGE); | 1378 Port::ORIGIN_MESSAGE); |
| 1380 conn1->Ping(0); | 1379 conn1->Ping(0); |
| 1381 | 1380 |
| 1382 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout); | 1381 ASSERT_TRUE_WAIT(lport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1383 msg = lport->last_stun_msg(); | 1382 msg = lport->last_stun_msg(); |
| 1384 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); | 1383 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); |
| 1385 std::unique_ptr<IceMessage> modified_req( | 1384 std::unique_ptr<IceMessage> modified_req( |
| 1386 CreateStunMessage(STUN_BINDING_REQUEST)); | 1385 CreateStunMessage(STUN_BINDING_REQUEST)); |
| 1387 const StunByteStringAttribute* username_attr = msg->GetByteString( | 1386 const StunByteStringAttribute* username_attr = msg->GetByteString( |
| 1388 STUN_ATTR_USERNAME); | 1387 STUN_ATTR_USERNAME); |
| 1389 modified_req->AddAttribute(new StunByteStringAttribute( | 1388 modified_req->AddAttribute(new StunByteStringAttribute( |
| 1390 STUN_ATTR_USERNAME, username_attr->GetString())); | 1389 STUN_ATTR_USERNAME, username_attr->GetString())); |
| 1391 // To make sure we receive error response, adding tiebreaker less than | 1390 // To make sure we receive error response, adding tiebreaker less than |
| 1392 // what's present in request. | 1391 // what's present in request. |
| 1393 modified_req->AddAttribute(new StunUInt64Attribute( | 1392 modified_req->AddAttribute(new StunUInt64Attribute( |
| 1394 STUN_ATTR_ICE_CONTROLLING, kTiebreaker1 - 1)); | 1393 STUN_ATTR_ICE_CONTROLLING, kTiebreaker1 - 1)); |
| 1395 modified_req->AddMessageIntegrity("lpass"); | 1394 modified_req->AddMessageIntegrity("lpass"); |
| 1396 modified_req->AddFingerprint(); | 1395 modified_req->AddFingerprint(); |
| 1397 | 1396 |
| 1398 lport->Reset(); | 1397 lport->Reset(); |
| 1399 std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter()); | 1398 std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter()); |
| 1400 WriteStunMessage(modified_req.get(), buf.get()); | 1399 WriteStunMessage(modified_req.get(), buf.get()); |
| 1401 conn1->OnReadPacket(buf->Data(), buf->Length(), rtc::PacketTime()); | 1400 conn1->OnReadPacket(buf->Data(), buf->Length(), rtc::PacketTime()); |
| 1402 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout); | 1401 ASSERT_TRUE_WAIT(lport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1403 msg = lport->last_stun_msg(); | 1402 msg = lport->last_stun_msg(); |
| 1404 EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type()); | 1403 EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type()); |
| 1405 } | 1404 } |
| 1406 | 1405 |
| 1407 // This test verifies role conflict signal is received when there is | 1406 // This test verifies role conflict signal is received when there is |
| 1408 // conflict in the role. In this case both ports are in controlling and | 1407 // conflict in the role. In this case both ports are in controlling and |
| 1409 // |rport| has higher tiebreaker value than |lport|. Since |lport| has lower | 1408 // |rport| has higher tiebreaker value than |lport|. Since |lport| has lower |
| 1410 // value of tiebreaker, when it receives ping request from |rport| it will | 1409 // value of tiebreaker, when it receives ping request from |rport| it will |
| 1411 // send role conflict signal. | 1410 // send role conflict signal. |
| 1412 TEST_F(PortTest, TestIceRoleConflict) { | 1411 TEST_F(PortTest, TestIceRoleConflict) { |
| 1413 std::unique_ptr<TestPort> lport( | 1412 std::unique_ptr<TestPort> lport( |
| 1414 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); | 1413 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); |
| 1415 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); | 1414 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); |
| 1416 lport->SetIceTiebreaker(kTiebreaker1); | 1415 lport->SetIceTiebreaker(kTiebreaker1); |
| 1417 std::unique_ptr<TestPort> rport( | 1416 std::unique_ptr<TestPort> rport( |
| 1418 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); | 1417 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); |
| 1419 rport->SetIceRole(cricket::ICEROLE_CONTROLLING); | 1418 rport->SetIceRole(cricket::ICEROLE_CONTROLLING); |
| 1420 rport->SetIceTiebreaker(kTiebreaker2); | 1419 rport->SetIceTiebreaker(kTiebreaker2); |
| 1421 | 1420 |
| 1422 lport->PrepareAddress(); | 1421 lport->PrepareAddress(); |
| 1423 rport->PrepareAddress(); | 1422 rport->PrepareAddress(); |
| 1424 ASSERT_FALSE(lport->Candidates().empty()); | 1423 ASSERT_FALSE(lport->Candidates().empty()); |
| 1425 ASSERT_FALSE(rport->Candidates().empty()); | 1424 ASSERT_FALSE(rport->Candidates().empty()); |
| 1426 Connection* lconn = lport->CreateConnection(rport->Candidates()[0], | 1425 Connection* lconn = lport->CreateConnection(rport->Candidates()[0], |
| 1427 Port::ORIGIN_MESSAGE); | 1426 Port::ORIGIN_MESSAGE); |
| 1428 Connection* rconn = rport->CreateConnection(lport->Candidates()[0], | 1427 Connection* rconn = rport->CreateConnection(lport->Candidates()[0], |
| 1429 Port::ORIGIN_MESSAGE); | 1428 Port::ORIGIN_MESSAGE); |
| 1430 rconn->Ping(0); | 1429 rconn->Ping(0); |
| 1431 | 1430 |
| 1432 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, kDefaultTimeout); | 1431 ASSERT_TRUE_WAIT(rport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1433 IceMessage* msg = rport->last_stun_msg(); | 1432 IceMessage* msg = rport->last_stun_msg(); |
| 1434 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); | 1433 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); |
| 1435 // Send rport binding request to lport. | 1434 // Send rport binding request to lport. |
| 1436 lconn->OnReadPacket(rport->last_stun_buf()->data<char>(), | 1435 lconn->OnReadPacket(rport->last_stun_buf()->data<char>(), |
| 1437 rport->last_stun_buf()->size(), | 1436 rport->last_stun_buf()->size(), |
| 1438 rtc::PacketTime()); | 1437 rtc::PacketTime()); |
| 1439 | 1438 |
| 1440 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout); | 1439 ASSERT_TRUE_WAIT(lport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1441 EXPECT_EQ(STUN_BINDING_RESPONSE, lport->last_stun_msg()->type()); | 1440 EXPECT_EQ(STUN_BINDING_RESPONSE, lport->last_stun_msg()->type()); |
| 1442 EXPECT_TRUE(role_conflict()); | 1441 EXPECT_TRUE(role_conflict()); |
| 1443 } | 1442 } |
| 1444 | 1443 |
| 1445 TEST_F(PortTest, TestTcpNoDelay) { | 1444 TEST_F(PortTest, TestTcpNoDelay) { |
| 1446 TCPPort* port1 = CreateTcpPort(kLocalAddr1); | 1445 TCPPort* port1 = CreateTcpPort(kLocalAddr1); |
| 1447 port1->SetIceRole(cricket::ICEROLE_CONTROLLING); | 1446 port1->SetIceRole(cricket::ICEROLE_CONTROLLING); |
| 1448 int option_value = -1; | 1447 int option_value = -1; |
| 1449 int success = port1->GetOption(rtc::Socket::OPT_NODELAY, | 1448 int success = port1->GetOption(rtc::Socket::OPT_NODELAY, |
| 1450 &option_value); | 1449 &option_value); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1506 ports[i]->PrepareAddress(); | 1505 ports[i]->PrepareAddress(); |
| 1507 } | 1506 } |
| 1508 | 1507 |
| 1509 // IPv4 Port, connects to IPv6 candidate and then to IPv4 candidate. | 1508 // IPv4 Port, connects to IPv6 candidate and then to IPv4 candidate. |
| 1510 if (type == SOCK_STREAM) { | 1509 if (type == SOCK_STREAM) { |
| 1511 FakeAsyncPacketSocket* clientsocket = new FakeAsyncPacketSocket(); | 1510 FakeAsyncPacketSocket* clientsocket = new FakeAsyncPacketSocket(); |
| 1512 factory.set_next_client_tcp_socket(clientsocket); | 1511 factory.set_next_client_tcp_socket(clientsocket); |
| 1513 } | 1512 } |
| 1514 Connection* c = ports[0]->CreateConnection(GetCandidate(ports[2].get()), | 1513 Connection* c = ports[0]->CreateConnection(GetCandidate(ports[2].get()), |
| 1515 Port::ORIGIN_MESSAGE); | 1514 Port::ORIGIN_MESSAGE); |
| 1516 EXPECT_TRUE(NULL == c); | 1515 EXPECT_TRUE(nullptr == c); |
| 1517 EXPECT_EQ(0U, ports[0]->connections().size()); | 1516 EXPECT_EQ(0U, ports[0]->connections().size()); |
| 1518 c = ports[0]->CreateConnection(GetCandidate(ports[1].get()), | 1517 c = ports[0]->CreateConnection(GetCandidate(ports[1].get()), |
| 1519 Port::ORIGIN_MESSAGE); | 1518 Port::ORIGIN_MESSAGE); |
| 1520 EXPECT_FALSE(NULL == c); | 1519 EXPECT_FALSE(nullptr == c); |
| 1521 EXPECT_EQ(1U, ports[0]->connections().size()); | 1520 EXPECT_EQ(1U, ports[0]->connections().size()); |
| 1522 | 1521 |
| 1523 // IPv6 Port, connects to IPv4 candidate and to IPv6 candidate. | 1522 // IPv6 Port, connects to IPv4 candidate and to IPv6 candidate. |
| 1524 if (type == SOCK_STREAM) { | 1523 if (type == SOCK_STREAM) { |
| 1525 FakeAsyncPacketSocket* clientsocket = new FakeAsyncPacketSocket(); | 1524 FakeAsyncPacketSocket* clientsocket = new FakeAsyncPacketSocket(); |
| 1526 factory.set_next_client_tcp_socket(clientsocket); | 1525 factory.set_next_client_tcp_socket(clientsocket); |
| 1527 } | 1526 } |
| 1528 c = ports[2]->CreateConnection(GetCandidate(ports[0].get()), | 1527 c = ports[2]->CreateConnection(GetCandidate(ports[0].get()), |
| 1529 Port::ORIGIN_MESSAGE); | 1528 Port::ORIGIN_MESSAGE); |
| 1530 EXPECT_TRUE(NULL == c); | 1529 EXPECT_TRUE(nullptr == c); |
| 1531 EXPECT_EQ(0U, ports[2]->connections().size()); | 1530 EXPECT_EQ(0U, ports[2]->connections().size()); |
| 1532 c = ports[2]->CreateConnection(GetCandidate(ports[3].get()), | 1531 c = ports[2]->CreateConnection(GetCandidate(ports[3].get()), |
| 1533 Port::ORIGIN_MESSAGE); | 1532 Port::ORIGIN_MESSAGE); |
| 1534 EXPECT_FALSE(NULL == c); | 1533 EXPECT_FALSE(nullptr == c); |
| 1535 EXPECT_EQ(1U, ports[2]->connections().size()); | 1534 EXPECT_EQ(1U, ports[2]->connections().size()); |
| 1536 } | 1535 } |
| 1537 | 1536 |
| 1538 TEST_F(PortTest, TestSkipCrossFamilyTcp) { | 1537 TEST_F(PortTest, TestSkipCrossFamilyTcp) { |
| 1539 TestCrossFamilyPorts(SOCK_STREAM); | 1538 TestCrossFamilyPorts(SOCK_STREAM); |
| 1540 } | 1539 } |
| 1541 | 1540 |
| 1542 TEST_F(PortTest, TestSkipCrossFamilyUdp) { | 1541 TEST_F(PortTest, TestSkipCrossFamilyUdp) { |
| 1543 TestCrossFamilyPorts(SOCK_DGRAM); | 1542 TestCrossFamilyPorts(SOCK_DGRAM); |
| 1544 } | 1543 } |
| 1545 | 1544 |
| 1546 void PortTest::ExpectPortsCanConnect(bool can_connect, Port* p1, Port* p2) { | 1545 void PortTest::ExpectPortsCanConnect(bool can_connect, Port* p1, Port* p2) { |
| 1547 Connection* c = p1->CreateConnection(GetCandidate(p2), | 1546 Connection* c = p1->CreateConnection(GetCandidate(p2), |
| 1548 Port::ORIGIN_MESSAGE); | 1547 Port::ORIGIN_MESSAGE); |
| 1549 if (can_connect) { | 1548 if (can_connect) { |
| 1550 EXPECT_FALSE(NULL == c); | 1549 EXPECT_FALSE(nullptr == c); |
| 1551 EXPECT_EQ(1U, p1->connections().size()); | 1550 EXPECT_EQ(1U, p1->connections().size()); |
| 1552 } else { | 1551 } else { |
| 1553 EXPECT_TRUE(NULL == c); | 1552 EXPECT_TRUE(nullptr == c); |
| 1554 EXPECT_EQ(0U, p1->connections().size()); | 1553 EXPECT_EQ(0U, p1->connections().size()); |
| 1555 } | 1554 } |
| 1556 } | 1555 } |
| 1557 | 1556 |
| 1558 TEST_F(PortTest, TestUdpV6CrossTypePorts) { | 1557 TEST_F(PortTest, TestUdpV6CrossTypePorts) { |
| 1559 FakePacketSocketFactory factory; | 1558 FakePacketSocketFactory factory; |
| 1560 std::unique_ptr<Port> ports[4]; | 1559 std::unique_ptr<Port> ports[4]; |
| 1561 SocketAddress addresses[4] = {SocketAddress("2001:db8::1", 0), | 1560 SocketAddress addresses[4] = {SocketAddress("2001:db8::1", 0), |
| 1562 SocketAddress("fe80::1", 0), | 1561 SocketAddress("fe80::1", 0), |
| 1563 SocketAddress("fe80::2", 0), | 1562 SocketAddress("fe80::2", 0), |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1637 lport->PrepareAddress(); | 1636 lport->PrepareAddress(); |
| 1638 rport->PrepareAddress(); | 1637 rport->PrepareAddress(); |
| 1639 ASSERT_FALSE(rport->Candidates().empty()); | 1638 ASSERT_FALSE(rport->Candidates().empty()); |
| 1640 Connection* lconn = lport->CreateConnection( | 1639 Connection* lconn = lport->CreateConnection( |
| 1641 rport->Candidates()[0], Port::ORIGIN_MESSAGE); | 1640 rport->Candidates()[0], Port::ORIGIN_MESSAGE); |
| 1642 Connection* rconn = rport->CreateConnection( | 1641 Connection* rconn = rport->CreateConnection( |
| 1643 lport->Candidates()[0], Port::ORIGIN_MESSAGE); | 1642 lport->Candidates()[0], Port::ORIGIN_MESSAGE); |
| 1644 lconn->Ping(0); | 1643 lconn->Ping(0); |
| 1645 | 1644 |
| 1646 // Check that it's a proper BINDING-REQUEST. | 1645 // Check that it's a proper BINDING-REQUEST. |
| 1647 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout); | 1646 ASSERT_TRUE_WAIT(lport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1648 IceMessage* msg = lport->last_stun_msg(); | 1647 IceMessage* msg = lport->last_stun_msg(); |
| 1649 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); | 1648 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); |
| 1650 EXPECT_FALSE(msg->IsLegacy()); | 1649 EXPECT_FALSE(msg->IsLegacy()); |
| 1651 const StunByteStringAttribute* username_attr = | 1650 const StunByteStringAttribute* username_attr = |
| 1652 msg->GetByteString(STUN_ATTR_USERNAME); | 1651 msg->GetByteString(STUN_ATTR_USERNAME); |
| 1653 ASSERT_TRUE(username_attr != NULL); | 1652 ASSERT_TRUE(username_attr != nullptr); |
| 1654 const StunUInt32Attribute* priority_attr = msg->GetUInt32(STUN_ATTR_PRIORITY); | 1653 const StunUInt32Attribute* priority_attr = msg->GetUInt32(STUN_ATTR_PRIORITY); |
| 1655 ASSERT_TRUE(priority_attr != NULL); | 1654 ASSERT_TRUE(priority_attr != nullptr); |
| 1656 EXPECT_EQ(kDefaultPrflxPriority, priority_attr->value()); | 1655 EXPECT_EQ(kDefaultPrflxPriority, priority_attr->value()); |
| 1657 EXPECT_EQ("rfrag:lfrag", username_attr->GetString()); | 1656 EXPECT_EQ("rfrag:lfrag", username_attr->GetString()); |
| 1658 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL); | 1657 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != nullptr); |
| 1659 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( | 1658 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( |
| 1660 lport->last_stun_buf()->data<char>(), lport->last_stun_buf()->size(), | 1659 lport->last_stun_buf()->data<char>(), lport->last_stun_buf()->size(), |
| 1661 "rpass")); | 1660 "rpass")); |
| 1662 const StunUInt64Attribute* ice_controlling_attr = | 1661 const StunUInt64Attribute* ice_controlling_attr = |
| 1663 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING); | 1662 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING); |
| 1664 ASSERT_TRUE(ice_controlling_attr != NULL); | 1663 ASSERT_TRUE(ice_controlling_attr != nullptr); |
| 1665 EXPECT_EQ(lport->IceTiebreaker(), ice_controlling_attr->value()); | 1664 EXPECT_EQ(lport->IceTiebreaker(), ice_controlling_attr->value()); |
| 1666 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLED) == NULL); | 1665 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLED) == nullptr); |
| 1667 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) != NULL); | 1666 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) != nullptr); |
| 1668 EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != NULL); | 1667 EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != nullptr); |
| 1669 EXPECT_TRUE(StunMessage::ValidateFingerprint( | 1668 EXPECT_TRUE(StunMessage::ValidateFingerprint( |
| 1670 lport->last_stun_buf()->data<char>(), lport->last_stun_buf()->size())); | 1669 lport->last_stun_buf()->data<char>(), lport->last_stun_buf()->size())); |
| 1671 | 1670 |
| 1672 // Request should not include ping count. | 1671 // Request should not include ping count. |
| 1673 ASSERT_TRUE(msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT) == NULL); | 1672 ASSERT_TRUE(msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT) == nullptr); |
| 1674 | 1673 |
| 1675 // Save a copy of the BINDING-REQUEST for use below. | 1674 // Save a copy of the BINDING-REQUEST for use below. |
| 1676 std::unique_ptr<IceMessage> request(CopyStunMessage(msg)); | 1675 std::unique_ptr<IceMessage> request(CopyStunMessage(msg)); |
| 1677 | 1676 |
| 1678 // Receive the BINDING-REQUEST and respond with BINDING-RESPONSE. | 1677 // Receive the BINDING-REQUEST and respond with BINDING-RESPONSE. |
| 1679 rconn->OnReadPacket(lport->last_stun_buf()->data<char>(), | 1678 rconn->OnReadPacket(lport->last_stun_buf()->data<char>(), |
| 1680 lport->last_stun_buf()->size(), rtc::PacketTime()); | 1679 lport->last_stun_buf()->size(), rtc::PacketTime()); |
| 1681 msg = rport->last_stun_msg(); | 1680 msg = rport->last_stun_msg(); |
| 1682 ASSERT_TRUE(msg != NULL); | 1681 ASSERT_TRUE(msg != nullptr); |
| 1683 EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type()); | 1682 EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type()); |
| 1684 // Received a BINDING-RESPONSE. | 1683 // Received a BINDING-RESPONSE. |
| 1685 lconn->OnReadPacket(rport->last_stun_buf()->data<char>(), | 1684 lconn->OnReadPacket(rport->last_stun_buf()->data<char>(), |
| 1686 rport->last_stun_buf()->size(), rtc::PacketTime()); | 1685 rport->last_stun_buf()->size(), rtc::PacketTime()); |
| 1687 // Verify the STUN Stats. | 1686 // Verify the STUN Stats. |
| 1688 EXPECT_EQ(1U, lconn->stats().sent_ping_requests_total); | 1687 EXPECT_EQ(1U, lconn->stats().sent_ping_requests_total); |
| 1689 EXPECT_EQ(1U, lconn->stats().sent_ping_requests_before_first_response); | 1688 EXPECT_EQ(1U, lconn->stats().sent_ping_requests_before_first_response); |
| 1690 EXPECT_EQ(1U, lconn->stats().recv_ping_responses); | 1689 EXPECT_EQ(1U, lconn->stats().recv_ping_responses); |
| 1691 EXPECT_EQ(1U, rconn->stats().recv_ping_requests); | 1690 EXPECT_EQ(1U, rconn->stats().recv_ping_requests); |
| 1692 EXPECT_EQ(1U, rconn->stats().sent_ping_responses); | 1691 EXPECT_EQ(1U, rconn->stats().sent_ping_responses); |
| 1693 | 1692 |
| 1694 EXPECT_FALSE(msg->IsLegacy()); | 1693 EXPECT_FALSE(msg->IsLegacy()); |
| 1695 const StunAddressAttribute* addr_attr = msg->GetAddress( | 1694 const StunAddressAttribute* addr_attr = msg->GetAddress( |
| 1696 STUN_ATTR_XOR_MAPPED_ADDRESS); | 1695 STUN_ATTR_XOR_MAPPED_ADDRESS); |
| 1697 ASSERT_TRUE(addr_attr != NULL); | 1696 ASSERT_TRUE(addr_attr != nullptr); |
| 1698 EXPECT_EQ(lport->Candidates()[0].address(), addr_attr->GetAddress()); | 1697 EXPECT_EQ(lport->Candidates()[0].address(), addr_attr->GetAddress()); |
| 1699 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL); | 1698 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != nullptr); |
| 1700 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( | 1699 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( |
| 1701 rport->last_stun_buf()->data<char>(), rport->last_stun_buf()->size(), | 1700 rport->last_stun_buf()->data<char>(), rport->last_stun_buf()->size(), |
| 1702 "rpass")); | 1701 "rpass")); |
| 1703 EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != NULL); | 1702 EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != nullptr); |
| 1704 EXPECT_TRUE(StunMessage::ValidateFingerprint( | 1703 EXPECT_TRUE(StunMessage::ValidateFingerprint( |
| 1705 lport->last_stun_buf()->data<char>(), lport->last_stun_buf()->size())); | 1704 lport->last_stun_buf()->data<char>(), lport->last_stun_buf()->size())); |
| 1706 // No USERNAME or PRIORITY in ICE responses. | 1705 // No USERNAME or PRIORITY in ICE responses. |
| 1707 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USERNAME) == NULL); | 1706 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USERNAME) == nullptr); |
| 1708 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL); | 1707 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == nullptr); |
| 1709 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MAPPED_ADDRESS) == NULL); | 1708 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MAPPED_ADDRESS) == nullptr); |
| 1710 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLING) == NULL); | 1709 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLING) == nullptr); |
| 1711 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLED) == NULL); | 1710 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLED) == nullptr); |
| 1712 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == NULL); | 1711 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == nullptr); |
| 1713 | 1712 |
| 1714 // Response should not include ping count. | 1713 // Response should not include ping count. |
| 1715 ASSERT_TRUE(msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT) == NULL); | 1714 ASSERT_TRUE(msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT) == nullptr); |
| 1716 | 1715 |
| 1717 // Respond with a BINDING-ERROR-RESPONSE. This wouldn't happen in real life, | 1716 // Respond with a BINDING-ERROR-RESPONSE. This wouldn't happen in real life, |
| 1718 // but we can do it here. | 1717 // but we can do it here. |
| 1719 rport->SendBindingErrorResponse(request.get(), | 1718 rport->SendBindingErrorResponse(request.get(), |
| 1720 lport->Candidates()[0].address(), | 1719 lport->Candidates()[0].address(), |
| 1721 STUN_ERROR_SERVER_ERROR, | 1720 STUN_ERROR_SERVER_ERROR, |
| 1722 STUN_ERROR_REASON_SERVER_ERROR); | 1721 STUN_ERROR_REASON_SERVER_ERROR); |
| 1723 msg = rport->last_stun_msg(); | 1722 msg = rport->last_stun_msg(); |
| 1724 ASSERT_TRUE(msg != NULL); | 1723 ASSERT_TRUE(msg != nullptr); |
| 1725 EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type()); | 1724 EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type()); |
| 1726 EXPECT_FALSE(msg->IsLegacy()); | 1725 EXPECT_FALSE(msg->IsLegacy()); |
| 1727 const StunErrorCodeAttribute* error_attr = msg->GetErrorCode(); | 1726 const StunErrorCodeAttribute* error_attr = msg->GetErrorCode(); |
| 1728 ASSERT_TRUE(error_attr != NULL); | 1727 ASSERT_TRUE(error_attr != nullptr); |
| 1729 EXPECT_EQ(STUN_ERROR_SERVER_ERROR, error_attr->code()); | 1728 EXPECT_EQ(STUN_ERROR_SERVER_ERROR, error_attr->code()); |
| 1730 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), error_attr->reason()); | 1729 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), error_attr->reason()); |
| 1731 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL); | 1730 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != nullptr); |
| 1732 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( | 1731 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( |
| 1733 rport->last_stun_buf()->data<char>(), rport->last_stun_buf()->size(), | 1732 rport->last_stun_buf()->data<char>(), rport->last_stun_buf()->size(), |
| 1734 "rpass")); | 1733 "rpass")); |
| 1735 EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != NULL); | 1734 EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != nullptr); |
| 1736 EXPECT_TRUE(StunMessage::ValidateFingerprint( | 1735 EXPECT_TRUE(StunMessage::ValidateFingerprint( |
| 1737 lport->last_stun_buf()->data<char>(), lport->last_stun_buf()->size())); | 1736 lport->last_stun_buf()->data<char>(), lport->last_stun_buf()->size())); |
| 1738 // No USERNAME with ICE. | 1737 // No USERNAME with ICE. |
| 1739 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USERNAME) == NULL); | 1738 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USERNAME) == nullptr); |
| 1740 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL); | 1739 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == nullptr); |
| 1741 | 1740 |
| 1742 // Testing STUN binding requests from rport --> lport, having ICE_CONTROLLED | 1741 // Testing STUN binding requests from rport --> lport, having ICE_CONTROLLED |
| 1743 // and (incremented) RETRANSMIT_COUNT attributes. | 1742 // and (incremented) RETRANSMIT_COUNT attributes. |
| 1744 rport->Reset(); | 1743 rport->Reset(); |
| 1745 rport->set_send_retransmit_count_attribute(true); | 1744 rport->set_send_retransmit_count_attribute(true); |
| 1746 rconn->Ping(0); | 1745 rconn->Ping(0); |
| 1747 rconn->Ping(0); | 1746 rconn->Ping(0); |
| 1748 rconn->Ping(0); | 1747 rconn->Ping(0); |
| 1749 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, kDefaultTimeout); | 1748 ASSERT_TRUE_WAIT(rport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1750 msg = rport->last_stun_msg(); | 1749 msg = rport->last_stun_msg(); |
| 1751 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); | 1750 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); |
| 1752 const StunUInt64Attribute* ice_controlled_attr = | 1751 const StunUInt64Attribute* ice_controlled_attr = |
| 1753 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLED); | 1752 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLED); |
| 1754 ASSERT_TRUE(ice_controlled_attr != NULL); | 1753 ASSERT_TRUE(ice_controlled_attr != nullptr); |
| 1755 EXPECT_EQ(rport->IceTiebreaker(), ice_controlled_attr->value()); | 1754 EXPECT_EQ(rport->IceTiebreaker(), ice_controlled_attr->value()); |
| 1756 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == NULL); | 1755 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == nullptr); |
| 1757 | 1756 |
| 1758 // Request should include ping count. | 1757 // Request should include ping count. |
| 1759 const StunUInt32Attribute* retransmit_attr = | 1758 const StunUInt32Attribute* retransmit_attr = |
| 1760 msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT); | 1759 msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT); |
| 1761 ASSERT_TRUE(retransmit_attr != NULL); | 1760 ASSERT_TRUE(retransmit_attr != nullptr); |
| 1762 EXPECT_EQ(2U, retransmit_attr->value()); | 1761 EXPECT_EQ(2U, retransmit_attr->value()); |
| 1763 | 1762 |
| 1764 // Respond with a BINDING-RESPONSE. | 1763 // Respond with a BINDING-RESPONSE. |
| 1765 request.reset(CopyStunMessage(msg)); | 1764 request.reset(CopyStunMessage(msg)); |
| 1766 lconn->OnReadPacket(rport->last_stun_buf()->data<char>(), | 1765 lconn->OnReadPacket(rport->last_stun_buf()->data<char>(), |
| 1767 rport->last_stun_buf()->size(), rtc::PacketTime()); | 1766 rport->last_stun_buf()->size(), rtc::PacketTime()); |
| 1768 msg = lport->last_stun_msg(); | 1767 msg = lport->last_stun_msg(); |
| 1769 // Receive the BINDING-RESPONSE. | 1768 // Receive the BINDING-RESPONSE. |
| 1770 rconn->OnReadPacket(lport->last_stun_buf()->data<char>(), | 1769 rconn->OnReadPacket(lport->last_stun_buf()->data<char>(), |
| 1771 lport->last_stun_buf()->size(), rtc::PacketTime()); | 1770 lport->last_stun_buf()->size(), rtc::PacketTime()); |
| 1772 | 1771 |
| 1773 // Verify the Stun ping stats. | 1772 // Verify the Stun ping stats. |
| 1774 EXPECT_EQ(3U, rconn->stats().sent_ping_requests_total); | 1773 EXPECT_EQ(3U, rconn->stats().sent_ping_requests_total); |
| 1775 EXPECT_EQ(3U, rconn->stats().sent_ping_requests_before_first_response); | 1774 EXPECT_EQ(3U, rconn->stats().sent_ping_requests_before_first_response); |
| 1776 EXPECT_EQ(1U, rconn->stats().recv_ping_responses); | 1775 EXPECT_EQ(1U, rconn->stats().recv_ping_responses); |
| 1777 EXPECT_EQ(1U, lconn->stats().sent_ping_responses); | 1776 EXPECT_EQ(1U, lconn->stats().sent_ping_responses); |
| 1778 EXPECT_EQ(1U, lconn->stats().recv_ping_requests); | 1777 EXPECT_EQ(1U, lconn->stats().recv_ping_requests); |
| 1779 // Ping after receiver the first response | 1778 // Ping after receiver the first response |
| 1780 rconn->Ping(0); | 1779 rconn->Ping(0); |
| 1781 rconn->Ping(0); | 1780 rconn->Ping(0); |
| 1782 EXPECT_EQ(5U, rconn->stats().sent_ping_requests_total); | 1781 EXPECT_EQ(5U, rconn->stats().sent_ping_requests_total); |
| 1783 EXPECT_EQ(3U, rconn->stats().sent_ping_requests_before_first_response); | 1782 EXPECT_EQ(3U, rconn->stats().sent_ping_requests_before_first_response); |
| 1784 | 1783 |
| 1785 // Response should include same ping count. | 1784 // Response should include same ping count. |
| 1786 retransmit_attr = msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT); | 1785 retransmit_attr = msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT); |
| 1787 ASSERT_TRUE(retransmit_attr != NULL); | 1786 ASSERT_TRUE(retransmit_attr != nullptr); |
| 1788 EXPECT_EQ(2U, retransmit_attr->value()); | 1787 EXPECT_EQ(2U, retransmit_attr->value()); |
| 1789 } | 1788 } |
| 1790 | 1789 |
| 1791 TEST_F(PortTest, TestUseCandidateAttribute) { | 1790 TEST_F(PortTest, TestUseCandidateAttribute) { |
| 1792 std::unique_ptr<TestPort> lport( | 1791 std::unique_ptr<TestPort> lport( |
| 1793 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); | 1792 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); |
| 1794 std::unique_ptr<TestPort> rport( | 1793 std::unique_ptr<TestPort> rport( |
| 1795 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); | 1794 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); |
| 1796 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); | 1795 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); |
| 1797 lport->SetIceTiebreaker(kTiebreaker1); | 1796 lport->SetIceTiebreaker(kTiebreaker1); |
| 1798 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); | 1797 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); |
| 1799 rport->SetIceTiebreaker(kTiebreaker2); | 1798 rport->SetIceTiebreaker(kTiebreaker2); |
| 1800 | 1799 |
| 1801 // Send a fake ping from lport to rport. | 1800 // Send a fake ping from lport to rport. |
| 1802 lport->PrepareAddress(); | 1801 lport->PrepareAddress(); |
| 1803 rport->PrepareAddress(); | 1802 rport->PrepareAddress(); |
| 1804 ASSERT_FALSE(rport->Candidates().empty()); | 1803 ASSERT_FALSE(rport->Candidates().empty()); |
| 1805 Connection* lconn = lport->CreateConnection( | 1804 Connection* lconn = lport->CreateConnection( |
| 1806 rport->Candidates()[0], Port::ORIGIN_MESSAGE); | 1805 rport->Candidates()[0], Port::ORIGIN_MESSAGE); |
| 1807 lconn->Ping(0); | 1806 lconn->Ping(0); |
| 1808 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout); | 1807 ASSERT_TRUE_WAIT(lport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1809 IceMessage* msg = lport->last_stun_msg(); | 1808 IceMessage* msg = lport->last_stun_msg(); |
| 1810 const StunUInt64Attribute* ice_controlling_attr = | 1809 const StunUInt64Attribute* ice_controlling_attr = |
| 1811 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING); | 1810 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING); |
| 1812 ASSERT_TRUE(ice_controlling_attr != NULL); | 1811 ASSERT_TRUE(ice_controlling_attr != nullptr); |
| 1813 const StunByteStringAttribute* use_candidate_attr = msg->GetByteString( | 1812 const StunByteStringAttribute* use_candidate_attr = msg->GetByteString( |
| 1814 STUN_ATTR_USE_CANDIDATE); | 1813 STUN_ATTR_USE_CANDIDATE); |
| 1815 ASSERT_TRUE(use_candidate_attr != NULL); | 1814 ASSERT_TRUE(use_candidate_attr != nullptr); |
| 1816 } | 1815 } |
| 1817 | 1816 |
| 1818 // Tests that when the network type changes, the network cost of the port will | 1817 // Tests that when the network type changes, the network cost of the port will |
| 1819 // change, the network cost of the local candidates will change. Also tests that | 1818 // change, the network cost of the local candidates will change. Also tests that |
| 1820 // the remote network costs are updated with the stun binding requests. | 1819 // the remote network costs are updated with the stun binding requests. |
| 1821 TEST_F(PortTest, TestNetworkCostChange) { | 1820 TEST_F(PortTest, TestNetworkCostChange) { |
| 1822 std::unique_ptr<TestPort> lport( | 1821 std::unique_ptr<TestPort> lport( |
| 1823 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); | 1822 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); |
| 1824 std::unique_ptr<TestPort> rport( | 1823 std::unique_ptr<TestPort> rport( |
| 1825 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); | 1824 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1857 SetNetworkType(rtc::ADAPTER_TYPE_WIFI); | 1856 SetNetworkType(rtc::ADAPTER_TYPE_WIFI); |
| 1858 Connection* rconn = | 1857 Connection* rconn = |
| 1859 rport->CreateConnection(lport->Candidates()[0], Port::ORIGIN_MESSAGE); | 1858 rport->CreateConnection(lport->Candidates()[0], Port::ORIGIN_MESSAGE); |
| 1860 SetNetworkType(rtc::ADAPTER_TYPE_CELLULAR); | 1859 SetNetworkType(rtc::ADAPTER_TYPE_CELLULAR); |
| 1861 lconn->Ping(0); | 1860 lconn->Ping(0); |
| 1862 // The rconn's remote candidate cost is rtc::kNetworkCostLow, but the ping | 1861 // The rconn's remote candidate cost is rtc::kNetworkCostLow, but the ping |
| 1863 // contains an attribute of network cost of rtc::kNetworkCostHigh. Once the | 1862 // contains an attribute of network cost of rtc::kNetworkCostHigh. Once the |
| 1864 // message is handled in rconn, The rconn's remote candidate will have cost | 1863 // message is handled in rconn, The rconn's remote candidate will have cost |
| 1865 // rtc::kNetworkCostHigh; | 1864 // rtc::kNetworkCostHigh; |
| 1866 EXPECT_EQ(rtc::kNetworkCostLow, rconn->remote_candidate().network_cost()); | 1865 EXPECT_EQ(rtc::kNetworkCostLow, rconn->remote_candidate().network_cost()); |
| 1867 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout); | 1866 ASSERT_TRUE_WAIT(lport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1868 IceMessage* msg = lport->last_stun_msg(); | 1867 IceMessage* msg = lport->last_stun_msg(); |
| 1869 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); | 1868 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); |
| 1870 // Pass the binding request to rport. | 1869 // Pass the binding request to rport. |
| 1871 rconn->OnReadPacket(lport->last_stun_buf()->data<char>(), | 1870 rconn->OnReadPacket(lport->last_stun_buf()->data<char>(), |
| 1872 lport->last_stun_buf()->size(), rtc::PacketTime()); | 1871 lport->last_stun_buf()->size(), rtc::PacketTime()); |
| 1873 // Wait until rport sends the response and then check the remote network cost. | 1872 // Wait until rport sends the response and then check the remote network cost. |
| 1874 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, kDefaultTimeout); | 1873 ASSERT_TRUE_WAIT(rport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1875 EXPECT_EQ(rtc::kNetworkCostHigh, rconn->remote_candidate().network_cost()); | 1874 EXPECT_EQ(rtc::kNetworkCostHigh, rconn->remote_candidate().network_cost()); |
| 1876 } | 1875 } |
| 1877 | 1876 |
| 1878 TEST_F(PortTest, TestNetworkInfoAttribute) { | 1877 TEST_F(PortTest, TestNetworkInfoAttribute) { |
| 1879 std::unique_ptr<TestPort> lport( | 1878 std::unique_ptr<TestPort> lport( |
| 1880 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); | 1879 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); |
| 1881 std::unique_ptr<TestPort> rport( | 1880 std::unique_ptr<TestPort> rport( |
| 1882 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); | 1881 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); |
| 1883 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); | 1882 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); |
| 1884 lport->SetIceTiebreaker(kTiebreaker1); | 1883 lport->SetIceTiebreaker(kTiebreaker1); |
| 1885 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); | 1884 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); |
| 1886 rport->SetIceTiebreaker(kTiebreaker2); | 1885 rport->SetIceTiebreaker(kTiebreaker2); |
| 1887 | 1886 |
| 1888 uint16_t lnetwork_id = 9; | 1887 uint16_t lnetwork_id = 9; |
| 1889 lport->Network()->set_id(lnetwork_id); | 1888 lport->Network()->set_id(lnetwork_id); |
| 1890 // Send a fake ping from lport to rport. | 1889 // Send a fake ping from lport to rport. |
| 1891 lport->PrepareAddress(); | 1890 lport->PrepareAddress(); |
| 1892 rport->PrepareAddress(); | 1891 rport->PrepareAddress(); |
| 1893 Connection* lconn = | 1892 Connection* lconn = |
| 1894 lport->CreateConnection(rport->Candidates()[0], Port::ORIGIN_MESSAGE); | 1893 lport->CreateConnection(rport->Candidates()[0], Port::ORIGIN_MESSAGE); |
| 1895 lconn->Ping(0); | 1894 lconn->Ping(0); |
| 1896 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout); | 1895 ASSERT_TRUE_WAIT(lport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1897 IceMessage* msg = lport->last_stun_msg(); | 1896 IceMessage* msg = lport->last_stun_msg(); |
| 1898 const StunUInt32Attribute* network_info_attr = | 1897 const StunUInt32Attribute* network_info_attr = |
| 1899 msg->GetUInt32(STUN_ATTR_NETWORK_INFO); | 1898 msg->GetUInt32(STUN_ATTR_NETWORK_INFO); |
| 1900 ASSERT_TRUE(network_info_attr != NULL); | 1899 ASSERT_TRUE(network_info_attr != nullptr); |
| 1901 uint32_t network_info = network_info_attr->value(); | 1900 uint32_t network_info = network_info_attr->value(); |
| 1902 EXPECT_EQ(lnetwork_id, network_info >> 16); | 1901 EXPECT_EQ(lnetwork_id, network_info >> 16); |
| 1903 // Default network has unknown type and cost kNetworkCostUnknown. | 1902 // Default network has unknown type and cost kNetworkCostUnknown. |
| 1904 EXPECT_EQ(rtc::kNetworkCostUnknown, network_info & 0xFFFF); | 1903 EXPECT_EQ(rtc::kNetworkCostUnknown, network_info & 0xFFFF); |
| 1905 | 1904 |
| 1906 // Set the network type to be cellular so its cost will be kNetworkCostHigh. | 1905 // Set the network type to be cellular so its cost will be kNetworkCostHigh. |
| 1907 // Send a fake ping from rport to lport. | 1906 // Send a fake ping from rport to lport. |
| 1908 SetNetworkType(rtc::ADAPTER_TYPE_CELLULAR); | 1907 SetNetworkType(rtc::ADAPTER_TYPE_CELLULAR); |
| 1909 uint16_t rnetwork_id = 8; | 1908 uint16_t rnetwork_id = 8; |
| 1910 rport->Network()->set_id(rnetwork_id); | 1909 rport->Network()->set_id(rnetwork_id); |
| 1911 Connection* rconn = | 1910 Connection* rconn = |
| 1912 rport->CreateConnection(lport->Candidates()[0], Port::ORIGIN_MESSAGE); | 1911 rport->CreateConnection(lport->Candidates()[0], Port::ORIGIN_MESSAGE); |
| 1913 rconn->Ping(0); | 1912 rconn->Ping(0); |
| 1914 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, kDefaultTimeout); | 1913 ASSERT_TRUE_WAIT(rport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 1915 msg = rport->last_stun_msg(); | 1914 msg = rport->last_stun_msg(); |
| 1916 network_info_attr = msg->GetUInt32(STUN_ATTR_NETWORK_INFO); | 1915 network_info_attr = msg->GetUInt32(STUN_ATTR_NETWORK_INFO); |
| 1917 ASSERT_TRUE(network_info_attr != NULL); | 1916 ASSERT_TRUE(network_info_attr != nullptr); |
| 1918 network_info = network_info_attr->value(); | 1917 network_info = network_info_attr->value(); |
| 1919 EXPECT_EQ(rnetwork_id, network_info >> 16); | 1918 EXPECT_EQ(rnetwork_id, network_info >> 16); |
| 1920 EXPECT_EQ(rtc::kNetworkCostHigh, network_info & 0xFFFF); | 1919 EXPECT_EQ(rtc::kNetworkCostHigh, network_info & 0xFFFF); |
| 1921 } | 1920 } |
| 1922 | 1921 |
| 1923 // Test handling STUN messages. | 1922 // Test handling STUN messages. |
| 1924 TEST_F(PortTest, TestHandleStunMessage) { | 1923 TEST_F(PortTest, TestHandleStunMessage) { |
| 1925 // Our port will act as the "remote" port. | 1924 // Our port will act as the "remote" port. |
| 1926 std::unique_ptr<TestPort> port(CreateTestPort(kLocalAddr2, "rfrag", "rpass")); | 1925 std::unique_ptr<TestPort> port(CreateTestPort(kLocalAddr2, "rfrag", "rpass")); |
| 1927 | 1926 |
| 1928 std::unique_ptr<IceMessage> in_msg, out_msg; | 1927 std::unique_ptr<IceMessage> in_msg, out_msg; |
| 1929 std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter()); | 1928 std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter()); |
| 1930 rtc::SocketAddress addr(kLocalAddr1); | 1929 rtc::SocketAddress addr(kLocalAddr1); |
| 1931 std::string username; | 1930 std::string username; |
| 1932 | 1931 |
| 1933 // BINDING-REQUEST from local to remote with valid ICE username, | 1932 // BINDING-REQUEST from local to remote with valid ICE username, |
| 1934 // MESSAGE-INTEGRITY, and FINGERPRINT. | 1933 // MESSAGE-INTEGRITY, and FINGERPRINT. |
| 1935 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, | 1934 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, |
| 1936 "rfrag:lfrag")); | 1935 "rfrag:lfrag")); |
| 1937 in_msg->AddMessageIntegrity("rpass"); | 1936 in_msg->AddMessageIntegrity("rpass"); |
| 1938 in_msg->AddFingerprint(); | 1937 in_msg->AddFingerprint(); |
| 1939 WriteStunMessage(in_msg.get(), buf.get()); | 1938 WriteStunMessage(in_msg.get(), buf.get()); |
| 1940 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, | 1939 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
| 1941 &username)); | 1940 &username)); |
| 1942 EXPECT_TRUE(out_msg.get() != NULL); | 1941 EXPECT_TRUE(out_msg.get() != nullptr); |
| 1943 EXPECT_EQ("lfrag", username); | 1942 EXPECT_EQ("lfrag", username); |
| 1944 | 1943 |
| 1945 // BINDING-RESPONSE without username, with MESSAGE-INTEGRITY and FINGERPRINT. | 1944 // BINDING-RESPONSE without username, with MESSAGE-INTEGRITY and FINGERPRINT. |
| 1946 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE)); | 1945 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE)); |
| 1947 in_msg->AddAttribute( | 1946 in_msg->AddAttribute( |
| 1948 new StunXorAddressAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2)); | 1947 new StunXorAddressAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2)); |
| 1949 in_msg->AddMessageIntegrity("rpass"); | 1948 in_msg->AddMessageIntegrity("rpass"); |
| 1950 in_msg->AddFingerprint(); | 1949 in_msg->AddFingerprint(); |
| 1951 WriteStunMessage(in_msg.get(), buf.get()); | 1950 WriteStunMessage(in_msg.get(), buf.get()); |
| 1952 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, | 1951 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
| 1953 &username)); | 1952 &username)); |
| 1954 EXPECT_TRUE(out_msg.get() != NULL); | 1953 EXPECT_TRUE(out_msg.get() != nullptr); |
| 1955 EXPECT_EQ("", username); | 1954 EXPECT_EQ("", username); |
| 1956 | 1955 |
| 1957 // BINDING-ERROR-RESPONSE without username, with error, M-I, and FINGERPRINT. | 1956 // BINDING-ERROR-RESPONSE without username, with error, M-I, and FINGERPRINT. |
| 1958 in_msg.reset(CreateStunMessage(STUN_BINDING_ERROR_RESPONSE)); | 1957 in_msg.reset(CreateStunMessage(STUN_BINDING_ERROR_RESPONSE)); |
| 1959 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE, | 1958 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE, |
| 1960 STUN_ERROR_SERVER_ERROR, STUN_ERROR_REASON_SERVER_ERROR)); | 1959 STUN_ERROR_SERVER_ERROR, STUN_ERROR_REASON_SERVER_ERROR)); |
| 1961 in_msg->AddFingerprint(); | 1960 in_msg->AddFingerprint(); |
| 1962 WriteStunMessage(in_msg.get(), buf.get()); | 1961 WriteStunMessage(in_msg.get(), buf.get()); |
| 1963 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, | 1962 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
| 1964 &username)); | 1963 &username)); |
| 1965 EXPECT_TRUE(out_msg.get() != NULL); | 1964 EXPECT_TRUE(out_msg.get() != nullptr); |
| 1966 EXPECT_EQ("", username); | 1965 EXPECT_EQ("", username); |
| 1967 ASSERT_TRUE(out_msg->GetErrorCode() != NULL); | 1966 ASSERT_TRUE(out_msg->GetErrorCode() != nullptr); |
| 1968 EXPECT_EQ(STUN_ERROR_SERVER_ERROR, out_msg->GetErrorCode()->code()); | 1967 EXPECT_EQ(STUN_ERROR_SERVER_ERROR, out_msg->GetErrorCode()->code()); |
| 1969 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), | 1968 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), |
| 1970 out_msg->GetErrorCode()->reason()); | 1969 out_msg->GetErrorCode()->reason()); |
| 1971 } | 1970 } |
| 1972 | 1971 |
| 1973 // Tests handling of ICE binding requests with missing or incorrect usernames. | 1972 // Tests handling of ICE binding requests with missing or incorrect usernames. |
| 1974 TEST_F(PortTest, TestHandleStunMessageBadUsername) { | 1973 TEST_F(PortTest, TestHandleStunMessageBadUsername) { |
| 1975 std::unique_ptr<TestPort> port(CreateTestPort(kLocalAddr2, "rfrag", "rpass")); | 1974 std::unique_ptr<TestPort> port(CreateTestPort(kLocalAddr2, "rfrag", "rpass")); |
| 1976 | 1975 |
| 1977 std::unique_ptr<IceMessage> in_msg, out_msg; | 1976 std::unique_ptr<IceMessage> in_msg, out_msg; |
| 1978 std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter()); | 1977 std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter()); |
| 1979 rtc::SocketAddress addr(kLocalAddr1); | 1978 rtc::SocketAddress addr(kLocalAddr1); |
| 1980 std::string username; | 1979 std::string username; |
| 1981 | 1980 |
| 1982 // BINDING-REQUEST with no username. | 1981 // BINDING-REQUEST with no username. |
| 1983 in_msg.reset(CreateStunMessage(STUN_BINDING_REQUEST)); | 1982 in_msg.reset(CreateStunMessage(STUN_BINDING_REQUEST)); |
| 1984 in_msg->AddMessageIntegrity("rpass"); | 1983 in_msg->AddMessageIntegrity("rpass"); |
| 1985 in_msg->AddFingerprint(); | 1984 in_msg->AddFingerprint(); |
| 1986 WriteStunMessage(in_msg.get(), buf.get()); | 1985 WriteStunMessage(in_msg.get(), buf.get()); |
| 1987 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, | 1986 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
| 1988 &username)); | 1987 &username)); |
| 1989 EXPECT_TRUE(out_msg.get() == NULL); | 1988 EXPECT_TRUE(out_msg.get() == nullptr); |
| 1990 EXPECT_EQ("", username); | 1989 EXPECT_EQ("", username); |
| 1991 EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code()); | 1990 EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code()); |
| 1992 | 1991 |
| 1993 // BINDING-REQUEST with empty username. | 1992 // BINDING-REQUEST with empty username. |
| 1994 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "")); | 1993 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "")); |
| 1995 in_msg->AddMessageIntegrity("rpass"); | 1994 in_msg->AddMessageIntegrity("rpass"); |
| 1996 in_msg->AddFingerprint(); | 1995 in_msg->AddFingerprint(); |
| 1997 WriteStunMessage(in_msg.get(), buf.get()); | 1996 WriteStunMessage(in_msg.get(), buf.get()); |
| 1998 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, | 1997 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
| 1999 &username)); | 1998 &username)); |
| 2000 EXPECT_TRUE(out_msg.get() == NULL); | 1999 EXPECT_TRUE(out_msg.get() == nullptr); |
| 2001 EXPECT_EQ("", username); | 2000 EXPECT_EQ("", username); |
| 2002 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); | 2001 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); |
| 2003 | 2002 |
| 2004 // BINDING-REQUEST with too-short username. | 2003 // BINDING-REQUEST with too-short username. |
| 2005 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "rfra")); | 2004 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "rfra")); |
| 2006 in_msg->AddMessageIntegrity("rpass"); | 2005 in_msg->AddMessageIntegrity("rpass"); |
| 2007 in_msg->AddFingerprint(); | 2006 in_msg->AddFingerprint(); |
| 2008 WriteStunMessage(in_msg.get(), buf.get()); | 2007 WriteStunMessage(in_msg.get(), buf.get()); |
| 2009 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, | 2008 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
| 2010 &username)); | 2009 &username)); |
| 2011 EXPECT_TRUE(out_msg.get() == NULL); | 2010 EXPECT_TRUE(out_msg.get() == nullptr); |
| 2012 EXPECT_EQ("", username); | 2011 EXPECT_EQ("", username); |
| 2013 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); | 2012 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); |
| 2014 | 2013 |
| 2015 // BINDING-REQUEST with reversed username. | 2014 // BINDING-REQUEST with reversed username. |
| 2016 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, | 2015 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, |
| 2017 "lfrag:rfrag")); | 2016 "lfrag:rfrag")); |
| 2018 in_msg->AddMessageIntegrity("rpass"); | 2017 in_msg->AddMessageIntegrity("rpass"); |
| 2019 in_msg->AddFingerprint(); | 2018 in_msg->AddFingerprint(); |
| 2020 WriteStunMessage(in_msg.get(), buf.get()); | 2019 WriteStunMessage(in_msg.get(), buf.get()); |
| 2021 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, | 2020 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
| 2022 &username)); | 2021 &username)); |
| 2023 EXPECT_TRUE(out_msg.get() == NULL); | 2022 EXPECT_TRUE(out_msg.get() == nullptr); |
| 2024 EXPECT_EQ("", username); | 2023 EXPECT_EQ("", username); |
| 2025 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); | 2024 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); |
| 2026 | 2025 |
| 2027 // BINDING-REQUEST with garbage username. | 2026 // BINDING-REQUEST with garbage username. |
| 2028 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, | 2027 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, |
| 2029 "abcd:efgh")); | 2028 "abcd:efgh")); |
| 2030 in_msg->AddMessageIntegrity("rpass"); | 2029 in_msg->AddMessageIntegrity("rpass"); |
| 2031 in_msg->AddFingerprint(); | 2030 in_msg->AddFingerprint(); |
| 2032 WriteStunMessage(in_msg.get(), buf.get()); | 2031 WriteStunMessage(in_msg.get(), buf.get()); |
| 2033 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, | 2032 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
| 2034 &username)); | 2033 &username)); |
| 2035 EXPECT_TRUE(out_msg.get() == NULL); | 2034 EXPECT_TRUE(out_msg.get() == nullptr); |
| 2036 EXPECT_EQ("", username); | 2035 EXPECT_EQ("", username); |
| 2037 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); | 2036 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); |
| 2038 } | 2037 } |
| 2039 | 2038 |
| 2040 // Test handling STUN messages with missing or malformed M-I. | 2039 // Test handling STUN messages with missing or malformed M-I. |
| 2041 TEST_F(PortTest, TestHandleStunMessageBadMessageIntegrity) { | 2040 TEST_F(PortTest, TestHandleStunMessageBadMessageIntegrity) { |
| 2042 // Our port will act as the "remote" port. | 2041 // Our port will act as the "remote" port. |
| 2043 std::unique_ptr<TestPort> port(CreateTestPort(kLocalAddr2, "rfrag", "rpass")); | 2042 std::unique_ptr<TestPort> port(CreateTestPort(kLocalAddr2, "rfrag", "rpass")); |
| 2044 | 2043 |
| 2045 std::unique_ptr<IceMessage> in_msg, out_msg; | 2044 std::unique_ptr<IceMessage> in_msg, out_msg; |
| 2046 std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter()); | 2045 std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter()); |
| 2047 rtc::SocketAddress addr(kLocalAddr1); | 2046 rtc::SocketAddress addr(kLocalAddr1); |
| 2048 std::string username; | 2047 std::string username; |
| 2049 | 2048 |
| 2050 // BINDING-REQUEST from local to remote with valid ICE username and | 2049 // BINDING-REQUEST from local to remote with valid ICE username and |
| 2051 // FINGERPRINT, but no MESSAGE-INTEGRITY. | 2050 // FINGERPRINT, but no MESSAGE-INTEGRITY. |
| 2052 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, | 2051 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, |
| 2053 "rfrag:lfrag")); | 2052 "rfrag:lfrag")); |
| 2054 in_msg->AddFingerprint(); | 2053 in_msg->AddFingerprint(); |
| 2055 WriteStunMessage(in_msg.get(), buf.get()); | 2054 WriteStunMessage(in_msg.get(), buf.get()); |
| 2056 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, | 2055 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
| 2057 &username)); | 2056 &username)); |
| 2058 EXPECT_TRUE(out_msg.get() == NULL); | 2057 EXPECT_TRUE(out_msg.get() == nullptr); |
| 2059 EXPECT_EQ("", username); | 2058 EXPECT_EQ("", username); |
| 2060 EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code()); | 2059 EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code()); |
| 2061 | 2060 |
| 2062 // BINDING-REQUEST from local to remote with valid ICE username and | 2061 // BINDING-REQUEST from local to remote with valid ICE username and |
| 2063 // FINGERPRINT, but invalid MESSAGE-INTEGRITY. | 2062 // FINGERPRINT, but invalid MESSAGE-INTEGRITY. |
| 2064 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, | 2063 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, |
| 2065 "rfrag:lfrag")); | 2064 "rfrag:lfrag")); |
| 2066 in_msg->AddMessageIntegrity("invalid"); | 2065 in_msg->AddMessageIntegrity("invalid"); |
| 2067 in_msg->AddFingerprint(); | 2066 in_msg->AddFingerprint(); |
| 2068 WriteStunMessage(in_msg.get(), buf.get()); | 2067 WriteStunMessage(in_msg.get(), buf.get()); |
| 2069 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, | 2068 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
| 2070 &username)); | 2069 &username)); |
| 2071 EXPECT_TRUE(out_msg.get() == NULL); | 2070 EXPECT_TRUE(out_msg.get() == nullptr); |
| 2072 EXPECT_EQ("", username); | 2071 EXPECT_EQ("", username); |
| 2073 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); | 2072 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); |
| 2074 | 2073 |
| 2075 // TODO: BINDING-RESPONSES and BINDING-ERROR-RESPONSES are checked | 2074 // TODO: BINDING-RESPONSES and BINDING-ERROR-RESPONSES are checked |
| 2076 // by the Connection, not the Port, since they require the remote username. | 2075 // by the Connection, not the Port, since they require the remote username. |
| 2077 // Change this test to pass in data via Connection::OnReadPacket instead. | 2076 // Change this test to pass in data via Connection::OnReadPacket instead. |
| 2078 } | 2077 } |
| 2079 | 2078 |
| 2080 // Test handling STUN messages with missing or malformed FINGERPRINT. | 2079 // Test handling STUN messages with missing or malformed FINGERPRINT. |
| 2081 TEST_F(PortTest, TestHandleStunMessageBadFingerprint) { | 2080 TEST_F(PortTest, TestHandleStunMessageBadFingerprint) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2154 std::unique_ptr<IceMessage> in_msg, out_msg; | 2153 std::unique_ptr<IceMessage> in_msg, out_msg; |
| 2155 std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter()); | 2154 std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter()); |
| 2156 rtc::SocketAddress addr(kLocalAddr1); | 2155 rtc::SocketAddress addr(kLocalAddr1); |
| 2157 std::string username; | 2156 std::string username; |
| 2158 | 2157 |
| 2159 in_msg.reset(CreateStunMessage(STUN_BINDING_INDICATION)); | 2158 in_msg.reset(CreateStunMessage(STUN_BINDING_INDICATION)); |
| 2160 in_msg->AddFingerprint(); | 2159 in_msg->AddFingerprint(); |
| 2161 WriteStunMessage(in_msg.get(), buf.get()); | 2160 WriteStunMessage(in_msg.get(), buf.get()); |
| 2162 EXPECT_TRUE(lport->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, | 2161 EXPECT_TRUE(lport->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
| 2163 &username)); | 2162 &username)); |
| 2164 EXPECT_TRUE(out_msg.get() != NULL); | 2163 EXPECT_TRUE(out_msg.get() != nullptr); |
| 2165 EXPECT_EQ(out_msg->type(), STUN_BINDING_INDICATION); | 2164 EXPECT_EQ(out_msg->type(), STUN_BINDING_INDICATION); |
| 2166 EXPECT_EQ("", username); | 2165 EXPECT_EQ("", username); |
| 2167 | 2166 |
| 2168 // Verify connection can handle STUN indication and updates | 2167 // Verify connection can handle STUN indication and updates |
| 2169 // last_ping_received. | 2168 // last_ping_received. |
| 2170 std::unique_ptr<TestPort> rport( | 2169 std::unique_ptr<TestPort> rport( |
| 2171 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); | 2170 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); |
| 2172 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); | 2171 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); |
| 2173 rport->SetIceTiebreaker(kTiebreaker2); | 2172 rport->SetIceTiebreaker(kTiebreaker2); |
| 2174 | 2173 |
| 2175 lport->PrepareAddress(); | 2174 lport->PrepareAddress(); |
| 2176 rport->PrepareAddress(); | 2175 rport->PrepareAddress(); |
| 2177 ASSERT_FALSE(lport->Candidates().empty()); | 2176 ASSERT_FALSE(lport->Candidates().empty()); |
| 2178 ASSERT_FALSE(rport->Candidates().empty()); | 2177 ASSERT_FALSE(rport->Candidates().empty()); |
| 2179 | 2178 |
| 2180 Connection* lconn = lport->CreateConnection(rport->Candidates()[0], | 2179 Connection* lconn = lport->CreateConnection(rport->Candidates()[0], |
| 2181 Port::ORIGIN_MESSAGE); | 2180 Port::ORIGIN_MESSAGE); |
| 2182 Connection* rconn = rport->CreateConnection(lport->Candidates()[0], | 2181 Connection* rconn = rport->CreateConnection(lport->Candidates()[0], |
| 2183 Port::ORIGIN_MESSAGE); | 2182 Port::ORIGIN_MESSAGE); |
| 2184 rconn->Ping(0); | 2183 rconn->Ping(0); |
| 2185 | 2184 |
| 2186 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, kDefaultTimeout); | 2185 ASSERT_TRUE_WAIT(rport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 2187 IceMessage* msg = rport->last_stun_msg(); | 2186 IceMessage* msg = rport->last_stun_msg(); |
| 2188 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); | 2187 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); |
| 2189 // Send rport binding request to lport. | 2188 // Send rport binding request to lport. |
| 2190 lconn->OnReadPacket(rport->last_stun_buf()->data<char>(), | 2189 lconn->OnReadPacket(rport->last_stun_buf()->data<char>(), |
| 2191 rport->last_stun_buf()->size(), | 2190 rport->last_stun_buf()->size(), |
| 2192 rtc::PacketTime()); | 2191 rtc::PacketTime()); |
| 2193 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout); | 2192 ASSERT_TRUE_WAIT(lport->last_stun_msg() != nullptr, kDefaultTimeout); |
| 2194 EXPECT_EQ(STUN_BINDING_RESPONSE, lport->last_stun_msg()->type()); | 2193 EXPECT_EQ(STUN_BINDING_RESPONSE, lport->last_stun_msg()->type()); |
| 2195 int64_t last_ping_received1 = lconn->last_ping_received(); | 2194 int64_t last_ping_received1 = lconn->last_ping_received(); |
| 2196 | 2195 |
| 2197 // Adding a delay of 100ms. | 2196 // Adding a delay of 100ms. |
| 2198 rtc::Thread::Current()->ProcessMessages(100); | 2197 rtc::Thread::Current()->ProcessMessages(100); |
| 2199 // Pinging lconn using stun indication message. | 2198 // Pinging lconn using stun indication message. |
| 2200 lconn->OnReadPacket(buf->Data(), buf->Length(), rtc::PacketTime()); | 2199 lconn->OnReadPacket(buf->Data(), buf->Length(), rtc::PacketTime()); |
| 2201 int64_t last_ping_received2 = lconn->last_ping_received(); | 2200 int64_t last_ping_received2 = lconn->last_ping_received(); |
| 2202 EXPECT_GT(last_ping_received2, last_ping_received1); | 2201 EXPECT_GT(last_ping_received2, last_ping_received1); |
| 2203 } | 2202 } |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2438 TestChannel ch2(port2); | 2437 TestChannel ch2(port2); |
| 2439 | 2438 |
| 2440 // Acquire addresses. | 2439 // Acquire addresses. |
| 2441 ch1.Start(); | 2440 ch1.Start(); |
| 2442 ch2.Start(); | 2441 ch2.Start(); |
| 2443 ASSERT_EQ_SIMULATED_WAIT(1, ch1.complete_count(), kDefaultTimeout, clock); | 2442 ASSERT_EQ_SIMULATED_WAIT(1, ch1.complete_count(), kDefaultTimeout, clock); |
| 2444 ASSERT_EQ_SIMULATED_WAIT(1, ch2.complete_count(), kDefaultTimeout, clock); | 2443 ASSERT_EQ_SIMULATED_WAIT(1, ch2.complete_count(), kDefaultTimeout, clock); |
| 2445 | 2444 |
| 2446 // Send a ping from src to dst. | 2445 // Send a ping from src to dst. |
| 2447 ch1.CreateConnection(GetCandidate(port2)); | 2446 ch1.CreateConnection(GetCandidate(port2)); |
| 2448 ASSERT_TRUE(ch1.conn() != NULL); | 2447 ASSERT_TRUE(ch1.conn() != nullptr); |
| 2449 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state()); | 2448 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state()); |
| 2450 // for TCP connect | 2449 // for TCP connect |
| 2451 EXPECT_TRUE_SIMULATED_WAIT(ch1.conn()->connected(), kDefaultTimeout, clock); | 2450 EXPECT_TRUE_SIMULATED_WAIT(ch1.conn()->connected(), kDefaultTimeout, clock); |
| 2452 ch1.Ping(); | 2451 ch1.Ping(); |
| 2453 SIMULATED_WAIT(!ch2.remote_address().IsNil(), kShortTimeout, clock); | 2452 SIMULATED_WAIT(!ch2.remote_address().IsNil(), kShortTimeout, clock); |
| 2454 | 2453 |
| 2455 // Data should be sendable before the connection is accepted. | 2454 // Data should be sendable before the connection is accepted. |
| 2456 char data[] = "abcd"; | 2455 char data[] = "abcd"; |
| 2457 int data_size = arraysize(data); | 2456 int data_size = arraysize(data); |
| 2458 rtc::PacketOptions options; | 2457 rtc::PacketOptions options; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2508 | 2507 |
| 2509 // Set up channels. | 2508 // Set up channels. |
| 2510 TestChannel ch1(port1); | 2509 TestChannel ch1(port1); |
| 2511 TestChannel ch2(port2); | 2510 TestChannel ch2(port2); |
| 2512 | 2511 |
| 2513 // Acquire addresses. | 2512 // Acquire addresses. |
| 2514 ch1.Start(); | 2513 ch1.Start(); |
| 2515 ch2.Start(); | 2514 ch2.Start(); |
| 2516 | 2515 |
| 2517 ch1.CreateConnection(GetCandidate(port2)); | 2516 ch1.CreateConnection(GetCandidate(port2)); |
| 2518 ASSERT_TRUE(ch1.conn() != NULL); | 2517 ASSERT_TRUE(ch1.conn() != nullptr); |
| 2519 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state()); | 2518 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state()); |
| 2520 | 2519 |
| 2521 // Attempt to go directly to write timeout. | 2520 // Attempt to go directly to write timeout. |
| 2522 for (uint32_t i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) { | 2521 for (uint32_t i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) { |
| 2523 ch1.Ping(i); | 2522 ch1.Ping(i); |
| 2524 } | 2523 } |
| 2525 ch1.conn()->UpdateState(CONNECTION_WRITE_TIMEOUT + 500u); | 2524 ch1.conn()->UpdateState(CONNECTION_WRITE_TIMEOUT + 500u); |
| 2526 EXPECT_EQ(Connection::STATE_WRITE_TIMEOUT, ch1.conn()->write_state()); | 2525 EXPECT_EQ(Connection::STATE_WRITE_TIMEOUT, ch1.conn()->write_state()); |
| 2527 } | 2526 } |
| 2528 | 2527 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2543 ch1.SetIceMode(ICEMODE_FULL); | 2542 ch1.SetIceMode(ICEMODE_FULL); |
| 2544 | 2543 |
| 2545 // Start gathering candidates. | 2544 // Start gathering candidates. |
| 2546 ch1.Start(); | 2545 ch1.Start(); |
| 2547 ice_lite_port->PrepareAddress(); | 2546 ice_lite_port->PrepareAddress(); |
| 2548 | 2547 |
| 2549 ASSERT_EQ_WAIT(1, ch1.complete_count(), kDefaultTimeout); | 2548 ASSERT_EQ_WAIT(1, ch1.complete_count(), kDefaultTimeout); |
| 2550 ASSERT_FALSE(ice_lite_port->Candidates().empty()); | 2549 ASSERT_FALSE(ice_lite_port->Candidates().empty()); |
| 2551 | 2550 |
| 2552 ch1.CreateConnection(GetCandidate(ice_lite_port.get())); | 2551 ch1.CreateConnection(GetCandidate(ice_lite_port.get())); |
| 2553 ASSERT_TRUE(ch1.conn() != NULL); | 2552 ASSERT_TRUE(ch1.conn() != nullptr); |
| 2554 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state()); | 2553 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state()); |
| 2555 | 2554 |
| 2556 // Send ping from full mode client. | 2555 // Send ping from full mode client. |
| 2557 // This ping must not have USE_CANDIDATE_ATTR. | 2556 // This ping must not have USE_CANDIDATE_ATTR. |
| 2558 ch1.Ping(); | 2557 ch1.Ping(); |
| 2559 | 2558 |
| 2560 // Verify stun ping is without USE_CANDIDATE_ATTR. Getting message directly | 2559 // Verify stun ping is without USE_CANDIDATE_ATTR. Getting message directly |
| 2561 // from port. | 2560 // from port. |
| 2562 ASSERT_TRUE_WAIT(ice_full_port->last_stun_msg() != NULL, kDefaultTimeout); | 2561 ASSERT_TRUE_WAIT(ice_full_port->last_stun_msg() != nullptr, kDefaultTimeout); |
| 2563 IceMessage* msg = ice_full_port->last_stun_msg(); | 2562 IceMessage* msg = ice_full_port->last_stun_msg(); |
| 2564 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == NULL); | 2563 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == nullptr); |
| 2565 | 2564 |
| 2566 // Respond with a BINDING-RESPONSE from litemode client. | 2565 // Respond with a BINDING-RESPONSE from litemode client. |
| 2567 // NOTE: Ideally we should't create connection at this stage from lite | 2566 // NOTE: Ideally we should't create connection at this stage from lite |
| 2568 // port, as it should be done only after receiving ping with USE_CANDIDATE. | 2567 // port, as it should be done only after receiving ping with USE_CANDIDATE. |
| 2569 // But we need a connection to send a response message. | 2568 // But we need a connection to send a response message. |
| 2570 ice_lite_port->CreateConnection( | 2569 ice_lite_port->CreateConnection( |
| 2571 ice_full_port->Candidates()[0], cricket::Port::ORIGIN_MESSAGE); | 2570 ice_full_port->Candidates()[0], cricket::Port::ORIGIN_MESSAGE); |
| 2572 std::unique_ptr<IceMessage> request(CopyStunMessage(msg)); | 2571 std::unique_ptr<IceMessage> request(CopyStunMessage(msg)); |
| 2573 ice_lite_port->SendBindingResponse( | 2572 ice_lite_port->SendBindingResponse( |
| 2574 request.get(), ice_full_port->Candidates()[0].address()); | 2573 request.get(), ice_full_port->Candidates()[0].address()); |
| 2575 | 2574 |
| 2576 // Feeding the respone message from litemode to the full mode connection. | 2575 // Feeding the respone message from litemode to the full mode connection. |
| 2577 ch1.conn()->OnReadPacket(ice_lite_port->last_stun_buf()->data<char>(), | 2576 ch1.conn()->OnReadPacket(ice_lite_port->last_stun_buf()->data<char>(), |
| 2578 ice_lite_port->last_stun_buf()->size(), | 2577 ice_lite_port->last_stun_buf()->size(), |
| 2579 rtc::PacketTime()); | 2578 rtc::PacketTime()); |
| 2580 // Verifying full mode connection becomes writable from the response. | 2579 // Verifying full mode connection becomes writable from the response. |
| 2581 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(), | 2580 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(), |
| 2582 kDefaultTimeout); | 2581 kDefaultTimeout); |
| 2583 EXPECT_TRUE_WAIT(ch1.nominated(), kDefaultTimeout); | 2582 EXPECT_TRUE_WAIT(ch1.nominated(), kDefaultTimeout); |
| 2584 | 2583 |
| 2585 // Clear existing stun messsages. Otherwise we will process old stun | 2584 // Clear existing stun messsages. Otherwise we will process old stun |
| 2586 // message right after we send ping. | 2585 // message right after we send ping. |
| 2587 ice_full_port->Reset(); | 2586 ice_full_port->Reset(); |
| 2588 // Send ping. This must have USE_CANDIDATE_ATTR. | 2587 // Send ping. This must have USE_CANDIDATE_ATTR. |
| 2589 ch1.Ping(); | 2588 ch1.Ping(); |
| 2590 ASSERT_TRUE_WAIT(ice_full_port->last_stun_msg() != NULL, kDefaultTimeout); | 2589 ASSERT_TRUE_WAIT(ice_full_port->last_stun_msg() != nullptr, kDefaultTimeout); |
| 2591 msg = ice_full_port->last_stun_msg(); | 2590 msg = ice_full_port->last_stun_msg(); |
| 2592 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) != NULL); | 2591 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) != nullptr); |
| 2593 ch1.Stop(); | 2592 ch1.Stop(); |
| 2594 } | 2593 } |
| 2595 | 2594 |
| 2596 // This test case verifies that both the controlling port and the controlled | 2595 // This test case verifies that both the controlling port and the controlled |
| 2597 // port will time out after connectivity is lost, if they are not marked as | 2596 // port will time out after connectivity is lost, if they are not marked as |
| 2598 // "keep alive until pruned." | 2597 // "keep alive until pruned." |
| 2599 TEST_F(PortTest, TestPortTimeoutIfNotKeptAlive) { | 2598 TEST_F(PortTest, TestPortTimeoutIfNotKeptAlive) { |
| 2600 rtc::ScopedFakeClock clock; | 2599 rtc::ScopedFakeClock clock; |
| 2601 int timeout_delay = 100; | 2600 int timeout_delay = 100; |
| 2602 UDPPort* port1 = CreateUdpPort(kLocalAddr1); | 2601 UDPPort* port1 = CreateUdpPort(kLocalAddr1); |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2762 port->CreateConnection(candidate, Port::ORIGIN_MESSAGE); | 2761 port->CreateConnection(candidate, Port::ORIGIN_MESSAGE); |
| 2763 EXPECT_NE(conn1, conn2); | 2762 EXPECT_NE(conn1, conn2); |
| 2764 conn_in_use = port->GetConnection(address); | 2763 conn_in_use = port->GetConnection(address); |
| 2765 EXPECT_EQ(conn2, conn_in_use); | 2764 EXPECT_EQ(conn2, conn_in_use); |
| 2766 EXPECT_EQ(2u, conn_in_use->remote_candidate().generation()); | 2765 EXPECT_EQ(2u, conn_in_use->remote_candidate().generation()); |
| 2767 | 2766 |
| 2768 // Make sure the new connection was not deleted. | 2767 // Make sure the new connection was not deleted. |
| 2769 rtc::Thread::Current()->ProcessMessages(300); | 2768 rtc::Thread::Current()->ProcessMessages(300); |
| 2770 EXPECT_TRUE(port->GetConnection(address) != nullptr); | 2769 EXPECT_TRUE(port->GetConnection(address) != nullptr); |
| 2771 } | 2770 } |
| OLD | NEW |