Do not log requests for favicon.ico.
[odfkit:webodf.git] / webodf / testzip.js
1 /*global runtime core*/
2 runtime.loadClass("core.Zip");
3 runtime.loadClass("core.Async");
4
5 var async = new core.Async();
6
7 /**
8  * @param {!core.Zip.ZipEntry} entry
9  * @param {!core.Zip} zip
10  * @param {function(?string):undefined} callback
11  * @return {undefined}
12  */
13 function copyEntry(entry, zip, callback) {
14     entry.load(function (err, data) {
15         if (err) {
16             callback(err);
17         } else {
18             zip.save(entry.filename, data, false, entry.date);
19             callback(null);
20         }
21     });
22 }
23
24 /**
25  * @param {!core.Zip} zipa
26  * @param {!core.Zip} zipb
27  * @param {function(?string):undefined} callback
28  * @return {undefined}
29  */
30 function compareZips(zipa, zipb, callback) {
31     var entriesa = zipa.getEntries(),
32         l = entriesa.length,
33         entriesb = zipb.getEntries(),
34         i, j, entrya, entryb;
35     // compare the number of entries
36     if (entriesb.length !== l) {
37         callback("Number of entries is not equal.");
38         return;
39     }
40     // compare the meta data of the entries
41     for (i = 0; i < l; i += 1) {
42         entrya = entriesa[i];
43         for (j = 0; j < l; j += 1) {
44             entryb = entriesb[j];
45             if (entrya.filename === entryb.filename) {
46                 break;
47             }
48         }
49         if (j === l) {
50             callback("Entry " + entrya.filename + " is not present in the " +
51                     "second zip file.");
52             return;
53         }
54         if (entrya.date.valueOf() !== entryb.date.valueOf()) {
55             callback("Dates for entry " + entrya.filename + " is not equal: " +
56                 entrya.date + " vs " + entryb.date);
57             return;
58         }
59     }
60     // compare the data in the entries
61     async.forEach(entriesa, function (entry, callback) {
62         entry.load(function (err, dataa) {
63             if (err) {
64                 callback(err);
65                 return;
66             }
67             zipb.load(entry.filename, function (err, datab) {
68                 if (err) {
69                     callback(err);
70                     return;
71                 }
72                 var i = 0, l = dataa.length;
73                 if (dataa !== datab) {
74                     for (i = 0; i < l && dataa[i] === datab[i]; i += 1) {}
75                     callback("Data is not equal for " + entry.filename +
76                             " at position " + i + ": " + dataa.charCodeAt(i) +
77                             " vs " + datab.charCodeAt(i) + ".");
78                 } else {
79                     callback(null);
80                 }
81             });
82         });
83     }, function (err) {
84         callback(err);
85     });
86 }
87
88 function testZip(filepatha, callback) {
89     var zipa = new core.Zip(filepatha, function (err, zipa) {
90         if (err) {
91             runtime.log(err);
92             runtime.exit(1);
93             return;
94         }
95         // open a new zip file and copy all entries from zipa to zipb
96         var filepathb = "tmp323.zip",
97             zipb = new core.Zip(filepathb, null),
98             entries = zipa.getEntries(),
99             i, entriesDone = 0;
100         async.forEach(entries, function (entry, callback) {
101             copyEntry(entry, zipb, callback);
102         }, function (err) {
103             if (err) {
104                 callback(err);
105                 return;
106             }
107             zipb.write(function (err) {
108                 if (err) {
109                     callback(err);
110                     return;
111                 }
112                 zipb = new core.Zip(filepathb, function (err, zipb) {
113                     if (err) {
114                         callback(err);
115                         return;
116                     }
117                     compareZips(zipa, zipb, callback);
118                 });
119             });
120         });
121     });
122 }
123
124 var args = arguments;
125 // open the arguments one by one, save them to a file, then open again and see
126 // if the contents matches
127 function doit(i) {
128     if (i >= args.length) {
129         return;
130     }
131     testZip(args[i], function (err) {
132         runtime.log(args[i]);
133         if (err) {
134             runtime.log(err);
135             return;
136         }
137         i += 1;
138         if (i < args.length) {
139             doit(i);
140         }
141     });
142 }
143 doit(1);