Commit 87861221 authored by Derek Cheng's avatar Derek Cheng Committed by Commit Bot

[DIAL] DialServiceImpl / DialSocket cleanups.

- Replace 2 instances of WeakPtr usage in DialServiceImpl with a
CancelableTaskTracker to track thread-hopping calls to obtain network
interfaces.
- Replace the callbacks bound to DialServiceImpl using WeakPtr passed
to DialSocket with a raw pointer DialServiceImpl. This is safe because
DialServiceImpl owns DialSockets.
- Remove WeakPtrFactory from DialServiceImpl.

Bug: 735590
Change-Id: I4965a33a7a706b057ee7d0f4c5cb6fb98b06dbc2
Reviewed-on: https://chromium-review.googlesource.com/574993Reviewed-by: default avatarTakumi Fujimoto <takumif@chromium.org>
Commit-Queue: Derek Cheng <imcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#487595}
parent d646232e
...@@ -163,16 +163,10 @@ NetworkInterfaceList GetNetworkList() { ...@@ -163,16 +163,10 @@ NetworkInterfaceList GetNetworkList() {
} // namespace } // namespace
DialServiceImpl::DialSocket::DialSocket( DialServiceImpl::DialSocket::DialSocket(DialServiceImpl* dial_service)
const base::Closure& discovery_request_cb, : is_writing_(false), is_reading_(false), dial_service_(dial_service) {
const base::Callback<void(const DialDeviceData&)>& device_discovered_cb,
const base::Closure& on_error_cb)
: discovery_request_cb_(discovery_request_cb),
device_discovered_cb_(device_discovered_cb),
on_error_cb_(on_error_cb),
is_writing_(false),
is_reading_(false) {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
DCHECK(dial_service_);
} }
DialServiceImpl::DialSocket::~DialSocket() { DialServiceImpl::DialSocket::~DialSocket() {
...@@ -243,7 +237,7 @@ bool DialServiceImpl::DialSocket::CheckResult(const char* operation, ...@@ -243,7 +237,7 @@ bool DialServiceImpl::DialSocket::CheckResult(const char* operation,
Close(); Close();
std::string error_str(net::ErrorToString(result)); std::string error_str(net::ErrorToString(result));
VLOG(1) << "dial socket error: " << error_str; VLOG(1) << "dial socket error: " << error_str;
on_error_cb_.Run(); dial_service_->NotifyOnError();
return false; return false;
} }
return true; return true;
...@@ -266,7 +260,7 @@ void DialServiceImpl::DialSocket::OnSocketWrite(int send_buffer_size, ...@@ -266,7 +260,7 @@ void DialServiceImpl::DialSocket::OnSocketWrite(int send_buffer_size,
VLOG(1) << "Sent " << result << " chars, expected " << send_buffer_size VLOG(1) << "Sent " << result << " chars, expected " << send_buffer_size
<< " chars"; << " chars";
} }
discovery_request_cb_.Run(); dial_service_->NotifyOnDiscoveryRequest();
} }
bool DialServiceImpl::DialSocket::ReadSocket() { bool DialServiceImpl::DialSocket::ReadSocket() {
...@@ -328,7 +322,7 @@ void DialServiceImpl::DialSocket::HandleResponse(int bytes_read) { ...@@ -328,7 +322,7 @@ void DialServiceImpl::DialSocket::HandleResponse(int bytes_read) {
// Attempt to parse response, notify observers if successful. // Attempt to parse response, notify observers if successful.
DialDeviceData parsed_device; DialDeviceData parsed_device;
if (ParseResponse(response, response_time, &parsed_device)) if (ParseResponse(response, response_time, &parsed_device))
device_discovered_cb_.Run(parsed_device); dial_service_->NotifyOnDeviceDiscovered(parsed_device);
} }
// static // static
...@@ -398,8 +392,7 @@ DialServiceImpl::DialServiceImpl(net::NetLog* net_log) ...@@ -398,8 +392,7 @@ DialServiceImpl::DialServiceImpl(net::NetLog* net_log)
kDialRequestIntervalMillis) + kDialRequestIntervalMillis) +
TimeDelta::FromSeconds(kDialResponseTimeoutSecs)), TimeDelta::FromSeconds(kDialResponseTimeoutSecs)),
request_interval_( request_interval_(
TimeDelta::FromMilliseconds(kDialRequestIntervalMillis)), TimeDelta::FromMilliseconds(kDialRequestIntervalMillis)) {
weak_factory_(this) {
IPAddress address; IPAddress address;
bool success = address.AssignFromIPLiteral(kDialRequestAddress); bool success = address.AssignFromIPLiteral(kDialRequestAddress);
DCHECK(success); DCHECK(success);
...@@ -453,16 +446,17 @@ void DialServiceImpl::StartDiscovery() { ...@@ -453,16 +446,17 @@ void DialServiceImpl::StartDiscovery() {
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
auto task_runner = auto task_runner =
content::BrowserThread::GetTaskRunnerForThread(BrowserThread::UI); content::BrowserThread::GetTaskRunnerForThread(BrowserThread::UI);
base::PostTaskAndReplyWithResult( task_tracker_.PostTaskAndReplyWithResult(
task_runner.get(), FROM_HERE, task_runner.get(), FROM_HERE,
base::BindOnce(&GetBestBindAddressOnUIThread), base::BindOnce(&GetBestBindAddressOnUIThread),
base::BindOnce(&DialServiceImpl::DiscoverOnAddresses, base::BindOnce(&DialServiceImpl::DiscoverOnAddresses,
weak_factory_.GetWeakPtr())); base::Unretained(this)));
#else #else
base::PostTaskWithTraitsAndReplyWithResult( auto task_runner = base::CreateTaskRunnerWithTraits({base::MayBlock()});
FROM_HERE, {base::MayBlock()}, base::BindOnce(&GetNetworkList), task_tracker_.PostTaskAndReplyWithResult(
task_runner.get(), FROM_HERE, base::BindOnce(&GetNetworkList),
base::BindOnce(&DialServiceImpl::SendNetworkList, base::BindOnce(&DialServiceImpl::SendNetworkList,
weak_factory_.GetWeakPtr())); base::Unretained(this)));
#endif #endif
} }
...@@ -537,12 +531,7 @@ void DialServiceImpl::BindAndAddSocket(const IPAddress& bind_ip_address) { ...@@ -537,12 +531,7 @@ void DialServiceImpl::BindAndAddSocket(const IPAddress& bind_ip_address) {
std::unique_ptr<DialServiceImpl::DialSocket> std::unique_ptr<DialServiceImpl::DialSocket>
DialServiceImpl::CreateDialSocket() { DialServiceImpl::CreateDialSocket() {
return base::MakeUnique<DialServiceImpl::DialSocket>( return base::MakeUnique<DialServiceImpl::DialSocket>(this);
base::Bind(&DialServiceImpl::NotifyOnDiscoveryRequest,
weak_factory_.GetWeakPtr()),
base::Bind(&DialServiceImpl::NotifyOnDeviceDiscovered,
weak_factory_.GetWeakPtr()),
base::Bind(&DialServiceImpl::NotifyOnError, weak_factory_.GetWeakPtr()));
} }
void DialServiceImpl::SendOneRequest() { void DialServiceImpl::SendOneRequest() {
......
...@@ -11,8 +11,8 @@ ...@@ -11,8 +11,8 @@
#include "base/gtest_prod_util.h" #include "base/gtest_prod_util.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h" #include "base/observer_list.h"
#include "base/task/cancelable_task_tracker.h"
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "net/base/ip_address.h" #include "net/base/ip_address.h"
#include "net/log/net_log_source.h" #include "net/log/net_log_source.h"
...@@ -111,13 +111,7 @@ class DialServiceImpl : public DialService { ...@@ -111,13 +111,7 @@ class DialServiceImpl : public DialService {
// DialSocket lives on the IO thread. // DialSocket lives on the IO thread.
class DialSocket { class DialSocket {
public: public:
// TODO(imcheng): Consider writing a DialSocket::Delegate interface that explicit DialSocket(DialServiceImpl* dial_service);
// declares methods for these callbacks, and taking a ptr to the delegate
// here.
DialSocket(
const base::Closure& discovery_request_cb,
const base::Callback<void(const DialDeviceData&)>& device_discovered_cb,
const base::Closure& on_error_cb);
~DialSocket(); ~DialSocket();
// Creates a socket using |net_log| and |net_log_source| and binds it to // Creates a socket using |net_log| and |net_log_source| and binds it to
...@@ -135,6 +129,11 @@ class DialServiceImpl : public DialService { ...@@ -135,6 +129,11 @@ class DialServiceImpl : public DialService {
bool IsClosed(); bool IsClosed();
private: private:
FRIEND_TEST_ALL_PREFIXES(DialServiceTest, TestNotifyOnError);
FRIEND_TEST_ALL_PREFIXES(DialServiceTest, TestOnDeviceDiscovered);
FRIEND_TEST_ALL_PREFIXES(DialServiceTest, TestOnDiscoveryRequest);
FRIEND_TEST_ALL_PREFIXES(DialServiceTest, TestResponseParsing);
// Checks the result of a socket operation. The name of the socket // Checks the result of a socket operation. The name of the socket
// operation is given by |operation| and the result of the operation is // operation is given by |operation| and the result of the operation is
// given by |result|. If the result is an error, closes the socket, // given by |result|. If the result is an error, closes the socket,
...@@ -174,25 +173,15 @@ class DialServiceImpl : public DialService { ...@@ -174,25 +173,15 @@ class DialServiceImpl : public DialService {
// The source of of the last socket read. // The source of of the last socket read.
net::IPEndPoint recv_address_; net::IPEndPoint recv_address_;
// The callback to be invoked when a discovery request was made.
base::Closure discovery_request_cb_;
// The callback to be invoked when a device has been discovered.
base::Callback<void(const DialDeviceData&)> device_discovered_cb_;
// The callback to be invoked when there is an error with socket operations.
base::Closure on_error_cb_;
// Marks whether there is an active write callback. // Marks whether there is an active write callback.
bool is_writing_; bool is_writing_;
// Marks whether there is an active read callback. // Marks whether there is an active read callback.
bool is_reading_; bool is_reading_;
FRIEND_TEST_ALL_PREFIXES(DialServiceTest, TestNotifyOnError); // Pointer to the DialServiceImpl that owns this socket.
FRIEND_TEST_ALL_PREFIXES(DialServiceTest, TestOnDeviceDiscovered); DialServiceImpl* const dial_service_;
FRIEND_TEST_ALL_PREFIXES(DialServiceTest, TestOnDiscoveryRequest);
FRIEND_TEST_ALL_PREFIXES(DialServiceTest, TestResponseParsing);
DISALLOW_COPY_AND_ASSIGN(DialSocket); DISALLOW_COPY_AND_ASSIGN(DialSocket);
}; };
...@@ -277,7 +266,7 @@ class DialServiceImpl : public DialService { ...@@ -277,7 +266,7 @@ class DialServiceImpl : public DialService {
// List of observers. // List of observers.
base::ObserverList<Observer> observer_list_; base::ObserverList<Observer> observer_list_;
base::WeakPtrFactory<DialServiceImpl> weak_factory_; base::CancelableTaskTracker task_tracker_;
friend class DialServiceTest; friend class DialServiceTest;
FRIEND_TEST_ALL_PREFIXES(DialServiceTest, TestSendMultipleRequests); FRIEND_TEST_ALL_PREFIXES(DialServiceTest, TestSendMultipleRequests);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_browser_thread_bundle.h"
#include "net/base/ip_address.h" #include "net/base/ip_address.h"
#include "net/base/ip_endpoint.h" #include "net/base/ip_endpoint.h"
#include "net/base/net_errors.h"
#include "net/base/network_interfaces.h" #include "net/base/network_interfaces.h"
#include "net/log/test_net_log.h" #include "net/log/test_net_log.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
...@@ -129,6 +130,12 @@ TEST_F(DialServiceTest, TestOnDiscoveryRequest) { ...@@ -129,6 +130,12 @@ TEST_F(DialServiceTest, TestOnDiscoveryRequest) {
dial_socket_->OnSocketWrite(num_bytes, num_bytes); dial_socket_->OnSocketWrite(num_bytes, num_bytes);
} }
TEST_F(DialServiceTest, TestNotifyOnError) {
EXPECT_CALL(mock_observer_, OnError(A<DialService*>(),
DialService::DIAL_SERVICE_NO_INTERFACES));
dial_socket_->OnSocketWrite(0, net::ERR_CONNECTION_REFUSED);
}
TEST_F(DialServiceTest, TestOnDeviceDiscovered) { TEST_F(DialServiceTest, TestOnDeviceDiscovered) {
dial_service_.discovery_active_ = true; dial_service_.discovery_active_ = true;
int response_size = arraysize(kValidResponse) - 1; int response_size = arraysize(kValidResponse) - 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment