Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(609)

Side by Side Diff: chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc

Issue 2868263002: [Media Router] Add some SetForTest() functions to DialMediaSinkService and update unit tests (Closed)
Patch Set: call Stop() in DialMediaSinkService dtor Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "chrome/browser/media/router/discovery/dial/dial_media_sink_service.h" 5 #include "chrome/browser/media/router/discovery/dial/dial_media_sink_service.h"
6 6
7 #include "chrome/browser/media/router/discovery/dial/dial_device_data.h" 7 #include "chrome/browser/media/router/discovery/dial/dial_device_data.h"
8 #include "chrome/browser/profiles/profile.h" 8 #include "chrome/browser/profiles/profile.h"
9 #include "content/public/browser/browser_thread.h" 9 #include "content/public/browser/browser_thread.h"
10 #include "net/url_request/url_request_context_getter.h" 10 #include "net/url_request/url_request_context_getter.h"
11 11
12 using content::BrowserThread; 12 using content::BrowserThread;
13 13
14 namespace { 14 namespace {
15 // Time interval when media sink service sends sinks to MRP. 15 // Time interval when media sink service sends sinks to MRP.
16 const int kFetchCompleteTimeoutSecs = 3; 16 const int kFetchCompleteTimeoutSecs = 3;
17 } 17 }
18 18
19 namespace media_router { 19 namespace media_router {
20 20
21 DialMediaSinkService::DialMediaSinkService( 21 DialMediaSinkService::DialMediaSinkService(
22 const OnSinksDiscoveredCallback& callback, 22 const OnSinksDiscoveredCallback& callback,
23 net::URLRequestContextGetter* request_context) 23 net::URLRequestContextGetter* request_context)
24 : MediaSinkService(callback), request_context_(request_context) { 24 : MediaSinkService(callback),
25 request_context_(request_context),
26 discovery_started_(false) {
25 DCHECK_CURRENTLY_ON(BrowserThread::IO); 27 DCHECK_CURRENTLY_ON(BrowserThread::IO);
26 DCHECK(request_context_); 28 DCHECK(request_context_);
27 } 29 }
28 30
29 DialMediaSinkService::~DialMediaSinkService() {} 31 DialMediaSinkService::~DialMediaSinkService() {
32 DCHECK_CURRENTLY_ON(BrowserThread::IO);
33 Stop();
34 }
30 35
31 void DialMediaSinkService::Start() { 36 void DialMediaSinkService::Start() {
32 DCHECK_CURRENTLY_ON(BrowserThread::IO); 37 DCHECK_CURRENTLY_ON(BrowserThread::IO);
33 dial_registry()->RegisterObserver(this); 38 if (discovery_started_)
34 dial_registry()->StartPeriodicDiscovery(); 39 return;
40 discovery_started_ = true;
41
42 if (!dial_registry_)
43 dial_registry_ = DialRegistry::GetInstance();
44
45 dial_registry_->RegisterObserver(this);
46 dial_registry_->OnListenerAdded();
35 } 47 }
36 48
37 void DialMediaSinkService::Stop() { 49 void DialMediaSinkService::Stop() {
38 DCHECK_CURRENTLY_ON(BrowserThread::IO); 50 DCHECK_CURRENTLY_ON(BrowserThread::IO);
39 dial_registry()->UnregisterObserver(this); 51 if (!discovery_started_)
40 } 52 return;
53 discovery_started_ = false;
41 54
42 DialRegistry* DialMediaSinkService::dial_registry() { 55 DCHECK(dial_registry_);
Kevin M 2017/05/10 23:22:01 It's not possible for dial_registry to be non-null
zhaobin 2017/05/11 19:46:25 Done.
43 DCHECK_CURRENTLY_ON(BrowserThread::IO); 56 dial_registry_->OnListenerRemoved();
44 return DialRegistry::GetInstance(); 57 dial_registry_->UnregisterObserver(this);
45 } 58 }
46 59
47 DeviceDescriptionService* DialMediaSinkService::GetDescriptionService() { 60 DeviceDescriptionService* DialMediaSinkService::GetDescriptionService() {
48 DCHECK_CURRENTLY_ON(BrowserThread::IO); 61 DCHECK_CURRENTLY_ON(BrowserThread::IO);
49 if (!description_service_.get()) { 62 if (!description_service_.get()) {
50 description_service_.reset(new DeviceDescriptionService( 63 description_service_.reset(new DeviceDescriptionService(
51 base::Bind(&DialMediaSinkService::OnDeviceDescriptionAvailable, 64 base::Bind(&DialMediaSinkService::OnDeviceDescriptionAvailable,
52 base::Unretained(this)), 65 base::Unretained(this)),
53 base::Bind(&DialMediaSinkService::OnDeviceDescriptionError, 66 base::Bind(&DialMediaSinkService::OnDeviceDescriptionError,
54 base::Unretained(this)))); 67 base::Unretained(this))));
55 } 68 }
56 return description_service_.get(); 69 return description_service_.get();
57 } 70 }
58 71
72 void DialMediaSinkService::SetDialRegistryForTest(DialRegistry* dial_registry) {
Kevin M 2017/05/10 23:22:01 Maybe DCHECK for !discovery_started_ on these SetF
zhaobin 2017/05/11 19:46:25 |discovery_started_| removed. Maybe test code coul
73 dial_registry_ = dial_registry;
74 }
75
76 void DialMediaSinkService::SetDescriptionServiceForTest(
77 std::unique_ptr<DeviceDescriptionService> description_service) {
78 description_service_ = std::move(description_service);
79 }
80
81 void DialMediaSinkService::SetTimerForTest(std::unique_ptr<base::Timer> timer) {
82 finish_timer_ = std::move(timer);
83 }
84
59 void DialMediaSinkService::OnDialDeviceEvent( 85 void DialMediaSinkService::OnDialDeviceEvent(
60 const DialRegistry::DeviceList& devices) { 86 const DialRegistry::DeviceList& devices) {
61 DCHECK_CURRENTLY_ON(BrowserThread::IO); 87 DCHECK_CURRENTLY_ON(BrowserThread::IO);
62 DVLOG(2) << "DialMediaSinkService::OnDialDeviceEvent found " << devices.size() 88 DVLOG(2) << "DialMediaSinkService::OnDialDeviceEvent found " << devices.size()
63 << " devices"; 89 << " devices";
64 90
65 // Add a finish timer. 91 StartTimer();
66 finish_timer_.reset(new base::OneShotTimer());
67 base::TimeDelta finish_delay =
68 base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs);
69 finish_timer_->Start(FROM_HERE, finish_delay, this,
70 &DialMediaSinkService::OnFetchCompleted);
71 92
72 current_sinks_.clear(); 93 current_sinks_.clear();
73 current_devices_ = devices; 94 current_devices_ = devices;
74 95
75 GetDescriptionService()->GetDeviceDescriptions(devices, 96 GetDescriptionService()->GetDeviceDescriptions(devices,
76 request_context_.get()); 97 request_context_.get());
77 } 98 }
78 99
79 void DialMediaSinkService::OnDialError(DialRegistry::DialErrorCode type) { 100 void DialMediaSinkService::OnDialError(DialRegistry::DialErrorCode type) {
80 DCHECK_CURRENTLY_ON(BrowserThread::IO); 101 DCHECK_CURRENTLY_ON(BrowserThread::IO);
(...skipping 19 matching lines...) Expand all
100 extra_data.app_url = description_data.app_url; 121 extra_data.app_url = description_data.app_url;
101 extra_data.model_name = description_data.model_name; 122 extra_data.model_name = description_data.model_name;
102 std::string ip_address = device_data.device_description_url().host(); 123 std::string ip_address = device_data.device_description_url().host();
103 if (!extra_data.ip_address.AssignFromIPLiteral(ip_address)) { 124 if (!extra_data.ip_address.AssignFromIPLiteral(ip_address)) {
104 DVLOG(1) << "Invalid ip_address: " << ip_address; 125 DVLOG(1) << "Invalid ip_address: " << ip_address;
105 return; 126 return;
106 } 127 }
107 128
108 current_sinks_.insert(MediaSinkInternal(sink, extra_data)); 129 current_sinks_.insert(MediaSinkInternal(sink, extra_data));
109 130
110 if (finish_timer_)
111 return;
112
113 // Start fetch timer again if device description comes back after 131 // Start fetch timer again if device description comes back after
114 // |finish_timer_| fires. 132 // |finish_timer_| fires.
115 base::TimeDelta finish_delay = 133 DCHECK(finish_timer_);
116 base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs); 134 if (!finish_timer_->IsRunning())
117 finish_timer_.reset(new base::OneShotTimer()); 135 StartTimer();
118 finish_timer_->Start(FROM_HERE, finish_delay, this,
119 &DialMediaSinkService::OnFetchCompleted);
120 } 136 }
121 137
122 void DialMediaSinkService::OnDeviceDescriptionError( 138 void DialMediaSinkService::OnDeviceDescriptionError(
123 const DialDeviceData& device, 139 const DialDeviceData& device,
124 const std::string& error_message) { 140 const std::string& error_message) {
125 DCHECK_CURRENTLY_ON(BrowserThread::IO); 141 DCHECK_CURRENTLY_ON(BrowserThread::IO);
126 DVLOG(2) << "OnDescriptionFetchesError [message]: " << error_message; 142 DVLOG(2) << "OnDescriptionFetchesError [message]: " << error_message;
127 } 143 }
128 144
129 void DialMediaSinkService::OnFetchCompleted() { 145 void DialMediaSinkService::OnFetchCompleted() {
130 DCHECK_CURRENTLY_ON(BrowserThread::IO); 146 DCHECK_CURRENTLY_ON(BrowserThread::IO);
131 DCHECK(!sink_discovery_callback_.is_null()); 147 DCHECK(!sink_discovery_callback_.is_null());
132 148
133 finish_timer_.reset(); 149 if (current_sinks_ == mrp_sinks_) {
134
135 auto sinks = current_sinks_;
136 if (sinks == mrp_sinks_) {
137 DVLOG(2) << "No update to sink list."; 150 DVLOG(2) << "No update to sink list.";
138 return; 151 return;
139 } 152 }
140 153
154 auto sinks = current_sinks_;
Kevin Marshall 2017/05/10 23:25:10 This seems like an avoidable copy.
zhaobin 2017/05/11 19:46:25 Done.
141 DVLOG(2) << "Send sinks to media router, [size]: " << sinks.size(); 155 DVLOG(2) << "Send sinks to media router, [size]: " << sinks.size();
142 sink_discovery_callback_.Run( 156 sink_discovery_callback_.Run(
143 std::vector<MediaSinkInternal>(sinks.begin(), sinks.end())); 157 std::vector<MediaSinkInternal>(sinks.begin(), sinks.end()));
144 mrp_sinks_ = std::move(sinks); 158 mrp_sinks_ = std::move(sinks);
145 } 159 }
146 160
161 void DialMediaSinkService::StartTimer() {
162 DCHECK_CURRENTLY_ON(BrowserThread::IO);
163 // Create a finish timer.
164 if (!finish_timer_)
165 finish_timer_.reset(new base::OneShotTimer());
166
167 base::TimeDelta finish_delay =
168 base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs);
169 finish_timer_->Start(FROM_HERE, finish_delay,
170 base::Bind(&DialMediaSinkService::OnFetchCompleted,
171 base::Unretained(this)));
172 }
173
147 } // namespace media_router 174 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698