4 function parserForFile(filename) {
7 let file = do_get_file(filename);
9 parser = factory.createINIParser(file);
12 dump("INFO | caught error: " + e);
13 // checkParserOutput will handle a null parser when it's expected.
18 function checkParserOutput(parser, expected) {
19 // If the expected output is null, we expect the parser to have
20 // failed (and vice-versa).
21 if (!parser || !expected) {
22 Assert.equal(parser, null);
23 Assert.equal(expected, null);
27 let output = getParserOutput(parser);
28 for (let section in expected) {
29 Assert.ok(section in output);
30 for (let key in expected[section]) {
31 Assert.ok(key in output[section]);
32 Assert.equal(output[section][key], expected[section][key]);
33 delete output[section][key];
35 for (let key in output[section]) {
36 Assert.equal(key, "wasn't expecting this key!");
38 delete output[section];
40 for (let section in output) {
41 Assert.equal(section, "wasn't expecting this section!");
45 function getParserOutput(parser) {
48 for (let section of parser.getSections()) {
49 Assert.equal(false, section in output); // catch dupes
52 for (let key of parser.getKeys(section)) {
53 Assert.equal(false, key in output[section]); // catch dupes
54 let value = parser.getString(section, key);
55 output[section][key] = value;
64 { filename: "data/iniparser01.ini", reference: {} },
65 { filename: "data/iniparser02.ini", reference: {} },
66 { filename: "data/iniparser03.ini", reference: {} },
67 { filename: "data/iniparser04.ini", reference: {} },
68 { filename: "data/iniparser05.ini", reference: {} },
69 { filename: "data/iniparser06.ini", reference: {} },
70 { filename: "data/iniparser07.ini", reference: {} },
72 filename: "data/iniparser08.ini",
73 reference: { section1: { name1: "" } },
76 filename: "data/iniparser09.ini",
77 reference: { section1: { name1: "value1" } },
80 filename: "data/iniparser10.ini",
81 reference: { section1: { name1: "value1" } },
84 filename: "data/iniparser11.ini",
85 reference: { section1: { name1: "value1" } },
88 filename: "data/iniparser12.ini",
89 reference: { section1: { name1: "value1" } },
92 filename: "data/iniparser13.ini",
93 reference: { section1: { name1: "value1" } },
96 filename: "data/iniparser14.ini",
98 section1: { name1: "value1", name2: "value2" },
99 section2: { name1: "value1", name2: "foopy" },
103 filename: "data/iniparser15.ini",
105 section1: { name1: "newValue1" },
106 section2: { name1: "foopy" },
110 filename: "data/iniparser16.ini",
112 "☺♫": { "♫": "☻", "♪": "♥" },
113 "☼": { "♣": "♠", "♦": "♥" },
116 { filename: "data/iniparser17.ini", reference: { section: { key: "" } } },
120 filename: "data/iniparser01-utf8BOM.ini",
121 reference: testdata[0].reference,
124 filename: "data/iniparser02-utf8BOM.ini",
125 reference: testdata[1].reference,
128 filename: "data/iniparser03-utf8BOM.ini",
129 reference: testdata[2].reference,
132 filename: "data/iniparser04-utf8BOM.ini",
133 reference: testdata[3].reference,
136 filename: "data/iniparser05-utf8BOM.ini",
137 reference: testdata[4].reference,
140 filename: "data/iniparser06-utf8BOM.ini",
141 reference: testdata[5].reference,
144 filename: "data/iniparser07-utf8BOM.ini",
145 reference: testdata[6].reference,
148 filename: "data/iniparser08-utf8BOM.ini",
149 reference: testdata[7].reference,
152 filename: "data/iniparser09-utf8BOM.ini",
153 reference: testdata[8].reference,
156 filename: "data/iniparser10-utf8BOM.ini",
157 reference: testdata[9].reference,
160 filename: "data/iniparser11-utf8BOM.ini",
161 reference: testdata[10].reference,
164 filename: "data/iniparser12-utf8BOM.ini",
165 reference: testdata[11].reference,
168 filename: "data/iniparser13-utf8BOM.ini",
169 reference: testdata[12].reference,
172 filename: "data/iniparser14-utf8BOM.ini",
173 reference: testdata[13].reference,
176 filename: "data/iniparser15-utf8BOM.ini",
177 reference: testdata[14].reference,
180 filename: "data/iniparser16-utf8BOM.ini",
181 reference: testdata[15].reference,
184 // Intentional test for appInfo that can't be preloaded.
185 // eslint-disable-next-line mozilla/use-services
186 let os = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS;
187 if ("WINNT" === os) {
189 filename: "data/iniparser01-utf16leBOM.ini",
190 reference: testdata[0].reference,
193 filename: "data/iniparser02-utf16leBOM.ini",
194 reference: testdata[1].reference,
197 filename: "data/iniparser03-utf16leBOM.ini",
198 reference: testdata[2].reference,
201 filename: "data/iniparser04-utf16leBOM.ini",
202 reference: testdata[3].reference,
205 filename: "data/iniparser05-utf16leBOM.ini",
206 reference: testdata[4].reference,
209 filename: "data/iniparser06-utf16leBOM.ini",
210 reference: testdata[5].reference,
213 filename: "data/iniparser07-utf16leBOM.ini",
214 reference: testdata[6].reference,
217 filename: "data/iniparser08-utf16leBOM.ini",
218 reference: testdata[7].reference,
221 filename: "data/iniparser09-utf16leBOM.ini",
222 reference: testdata[8].reference,
225 filename: "data/iniparser10-utf16leBOM.ini",
226 reference: testdata[9].reference,
229 filename: "data/iniparser11-utf16leBOM.ini",
230 reference: testdata[10].reference,
233 filename: "data/iniparser12-utf16leBOM.ini",
234 reference: testdata[11].reference,
237 filename: "data/iniparser13-utf16leBOM.ini",
238 reference: testdata[12].reference,
241 filename: "data/iniparser14-utf16leBOM.ini",
242 reference: testdata[13].reference,
245 filename: "data/iniparser15-utf16leBOM.ini",
246 reference: testdata[14].reference,
249 filename: "data/iniparser16-utf16leBOM.ini",
250 reference: testdata[15].reference,
254 /* ========== 0 ========== */
255 factory = Cc["@mozilla.org/xpcom/ini-parser-factory;1"].getService(
256 Ci.nsIINIParserFactory
258 Assert.ok(!!factory);
260 // Test reading from a variety of files and strings. While we're at it,
261 // write out each one and read it back to ensure that nothing changed.
262 while (testnum < testdata.length) {
263 dump("\nINFO | test #" + ++testnum);
264 let filename = testdata[testnum - 1].filename;
265 dump(", filename " + filename + "\n");
266 let parser = parserForFile(filename);
267 checkParserOutput(parser, testdata[testnum - 1].reference);
271 Assert.ok(parser instanceof Ci.nsIINIParserWriter);
272 // write contents out to a new file
273 let newfilename = filename + ".new";
274 let newfile = do_get_file(filename);
275 newfile.leafName += ".new";
276 parser.writeFile(newfile);
277 // read new file and make sure the contents are the same.
278 parser = parserForFile(newfilename);
279 checkParserOutput(parser, testdata[testnum - 1].reference);
280 // cleanup after the test
281 newfile.remove(false);
283 // ensure that `writeString` works correctly
284 Assert.ok(parser instanceof Ci.nsIINIParserWriter);
285 let formatted = parser.writeToString();
286 parser = factory.createINIParser(null);
287 // re-parsing the formatted string is the easiest
288 // way to verify correctness...
289 parser.initFromString(formatted);
290 checkParserOutput(parser, testdata[testnum - 1].reference);
293 dump("INFO | test #" + ++testnum + "\n");
295 // test writing to a new file.
296 var newfile = do_get_file("data/");
297 newfile.append("nonexistent-file.ini");
298 if (newfile.exists()) {
299 newfile.remove(false);
301 Assert.ok(!newfile.exists());
304 var parser = factory.createINIParser(newfile);
305 Assert.ok(false, "Should have thrown an exception");
309 Cr.NS_ERROR_FILE_NOT_FOUND,
310 "Caught a file not found exception"
313 parser = factory.createINIParser();
315 Assert.ok(parser instanceof Ci.nsIINIParserWriter);
316 checkParserOutput(parser, {});
317 parser.writeFile(newfile);
318 Assert.ok(newfile.exists());
320 // test adding a new section and new key
321 parser.setString("section", "key", "value");
322 parser.setString("section", "key2", "");
323 parser.writeFile(newfile);
324 Assert.ok(newfile.exists());
325 checkParserOutput(parser, { section: { key: "value", key2: "" } });
326 // read it in again, check for same data.
327 parser = parserForFile("data/nonexistent-file.ini");
328 checkParserOutput(parser, { section: { key: "value", key2: "" } });
329 // cleanup after the test
330 newfile.remove(false);
332 dump("INFO | test #" + ++testnum + "\n");
334 // test modifying a existing key's value (in an existing section)
335 parser = parserForFile("data/iniparser09.ini");
336 checkParserOutput(parser, { section1: { name1: "value1" } });
338 Assert.ok(parser instanceof Ci.nsIINIParserWriter);
339 parser.setString("section1", "name1", "value2");
340 checkParserOutput(parser, { section1: { name1: "value2" } });
342 dump("INFO | test #" + ++testnum + "\n");
344 // test trying to set illegal characters
347 checkParserOutput(parser, { section1: { name1: "value2" } });
349 // Bad characters in section name
351 parser.setString("bad\0", "ok", "ok");
355 Assert.ok(caughtError);
356 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
359 parser.setString("bad\r", "ok", "ok");
363 Assert.ok(caughtError);
364 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
367 parser.setString("bad\n", "ok", "ok");
371 Assert.ok(caughtError);
372 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
375 parser.setString("bad[", "ok", "ok");
379 Assert.ok(caughtError);
380 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
383 parser.setString("bad]", "ok", "ok");
387 Assert.ok(caughtError);
388 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
391 parser.setString("", "ok", "ok");
395 Assert.ok(caughtError);
396 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
398 // Bad characters in key name
401 parser.setString("ok", "bad\0", "ok");
405 Assert.ok(caughtError);
406 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
409 parser.setString("ok", "bad\r", "ok");
413 Assert.ok(caughtError);
414 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
417 parser.setString("ok", "bad\n", "ok");
421 Assert.ok(caughtError);
422 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
425 parser.setString("ok", "bad=", "ok");
429 Assert.ok(caughtError);
430 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
433 parser.setString("ok", "", "ok");
437 Assert.ok(caughtError);
438 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
440 // Bad characters in value
443 parser.setString("ok", "ok", "bad\0");
447 Assert.ok(caughtError);
448 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
451 parser.setString("ok", "ok", "bad\r");
455 Assert.ok(caughtError);
456 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
459 parser.setString("ok", "ok", "bad\n");
463 Assert.ok(caughtError);
464 Assert.equal(caughtError.result, Cr.NS_ERROR_INVALID_ARG);
467 parser.setString("ok", "ok", "good=");
471 Assert.ok(!caughtError);
474 throw new Error(`FAILED in test #${testnum} -- ${e}`);