summaryrefslogtreecommitdiffstats
path: root/chrome/utility
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/utility')
-rw-r--r--chrome/utility/local_discovery/local_domain_resolver_unittest.cc56
-rw-r--r--chrome/utility/local_discovery/service_discovery_client_impl.cc52
-rw-r--r--chrome/utility/local_discovery/service_discovery_client_impl.h11
-rw-r--r--chrome/utility/local_discovery/service_discovery_message_handler.cc12
-rw-r--r--chrome/utility/local_discovery/service_discovery_message_handler.h3
5 files changed, 99 insertions, 35 deletions
diff --git a/chrome/utility/local_discovery/local_domain_resolver_unittest.cc b/chrome/utility/local_discovery/local_domain_resolver_unittest.cc
index 1dc9fc3..828af27 100644
--- a/chrome/utility/local_discovery/local_domain_resolver_unittest.cc
+++ b/chrome/utility/local_discovery/local_domain_resolver_unittest.cc
@@ -73,12 +73,17 @@ class LocalDomainResolverTest : public testing::Test {
mdns_client_.StartListening();
}
- void AddressCallback(bool resolved, const net::IPAddressNumber& address) {
- if (address == net::IPAddressNumber()) {
- AddressCallbackInternal(resolved, "");
- } else {
- AddressCallbackInternal(resolved, net::IPAddressToString(address));
- }
+ std::string IPAddressToStringWithEmpty(const net::IPAddressNumber& address) {
+ if (address.empty()) return "";
+ return net::IPAddressToString(address);
+ }
+
+ void AddressCallback(bool resolved,
+ const net::IPAddressNumber& address_ipv4,
+ const net::IPAddressNumber& address_ipv6) {
+ AddressCallbackInternal(resolved,
+ IPAddressToStringWithEmpty(address_ipv4),
+ IPAddressToStringWithEmpty(address_ipv6));
}
void RunFor(base::TimeDelta time_period) {
@@ -92,8 +97,10 @@ class LocalDomainResolverTest : public testing::Test {
callback.Cancel();
}
- MOCK_METHOD2(AddressCallbackInternal,
- void(bool resolved, std::string address));
+ MOCK_METHOD3(AddressCallbackInternal,
+ void(bool resolved,
+ std::string address_ipv4,
+ std::string address_ipv6));
net::MockMDnsSocketFactory* socket_factory_;
net::MDnsClientImpl mdns_client_;
@@ -111,7 +118,7 @@ TEST_F(LocalDomainResolverTest, ResolveDomainA) {
resolver.Start();
- EXPECT_CALL(*this, AddressCallbackInternal(true, "1.2.3.4"));
+ EXPECT_CALL(*this, AddressCallbackInternal(true, "1.2.3.4", ""));
socket_factory_->SimulateReceive(
kSamplePacketA, sizeof(kSamplePacketA));
@@ -128,13 +135,33 @@ TEST_F(LocalDomainResolverTest, ResolveDomainAAAA) {
resolver.Start();
- EXPECT_CALL(*this, AddressCallbackInternal(true, "a::1:2:3:4"));
+ EXPECT_CALL(*this, AddressCallbackInternal(true, "", "a::1:2:3:4"));
+
+ socket_factory_->SimulateReceive(
+ kSamplePacketAAAA, sizeof(kSamplePacketAAAA));
+}
+
+TEST_F(LocalDomainResolverTest, ResolveDomainAnyOneAvailable) {
+ LocalDomainResolverImpl resolver(
+ "myhello.local", net::ADDRESS_FAMILY_UNSPECIFIED,
+ base::Bind(&LocalDomainResolverTest::AddressCallback,
+ base::Unretained(this)), &mdns_client_);
+
+ EXPECT_CALL(*socket_factory_, OnSendTo(_))
+ .Times(4); // Twice per query
+
+ resolver.Start();
socket_factory_->SimulateReceive(
kSamplePacketAAAA, sizeof(kSamplePacketAAAA));
+
+ EXPECT_CALL(*this, AddressCallbackInternal(true, "", "a::1:2:3:4"));
+
+ RunFor(base::TimeDelta::FromMilliseconds(150));
}
-TEST_F(LocalDomainResolverTest, ResolveDomainAny) {
+
+TEST_F(LocalDomainResolverTest, ResolveDomainAnyBothAvailable) {
LocalDomainResolverImpl resolver(
"myhello.local", net::ADDRESS_FAMILY_UNSPECIFIED,
base::Bind(&LocalDomainResolverTest::AddressCallback,
@@ -145,10 +172,13 @@ TEST_F(LocalDomainResolverTest, ResolveDomainAny) {
resolver.Start();
- EXPECT_CALL(*this, AddressCallbackInternal(true, "a::1:2:3:4"));
+ EXPECT_CALL(*this, AddressCallbackInternal(true, "1.2.3.4", "a::1:2:3:4"));
socket_factory_->SimulateReceive(
kSamplePacketAAAA, sizeof(kSamplePacketAAAA));
+
+ socket_factory_->SimulateReceive(
+ kSamplePacketA, sizeof(kSamplePacketA));
}
TEST_F(LocalDomainResolverTest, ResolveDomainNone) {
@@ -162,7 +192,7 @@ TEST_F(LocalDomainResolverTest, ResolveDomainNone) {
resolver.Start();
- EXPECT_CALL(*this, AddressCallbackInternal(false, ""));
+ EXPECT_CALL(*this, AddressCallbackInternal(false, "", ""));
RunFor(base::TimeDelta::FromSeconds(4));
}
diff --git a/chrome/utility/local_discovery/service_discovery_client_impl.cc b/chrome/utility/local_discovery/service_discovery_client_impl.cc
index 524f176..e8fc595 100644
--- a/chrome/utility/local_discovery/service_discovery_client_impl.cc
+++ b/chrome/utility/local_discovery/service_discovery_client_impl.cc
@@ -14,6 +14,12 @@
namespace local_discovery {
+namespace {
+// TODO(noamsml): Make this configurable through the LocalDomainResolver
+// interface.
+const int kLocalDomainSecondAddressTimeoutMs = 100;
+}
+
ServiceDiscoveryClientImpl::ServiceDiscoveryClientImpl(
net::MDnsClient* mdns_client) : mdns_client_(mdns_client) {
}
@@ -393,10 +399,11 @@ LocalDomainResolverImpl::LocalDomainResolverImpl(
const IPAddressCallback& callback,
net::MDnsClient* mdns_client)
: domain_(domain), address_family_(address_family), callback_(callback),
- transaction_failures_(0), mdns_client_(mdns_client) {
+ transactions_finished_(0), mdns_client_(mdns_client) {
}
LocalDomainResolverImpl::~LocalDomainResolverImpl() {
+ timeout_callback_.Cancel();
}
void LocalDomainResolverImpl::Start() {
@@ -425,31 +432,44 @@ scoped_ptr<net::MDnsTransaction> LocalDomainResolverImpl::CreateTransaction(
void LocalDomainResolverImpl::OnTransactionComplete(
net::MDnsTransaction::Result result, const net::RecordParsed* record) {
- if (result != net::MDnsTransaction::RESULT_RECORD &&
- address_family_ == net::ADDRESS_FAMILY_UNSPECIFIED) {
- transaction_failures_++;
-
- if (transaction_failures_ < 2) {
- return;
- }
- }
+ transactions_finished_++;
- transaction_a_.reset();
- transaction_aaaa_.reset();
-
- net::IPAddressNumber address;
if (result == net::MDnsTransaction::RESULT_RECORD) {
if (record->type() == net::dns_protocol::kTypeA) {
const net::ARecordRdata* rdata = record->rdata<net::ARecordRdata>();
- address = rdata->address();
+ address_ipv4_ = rdata->address();
} else {
DCHECK_EQ(net::dns_protocol::kTypeAAAA, record->type());
const net::AAAARecordRdata* rdata = record->rdata<net::AAAARecordRdata>();
- address = rdata->address();
+ address_ipv6_ = rdata->address();
}
}
- callback_.Run(result == net::MDnsTransaction::RESULT_RECORD, address);
+ if (transactions_finished_ == 1 &&
+ address_family_ == net::ADDRESS_FAMILY_UNSPECIFIED) {
+ timeout_callback_.Reset(base::Bind(
+ &LocalDomainResolverImpl::SendResolvedAddresses,
+ base::Unretained(this)));
+
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ timeout_callback_.callback(),
+ base::TimeDelta::FromMilliseconds(kLocalDomainSecondAddressTimeoutMs));
+ } else if (transactions_finished_ == 2
+ || address_family_ != net::ADDRESS_FAMILY_UNSPECIFIED) {
+ SendResolvedAddresses();
+ }
+}
+
+bool LocalDomainResolverImpl::IsSuccess() {
+ return !address_ipv4_.empty() || !address_ipv6_.empty();
+}
+
+void LocalDomainResolverImpl::SendResolvedAddresses() {
+ transaction_a_.reset();
+ transaction_aaaa_.reset();
+ timeout_callback_.Cancel();
+ callback_.Run(IsSuccess(), address_ipv4_, address_ipv6_);
}
} // namespace local_discovery
diff --git a/chrome/utility/local_discovery/service_discovery_client_impl.h b/chrome/utility/local_discovery/service_discovery_client_impl.h
index f04f3112..efe0d43 100644
--- a/chrome/utility/local_discovery/service_discovery_client_impl.h
+++ b/chrome/utility/local_discovery/service_discovery_client_impl.h
@@ -212,6 +212,10 @@ class LocalDomainResolverImpl : public LocalDomainResolver {
scoped_ptr<net::MDnsTransaction> CreateTransaction(uint16 type);
+ bool IsSuccess();
+
+ void SendResolvedAddresses();
+
std::string domain_;
net::AddressFamily address_family_;
IPAddressCallback callback_;
@@ -219,10 +223,15 @@ class LocalDomainResolverImpl : public LocalDomainResolver {
scoped_ptr<net::MDnsTransaction> transaction_a_;
scoped_ptr<net::MDnsTransaction> transaction_aaaa_;
- int transaction_failures_;
+ int transactions_finished_;
net::MDnsClient* mdns_client_;
+ net::IPAddressNumber address_ipv4_;
+ net::IPAddressNumber address_ipv6_;
+
+ base::CancelableCallback<void()> timeout_callback_;
+
DISALLOW_COPY_AND_ASSIGN(LocalDomainResolverImpl);
};
diff --git a/chrome/utility/local_discovery/service_discovery_message_handler.cc b/chrome/utility/local_discovery/service_discovery_message_handler.cc
index e6c84dd..d506c2b 100644
--- a/chrome/utility/local_discovery/service_discovery_message_handler.cc
+++ b/chrome/utility/local_discovery/service_discovery_message_handler.cc
@@ -135,10 +135,11 @@ void SendServiceUpdated(uint64 id, ServiceWatcher::UpdateType update,
}
void SendLocalDomainResolved(uint64 id, bool success,
- const net::IPAddressNumber& address) {
+ const net::IPAddressNumber& address_ipv4,
+ const net::IPAddressNumber& address_ipv6) {
content::UtilityThread::Get()->Send(
new LocalDiscoveryHostMsg_LocalDomainResolverCallback(
- id, success, address));
+ id, success, address_ipv4, address_ipv6));
}
} // namespace
@@ -381,10 +382,13 @@ void ServiceDiscoveryMessageHandler::OnServiceResolved(
void ServiceDiscoveryMessageHandler::OnLocalDomainResolved(
uint64 id,
bool success,
- const net::IPAddressNumber& address) {
+ const net::IPAddressNumber& address_ipv4,
+ const net::IPAddressNumber& address_ipv6) {
DCHECK(service_discovery_client_);
utility_task_runner_->PostTask(FROM_HERE, base::Bind(&SendLocalDomainResolved,
- id, success, address));
+ id, success,
+ address_ipv4,
+ address_ipv6));
}
diff --git a/chrome/utility/local_discovery/service_discovery_message_handler.h b/chrome/utility/local_discovery/service_discovery_message_handler.h
index 35c6b03..917d525 100644
--- a/chrome/utility/local_discovery/service_discovery_message_handler.h
+++ b/chrome/utility/local_discovery/service_discovery_message_handler.h
@@ -87,7 +87,8 @@ class ServiceDiscoveryMessageHandler : public chrome::UtilityMessageHandler {
// Is called by LocalDomainResolver as callback.
void OnLocalDomainResolved(uint64 id,
bool success,
- const net::IPAddressNumber& address);
+ const net::IPAddressNumber& address_ipv4,
+ const net::IPAddressNumber& address_ipv6);
ServiceWatchers service_watchers_;
ServiceResolvers service_resolvers_;