OLD | NEW |
| (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/storage_monitor/removable_device_notifications_mac.h" | |
6 | |
7 #include "base/file_util.h" | |
8 #include "base/files/scoped_temp_dir.h" | |
9 #include "base/mac/foundation_util.h" | |
10 #include "base/message_loop.h" | |
11 #include "base/sys_string_conversions.h" | |
12 #include "base/utf_string_conversions.h" | |
13 #include "chrome/browser/storage_monitor/media_storage_util.h" | |
14 #include "chrome/browser/storage_monitor/mock_removable_storage_observer.h" | |
15 #include "chrome/browser/storage_monitor/removable_device_constants.h" | |
16 #include "content/public/test/test_browser_thread.h" | |
17 #include "testing/gtest/include/gtest/gtest.h" | |
18 | |
19 namespace chrome { | |
20 | |
21 uint64 kTestSize = 1000000ULL; | |
22 | |
23 namespace { | |
24 | |
25 DiskInfoMac CreateDiskInfoMac(const std::string& unique_id, | |
26 const std::string& model_name, | |
27 const string16& display_name, | |
28 const base::FilePath& mount_point, | |
29 uint64 size_bytes) { | |
30 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; | |
31 [dict setObject:@"dummy_bsd_name" | |
32 forKey:base::mac::CFToNSCast(kDADiskDescriptionMediaBSDNameKey)]; | |
33 [dict setObject:base::SysUTF8ToNSString(unique_id) | |
34 forKey:base::mac::CFToNSCast(kDADiskDescriptionDeviceRevisionKey)]; | |
35 if (!model_name.empty()) { | |
36 [dict setObject:base::SysUTF8ToNSString(model_name) | |
37 forKey:base::mac::CFToNSCast(kDADiskDescriptionDeviceModelKey)]; | |
38 } | |
39 NSString* path = base::mac::FilePathToNSString(mount_point); | |
40 [dict setObject:[NSURL fileURLWithPath:path] | |
41 forKey:base::mac::CFToNSCast(kDADiskDescriptionVolumePathKey)]; | |
42 [dict setObject:base::SysUTF16ToNSString(display_name) | |
43 forKey:base::mac::CFToNSCast(kDADiskDescriptionVolumeNameKey)]; | |
44 [dict setObject:[NSNumber numberWithBool:YES] | |
45 forKey:base::mac::CFToNSCast(kDADiskDescriptionMediaRemovableKey)]; | |
46 [dict setObject:[NSNumber numberWithInt:size_bytes] | |
47 forKey:base::mac::CFToNSCast(kDADiskDescriptionMediaSizeKey)]; | |
48 return DiskInfoMac::BuildDiskInfoOnFileThread(base::mac::NSToCFCast(dict)); | |
49 } | |
50 | |
51 } // namespace | |
52 | |
53 class RemovableDeviceNotificationsMacTest : public testing::Test { | |
54 public: | |
55 RemovableDeviceNotificationsMacTest() | |
56 : message_loop_(MessageLoop::TYPE_IO), | |
57 file_thread_(content::BrowserThread::FILE, &message_loop_) { | |
58 } | |
59 | |
60 virtual void SetUp() OVERRIDE { | |
61 notifications_ = new RemovableDeviceNotificationsMac; | |
62 | |
63 mock_storage_observer_.reset(new MockRemovableStorageObserver); | |
64 notifications_->AddObserver(mock_storage_observer_.get()); | |
65 | |
66 | |
67 unique_id_ = "test_id"; | |
68 display_name_ = ASCIIToUTF16("977 KB Test Display Name"); | |
69 mount_point_ = base::FilePath("/unused_test_directory"); | |
70 device_id_ = MediaStorageUtil::MakeDeviceId( | |
71 MediaStorageUtil::REMOVABLE_MASS_STORAGE_NO_DCIM, unique_id_); | |
72 disk_info_ = CreateDiskInfoMac(unique_id_, "", | |
73 ASCIIToUTF16("Test Display Name"), | |
74 mount_point_, kTestSize); | |
75 } | |
76 | |
77 protected: | |
78 // The message loop and file thread to run tests on. | |
79 MessageLoop message_loop_; | |
80 content::TestBrowserThread file_thread_; | |
81 | |
82 scoped_ptr<MockRemovableStorageObserver> mock_storage_observer_; | |
83 | |
84 // Information about the disk. | |
85 std::string unique_id_; | |
86 string16 display_name_; | |
87 base::FilePath mount_point_; | |
88 std::string device_id_; | |
89 DiskInfoMac disk_info_; | |
90 | |
91 scoped_refptr<RemovableDeviceNotificationsMac> notifications_; | |
92 }; | |
93 | |
94 TEST_F(RemovableDeviceNotificationsMacTest, AddRemove) { | |
95 notifications_->UpdateDisk( | |
96 disk_info_, RemovableDeviceNotificationsMac::UPDATE_DEVICE_ADDED); | |
97 message_loop_.RunUntilIdle(); | |
98 EXPECT_EQ(1, mock_storage_observer_->attach_calls()); | |
99 EXPECT_EQ(0, mock_storage_observer_->detach_calls()); | |
100 EXPECT_EQ(device_id_, mock_storage_observer_->last_attached().device_id); | |
101 EXPECT_EQ(display_name_, mock_storage_observer_->last_attached().name); | |
102 EXPECT_EQ(mount_point_.value(), | |
103 mock_storage_observer_->last_attached().location); | |
104 | |
105 notifications_->UpdateDisk( | |
106 disk_info_, RemovableDeviceNotificationsMac::UPDATE_DEVICE_REMOVED); | |
107 message_loop_.RunUntilIdle(); | |
108 EXPECT_EQ(1, mock_storage_observer_->attach_calls()); | |
109 EXPECT_EQ(1, mock_storage_observer_->detach_calls()); | |
110 EXPECT_EQ(device_id_, mock_storage_observer_->last_detached().device_id); | |
111 } | |
112 | |
113 TEST_F(RemovableDeviceNotificationsMacTest, UpdateVolumeName) { | |
114 notifications_->UpdateDisk( | |
115 disk_info_, RemovableDeviceNotificationsMac::UPDATE_DEVICE_ADDED); | |
116 message_loop_.RunUntilIdle(); | |
117 | |
118 EXPECT_EQ(1, mock_storage_observer_->attach_calls()); | |
119 EXPECT_EQ(0, mock_storage_observer_->detach_calls()); | |
120 EXPECT_EQ(device_id_, mock_storage_observer_->last_attached().device_id); | |
121 EXPECT_EQ(display_name_, mock_storage_observer_->last_attached().name); | |
122 EXPECT_EQ(mount_point_.value(), | |
123 mock_storage_observer_->last_attached().location); | |
124 | |
125 string16 new_display_name(ASCIIToUTF16("977 KB Test Display Name")); | |
126 DiskInfoMac info2 = CreateDiskInfoMac( | |
127 unique_id_, "", ASCIIToUTF16("Test Display Name"), mount_point_, | |
128 kTestSize); | |
129 notifications_->UpdateDisk( | |
130 info2, RemovableDeviceNotificationsMac::UPDATE_DEVICE_CHANGED); | |
131 message_loop_.RunUntilIdle(); | |
132 | |
133 EXPECT_EQ(1, mock_storage_observer_->detach_calls()); | |
134 EXPECT_EQ(device_id_, mock_storage_observer_->last_detached().device_id); | |
135 EXPECT_EQ(2, mock_storage_observer_->attach_calls()); | |
136 EXPECT_EQ(device_id_, mock_storage_observer_->last_attached().device_id); | |
137 EXPECT_EQ(new_display_name, mock_storage_observer_->last_attached().name); | |
138 EXPECT_EQ(mount_point_.value(), | |
139 mock_storage_observer_->last_attached().location); | |
140 } | |
141 | |
142 TEST_F(RemovableDeviceNotificationsMacTest, DCIM) { | |
143 base::ScopedTempDir temp_dir; | |
144 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
145 ASSERT_TRUE(file_util::CreateDirectory( | |
146 temp_dir.path().Append(kDCIMDirectoryName))); | |
147 | |
148 base::FilePath mount_point = temp_dir.path(); | |
149 DiskInfoMac info = CreateDiskInfoMac( | |
150 unique_id_, "", ASCIIToUTF16("Test Display Name"), mount_point, | |
151 kTestSize); | |
152 std::string device_id = MediaStorageUtil::MakeDeviceId( | |
153 MediaStorageUtil::REMOVABLE_MASS_STORAGE_WITH_DCIM, unique_id_); | |
154 | |
155 notifications_->UpdateDisk( | |
156 info, RemovableDeviceNotificationsMac::UPDATE_DEVICE_ADDED); | |
157 message_loop_.RunUntilIdle(); | |
158 | |
159 EXPECT_EQ(1, mock_storage_observer_->attach_calls()); | |
160 EXPECT_EQ(0, mock_storage_observer_->detach_calls()); | |
161 EXPECT_EQ(device_id, mock_storage_observer_->last_attached().device_id); | |
162 EXPECT_EQ(display_name_, mock_storage_observer_->last_attached().name); | |
163 EXPECT_EQ(mount_point.value(), | |
164 mock_storage_observer_->last_attached().location); | |
165 } | |
166 | |
167 TEST_F(RemovableDeviceNotificationsMacTest, GetStorageInfo) { | |
168 notifications_->UpdateDisk( | |
169 disk_info_, RemovableDeviceNotificationsMac::UPDATE_DEVICE_ADDED); | |
170 message_loop_.RunUntilIdle(); | |
171 | |
172 EXPECT_EQ(1, mock_storage_observer_->attach_calls()); | |
173 EXPECT_EQ(0, mock_storage_observer_->detach_calls()); | |
174 EXPECT_EQ(device_id_, mock_storage_observer_->last_attached().device_id); | |
175 EXPECT_EQ(display_name_, mock_storage_observer_->last_attached().name); | |
176 EXPECT_EQ(mount_point_.value(), | |
177 mock_storage_observer_->last_attached().location); | |
178 | |
179 StorageMonitor::StorageInfo info; | |
180 EXPECT_TRUE(notifications_->GetStorageInfoForPath( | |
181 mount_point_.AppendASCII("foo"), &info)); | |
182 EXPECT_EQ(info.device_id, device_id_); | |
183 EXPECT_EQ(info.name, ASCIIToUTF16("Test Display Name")); | |
184 EXPECT_EQ(info.location, mount_point_.value()); | |
185 | |
186 EXPECT_FALSE(notifications_->GetStorageInfoForPath( | |
187 base::FilePath("/non/matching/path"), &info)); | |
188 } | |
189 | |
190 TEST_F(RemovableDeviceNotificationsMacTest, GetStorageSize) { | |
191 notifications_->UpdateDisk( | |
192 disk_info_, RemovableDeviceNotificationsMac::UPDATE_DEVICE_ADDED); | |
193 message_loop_.RunUntilIdle(); | |
194 EXPECT_EQ(1, mock_storage_observer_->attach_calls()); | |
195 | |
196 EXPECT_EQ(kTestSize, | |
197 notifications_->GetStorageSize("/unused_test_directory")); | |
198 } | |
199 | |
200 // Test that mounting a DMG doesn't send a notification. | |
201 TEST_F(RemovableDeviceNotificationsMacTest, DMG) { | |
202 DiskInfoMac info = CreateDiskInfoMac( | |
203 unique_id_, "Disk Image", display_name_, mount_point_, kTestSize); | |
204 notifications_->UpdateDisk( | |
205 info, RemovableDeviceNotificationsMac::UPDATE_DEVICE_ADDED); | |
206 message_loop_.RunUntilIdle(); | |
207 EXPECT_EQ(0, mock_storage_observer_->attach_calls()); | |
208 } | |
209 | |
210 } // namespace chrome | |
OLD | NEW |