OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/dns/dns_transaction.h" | 5 #include "net/dns/dns_transaction.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
10 #include "base/rand_util.h" | 10 #include "base/rand_util.h" |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 | 170 |
171 private: | 171 private: |
172 TestSocketFactory* factory_; | 172 TestSocketFactory* factory_; |
173 | 173 |
174 DISALLOW_COPY_AND_ASSIGN(TestUDPClientSocket); | 174 DISALLOW_COPY_AND_ASSIGN(TestUDPClientSocket); |
175 }; | 175 }; |
176 | 176 |
177 // Creates TestUDPClientSockets and keeps endpoints reported via OnConnect. | 177 // Creates TestUDPClientSockets and keeps endpoints reported via OnConnect. |
178 class TestSocketFactory : public MockClientSocketFactory { | 178 class TestSocketFactory : public MockClientSocketFactory { |
179 public: | 179 public: |
180 TestSocketFactory() : create_failing_sockets_(false) {} | 180 TestSocketFactory() : fail_next_socket_(false) {} |
181 virtual ~TestSocketFactory() {} | 181 virtual ~TestSocketFactory() {} |
182 | 182 |
183 virtual DatagramClientSocket* CreateDatagramClientSocket( | 183 virtual DatagramClientSocket* CreateDatagramClientSocket( |
184 DatagramSocket::BindType bind_type, | 184 DatagramSocket::BindType bind_type, |
185 const RandIntCallback& rand_int_cb, | 185 const RandIntCallback& rand_int_cb, |
186 net::NetLog* net_log, | 186 net::NetLog* net_log, |
187 const net::NetLog::Source& source) OVERRIDE { | 187 const net::NetLog::Source& source) OVERRIDE { |
188 if (create_failing_sockets_) | 188 if (fail_next_socket_) { |
| 189 fail_next_socket_ = false; |
189 return new FailingUDPClientSocket(&empty_data_, net_log); | 190 return new FailingUDPClientSocket(&empty_data_, net_log); |
| 191 } |
190 SocketDataProvider* data_provider = mock_data().GetNext(); | 192 SocketDataProvider* data_provider = mock_data().GetNext(); |
191 TestUDPClientSocket* socket = new TestUDPClientSocket(this, | 193 TestUDPClientSocket* socket = new TestUDPClientSocket(this, |
192 data_provider, | 194 data_provider, |
193 net_log); | 195 net_log); |
194 data_provider->set_socket(socket); | 196 data_provider->set_socket(socket); |
195 return socket; | 197 return socket; |
196 } | 198 } |
197 | 199 |
198 void OnConnect(const IPEndPoint& endpoint) { | 200 void OnConnect(const IPEndPoint& endpoint) { |
199 remote_endpoints_.push_back(endpoint); | 201 remote_endpoints_.push_back(endpoint); |
200 } | 202 } |
201 | 203 |
202 std::vector<IPEndPoint> remote_endpoints_; | 204 std::vector<IPEndPoint> remote_endpoints_; |
203 bool create_failing_sockets_; | 205 bool fail_next_socket_; |
204 | 206 |
205 private: | 207 private: |
206 StaticSocketDataProvider empty_data_; | 208 StaticSocketDataProvider empty_data_; |
207 | 209 |
208 DISALLOW_COPY_AND_ASSIGN(TestSocketFactory); | 210 DISALLOW_COPY_AND_ASSIGN(TestSocketFactory); |
209 }; | 211 }; |
210 | 212 |
211 int TestUDPClientSocket::Connect(const IPEndPoint& endpoint) { | 213 int TestUDPClientSocket::Connect(const IPEndPoint& endpoint) { |
212 factory_->OnConnect(endpoint); | 214 factory_->OnConnect(endpoint); |
213 return MockUDPClientSocket::Connect(endpoint); | 215 return MockUDPClientSocket::Connect(endpoint); |
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
851 AddAsyncQueryAndRcode("www.lab.ccs.neu.edu", dns_protocol::kTypeA, | 853 AddAsyncQueryAndRcode("www.lab.ccs.neu.edu", dns_protocol::kTypeA, |
852 dns_protocol::kRcodeNXDOMAIN); | 854 dns_protocol::kRcodeNXDOMAIN); |
853 AddSyncQueryAndResponse(2 /* id */, kT2HostName, kT2Qtype, | 855 AddSyncQueryAndResponse(2 /* id */, kT2HostName, kT2Qtype, |
854 kT2ResponseDatagram, arraysize(kT2ResponseDatagram)); | 856 kT2ResponseDatagram, arraysize(kT2ResponseDatagram)); |
855 | 857 |
856 TransactionHelper helper0("www", kT2Qtype, kT2RecordCount); | 858 TransactionHelper helper0("www", kT2Qtype, kT2RecordCount); |
857 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 859 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
858 } | 860 } |
859 | 861 |
860 TEST_F(DnsTransactionTest, ConnectFailure) { | 862 TEST_F(DnsTransactionTest, ConnectFailure) { |
861 socket_factory_->create_failing_sockets_ = true; | 863 socket_factory_->fail_next_socket_ = true; |
862 transaction_ids_.push_back(0); // Needed to make a DnsUDPAttempt. | 864 transaction_ids_.push_back(0); // Needed to make a DnsUDPAttempt. |
863 TransactionHelper helper0("www.chromium.org", dns_protocol::kTypeA, | 865 TransactionHelper helper0("www.chromium.org", dns_protocol::kTypeA, |
864 ERR_CONNECTION_REFUSED); | 866 ERR_CONNECTION_REFUSED); |
865 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 867 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
866 } | 868 } |
867 | 869 |
| 870 TEST_F(DnsTransactionTest, ConnectFailureFollowedBySuccess) { |
| 871 // Retry after server failure. |
| 872 config_.attempts = 2; |
| 873 ConfigureFactory(); |
| 874 // First server connection attempt fails. |
| 875 transaction_ids_.push_back(0); // Needed to make a DnsUDPAttempt. |
| 876 socket_factory_->fail_next_socket_ = true; |
| 877 // Second DNS query succeeds. |
| 878 AddAsyncQueryAndResponse(0 /* id */, kT0HostName, kT0Qtype, |
| 879 kT0ResponseDatagram, arraysize(kT0ResponseDatagram)); |
| 880 TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount); |
| 881 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
| 882 } |
| 883 |
868 TEST_F(DnsTransactionTest, TCPLookup) { | 884 TEST_F(DnsTransactionTest, TCPLookup) { |
869 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, | 885 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, |
870 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); | 886 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); |
871 AddQueryAndResponse(0 /* id */, kT0HostName, kT0Qtype, | 887 AddQueryAndResponse(0 /* id */, kT0HostName, kT0Qtype, |
872 kT0ResponseDatagram, arraysize(kT0ResponseDatagram), | 888 kT0ResponseDatagram, arraysize(kT0ResponseDatagram), |
873 ASYNC, true /* use_tcp */); | 889 ASYNC, true /* use_tcp */); |
874 | 890 |
875 TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount); | 891 TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount); |
876 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 892 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
877 } | 893 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
920 config_.timeout = TestTimeouts::tiny_timeout(); | 936 config_.timeout = TestTimeouts::tiny_timeout(); |
921 ConfigureFactory(); | 937 ConfigureFactory(); |
922 | 938 |
923 TransactionHelper helper0(".", dns_protocol::kTypeA, ERR_INVALID_ARGUMENT); | 939 TransactionHelper helper0(".", dns_protocol::kTypeA, ERR_INVALID_ARGUMENT); |
924 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 940 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
925 } | 941 } |
926 | 942 |
927 } // namespace | 943 } // namespace |
928 | 944 |
929 } // namespace net | 945 } // namespace net |
OLD | NEW |