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 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 | 229 |
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 }; |
| 239 const std::string kDeviceId = "0"; |
238 // Only |kDevice2| should be attached, since |kDevice1| has a bad path. | 240 // Only |kDevice2| should be attached, since |kDevice1| has a bad path. |
239 EXPECT_CALL(observer(), OnMediaDeviceAttached(0, kDevice2, test_path)) | 241 EXPECT_CALL(observer(), |
| 242 OnMediaDeviceAttached(kDeviceId, |
| 243 ASCIIToUTF16(kDevice2), |
| 244 base::SystemMonitor::TYPE_PATH, |
| 245 test_path.value())) |
240 .InSequence(mock_sequence); | 246 .InSequence(mock_sequence); |
241 AppendToMtabAndRunLoop(test_data, arraysize(test_data)); | 247 AppendToMtabAndRunLoop(test_data, arraysize(test_data)); |
242 | 248 |
243 // |kDevice2| should be detached here. | 249 // |kDevice2| should be detached here. |
244 EXPECT_CALL(observer(), OnMediaDeviceDetached(0)).InSequence(mock_sequence); | 250 EXPECT_CALL(observer(), OnMediaDeviceDetached(kDeviceId)) |
| 251 .InSequence(mock_sequence); |
245 WriteEmptyMtabAndRunLoop(); | 252 WriteEmptyMtabAndRunLoop(); |
246 } | 253 } |
247 | 254 |
248 // Only mount points with DCIM directories are recognized. | 255 // Only mount points with DCIM directories are recognized. |
249 TEST_F(MediaDeviceNotificationsLinuxTest, DCIM) { | 256 TEST_F(MediaDeviceNotificationsLinuxTest, DCIM) { |
250 testing::Sequence mock_sequence; | 257 testing::Sequence mock_sequence; |
251 FilePath test_path_a = CreateMountPointWithDCIMDir(kMountPointA); | 258 FilePath test_path_a = CreateMountPointWithDCIMDir(kMountPointA); |
252 ASSERT_FALSE(test_path_a.empty()); | 259 ASSERT_FALSE(test_path_a.empty()); |
253 MtabTestData test_data1[] = { | 260 MtabTestData test_data1[] = { |
254 MtabTestData(kDevice1, test_path_a.value(), kValidFS), | 261 MtabTestData(kDevice1, test_path_a.value(), kValidFS), |
255 }; | 262 }; |
| 263 const std::string kDeviceId = "0"; |
256 // |kDevice1| should be attached as expected. | 264 // |kDevice1| should be attached as expected. |
257 EXPECT_CALL(observer(), OnMediaDeviceAttached(0, kDevice1, test_path_a)) | 265 EXPECT_CALL(observer(), |
| 266 OnMediaDeviceAttached(kDeviceId, |
| 267 ASCIIToUTF16(kDevice1), |
| 268 base::SystemMonitor::TYPE_PATH, |
| 269 test_path_a.value())) |
258 .InSequence(mock_sequence); | 270 .InSequence(mock_sequence); |
259 AppendToMtabAndRunLoop(test_data1, arraysize(test_data1)); | 271 AppendToMtabAndRunLoop(test_data1, arraysize(test_data1)); |
260 | 272 |
261 // This should do nothing, since |kMountPointB| does not have a DCIM dir. | 273 // This should do nothing, since |kMountPointB| does not have a DCIM dir. |
262 FilePath test_path_b = CreateMountPointWithoutDCIMDir(kMountPointB); | 274 FilePath test_path_b = CreateMountPointWithoutDCIMDir(kMountPointB); |
263 ASSERT_FALSE(test_path_b.empty()); | 275 ASSERT_FALSE(test_path_b.empty()); |
264 MtabTestData test_data2[] = { | 276 MtabTestData test_data2[] = { |
265 MtabTestData(kDevice2, test_path_b.value(), kValidFS), | 277 MtabTestData(kDevice2, test_path_b.value(), kValidFS), |
266 }; | 278 }; |
267 AppendToMtabAndRunLoop(test_data2, arraysize(test_data2)); | 279 AppendToMtabAndRunLoop(test_data2, arraysize(test_data2)); |
268 | 280 |
269 // |kDevice1| should be detached as expected. | 281 // |kDevice1| should be detached as expected. |
270 EXPECT_CALL(observer(), OnMediaDeviceDetached(0)).InSequence(mock_sequence); | 282 EXPECT_CALL(observer(), OnMediaDeviceDetached(kDeviceId)) |
| 283 .InSequence(mock_sequence); |
271 WriteEmptyMtabAndRunLoop(); | 284 WriteEmptyMtabAndRunLoop(); |
272 } | 285 } |
273 | 286 |
274 // More complicated test case with multiple devices on multiple mount points. | 287 // More complicated test case with multiple devices on multiple mount points. |
275 TEST_F(MediaDeviceNotificationsLinuxTest, MultiDevicesMultiMountPoints) { | 288 TEST_F(MediaDeviceNotificationsLinuxTest, MultiDevicesMultiMountPoints) { |
276 FilePath test_path_a = CreateMountPointWithDCIMDir(kMountPointA); | 289 FilePath test_path_a = CreateMountPointWithDCIMDir(kMountPointA); |
277 FilePath test_path_b = CreateMountPointWithDCIMDir(kMountPointB); | 290 FilePath test_path_b = CreateMountPointWithDCIMDir(kMountPointB); |
278 ASSERT_FALSE(test_path_a.empty()); | 291 ASSERT_FALSE(test_path_a.empty()); |
279 ASSERT_FALSE(test_path_b.empty()); | 292 ASSERT_FALSE(test_path_b.empty()); |
280 | 293 |
281 // Attach two devices. | 294 // Attach two devices. |
282 // kDevice1 -> kMountPointA | 295 // kDevice1 -> kMountPointA |
283 // kDevice2 -> kMountPointB | 296 // kDevice2 -> kMountPointB |
284 MtabTestData test_data1[] = { | 297 MtabTestData test_data1[] = { |
285 MtabTestData(kDevice1, test_path_a.value(), kValidFS), | 298 MtabTestData(kDevice1, test_path_a.value(), kValidFS), |
286 MtabTestData(kDevice2, test_path_b.value(), kValidFS), | 299 MtabTestData(kDevice2, test_path_b.value(), kValidFS), |
287 }; | 300 }; |
288 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(2); | 301 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(2); |
289 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(0); | 302 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(0); |
290 AppendToMtabAndRunLoop(test_data1, arraysize(test_data1)); | 303 AppendToMtabAndRunLoop(test_data1, arraysize(test_data1)); |
291 | 304 |
292 // Attach |kDevice1| to |kMountPointB|. | 305 // Attach |kDevice1| to |kMountPointB|. |
293 // |kDevice2| is inaccessible, so it is detached. |kDevice1| has been | 306 // |kDevice2| is inaccessible, so it is detached. |kDevice1| has been |
294 // re-attached at |kMountPointB|, so it is 'detached' from kMountPointA. | 307 // re-attached at |kMountPointB|, so it is 'detached' from kMountPointA. |
295 // kDevice1 -> kMountPointA | 308 // kDevice1 -> kMountPointA |
296 // kDevice2 -> kMountPointB | 309 // kDevice2 -> kMountPointB |
297 // kDevice1 -> kMountPointB | 310 // kDevice1 -> kMountPointB |
298 MtabTestData test_data2[] = { | 311 MtabTestData test_data2[] = { |
299 MtabTestData(kDevice1, test_path_b.value(), kValidFS), | 312 MtabTestData(kDevice1, test_path_b.value(), kValidFS), |
300 }; | 313 }; |
301 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(1); | 314 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(1); |
302 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(2); | 315 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(2); |
303 AppendToMtabAndRunLoop(test_data2, arraysize(test_data2)); | 316 AppendToMtabAndRunLoop(test_data2, arraysize(test_data2)); |
304 | 317 |
305 // Attach |kDevice2| to |kMountPointA|. | 318 // Attach |kDevice2| to |kMountPointA|. |
306 // kDevice1 -> kMountPointA | 319 // kDevice1 -> kMountPointA |
307 // kDevice2 -> kMountPointB | 320 // kDevice2 -> kMountPointB |
308 // kDevice1 -> kMountPointB | 321 // kDevice1 -> kMountPointB |
309 // kDevice2 -> kMountPointA | 322 // kDevice2 -> kMountPointA |
310 MtabTestData test_data3[] = { | 323 MtabTestData test_data3[] = { |
311 MtabTestData(kDevice2, test_path_a.value(), kValidFS), | 324 MtabTestData(kDevice2, test_path_a.value(), kValidFS), |
312 }; | 325 }; |
313 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(1); | 326 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(1); |
314 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(0); | 327 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(0); |
315 AppendToMtabAndRunLoop(test_data3, arraysize(test_data3)); | 328 AppendToMtabAndRunLoop(test_data3, arraysize(test_data3)); |
316 | 329 |
317 // Detach |kDevice2| from |kMountPointA|. | 330 // Detach |kDevice2| from |kMountPointA|. |
318 // kDevice1 -> kMountPointA | 331 // kDevice1 -> kMountPointA |
319 // kDevice2 -> kMountPointB | 332 // kDevice2 -> kMountPointB |
320 // kDevice1 -> kMountPointB | 333 // kDevice1 -> kMountPointB |
321 MtabTestData test_data4[] = { | 334 MtabTestData test_data4[] = { |
322 MtabTestData(kDevice1, test_path_a.value(), kValidFS), | 335 MtabTestData(kDevice1, test_path_a.value(), kValidFS), |
323 MtabTestData(kDevice2, test_path_b.value(), kValidFS), | 336 MtabTestData(kDevice2, test_path_b.value(), kValidFS), |
324 MtabTestData(kDevice1, test_path_b.value(), kValidFS), | 337 MtabTestData(kDevice1, test_path_b.value(), kValidFS), |
325 }; | 338 }; |
326 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(0); | 339 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(0); |
327 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(1); | 340 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(1); |
328 OverwriteMtabAndRunLoop(test_data4, arraysize(test_data4)); | 341 OverwriteMtabAndRunLoop(test_data4, arraysize(test_data4)); |
329 | 342 |
330 // Detach |kDevice1| from |kMountPointB|. | 343 // Detach |kDevice1| from |kMountPointB|. |
331 // kDevice1 -> kMountPointA | 344 // kDevice1 -> kMountPointA |
332 // kDevice2 -> kMountPointB | 345 // kDevice2 -> kMountPointB |
333 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(2); | 346 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(2); |
334 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(1); | 347 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(1); |
335 OverwriteMtabAndRunLoop(test_data1, arraysize(test_data1)); | 348 OverwriteMtabAndRunLoop(test_data1, arraysize(test_data1)); |
336 | 349 |
337 // Detach all devices. | 350 // Detach all devices. |
338 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(0); | 351 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(0); |
339 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(2); | 352 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(2); |
340 WriteEmptyMtabAndRunLoop(); | 353 WriteEmptyMtabAndRunLoop(); |
341 } | 354 } |
342 | 355 |
343 // More complicated test case with multiple devices on one mount point. | 356 // More complicated test case with multiple devices on one mount point. |
344 TEST_F(MediaDeviceNotificationsLinuxTest, MultiDevicesOneMountPoint) { | 357 TEST_F(MediaDeviceNotificationsLinuxTest, MultiDevicesOneMountPoint) { |
345 FilePath test_path_a = CreateMountPointWithDCIMDir(kMountPointA); | 358 FilePath test_path_a = CreateMountPointWithDCIMDir(kMountPointA); |
346 FilePath test_path_b = CreateMountPointWithDCIMDir(kMountPointB); | 359 FilePath test_path_b = CreateMountPointWithDCIMDir(kMountPointB); |
347 ASSERT_FALSE(test_path_a.empty()); | 360 ASSERT_FALSE(test_path_a.empty()); |
348 ASSERT_FALSE(test_path_b.empty()); | 361 ASSERT_FALSE(test_path_b.empty()); |
| 362 const std::string kDeviceId0 = "0"; |
| 363 const std::string kDeviceId1 = "1"; |
349 | 364 |
350 // |kDevice1| is most recently mounted at |kMountPointB|. | 365 // |kDevice1| is most recently mounted at |kMountPointB|. |
351 // kDevice1 -> kMountPointA | 366 // kDevice1 -> kMountPointA |
352 // kDevice2 -> kMountPointB | 367 // kDevice2 -> kMountPointB |
353 // kDevice1 -> kMountPointB | 368 // kDevice1 -> kMountPointB |
354 MtabTestData test_data1[] = { | 369 MtabTestData test_data1[] = { |
355 MtabTestData(kDevice1, test_path_a.value(), kValidFS), | 370 MtabTestData(kDevice1, test_path_a.value(), kValidFS), |
356 MtabTestData(kDevice2, test_path_b.value(), kValidFS), | 371 MtabTestData(kDevice2, test_path_b.value(), kValidFS), |
357 MtabTestData(kDevice1, test_path_b.value(), kValidFS), | 372 MtabTestData(kDevice1, test_path_b.value(), kValidFS), |
358 }; | 373 }; |
359 EXPECT_CALL(observer(), OnMediaDeviceAttached(0, kDevice1, test_path_b)) | 374 EXPECT_CALL(observer(), |
| 375 OnMediaDeviceAttached(kDeviceId0, |
| 376 ASCIIToUTF16(kDevice1), |
| 377 base::SystemMonitor::TYPE_PATH, |
| 378 test_path_b.value())) |
360 .Times(1); | 379 .Times(1); |
361 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(0); | 380 EXPECT_CALL(observer(), OnMediaDeviceDetached(_)).Times(0); |
362 OverwriteMtabAndRunLoop(test_data1, arraysize(test_data1)); | 381 OverwriteMtabAndRunLoop(test_data1, arraysize(test_data1)); |
363 | 382 |
364 // Attach |kDevice3| to |kMountPointB|. | 383 // Attach |kDevice3| to |kMountPointB|. |
365 // |kDevice1| is inaccessible at its most recent mount point, so it is | 384 // |kDevice1| is inaccessible at its most recent mount point, so it is |
366 // detached and unavailable, even though it is still accessible via | 385 // detached and unavailable, even though it is still accessible via |
367 // |kMountPointA|. | 386 // |kMountPointA|. |
368 // kDevice1 -> kMountPointA | 387 // kDevice1 -> kMountPointA |
369 // kDevice2 -> kMountPointB | 388 // kDevice2 -> kMountPointB |
370 // kDevice1 -> kMountPointB | 389 // kDevice1 -> kMountPointB |
371 // kDevice3 -> kMountPointB | 390 // kDevice3 -> kMountPointB |
372 MtabTestData test_data2[] = { | 391 MtabTestData test_data2[] = { |
373 MtabTestData(kDevice3, test_path_b.value(), kValidFS), | 392 MtabTestData(kDevice3, test_path_b.value(), kValidFS), |
374 }; | 393 }; |
375 EXPECT_CALL(observer(), OnMediaDeviceDetached(0)).Times(1); | 394 EXPECT_CALL(observer(), OnMediaDeviceDetached(kDeviceId0)).Times(1); |
376 EXPECT_CALL(observer(), OnMediaDeviceAttached(1, kDevice3, test_path_b)) | 395 EXPECT_CALL(observer(), |
| 396 OnMediaDeviceAttached(kDeviceId1, |
| 397 ASCIIToUTF16(kDevice3), |
| 398 base::SystemMonitor::TYPE_PATH, |
| 399 test_path_b.value())) |
377 .Times(1); | 400 .Times(1); |
378 AppendToMtabAndRunLoop(test_data2, arraysize(test_data2)); | 401 AppendToMtabAndRunLoop(test_data2, arraysize(test_data2)); |
379 | 402 |
380 // Detach all devices. | 403 // Detach all devices. |
381 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _)).Times(0); | 404 EXPECT_CALL(observer(), OnMediaDeviceAttached(_, _, _, _)).Times(0); |
382 EXPECT_CALL(observer(), OnMediaDeviceDetached(1)).Times(1); | 405 EXPECT_CALL(observer(), OnMediaDeviceDetached(kDeviceId1)).Times(1); |
383 WriteEmptyMtabAndRunLoop(); | 406 WriteEmptyMtabAndRunLoop(); |
384 } | 407 } |
385 | 408 |
386 } // namespace | 409 } // namespace |
387 | 410 |
388 } // namespace chrome | 411 } // namespace chrome |
OLD | NEW |