Roll leveldb 3f7758:803d69 (v1.17 -> v1.18)
[chromium-blink-merge.git] / chrome / test / data / chromeos / wallpaper_manager / unit_tests / api_mock.js
blob74d6795e4996b618267e6e2910aa62cb31177b81
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
3 // found in the LICENSE file.
6 var TestConstants = {
7   wallpaperURL: 'https://test.com/test.jpg',
8   // A dummy string which is used to mock an image.
9   IMAGE: '*#*@#&',
10   // A dummy array which is used to mock the file content.
11   FILESTRING: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
14 // mock FileReader object in HTML5 File System
15 function FileReader() {
16   this.result = '';
17   this.onloadend = function() {
18   };
19   this.readAsArrayBuffer = function(mockFile) {
20     this.result = mockFile;
21     this.onloadend();
22   }
25 // Mock localFS handler
26 var mockLocalFS = {
27   root: {
28     dirList: [],
29     rootFileList: [],
30     getDirectory: function(dir, isCreate, success, failure) {
31       for(var i = 0; i < this.dirList.length; i++) {
32         if (this.dirList[i].name == dir) {
33           success(this.dirList[i]);
34           return;
35         }
36       }
37       if (!isCreate.create) {
38         if (failure)
39           failure('DIR_NOT_FOUND');
40       } else {
41         this.dirList.push(new DirEntry(dir));
42         success(this.dirList[this.dirList.length - 1]);
43       }
44     },
45     getFile: function(fileName, isCreate, success, failure) {
46       if (fileName[0] == '/')
47         fileName = fileName.substr(1);
48       if (fileName.split('/').length == 1) {
49         for(var i = 0; i < this.rootFileList.length; i++) {
50           if (fileName == this.rootFileList[i].name) {
51             success(this.rootFileList[i]);
52             return;
53           }
54         }
55         if (!isCreate.create) {
56           if (failure)
57             failure('FILE_NOT_FOUND');
58         } else {
59           this.rootFileList.push(new FileEntry(fileName));
60           success(this.rootFileList[this.rootFileList.length - 1]);
61         }
62       } else if (fileName.split('/').length == 2) {
63         var realDirName = fileName.split('/')[0];
64         var realFileName = fileName.split('/')[1];
65         var getDirSuccess = function(dirEntry) {
66           dirEntry.getFile(realFileName, isCreate, success, failure);
67         };
68         this.getDirectory(realDirName, {create: false},
69                                  getDirSuccess, failure);
70       } else {
71         console.error('Only support one level deep subdirectory')
72       }
73     }
74   },
75   /**
76    * Create a new file in mockLocalFS.
77    * @param {string} fileName File name that to be created.
78    * @return {FileEntry} Handle of the new file
79    */
80   mockTestFile: function(fileName) {
81     var mockFile;
82     if (fileName[0] == '/')
83       fileName = fileName.substr(1);
84     if (fileName.split('/').length == 1) {
85       mockFile = new FileEntry(fileName);
86       this.root.rootFileList.push(mockFile);
87     } else if (fileName.split('/').length == 2) {
88       var realDirName = fileName.split('/')[0];
89       var realFileName = fileName.split('/')[1];
90       var getDirSuccess = function(dirEntry) {
91         dirEntry.getFile(realFileName, {create: true},
92                          function(fe) {mockFile = fe;} );
93       };
94       this.root.getDirectory(realDirName, {create: true}, getDirSuccess);
95     } else {
96       console.error('Only support one-level fileSystem mock')
97     }
98     return mockFile;
99   },
100   /**
101    * Delete all files and directories in mockLocalFS.
102    */
103   reset: function() {
104     this.root.dirList = [];
105     this.root.rootFileList = [];
106   }
109 function DirEntry(dirname) {
110   this.name = dirname;
111   this.fileList = [];
112   this.getFile = function(fileName, isCreate, success, failure) {
113     for(var i = 0; i < this.fileList.length; i++) {
114       if (fileName == this.fileList[i].name) {
115         success(this.fileList[i]);
116         return;
117       }
118     }
119     if (!isCreate.create) {
120       if (failure)
121         failure('FILE_NOT_FOUND');
122     } else {
123       this.fileList.push( new FileEntry(fileName) );
124       success(this.fileList[this.fileList.length - 1]);
125     }
126   }
129 window.webkitRequestFileSystem = function(type, size, callback) {
130   callback(mockLocalFS);
133 function Blob(arg) {
134   var data = arg[0];
135   this.content = '';
136   if (typeof data == 'string')
137     this.content = data;
138   else
139     this.content = Array.prototype.join.call(data);
142 var mockWriter = {
143   write: function(blobData) {
144   }
147 function FileEntry(filename) {
148   this.name = filename;
149   this.file = function(callback) {
150     callback(TestConstants.FILESTRING);
151   };
152   this.createWriter = function(callback) {
153     callback(mockWriter);
154   };
155   this.remove = function(success, failure) {
156   };
159 // Mock chrome syncFS handler
160 var mockSyncFS = {
161   root: {
162     fileList: [],
163     getFile: function(fileName, isCreate, success, failure) {
164       for(var i = 0; i < this.fileList.length; i++) {
165         if (fileName == this.fileList[i].name) {
166           success(this.fileList[i]);
167           return;
168         }
169       }
170       if (!isCreate.create) {
171         if (failure)
172           failure('FILE_NOT_FOUND');
173       } else {
174         this.fileList.push(new FileEntry(fileName));
175         success(this.fileList[this.fileList.length - 1]);
176       }
177     },
178   },
179   /**
180    * Create a new file in mockSyncFS.
181    * @param {string} fileName File name that to be created.
182    * @return {FileEntry} Handle of the new file
183    */
184   mockTestFile: function(fileName) {
185     var mockFile = new FileEntry(fileName);
186     this.root.fileList.push(mockFile);
187     return mockFile;
188   },
189   /**
190    * Delete all files in mockSyncFS.
191    */
192   reset: function() {
193     this.root.fileList = [];
194   }
197 // Mock a few chrome apis.
198 var chrome = {
199   storage: {
200     local: {
201       get: function(key, callback) {
202         var items = {};
203         switch (key) {
204           case Constants.AccessLocalWallpaperInfoKey:
205             items[Constants.AccessLocalWallpaperInfoKey] = {
206               'url': 'dummy',
207               'layout': 'dummy',
208               'source': Constants.WallpaperSourceEnum.Custom
209             };
210         }
211         callback(items);
212       },
213       set: function(items, callback) {
214       }
215     },
216     sync: {
217       get: function(key, callback) {
218       },
219       set: function(items, callback) {
220       }
221     },
222     onChanged: {
223       addListener: function(listener) {
224         this.dispatch = listener;
225       }
226     }
227   },
228   syncFileSystem: {
229     requestFileSystem: function(callback) {
230       callback(mockSyncFS);
231     },
232     onFileStatusChanged: {
233       addListener: function(listener) {
234         this.dispatch = listener;
235       }
236     }
237   },
238   app: {
239     runtime: {
240       onLaunched: {
241         addListener: function(listener) {
242         }
243       }
244     }
245   },
246   alarms: {
247     onAlarm: {
248       addListener: function(listener) {
249       }
250     }
251   },
252   wallpaperPrivate: {
253     getStrings: function(callback) {
254       callback({isExperimental: false});
255     },
256     setCustomWallpaper: function(data, layout, isGenerateThumbnail, fileName,
257                                  callback) {
258     },
259     getSyncSetting: function(callback) {
260       callback({syncThemes: true});
261     }
262   },
263   runtime: {
264     lastError: null
265   }
268 (function (exports) {
269   var originalXMLHttpRequest = window.XMLHttpRequest;
271   // Mock XMLHttpRequest. It dispatches a 'load' event immediately with status
272   // equals to 200 in function |send|.
273   function MockXMLHttpRequest() {
274   }
276   MockXMLHttpRequest.prototype = {
277     responseType: null,
278     url: null,
280     send: function(data) {
281       this.status = 200;
282       this.dispatchEvent('load');
283     },
285     addEventListener: function(type, listener) {
286       this.eventListeners = this.eventListeners || {};
287       this.eventListeners[type] = this.eventListeners[type] || [];
288       this.eventListeners[type].push(listener);
289     },
291     removeEventListener: function (type, listener) {
292       var listeners = this.eventListeners && this.eventListeners[type] || [];
294       for (var i = 0; i < listeners.length; ++i) {
295         if (listeners[i] == listener)
296           return listeners.splice(i, 1);
297       }
298     },
300     dispatchEvent: function(type) {
301       var listeners = this.eventListeners && this.eventListeners[type] || [];
303       if (/test.jpg$/g.test(this.url))
304         this.response = TestConstants.IMAGE;
305       else
306         this.response = '';
308       for (var i = 0; i < listeners.length; ++i)
309         listeners[i].call(this, new Event(type));
310     },
312     open: function(method, url, async) {
313       this.url = url;
314     }
315   };
317   function installMockXMLHttpRequest() {
318     window['XMLHttpRequest'] = MockXMLHttpRequest;
319   };
321   function uninstallMockXMLHttpRequest() {
322     window['XMLHttpRequest'] = originalXMLHttpRequest;
323   };
325   exports.installMockXMLHttpRequest = installMockXMLHttpRequest;
326   exports.uninstallMockXMLHttpRequest = uninstallMockXMLHttpRequest;
328 })(window);