OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/extensions/extension_apitest.h" | 5 #include "chrome/browser/extensions/extension_apitest.h" |
6 #include "content/public/browser/browser_thread.h" | 6 #include "content/public/browser/browser_thread.h" |
7 #include "content/public/test/test_utils.h" | 7 #include "content/public/test/test_utils.h" |
8 #include "device/usb/usb_service.h" | 8 #include "device/usb/usb_service.h" |
9 #include "extensions/browser/api/device_permissions_prompt.h" | 9 #include "extensions/browser/api/device_permissions_prompt.h" |
10 #include "extensions/browser/api/usb/usb_api.h" | 10 #include "extensions/browser/api/usb/usb_api.h" |
11 #include "extensions/shell/browser/shell_extensions_api_client.h" | 11 #include "extensions/shell/browser/shell_extensions_api_client.h" |
12 #include "extensions/shell/test/shell_apitest.h" | 12 #include "extensions/shell/test/shell_apitest.h" |
13 #include "extensions/test/extension_test_message_listener.h" | 13 #include "extensions/test/extension_test_message_listener.h" |
14 #include "net/base/io_buffer.h" | 14 #include "net/base/io_buffer.h" |
15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
16 | 16 |
17 using testing::_; | 17 using testing::_; |
18 using testing::AnyNumber; | 18 using testing::AnyNumber; |
19 using testing::Invoke; | 19 using testing::Invoke; |
20 using testing::Return; | 20 using testing::Return; |
21 using content::BrowserThread; | 21 using content::BrowserThread; |
22 using device::UsbConfigDescriptor; | 22 using device::UsbConfigDescriptor; |
23 using device::UsbDevice; | 23 using device::UsbDevice; |
24 using device::UsbDeviceHandle; | 24 using device::UsbDeviceHandle; |
25 using device::UsbEndpointDirection; | 25 using device::UsbEndpointDirection; |
26 using device::UsbInterfaceDescriptor; | 26 using device::UsbInterfaceDescriptor; |
27 using device::UsbService; | 27 using device::UsbService; |
28 using device::UsbTransferCallback; | |
29 | 28 |
30 namespace extensions { | 29 namespace extensions { |
31 | 30 |
32 namespace { | 31 namespace { |
33 | 32 |
| 33 ACTION_TEMPLATE(InvokeCallback, |
| 34 HAS_1_TEMPLATE_PARAMS(int, k), |
| 35 AND_1_VALUE_PARAMS(p1)) { |
| 36 ::std::tr1::get<k>(args).Run(p1); |
| 37 } |
| 38 |
34 ACTION_TEMPLATE(InvokeUsbTransferCallback, | 39 ACTION_TEMPLATE(InvokeUsbTransferCallback, |
35 HAS_1_TEMPLATE_PARAMS(int, k), | 40 HAS_1_TEMPLATE_PARAMS(int, k), |
36 AND_1_VALUE_PARAMS(p1)) { | 41 AND_1_VALUE_PARAMS(p1)) { |
37 net::IOBuffer* io_buffer = new net::IOBuffer(1); | 42 net::IOBuffer* io_buffer = new net::IOBuffer(1); |
38 memset(io_buffer->data(), 0, 1); // Avoid uninitialized reads. | 43 memset(io_buffer->data(), 0, 1); // Avoid uninitialized reads. |
39 ::std::tr1::get<k>(args).Run(p1, io_buffer, 1); | 44 ::std::tr1::get<k>(args).Run(p1, io_buffer, 1); |
40 } | 45 } |
41 | 46 |
42 class TestDevicePermissionsPrompt | 47 class TestDevicePermissionsPrompt |
43 : public DevicePermissionsPrompt, | 48 : public DevicePermissionsPrompt, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 MOCK_METHOD10(ControlTransfer, | 85 MOCK_METHOD10(ControlTransfer, |
81 void(UsbEndpointDirection direction, | 86 void(UsbEndpointDirection direction, |
82 TransferRequestType request_type, | 87 TransferRequestType request_type, |
83 TransferRecipient recipient, | 88 TransferRecipient recipient, |
84 uint8 request, | 89 uint8 request, |
85 uint16 value, | 90 uint16 value, |
86 uint16 index, | 91 uint16 index, |
87 net::IOBuffer* buffer, | 92 net::IOBuffer* buffer, |
88 size_t length, | 93 size_t length, |
89 unsigned int timeout, | 94 unsigned int timeout, |
90 const UsbTransferCallback& callback)); | 95 const TransferCallback& callback)); |
91 | 96 |
92 MOCK_METHOD6(BulkTransfer, | 97 MOCK_METHOD6(BulkTransfer, |
93 void(UsbEndpointDirection direction, | 98 void(UsbEndpointDirection direction, |
94 uint8 endpoint, | 99 uint8 endpoint, |
95 net::IOBuffer* buffer, | 100 net::IOBuffer* buffer, |
96 size_t length, | 101 size_t length, |
97 unsigned int timeout, | 102 unsigned int timeout, |
98 const UsbTransferCallback& callback)); | 103 const TransferCallback& callback)); |
99 | 104 |
100 MOCK_METHOD6(InterruptTransfer, | 105 MOCK_METHOD6(InterruptTransfer, |
101 void(UsbEndpointDirection direction, | 106 void(UsbEndpointDirection direction, |
102 uint8 endpoint, | 107 uint8 endpoint, |
103 net::IOBuffer* buffer, | 108 net::IOBuffer* buffer, |
104 size_t length, | 109 size_t length, |
105 unsigned int timeout, | 110 unsigned int timeout, |
106 const UsbTransferCallback& callback)); | 111 const TransferCallback& callback)); |
107 | 112 |
108 MOCK_METHOD8(IsochronousTransfer, | 113 MOCK_METHOD8(IsochronousTransfer, |
109 void(UsbEndpointDirection direction, | 114 void(UsbEndpointDirection direction, |
110 uint8 endpoint, | 115 uint8 endpoint, |
111 net::IOBuffer* buffer, | 116 net::IOBuffer* buffer, |
112 size_t length, | 117 size_t length, |
113 unsigned int packets, | 118 unsigned int packets, |
114 unsigned int packet_length, | 119 unsigned int packet_length, |
115 unsigned int timeout, | 120 unsigned int timeout, |
116 const UsbTransferCallback& callback)); | 121 const TransferCallback& callback)); |
117 | 122 |
118 MOCK_METHOD0(ResetDevice, bool()); | 123 MOCK_METHOD1(ResetDevice, void(const ResultCallback& callback)); |
119 MOCK_METHOD2(GetStringDescriptor, bool(uint8_t, base::string16*)); | 124 MOCK_METHOD2(GetStringDescriptor, bool(uint8_t, base::string16*)); |
120 MOCK_METHOD1(SetConfiguration, bool(int)); | 125 MOCK_METHOD2(SetConfiguration, |
121 MOCK_METHOD1(ClaimInterface, bool(int interface_number)); | 126 void(int configuration_value, const ResultCallback& callback)); |
| 127 MOCK_METHOD2(ClaimInterface, |
| 128 void(int interface_number, const ResultCallback& callback)); |
122 MOCK_METHOD1(ReleaseInterface, bool(int interface_number)); | 129 MOCK_METHOD1(ReleaseInterface, bool(int interface_number)); |
123 MOCK_METHOD2(SetInterfaceAlternateSetting, | 130 MOCK_METHOD3(SetInterfaceAlternateSetting, |
124 bool(int interface_number, int alternate_setting)); | 131 void(int interface_number, |
| 132 int alternate_setting, |
| 133 const ResultCallback& callback)); |
125 | 134 |
126 virtual scoped_refptr<UsbDevice> GetDevice() const override { | 135 virtual scoped_refptr<UsbDevice> GetDevice() const override { |
127 return device_; | 136 return device_; |
128 } | 137 } |
129 | 138 |
130 void set_device(UsbDevice* device) { device_ = device; } | 139 void set_device(UsbDevice* device) { device_ = device; } |
131 | 140 |
132 protected: | 141 protected: |
133 UsbDevice* device_; | 142 UsbDevice* device_; |
134 | 143 |
135 virtual ~MockUsbDeviceHandle() {} | 144 virtual ~MockUsbDeviceHandle() {} |
136 }; | 145 }; |
137 | 146 |
138 class MockUsbDevice : public UsbDevice { | 147 class MockUsbDevice : public UsbDevice { |
139 public: | 148 public: |
140 MockUsbDevice(uint16 vendor_id, uint16 product_id, uint32 unique_id) | 149 MockUsbDevice(uint16 vendor_id, uint16 product_id, uint32 unique_id) |
141 : UsbDevice(vendor_id, product_id, unique_id) {} | 150 : UsbDevice(vendor_id, |
| 151 product_id, |
| 152 unique_id, |
| 153 base::string16(), |
| 154 base::string16(), |
| 155 base::string16()) {} |
142 | 156 |
143 MOCK_METHOD0(Open, scoped_refptr<UsbDeviceHandle>()); | 157 MOCK_METHOD1(Open, void(const OpenCallback&)); |
144 MOCK_METHOD1(Close, bool(scoped_refptr<UsbDeviceHandle>)); | 158 MOCK_METHOD1(Close, bool(scoped_refptr<UsbDeviceHandle>)); |
145 MOCK_METHOD0(GetConfiguration, const device::UsbConfigDescriptor*()); | 159 MOCK_METHOD0(GetConfiguration, const device::UsbConfigDescriptor*()); |
146 MOCK_METHOD1(GetManufacturer, bool(base::string16*)); | |
147 MOCK_METHOD1(GetProduct, bool(base::string16*)); | |
148 MOCK_METHOD1(GetSerialNumber, bool(base::string16*)); | |
149 | 160 |
150 private: | 161 private: |
151 virtual ~MockUsbDevice() {} | 162 virtual ~MockUsbDevice() {} |
152 }; | 163 }; |
153 | 164 |
154 class MockUsbService : public UsbService { | 165 class MockUsbService : public UsbService { |
155 public: | 166 public: |
156 explicit MockUsbService(scoped_refptr<UsbDevice> device) : device_(device) {} | 167 explicit MockUsbService(scoped_refptr<UsbDevice> device) : device_(device) {} |
157 | 168 |
158 // Public wrapper around the protected base class method. | 169 // Public wrapper around the protected base class method. |
159 void NotifyDeviceAdded(scoped_refptr<UsbDevice> device) { | 170 void NotifyDeviceAdded(scoped_refptr<UsbDevice> device) { |
160 UsbService::NotifyDeviceAdded(device); | 171 UsbService::NotifyDeviceAdded(device); |
161 } | 172 } |
162 | 173 |
163 // Public wrapper around the protected base class method. | 174 // Public wrapper around the protected base class method. |
164 void NotifyDeviceRemoved(scoped_refptr<UsbDevice> device) { | 175 void NotifyDeviceRemoved(scoped_refptr<UsbDevice> device) { |
165 UsbService::NotifyDeviceRemoved(device); | 176 UsbService::NotifyDeviceRemoved(device); |
166 } | 177 } |
167 | 178 |
168 protected: | 179 protected: |
169 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { | 180 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { |
170 EXPECT_EQ(unique_id, 0U); | 181 EXPECT_EQ(unique_id, 0U); |
171 return device_; | 182 return device_; |
172 } | 183 } |
173 | 184 |
174 void GetDevices(std::vector<scoped_refptr<UsbDevice>>* devices) override { | 185 void GetDevices(const GetDevicesCallback& callback) override { |
175 STLClearObject(devices); | 186 std::vector<scoped_refptr<UsbDevice>> devices; |
176 devices->push_back(device_); | 187 devices.push_back(device_); |
| 188 callback.Run(devices); |
177 } | 189 } |
178 | 190 |
179 scoped_refptr<UsbDevice> device_; | 191 scoped_refptr<UsbDevice> device_; |
180 }; | 192 }; |
181 | 193 |
182 class UsbApiTest : public ShellApiTest { | 194 class UsbApiTest : public ShellApiTest { |
183 public: | 195 public: |
184 void SetUpOnMainThread() override { | 196 void SetUpOnMainThread() override { |
185 ShellApiTest::SetUpOnMainThread(); | 197 ShellApiTest::SetUpOnMainThread(); |
186 | 198 |
187 mock_device_ = new MockUsbDevice(0, 0, 0); | 199 mock_device_ = new MockUsbDevice(0, 0, 0); |
188 EXPECT_CALL(*mock_device_.get(), GetManufacturer(_)) | |
189 .WillRepeatedly(Return(false)); | |
190 EXPECT_CALL(*mock_device_.get(), GetProduct(_)) | |
191 .WillRepeatedly(Return(false)); | |
192 EXPECT_CALL(*mock_device_.get(), GetSerialNumber(_)) | |
193 .WillRepeatedly(Return(false)); | |
194 | |
195 mock_device_handle_ = new MockUsbDeviceHandle(); | 200 mock_device_handle_ = new MockUsbDeviceHandle(); |
196 mock_device_handle_->set_device(mock_device_.get()); | 201 mock_device_handle_->set_device(mock_device_.get()); |
197 EXPECT_CALL(*mock_device_.get(), Open()) | 202 EXPECT_CALL(*mock_device_.get(), Open(_)) |
198 .WillRepeatedly(Return(mock_device_handle_)); | 203 .WillRepeatedly(InvokeCallback<0>(mock_device_handle_)); |
199 | 204 mock_service_.reset(new MockUsbService(mock_device_)); |
200 base::RunLoop run_loop; | |
201 BrowserThread::PostTaskAndReply(BrowserThread::FILE, FROM_HERE, | |
202 base::Bind(&UsbApiTest::SetUpService, this), | |
203 run_loop.QuitClosure()); | |
204 run_loop.Run(); | |
205 } | |
206 | |
207 void SetUpService() { | |
208 mock_service_ = new MockUsbService(mock_device_); | |
209 UsbService::SetInstanceForTest(mock_service_); | |
210 } | |
211 | |
212 void AddTestDevices() { | |
213 scoped_refptr<MockUsbDevice> device(new MockUsbDevice(0x18D1, 0x58F0, 1)); | |
214 EXPECT_CALL(*device.get(), GetSerialNumber(_)) | |
215 .WillRepeatedly(Return(false)); | |
216 mock_service_->NotifyDeviceAdded(device); | |
217 | |
218 device = new MockUsbDevice(0x18D1, 0x58F1, 2); | |
219 EXPECT_CALL(*device.get(), GetSerialNumber(_)) | |
220 .WillRepeatedly(Return(false)); | |
221 mock_service_->NotifyDeviceAdded(device); | |
222 } | 205 } |
223 | 206 |
224 protected: | 207 protected: |
225 scoped_refptr<MockUsbDeviceHandle> mock_device_handle_; | 208 scoped_refptr<MockUsbDeviceHandle> mock_device_handle_; |
226 scoped_refptr<MockUsbDevice> mock_device_; | 209 scoped_refptr<MockUsbDevice> mock_device_; |
227 MockUsbService* mock_service_; | 210 scoped_ptr<MockUsbService> mock_service_; |
228 }; | 211 }; |
229 | 212 |
230 } // namespace | 213 } // namespace |
231 | 214 |
232 IN_PROC_BROWSER_TEST_F(UsbApiTest, DeviceHandling) { | 215 IN_PROC_BROWSER_TEST_F(UsbApiTest, DeviceHandling) { |
233 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(2); | 216 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(2); |
234 ASSERT_TRUE(RunAppTest("api_test/usb/device_handling")); | 217 ASSERT_TRUE(RunAppTest("api_test/usb/device_handling")); |
235 } | 218 } |
236 | 219 |
237 IN_PROC_BROWSER_TEST_F(UsbApiTest, ResetDevice) { | 220 IN_PROC_BROWSER_TEST_F(UsbApiTest, ResetDevice) { |
238 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(2); | 221 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(2); |
239 EXPECT_CALL(*mock_device_handle_.get(), ResetDevice()) | 222 EXPECT_CALL(*mock_device_handle_.get(), ResetDevice(_)) |
240 .WillOnce(Return(true)) | 223 .WillOnce(InvokeCallback<0>(true)) |
241 .WillOnce(Return(false)); | 224 .WillOnce(InvokeCallback<0>(false)); |
242 EXPECT_CALL(*mock_device_handle_.get(), | 225 EXPECT_CALL(*mock_device_handle_.get(), |
243 InterruptTransfer(device::USB_DIRECTION_OUTBOUND, 2, _, 1, _, _)) | 226 InterruptTransfer(device::USB_DIRECTION_OUTBOUND, 2, _, 1, _, _)) |
244 .WillOnce(InvokeUsbTransferCallback<5>(device::USB_TRANSFER_COMPLETED)); | 227 .WillOnce(InvokeUsbTransferCallback<5>(device::USB_TRANSFER_COMPLETED)); |
245 ASSERT_TRUE(RunAppTest("api_test/usb/reset_device")); | 228 ASSERT_TRUE(RunAppTest("api_test/usb/reset_device")); |
246 } | 229 } |
247 | 230 |
248 IN_PROC_BROWSER_TEST_F(UsbApiTest, SetConfiguration) { | 231 IN_PROC_BROWSER_TEST_F(UsbApiTest, SetConfiguration) { |
249 UsbConfigDescriptor config_descriptor; | 232 UsbConfigDescriptor config_descriptor; |
250 EXPECT_CALL(*mock_device_handle_.get(), SetConfiguration(1)) | 233 EXPECT_CALL(*mock_device_handle_.get(), SetConfiguration(1, _)) |
251 .WillOnce(Return(true)); | 234 .WillOnce(InvokeCallback<1>(true)); |
252 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(1); | 235 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(1); |
253 EXPECT_CALL(*mock_device_.get(), GetConfiguration()) | 236 EXPECT_CALL(*mock_device_.get(), GetConfiguration()) |
254 .WillOnce(Return(nullptr)) | 237 .WillOnce(Return(nullptr)) |
255 .WillOnce(Return(&config_descriptor)); | 238 .WillOnce(Return(&config_descriptor)); |
256 ASSERT_TRUE(RunAppTest("api_test/usb/set_configuration")); | 239 ASSERT_TRUE(RunAppTest("api_test/usb/set_configuration")); |
257 } | 240 } |
258 | 241 |
259 IN_PROC_BROWSER_TEST_F(UsbApiTest, ListInterfaces) { | 242 IN_PROC_BROWSER_TEST_F(UsbApiTest, ListInterfaces) { |
260 UsbConfigDescriptor config_descriptor; | 243 UsbConfigDescriptor config_descriptor; |
261 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(1); | 244 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(1); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 } | 301 } |
319 | 302 |
320 IN_PROC_BROWSER_TEST_F(UsbApiTest, OnDeviceAdded) { | 303 IN_PROC_BROWSER_TEST_F(UsbApiTest, OnDeviceAdded) { |
321 ExtensionTestMessageListener load_listener("loaded", false); | 304 ExtensionTestMessageListener load_listener("loaded", false); |
322 ExtensionTestMessageListener result_listener("success", false); | 305 ExtensionTestMessageListener result_listener("success", false); |
323 result_listener.set_failure_message("failure"); | 306 result_listener.set_failure_message("failure"); |
324 | 307 |
325 ASSERT_TRUE(LoadApp("api_test/usb/add_event")); | 308 ASSERT_TRUE(LoadApp("api_test/usb/add_event")); |
326 ASSERT_TRUE(load_listener.WaitUntilSatisfied()); | 309 ASSERT_TRUE(load_listener.WaitUntilSatisfied()); |
327 | 310 |
328 base::RunLoop run_loop; | 311 scoped_refptr<MockUsbDevice> device(new MockUsbDevice(0x18D1, 0x58F0, 1)); |
329 BrowserThread::PostTaskAndReply( | 312 mock_service_->NotifyDeviceAdded(device); |
330 BrowserThread::FILE, FROM_HERE, | 313 |
331 base::Bind(&UsbApiTest::AddTestDevices, base::Unretained(this)), | 314 device = new MockUsbDevice(0x18D1, 0x58F1, 2); |
332 run_loop.QuitClosure()); | 315 mock_service_->NotifyDeviceAdded(device); |
333 run_loop.Run(); | |
334 | 316 |
335 ASSERT_TRUE(result_listener.WaitUntilSatisfied()); | 317 ASSERT_TRUE(result_listener.WaitUntilSatisfied()); |
336 } | 318 } |
337 | 319 |
338 IN_PROC_BROWSER_TEST_F(UsbApiTest, OnDeviceRemoved) { | 320 IN_PROC_BROWSER_TEST_F(UsbApiTest, OnDeviceRemoved) { |
339 ExtensionTestMessageListener load_listener("loaded", false); | 321 ExtensionTestMessageListener load_listener("loaded", false); |
340 ExtensionTestMessageListener result_listener("success", false); | 322 ExtensionTestMessageListener result_listener("success", false); |
341 result_listener.set_failure_message("failure"); | 323 result_listener.set_failure_message("failure"); |
342 | 324 |
343 ASSERT_TRUE(LoadApp("api_test/usb/remove_event")); | 325 ASSERT_TRUE(LoadApp("api_test/usb/remove_event")); |
344 ASSERT_TRUE(load_listener.WaitUntilSatisfied()); | 326 ASSERT_TRUE(load_listener.WaitUntilSatisfied()); |
345 | 327 |
346 base::RunLoop run_loop; | 328 mock_service_->NotifyDeviceRemoved(mock_device_); |
347 BrowserThread::PostTaskAndReply( | |
348 BrowserThread::FILE, FROM_HERE, | |
349 base::Bind(&MockUsbService::NotifyDeviceRemoved, | |
350 base::Unretained(mock_service_), mock_device_), | |
351 run_loop.QuitClosure()); | |
352 run_loop.Run(); | |
353 | |
354 ASSERT_TRUE(result_listener.WaitUntilSatisfied()); | 329 ASSERT_TRUE(result_listener.WaitUntilSatisfied()); |
355 } | 330 } |
356 | 331 |
357 IN_PROC_BROWSER_TEST_F(UsbApiTest, GetUserSelectedDevices) { | 332 IN_PROC_BROWSER_TEST_F(UsbApiTest, GetUserSelectedDevices) { |
358 ExtensionTestMessageListener ready_listener("opened_device", false); | 333 ExtensionTestMessageListener ready_listener("opened_device", false); |
359 ExtensionTestMessageListener result_listener("success", false); | 334 ExtensionTestMessageListener result_listener("success", false); |
360 result_listener.set_failure_message("failure"); | 335 result_listener.set_failure_message("failure"); |
361 | 336 |
362 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(1); | 337 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(1); |
363 | 338 |
364 TestExtensionsAPIClient test_api_client; | 339 TestExtensionsAPIClient test_api_client; |
365 ASSERT_TRUE(LoadApp("api_test/usb/get_user_selected_devices")); | 340 ASSERT_TRUE(LoadApp("api_test/usb/get_user_selected_devices")); |
366 ASSERT_TRUE(ready_listener.WaitUntilSatisfied()); | 341 ASSERT_TRUE(ready_listener.WaitUntilSatisfied()); |
367 | 342 |
368 base::RunLoop run_loop; | 343 mock_service_->NotifyDeviceRemoved(mock_device_); |
369 BrowserThread::PostTaskAndReply( | |
370 BrowserThread::FILE, FROM_HERE, | |
371 base::Bind(&MockUsbService::NotifyDeviceRemoved, | |
372 base::Unretained(mock_service_), mock_device_), | |
373 run_loop.QuitClosure()); | |
374 run_loop.Run(); | |
375 | |
376 ASSERT_TRUE(result_listener.WaitUntilSatisfied()); | 344 ASSERT_TRUE(result_listener.WaitUntilSatisfied()); |
377 } | 345 } |
378 | 346 |
379 } // namespace extensions | 347 } // namespace extensions |
OLD | NEW |