1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
|
"use strict";
// Globals
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
const { AppConstants } = ChromeUtils.import(
"resource://gre/modules/AppConstants.jsm"
);
ChromeUtils.defineModuleGetter(
this,
"CloudStorage",
"resource://gre/modules/CloudStorage.jsm"
);
ChromeUtils.defineModuleGetter(
this,
"FileUtils",
"resource://gre/modules/FileUtils.jsm"
);
const CLOUD_SERVICES_PREF = "cloud.services.";
const DROPBOX_DOWNLOAD_FOLDER = "Dropbox";
const GOOGLE_DRIVE_DOWNLOAD_FOLDER = "Google Drive";
const DROPBOX_CONFIG_FOLDER =
AppConstants.platform === "win" ? "Dropbox" : ".dropbox";
const DROPBOX_KEY = "Dropbox";
const GDRIVE_KEY = "GDrive";
var nsIDropboxFile, nsIGDriveFile;
function run_test() {
initPrefs();
registerFakePath("Home", do_get_file("cloud/"));
registerFakePath("LocalAppData", do_get_file("cloud/"));
registerCleanupFunction(() => {
cleanupPrefs();
});
run_next_test();
}
function initPrefs() {
Services.prefs.setBoolPref(CLOUD_SERVICES_PREF + "api.enabled", true);
}
/**
* Replaces a directory service entry with a given nsIFile.
*/
function registerFakePath(key, file) {
let dirsvc = Services.dirsvc.QueryInterface(Ci.nsIProperties);
let originalFile;
try {
// If a file is already provided save it and undefine, otherwise set will
// throw for persistent entries (ones that are cached).
originalFile = dirsvc.get(key, Ci.nsIFile);
dirsvc.undefine(key);
} catch (e) {
// dirsvc.get will throw if nothing provides for the key and dirsvc.undefine
// will throw if it's not a persistent entry, in either case we don't want
// to set the original file in cleanup.
originalFile = undefined;
}
dirsvc.set(key, file);
registerCleanupFunction(() => {
dirsvc.undefine(key);
if (originalFile) {
dirsvc.set(key, originalFile);
}
});
}
function mock_dropbox() {
let discoveryFolder = null;
if (AppConstants.platform === "win") {
discoveryFolder = FileUtils.getFile("LocalAppData", [
DROPBOX_CONFIG_FOLDER,
]);
} else {
discoveryFolder = FileUtils.getFile("Home", [DROPBOX_CONFIG_FOLDER]);
}
discoveryFolder.append("info.json");
let fileDir = discoveryFolder.parent;
if (!fileDir.exists()) {
fileDir.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
}
do_get_file("cloud/info.json").copyTo(fileDir, "info.json");
let exist = fileDir.exists();
Assert.ok(exist, "file exists on desktop");
// Mock Dropbox Download folder in Home directory
let downloadFolder = FileUtils.getFile("Home", [
DROPBOX_DOWNLOAD_FOLDER,
"Downloads",
]);
if (!downloadFolder.exists()) {
downloadFolder.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
}
registerCleanupFunction(() => {
if (discoveryFolder.exists()) {
discoveryFolder.remove(false);
}
if (downloadFolder.exists()) {
downloadFolder.remove(false);
}
});
return discoveryFolder;
}
function mock_gdrive() {
let discoveryFolder = null;
if (AppConstants.platform === "win") {
discoveryFolder = FileUtils.getFile("LocalAppData", ["Google", "Drive"]);
} else {
discoveryFolder = FileUtils.getFile("Home", [
"Library",
"Application Support",
"Google",
"Drive",
]);
}
if (!discoveryFolder.exists()) {
discoveryFolder.createUnique(
Ci.nsIFile.DIRECTORY_TYPE,
FileUtils.PERMS_DIRECTORY
);
}
let exist = discoveryFolder.exists();
Assert.ok(exist, "file exists on desktop");
// Mock Google Drive Download folder in Home directory
let downloadFolder = FileUtils.getFile("Home", [
GOOGLE_DRIVE_DOWNLOAD_FOLDER,
"Downloads",
]);
if (!downloadFolder.exists()) {
downloadFolder.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
}
registerCleanupFunction(() => {
if (discoveryFolder.exists()) {
discoveryFolder.remove(false);
}
if (downloadFolder.exists()) {
downloadFolder.remove(false);
}
});
return discoveryFolder;
}
function cleanupPrefs() {
try {
Services.prefs.clearUserPref(CLOUD_SERVICES_PREF + "lastprompt");
Services.prefs.clearUserPref(CLOUD_SERVICES_PREF + "storage.key");
Services.prefs.clearUserPref(CLOUD_SERVICES_PREF + "rejected.key");
Services.prefs.clearUserPref(CLOUD_SERVICES_PREF + "interval.prompt");
Services.prefs.clearUserPref(CLOUD_SERVICES_PREF + "api.enabled");
Services.prefs.setIntPref("browser.download.folderList", 2);
} catch (e) {
do_throw("Failed to cleanup prefs: " + e);
}
}
function promiseGetStorageProviders() {
return CloudStorage.getStorageProviders();
}
function promisePromptInfo() {
return CloudStorage.promisePromptInfo();
}
async function checkScan(expectedKey) {
let metadata = await promiseGetStorageProviders();
let scanProvider = await promisePromptInfo();
if (!expectedKey) {
Assert.equal(metadata.size, 0, "Number of storage providers");
Assert.ok(!scanProvider, "No provider in scan results");
} else {
Assert.ok(metadata.size, "Number of storage providers");
Assert.equal(
scanProvider.key,
expectedKey,
"Scanned provider key returned"
);
}
return metadata;
}
async function checkSavedPromptResponse(
aKey,
metadata,
remember,
selected = false
) {
CloudStorage.savePromptResponse(aKey, remember, selected);
if (remember && selected) {
// Save prompt response with option to always remember the setting
// and provider with aKey selected as cloud storage provider
// Sets user download settings to always save to cloud
// Check preferred provider key, should be set to dropbox
let prefProvider = CloudStorage.getPreferredProvider();
Assert.equal(
prefProvider,
aKey,
"Saved Response preferred provider key returned"
);
// Check browser.download.folderlist pref should be set to 3
Assert.equal(
Services.prefs.getIntPref("browser.download.folderList"),
3,
"Default download location set to 3"
);
// Preferred download folder should be set to provider downloadPath from metadata
let path = await CloudStorage.getDownloadFolder();
let nsIDownloadFolder = new FileUtils.File(path);
Assert.ok(nsIDownloadFolder, "Download folder retrieved");
Assert.equal(
nsIDownloadFolder.parent.path,
metadata.get(aKey).downloadPath,
"Default download Folder Path"
);
} else if (remember && !selected) {
// Save prompt response with option to always remember the setting
// and provider with aKey rejected as cloud storage provider
// Sets cloud.services.rejected.key pref with provider key.
// Provider is ignored in next scan and never re-prompted again
let scanResult = await promisePromptInfo();
if (scanResult) {
Assert.notEqual(
scanResult.key,
DROPBOX_KEY,
"Scanned provider key returned is not Dropbox"
);
} else {
Assert.ok(!scanResult, "No provider in scan results");
}
}
}
add_task(async function test_checkInit() {
let { CloudStorageInternal } = ChromeUtils.import(
"resource://gre/modules/CloudStorage.jsm",
null
);
let isInitialized = await CloudStorageInternal.promiseInit;
Assert.ok(isInitialized, "Providers Metadata successfully initialized");
});
add_task(async function test_noStorageProvider() {
await checkScan();
cleanupPrefs();
});
/**
* Check scan and save prompt response flow if only dropbox exists on desktop.
*/
add_task(async function test_dropboxStorageProvider() {
nsIDropboxFile = mock_dropbox();
let result = await checkScan(DROPBOX_KEY);
// Always save to cloud
await checkSavedPromptResponse(DROPBOX_KEY, result, true, true);
cleanupPrefs();
// Reject dropbox as cloud storage provider and never re-prompt again
await checkSavedPromptResponse(DROPBOX_KEY, result, true);
// Uninstall dropbox by removing discovery folder
nsIDropboxFile.remove(false);
cleanupPrefs();
});
/**
* Check scan and save prompt response flow if only gdrive exists on desktop.
*/
add_task(async function test_gDriveStorageProvider() {
nsIGDriveFile = mock_gdrive();
let result;
if (AppConstants.platform === "linux") {
result = await checkScan();
} else {
result = await checkScan(GDRIVE_KEY);
}
if (result.size || AppConstants.platform !== "linux") {
// Always save to cloud
await checkSavedPromptResponse(GDRIVE_KEY, result, true, true);
cleanupPrefs();
// Reject Google Drive as cloud storage provider and never re-prompt again
await checkSavedPromptResponse(GDRIVE_KEY, result, true);
}
// Uninstall gDrive by removing discovery folder /Home/Library/Application Support/Google/Drive
nsIGDriveFile.remove(false);
cleanupPrefs();
});
/**
* Check scan and save prompt response flow if multiple provider exists on desktop.
*/
add_task(async function test_multipleStorageProvider() {
nsIDropboxFile = mock_dropbox();
nsIGDriveFile = mock_gdrive();
// Dropbox picked by scan if multiple providers found
let result = await checkScan(DROPBOX_KEY);
// Always save to cloud
await checkSavedPromptResponse(DROPBOX_KEY, result, true, true);
cleanupPrefs();
// Reject dropbox as cloud storage provider and never re-prompt again
await checkSavedPromptResponse(DROPBOX_KEY, result, true);
// Uninstall dropbox and gdrive by removing discovery folder
nsIDropboxFile.remove(false);
nsIGDriveFile.remove(false);
cleanupPrefs();
});
|