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

Side by Side Diff: chrome/browser/extensions/api/dial/dial_service_unittest.cc

Issue 2756483007: [Device Discovery] Move files from browser/extensions/api/dial to browser/media/router/discovery/di… (Closed)
Patch Set: resolve code review comments from Devlin Created 3 years, 9 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/extensions/api/dial/dial_service.h"
6
7 #include <stddef.h>
8
9 #include <memory>
10
11 #include "base/macros.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/run_loop.h"
14 #include "chrome/browser/extensions/api/dial/dial_device_data.h"
15 #include "content/public/test/test_browser_thread_bundle.h"
16 #include "net/base/ip_address.h"
17 #include "net/base/ip_endpoint.h"
18 #include "net/base/network_interfaces.h"
19 #include "net/log/test_net_log.h"
20 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22
23 using base::Time;
24 using base::TimeDelta;
25 using ::testing::A;
26 using ::testing::AtLeast;
27 using ::testing::Return;
28
29 namespace {
30
31 const char kValidResponse[] =
32 "HTTP/1.1 OK\r\n"
33 "LOCATION: http://127.0.0.1/dd.xml\r\n"
34 "USN: some_id\r\n"
35 "CACHE-CONTROL: max-age=1800\r\n"
36 "CONFIGID.UPNP.ORG: 1\r\n\r\n";
37
38 } // namespace
39
40 namespace extensions {
41 namespace api {
42 namespace dial {
43
44 class MockObserver : public DialService::Observer {
45 public:
46 ~MockObserver() override {}
47
48 MOCK_METHOD1(OnDiscoveryRequest, void(DialService*));
49 MOCK_METHOD2(OnDeviceDiscovered, void(DialService*, const DialDeviceData&));
50 MOCK_METHOD1(OnDiscoveryFinished, void(DialService*));
51 MOCK_METHOD2(OnError, void(DialService*,
52 const DialService::DialServiceErrorCode&));
53 };
54
55 class DialServiceTest : public testing::Test {
56 public:
57 DialServiceTest()
58 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
59 mock_ip_(net::IPAddress::IPv4AllZeros()),
60 dial_service_(&test_net_log_) {
61 dial_service_.AddObserver(&mock_observer_);
62 dial_socket_ = dial_service_.CreateDialSocket();
63 }
64 protected:
65 content::TestBrowserThreadBundle thread_bundle_;
66 net::TestNetLog test_net_log_;
67 net::IPAddress mock_ip_;
68 DialServiceImpl dial_service_;
69 std::unique_ptr<DialServiceImpl::DialSocket> dial_socket_;
70 MockObserver mock_observer_;
71 };
72
73 TEST_F(DialServiceTest, TestSendMultipleRequests) {
74 // Setting the finish delay to zero disables the timer that invokes
75 // FinishDiscovery().
76 dial_service_.finish_delay_ = TimeDelta::FromSeconds(0);
77 dial_service_.request_interval_ = TimeDelta::FromSeconds(0);
78 dial_service_.max_requests_ = 4;
79 dial_service_.discovery_active_ = true;
80 EXPECT_CALL(mock_observer_, OnDiscoveryRequest(A<DialService*>())).Times(4);
81 EXPECT_CALL(mock_observer_, OnDiscoveryFinished(A<DialService*>())).Times(1);
82 dial_service_.BindAndAddSocket(mock_ip_);
83 EXPECT_EQ(1u, dial_service_.dial_sockets_.size());
84 dial_service_.SendOneRequest();
85 base::RunLoop().RunUntilIdle();
86 dial_service_.FinishDiscovery();
87 }
88
89 TEST_F(DialServiceTest, TestMultipleNetworkInterfaces) {
90 // Setting the finish delay to zero disables the timer that invokes
91 // FinishDiscovery().
92 dial_service_.finish_delay_ = TimeDelta::FromSeconds(0);
93 dial_service_.request_interval_ = TimeDelta::FromSeconds(0);
94 dial_service_.max_requests_ = 4;
95 dial_service_.discovery_active_ = true;
96 net::NetworkInterfaceList interface_list;
97 interface_list.push_back(
98 net::NetworkInterface("network1",
99 "network1",
100 0,
101 net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
102 mock_ip_,
103 0,
104 net::IP_ADDRESS_ATTRIBUTE_NONE));
105 interface_list.push_back(
106 net::NetworkInterface("network2",
107 "network2",
108 1,
109 net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
110 mock_ip_,
111 0,
112 net::IP_ADDRESS_ATTRIBUTE_NONE));
113 interface_list.push_back(
114 net::NetworkInterface("network3",
115 "network3",
116 2,
117 net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
118 mock_ip_,
119 0,
120 net::IP_ADDRESS_ATTRIBUTE_NONE));
121
122 // "network4" is equivalent to "network2" because both the address family
123 // and interface index are the same.
124 interface_list.push_back(
125 net::NetworkInterface("network4",
126 "network4",
127 1,
128 net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
129 mock_ip_,
130 0,
131 net::IP_ADDRESS_ATTRIBUTE_NONE));
132
133 // 3 sockets * 4 requests per socket = 12 requests
134 EXPECT_CALL(mock_observer_, OnDiscoveryRequest(A<DialService*>())).Times(12);
135 EXPECT_CALL(mock_observer_, OnDiscoveryFinished(A<DialService*>())).Times(1);
136
137 dial_service_.SendNetworkList(interface_list);
138 EXPECT_EQ(3u, dial_service_.dial_sockets_.size());
139
140 base::RunLoop().RunUntilIdle();
141 dial_service_.FinishDiscovery();
142 }
143
144 TEST_F(DialServiceTest, TestOnDiscoveryRequest) {
145 dial_service_.discovery_active_ = true;
146 dial_service_.num_requests_sent_ = 1;
147 dial_service_.max_requests_ = 1;
148 size_t num_bytes = dial_service_.send_buffer_->size();
149 EXPECT_CALL(mock_observer_, OnDiscoveryRequest(A<DialService*>())).Times(1);
150 dial_socket_->OnSocketWrite(num_bytes, num_bytes);
151 }
152
153 TEST_F(DialServiceTest, TestOnDeviceDiscovered) {
154 dial_service_.discovery_active_ = true;
155 int response_size = arraysize(kValidResponse) - 1;
156 dial_socket_->recv_buffer_ =
157 new net::IOBufferWithSize(response_size);
158 strncpy(dial_socket_->recv_buffer_->data(),
159 kValidResponse,
160 response_size);
161 dial_socket_->recv_address_ = net::IPEndPoint(mock_ip_, 12345);
162
163 DialDeviceData expected_device;
164 expected_device.set_device_id("some_id");
165
166 EXPECT_CALL(mock_observer_,
167 OnDeviceDiscovered(A<DialService*>(), expected_device))
168 .Times(1);
169 dial_socket_->OnSocketRead(response_size);
170 }
171
172 TEST_F(DialServiceTest, TestOnDiscoveryFinished) {
173 dial_service_.discovery_active_ = true;
174
175 EXPECT_CALL(mock_observer_, OnDiscoveryFinished(A<DialService*>())).Times(1);
176 dial_service_.FinishDiscovery();
177 EXPECT_FALSE(dial_service_.discovery_active_);
178 }
179
180 TEST_F(DialServiceTest, TestResponseParsing) {
181 Time now = Time::Now();
182
183 // Successful case
184 DialDeviceData parsed;
185 EXPECT_TRUE(DialServiceImpl::DialSocket::ParseResponse(
186 kValidResponse, now, &parsed));
187 EXPECT_EQ("some_id", parsed.device_id());
188 EXPECT_EQ("http://127.0.0.1/dd.xml", parsed.device_description_url().spec());
189 EXPECT_EQ(1, parsed.config_id());
190 EXPECT_EQ(now, parsed.response_time());
191
192 // Failure cases
193 DialDeviceData not_parsed;
194
195 // Empty, garbage
196 EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
197 std::string(), now, &not_parsed));
198 EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
199 "\r\n\r\n",
200 now, &not_parsed));
201 EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
202 "xyzzy",
203 now, &not_parsed));
204
205 // No headers
206 EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
207 "HTTP/1.1 OK\r\n\r\n",
208 now, &not_parsed));
209
210 // Missing LOCATION
211 EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
212 "HTTP/1.1 OK\r\n"
213 "USN: some_id\r\n\r\n",
214 now, &not_parsed));
215
216 // Empty LOCATION
217 EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
218 "HTTP/1.1 OK\r\n"
219 "LOCATION:\r\n"
220 "USN: some_id\r\n\r\n",
221 now, &not_parsed));
222
223 // Missing USN
224 EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
225 "HTTP/1.1 OK\r\n"
226 "LOCATION: http://127.0.0.1/dd.xml\r\n\r\n",
227 now, &not_parsed));
228
229 // Empty USN
230 EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
231 "HTTP/1.1 OK\r\n"
232 "LOCATION: http://127.0.0.1/dd.xml\r\n"
233 "USN:\r\n\r\n",
234 now, &not_parsed));
235 }
236
237 } // namespace dial
238 } // namespace api
239 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/dial/dial_service.cc ('k') | chrome/browser/media/router/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698