OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 // MediaDeviceNotificationsLinux unit tests. | 5 // MediaDeviceNotificationsLinux unit tests. |
6 | 6 |
7 #include "chrome/browser/media_gallery/media_device_notifications_linux.h" | 7 #include "chrome/browser/media_gallery/media_device_notifications_linux.h" |
8 | 8 |
9 #include <mntent.h> | 9 #include <mntent.h> |
10 #include <stdio.h> | 10 #include <stdio.h> |
11 | 11 |
12 #include <string> | 12 #include <string> |
13 | 13 |
14 #include "base/file_util.h" | 14 #include "base/file_util.h" |
15 #include "base/logging.h" | 15 #include "base/logging.h" |
16 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
17 #include "base/message_loop.h" | 17 #include "base/message_loop.h" |
18 #include "base/scoped_temp_dir.h" | 18 #include "base/scoped_temp_dir.h" |
19 #include "base/system_monitor/system_monitor.h" | 19 #include "base/system_monitor/system_monitor.h" |
20 #include "base/test/mock_devices_changed_observer.h" | 20 #include "base/test/mock_devices_changed_observer.h" |
| 21 #include "base/utf_string_conversions.h" |
21 #include "content/public/test/test_browser_thread.h" | 22 #include "content/public/test/test_browser_thread.h" |
22 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
23 | 24 |
24 namespace chrome { | 25 namespace chrome { |
25 | 26 |
26 namespace { | 27 namespace { |
27 | 28 |
28 using testing::_; | 29 using testing::_; |
29 | 30 |
30 const char kValidFS[] = "vfat"; | 31 const char kValidFS[] = "vfat"; |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 // Simple test case where we attach and detach a media device. | 230 // Simple test case where we attach and detach a media device. |
230 TEST_F(MediaDeviceNotificationsLinuxTest, BasicAttachDetach) { | 231 TEST_F(MediaDeviceNotificationsLinuxTest, BasicAttachDetach) { |
231 testing::Sequence mock_sequence; | 232 testing::Sequence mock_sequence; |
232 FilePath test_path = CreateMountPointWithDCIMDir(kMountPointA); | 233 FilePath test_path = CreateMountPointWithDCIMDir(kMountPointA); |
233 ASSERT_FALSE(test_path.empty()); | 234 ASSERT_FALSE(test_path.empty()); |
234 MtabTestData test_data[] = { | 235 MtabTestData test_data[] = { |
235 MtabTestData(kDevice1, kInvalidPath, kValidFS), | 236 MtabTestData(kDevice1, kInvalidPath, kValidFS), |
236 MtabTestData(kDevice2, test_path.value(), kValidFS), | 237 MtabTestData(kDevice2, test_path.value(), kValidFS), |
237 }; | 238 }; |
238 // Only |kDevice2| should be attached, since |kDevice1| has a bad path. | 239 // Only |kDevice2| should be attached, since |kDevice1| has a bad path. |
239 EXPECT_CALL(observer(), OnMediaDeviceAttached(0, kDevice2, test_path)) | 240 EXPECT_CALL(observer(), |
| 241 OnMediaDeviceAttached(0, |
| 242 kDevice2, |
| 243 base::SystemMonitor::TYPE_PATH, |
| 244 UTF8ToUTF16(test_path.value()))) |
240 .InSequence(mock_sequence); | 245 .InSequence(mock_sequence); |
241 AppendToMtabAndRunLoop(test_data, arraysize(test_data)); | 246 AppendToMtabAndRunLoop(test_data, arraysize(test_data)); |
242 | 247 |
243 // |kDevice2| should be detached here. | 248 // |kDevice2| should be detached here. |
244 EXPECT_CALL(observer(), OnMediaDeviceDetached(0)).InSequence(mock_sequence); | 249 EXPECT_CALL(observer(), OnMediaDeviceDetached(0)).InSequence(mock_sequence); |
245 WriteEmptyMtabAndRunLoop(); | 250 WriteEmptyMtabAndRunLoop(); |
246 } | 251 } |
247 | 252 |
248 // Only mount points with DCIM directories are recognized. | 253 // Only mount points with DCIM directories are recognized. |
249 TEST_F(MediaDeviceNotificationsLinuxTest, DCIM) { | 254 TEST_F(MediaDeviceNotificationsLinuxTest, DCIM) { |
250 testing::Sequence mock_sequence; | 255 testing::Sequence mock_sequence; |
251 FilePath test_path_a = CreateMountPointWithDCIMDir(kMountPointA); | 256 FilePath test_path_a = CreateMountPointWithDCIMDir(kMountPointA); |
252 ASSERT_FALSE(test_path_a.empty()); | 257 ASSERT_FALSE(test_path_a.empty()); |
253 MtabTestData test_data1[] = { | 258 MtabTestData test_data1[] = { |
254 MtabTestData(kDevice1, test_path_a.value(), kValidFS), | 259 MtabTestData(kDevice1, test_path_a.value(), kValidFS), |
255 }; | 260 }; |
256 // |kDevice1| should be attached as expected. | 261 // |kDevice1| should be attached as expected. |
257 EXPECT_CALL(observer(), OnMediaDeviceAttached(0, kDevice1, test_path_a)) | 262 EXPECT_CALL(observer(), |
| 263 OnMediaDeviceAttached(0, |
| 264 kDevice1, |
| 265 base::SystemMonitor::TYPE_PATH, |
| 266 UTF8ToUTF16(test_path_a.value()))) |
258 .InSequence(mock_sequence); | 267 .InSequence(mock_sequence); |
259 AppendToMtabAndRunLoop(test_data1, arraysize(test_data1)); | 268 AppendToMtabAndRunLoop(test_data1, arraysize(test_data1)); |
260 | 269 |
261 // This should do nothing, since |kMountPointB| does not have a DCIM dir. | 270 // This should do nothing, since |kMountPointB| does not have a DCIM dir. |
262 FilePath test_path_b = CreateMountPointWithoutDCIMDir(kMountPointB); | 271 FilePath test_path_b = CreateMountPointWithoutDCIMDir(kMountPointB); |
263 ASSERT_FALSE(test_path_b.empty()); | 272 ASSERT_FALSE(test_path_b.empty()); |
264 MtabTestData test_data2[] = { | 273 MtabTestData test_data2[] = { |
265 MtabTestData(kDevice2, test_path_b.value(), kValidFS), | 274 MtabTestData(kDevice2, test_path_b.value(), kValidFS), |
266 }; | 275 }; |
267 AppendToMtabAndRunLoop(test_data2, arraysize(test_data2)); | 276 AppendToMtabAndRunLoop(test_data2, arraysize(test_data2)); |
(...skipping 10 matching lines...) Expand all Loading... |
278 ASSERT_FALSE(test_path_a.empty()); | 287 ASSERT_FALSE(test_path_a.empty()); |
279 ASSERT_FALSE(test_path_b.empty()); | 288 ASSERT_FALSE(test_path_b.empty()); |
280 | 289 |
281 // Attach two devices. | 290 // Attach two devices. |
282 // kDevice1 -> kMountPointA | 291 // kDevice1 -> kMountPointA |
283 // kDevice2 -> kMountPointB | 292 // kDevice2 -> kMountPointB |
284 MtabTestData test_data1[] = { | 293 MtabTestData test_data1[] = { |
285 MtabTestData(kDevice1, test_path_a.value(), kValidFS), | 294 MtabTestData(kDevice1, test_path_a.value(), kValidFS), |
286 MtabTestData(kDevice2, test_path_b.value(), kValidFS), | 295 MtabTestData(kDevice2, test_path_b.value(), kValidFS), |
287 }; | 296 }; |
288 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(2); | 297 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(2); |
289 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(0); | 298 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(0); |
290 AppendToMtabAndRunLoop(test_data1, arraysize(test_data1)); | 299 AppendToMtabAndRunLoop(test_data1, arraysize(test_data1)); |
291 | 300 |
292 // Attach |kDevice1| to |kMountPointB|. | 301 // Attach |kDevice1| to |kMountPointB|. |
293 // |kDevice2| is inaccessible, so it is detached. |kDevice1| has been | 302 // |kDevice2| is inaccessible, so it is detached. |kDevice1| has been |
294 // re-attached at |kMountPointB|, so it is 'detached' from kMountPointA. | 303 // re-attached at |kMountPointB|, so it is 'detached' from kMountPointA. |
295 // kDevice1 -> kMountPointA | 304 // kDevice1 -> kMountPointA |
296 // kDevice2 -> kMountPointB | 305 // kDevice2 -> kMountPointB |
297 // kDevice1 -> kMountPointB | 306 // kDevice1 -> kMountPointB |
298 MtabTestData test_data2[] = { | 307 MtabTestData test_data2[] = { |
299 MtabTestData(kDevice1, test_path_b.value(), kValidFS), | 308 MtabTestData(kDevice1, test_path_b.value(), kValidFS), |
300 }; | 309 }; |
301 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(1); | 310 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(1); |
302 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(2); | 311 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(2); |
303 AppendToMtabAndRunLoop(test_data2, arraysize(test_data2)); | 312 AppendToMtabAndRunLoop(test_data2, arraysize(test_data2)); |
304 | 313 |
305 // Attach |kDevice2| to |kMountPointA|. | 314 // Attach |kDevice2| to |kMountPointA|. |
306 // kDevice1 -> kMountPointA | 315 // kDevice1 -> kMountPointA |
307 // kDevice2 -> kMountPointB | 316 // kDevice2 -> kMountPointB |
308 // kDevice1 -> kMountPointB | 317 // kDevice1 -> kMountPointB |
309 // kDevice2 -> kMountPointA | 318 // kDevice2 -> kMountPointA |
310 MtabTestData test_data3[] = { | 319 MtabTestData test_data3[] = { |
311 MtabTestData(kDevice2, test_path_a.value(), kValidFS), | 320 MtabTestData(kDevice2, test_path_a.value(), kValidFS), |
312 }; | 321 }; |
313 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(1); | 322 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(1); |
314 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(0); | 323 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(0); |
315 AppendToMtabAndRunLoop(test_data3, arraysize(test_data3)); | 324 AppendToMtabAndRunLoop(test_data3, arraysize(test_data3)); |
316 | 325 |
317 // Detach |kDevice2| from |kMountPointA|. | 326 // Detach |kDevice2| from |kMountPointA|. |
318 // kDevice1 -> kMountPointA | 327 // kDevice1 -> kMountPointA |
319 // kDevice2 -> kMountPointB | 328 // kDevice2 -> kMountPointB |
320 // kDevice1 -> kMountPointB | 329 // kDevice1 -> kMountPointB |
321 MtabTestData test_data4[] = { | 330 MtabTestData test_data4[] = { |
322 MtabTestData(kDevice1, test_path_a.value(), kValidFS), | 331 MtabTestData(kDevice1, test_path_a.value(), kValidFS), |
323 MtabTestData(kDevice2, test_path_b.value(), kValidFS), | 332 MtabTestData(kDevice2, test_path_b.value(), kValidFS), |
324 MtabTestData(kDevice1, test_path_b.value(), kValidFS), | 333 MtabTestData(kDevice1, test_path_b.value(), kValidFS), |
325 }; | 334 }; |
326 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(0); | 335 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(0); |
327 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(1); | 336 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(1); |
328 OverwriteMtabAndRunLoop(test_data4, arraysize(test_data4)); | 337 OverwriteMtabAndRunLoop(test_data4, arraysize(test_data4)); |
329 | 338 |
330 // Detach |kDevice1| from |kMountPointB|. | 339 // Detach |kDevice1| from |kMountPointB|. |
331 // kDevice1 -> kMountPointA | 340 // kDevice1 -> kMountPointA |
332 // kDevice2 -> kMountPointB | 341 // kDevice2 -> kMountPointB |
333 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(2); | 342 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(2); |
334 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(1); | 343 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(1); |
335 OverwriteMtabAndRunLoop(test_data1, arraysize(test_data1)); | 344 OverwriteMtabAndRunLoop(test_data1, arraysize(test_data1)); |
336 | 345 |
337 // Detach all devices. | 346 // Detach all devices. |
338 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(0); | 347 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(0); |
339 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(2); | 348 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(2); |
340 WriteEmptyMtabAndRunLoop(); | 349 WriteEmptyMtabAndRunLoop(); |
341 } | 350 } |
342 | 351 |
343 // More complicated test case with multiple devices on one mount point. | 352 // More complicated test case with multiple devices on one mount point. |
344 TEST_F(MediaDeviceNotificationsLinuxTest, MultiDevicesOneMountPoint) { | 353 TEST_F(MediaDeviceNotificationsLinuxTest, MultiDevicesOneMountPoint) { |
345 FilePath test_path_a = CreateMountPointWithDCIMDir(kMountPointA); | 354 FilePath test_path_a = CreateMountPointWithDCIMDir(kMountPointA); |
346 FilePath test_path_b = CreateMountPointWithDCIMDir(kMountPointB); | 355 FilePath test_path_b = CreateMountPointWithDCIMDir(kMountPointB); |
| 356 string16 test_path_b_str16 = UTF8ToUTF16(test_path_b.value()); |
347 ASSERT_FALSE(test_path_a.empty()); | 357 ASSERT_FALSE(test_path_a.empty()); |
348 ASSERT_FALSE(test_path_b.empty()); | 358 ASSERT_FALSE(test_path_b.empty()); |
349 | 359 |
350 // |kDevice1| is most recently mounted at |kMountPointB|. | 360 // |kDevice1| is most recently mounted at |kMountPointB|. |
351 // kDevice1 -> kMountPointA | 361 // kDevice1 -> kMountPointA |
352 // kDevice2 -> kMountPointB | 362 // kDevice2 -> kMountPointB |
353 // kDevice1 -> kMountPointB | 363 // kDevice1 -> kMountPointB |
354 MtabTestData test_data1[] = { | 364 MtabTestData test_data1[] = { |
355 MtabTestData(kDevice1, test_path_a.value(), kValidFS), | 365 MtabTestData(kDevice1, test_path_a.value(), kValidFS), |
356 MtabTestData(kDevice2, test_path_b.value(), kValidFS), | 366 MtabTestData(kDevice2, test_path_b.value(), kValidFS), |
357 MtabTestData(kDevice1, test_path_b.value(), kValidFS), | 367 MtabTestData(kDevice1, test_path_b.value(), kValidFS), |
358 }; | 368 }; |
359 EXPECT_CALL(observer(), OnMediaDeviceAttached(0, kDevice1, test_path_b)) | 369 EXPECT_CALL(observer(), |
| 370 OnMediaDeviceAttached(0, |
| 371 kDevice1, |
| 372 base::SystemMonitor::TYPE_PATH, |
| 373 test_path_b_str16)) |
360 .Times(1); | 374 .Times(1); |
361 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(0); | 375 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(0); |
362 OverwriteMtabAndRunLoop(test_data1, arraysize(test_data1)); | 376 OverwriteMtabAndRunLoop(test_data1, arraysize(test_data1)); |
363 | 377 |
364 // Attach |kDevice3| to |kMountPointB|. | 378 // Attach |kDevice3| to |kMountPointB|. |
365 // |kDevice1| is inaccessible at its most recent mount point, so it is | 379 // |kDevice1| is inaccessible at its most recent mount point, so it is |
366 // detached and unavailable, even though it is still accessible via | 380 // detached and unavailable, even though it is still accessible via |
367 // |kMountPointA|. | 381 // |kMountPointA|. |
368 // kDevice1 -> kMountPointA | 382 // kDevice1 -> kMountPointA |
369 // kDevice2 -> kMountPointB | 383 // kDevice2 -> kMountPointB |
370 // kDevice1 -> kMountPointB | 384 // kDevice1 -> kMountPointB |
371 // kDevice3 -> kMountPointB | 385 // kDevice3 -> kMountPointB |
372 MtabTestData test_data2[] = { | 386 MtabTestData test_data2[] = { |
373 MtabTestData(kDevice3, test_path_b.value(), kValidFS), | 387 MtabTestData(kDevice3, test_path_b.value(), kValidFS), |
374 }; | 388 }; |
375 EXPECT_CALL(observer(), OnMediaDeviceDetached(0)).Times(1); | 389 EXPECT_CALL(observer(), OnMediaDeviceDetached(0)).Times(1); |
376 EXPECT_CALL(observer(), OnMediaDeviceAttached(1, kDevice3, test_path_b)) | 390 EXPECT_CALL(observer(), |
| 391 OnMediaDeviceAttached(1, |
| 392 kDevice3, |
| 393 base::SystemMonitor::TYPE_PATH, |
| 394 test_path_b_str16)) |
377 .Times(1); | 395 .Times(1); |
378 AppendToMtabAndRunLoop(test_data2, arraysize(test_data2)); | 396 AppendToMtabAndRunLoop(test_data2, arraysize(test_data2)); |
379 | 397 |
380 // Detach all devices. | 398 // Detach all devices. |
381 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(0); | 399 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(0); |
382 EXPECT_CALL(observer(), OnMediaDeviceDetached(1)).Times(1); | 400 EXPECT_CALL(observer(), OnMediaDeviceDetached(1)).Times(1); |
383 WriteEmptyMtabAndRunLoop(); | 401 WriteEmptyMtabAndRunLoop(); |
384 } | 402 } |
385 | 403 |
386 } // namespace | 404 } // namespace |
387 | 405 |
388 } // namespace chrome | 406 } // namespace chrome |
OLD | NEW |