xpcom/tests/unit/test_iniProcessor.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/xpcom/tests/unit/test_iniProcessor.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,288 @@
     1.4 +const Ci = Components.interfaces;
     1.5 +const Cc = Components.classes;
     1.6 +const Cr = Components.results;
     1.7 +
     1.8 +let testnum = 0;
     1.9 +let factory;
    1.10 +
    1.11 +function parserForFile(filename) {
    1.12 +    let parser = null;
    1.13 +    try {
    1.14 +        let file = do_get_file(filename);
    1.15 +        do_check_true(!!file);
    1.16 +        parser = factory.createINIParser(file);
    1.17 +        do_check_true(!!parser);
    1.18 +    } catch(e) {
    1.19 +	dump("INFO | caught error: " + e);
    1.20 +        // checkParserOutput will handle a null parser when it's expected.
    1.21 +    }
    1.22 +    return parser;
    1.23 +    
    1.24 +}
    1.25 +
    1.26 +function checkParserOutput(parser, expected) {
    1.27 +    // If the expected output is null, we expect the parser to have
    1.28 +    // failed (and vice-versa).
    1.29 +    if (!parser || !expected) {
    1.30 +        do_check_eq(parser, null);
    1.31 +        do_check_eq(expected, null);
    1.32 +        return;
    1.33 +    }
    1.34 +
    1.35 +    let output = getParserOutput(parser);
    1.36 +    for (let section in expected) {
    1.37 +        do_check_true(section in output);
    1.38 +        for (let key in expected[section]) {
    1.39 +            do_check_true(key in output[section]);
    1.40 +            do_check_eq(output[section][key], expected[section][key]);
    1.41 +            delete output[section][key];
    1.42 +        }
    1.43 +        for (let key in output[section])
    1.44 +            do_check_eq(key, "wasn't expecting this key!");
    1.45 +        delete output[section];
    1.46 +    }
    1.47 +    for (let section in output)
    1.48 +        do_check_eq(section, "wasn't expecting this section!");
    1.49 +}
    1.50 +
    1.51 +function getParserOutput(parser) {
    1.52 +    let output = {};
    1.53 +
    1.54 +    let sections = parser.getSections();
    1.55 +    do_check_true(!!sections);
    1.56 +    while (sections.hasMore()) {
    1.57 +        let section = sections.getNext();
    1.58 +        do_check_false(section in output); // catch dupes
    1.59 +        output[section] = {};
    1.60 +
    1.61 +        let keys = parser.getKeys(section);
    1.62 +        do_check_true(!!keys);
    1.63 +        while (keys.hasMore()) {
    1.64 +            let key = keys.getNext();
    1.65 +            do_check_false(key in output[section]); // catch dupes
    1.66 +            let value = parser.getString(section, key);
    1.67 +            output[section][key] = value;
    1.68 +        }
    1.69 +    }
    1.70 +    return output;
    1.71 +}
    1.72 +
    1.73 +function run_test() {
    1.74 +try {
    1.75 +
    1.76 +let testdata = [
    1.77 +    { filename: "data/iniparser01.ini", reference: {} },
    1.78 +    { filename: "data/iniparser02.ini", reference: {} },
    1.79 +    { filename: "data/iniparser03.ini", reference: {} },
    1.80 +    { filename: "data/iniparser04.ini", reference: {} },
    1.81 +    { filename: "data/iniparser05.ini", reference: {} },
    1.82 +    { filename: "data/iniparser06.ini", reference: {} },
    1.83 +    { filename: "data/iniparser07.ini", reference: {} },
    1.84 +    { filename: "data/iniparser08.ini", reference: { section1: { name1: "" }} },
    1.85 +    { filename: "data/iniparser09.ini", reference: { section1: { name1: "value1" } } },
    1.86 +    { filename: "data/iniparser10.ini", reference: { section1: { name1: "value1" } } },
    1.87 +    { filename: "data/iniparser11.ini", reference: { section1: { name1: "value1" } } },
    1.88 +    { filename: "data/iniparser12.ini", reference: { section1: { name1: "value1" } } },
    1.89 +    { filename: "data/iniparser13.ini", reference: { section1: { name1: "value1" } } },
    1.90 +    { filename: "data/iniparser14.ini", reference: 
    1.91 +                    { section1: { name1: "value1", name2: "value2" },
    1.92 +                      section2: { name1: "value1", name2: "foopy"  }} },
    1.93 +    { filename: "data/iniparser15.ini", reference: 
    1.94 +                    { section1: { name1: "newValue1" },
    1.95 +                      section2: { name1: "foopy"     }} },
    1.96 +    { filename: "data/iniparser16.ini", reference: 
    1.97 +                    { "☺♫": { "♫": "☻", "♪": "♥"  },
    1.98 +                       "☼": { "♣": "♠", "♦": "♥"  }} },
    1.99 +
   1.100 +    ];
   1.101 +
   1.102 +    testdata.push( { filename: "data/iniparser01-utf8BOM.ini",
   1.103 +                     reference: testdata[0].reference } );
   1.104 +    testdata.push( { filename: "data/iniparser02-utf8BOM.ini",
   1.105 +                     reference: testdata[1].reference } );
   1.106 +    testdata.push( { filename: "data/iniparser03-utf8BOM.ini",
   1.107 +                     reference: testdata[2].reference } );
   1.108 +    testdata.push( { filename: "data/iniparser04-utf8BOM.ini",
   1.109 +                     reference: testdata[3].reference } );
   1.110 +    testdata.push( { filename: "data/iniparser05-utf8BOM.ini",
   1.111 +                     reference: testdata[4].reference } );
   1.112 +    testdata.push( { filename: "data/iniparser06-utf8BOM.ini",
   1.113 +                     reference: testdata[5].reference } );
   1.114 +    testdata.push( { filename: "data/iniparser07-utf8BOM.ini",
   1.115 +                     reference: testdata[6].reference } );
   1.116 +    testdata.push( { filename: "data/iniparser08-utf8BOM.ini",
   1.117 +                     reference: testdata[7].reference } );
   1.118 +    testdata.push( { filename: "data/iniparser09-utf8BOM.ini",
   1.119 +                     reference: testdata[8].reference } );
   1.120 +    testdata.push( { filename: "data/iniparser10-utf8BOM.ini",
   1.121 +                     reference: testdata[9].reference } );
   1.122 +    testdata.push( { filename: "data/iniparser11-utf8BOM.ini",
   1.123 +                     reference: testdata[10].reference } );
   1.124 +    testdata.push( { filename: "data/iniparser12-utf8BOM.ini",
   1.125 +                     reference: testdata[11].reference } );
   1.126 +    testdata.push( { filename: "data/iniparser13-utf8BOM.ini",
   1.127 +                     reference: testdata[12].reference } );
   1.128 +    testdata.push( { filename: "data/iniparser14-utf8BOM.ini",
   1.129 +                     reference: testdata[13].reference } );
   1.130 +    testdata.push( { filename: "data/iniparser15-utf8BOM.ini",
   1.131 +                     reference: testdata[14].reference } );
   1.132 +    testdata.push( { filename: "data/iniparser16-utf8BOM.ini",
   1.133 +                     reference: testdata[15].reference } );
   1.134 +
   1.135 +    let os = Cc["@mozilla.org/xre/app-info;1"]
   1.136 +             .getService(Ci.nsIXULRuntime).OS;
   1.137 +    if("WINNT" === os) {
   1.138 +        testdata.push( { filename: "data/iniparser01-utf16leBOM.ini",
   1.139 +                         reference: testdata[0].reference } );
   1.140 +        testdata.push( { filename: "data/iniparser02-utf16leBOM.ini",
   1.141 +                         reference: testdata[1].reference } );
   1.142 +        testdata.push( { filename: "data/iniparser03-utf16leBOM.ini",
   1.143 +                         reference: testdata[2].reference } );
   1.144 +        testdata.push( { filename: "data/iniparser04-utf16leBOM.ini",
   1.145 +                         reference: testdata[3].reference } );
   1.146 +        testdata.push( { filename: "data/iniparser05-utf16leBOM.ini",
   1.147 +                         reference: testdata[4].reference } );
   1.148 +        testdata.push( { filename: "data/iniparser06-utf16leBOM.ini",
   1.149 +                         reference: testdata[5].reference } );
   1.150 +        testdata.push( { filename: "data/iniparser07-utf16leBOM.ini",
   1.151 +                         reference: testdata[6].reference } );
   1.152 +        testdata.push( { filename: "data/iniparser08-utf16leBOM.ini",
   1.153 +                         reference: testdata[7].reference } );
   1.154 +        testdata.push( { filename: "data/iniparser09-utf16leBOM.ini",
   1.155 +                         reference: testdata[8].reference } );
   1.156 +        testdata.push( { filename: "data/iniparser10-utf16leBOM.ini",
   1.157 +                         reference: testdata[9].reference } );
   1.158 +        testdata.push( { filename: "data/iniparser11-utf16leBOM.ini",
   1.159 +                         reference: testdata[10].reference } );
   1.160 +        testdata.push( { filename: "data/iniparser12-utf16leBOM.ini",
   1.161 +                         reference: testdata[11].reference } );
   1.162 +        testdata.push( { filename: "data/iniparser13-utf16leBOM.ini",
   1.163 +                         reference: testdata[12].reference } );
   1.164 +        testdata.push( { filename: "data/iniparser14-utf16leBOM.ini",
   1.165 +                         reference: testdata[13].reference } );
   1.166 +        testdata.push( { filename: "data/iniparser15-utf16leBOM.ini",
   1.167 +                         reference: testdata[14].reference } );
   1.168 +        testdata.push( { filename: "data/iniparser16-utf16leBOM.ini",
   1.169 +                         reference: testdata[15].reference } );
   1.170 +    }
   1.171 +
   1.172 +/* ========== 0 ========== */
   1.173 +factory = Cc["@mozilla.org/xpcom/ini-processor-factory;1"].
   1.174 +          getService(Ci.nsIINIParserFactory);
   1.175 +do_check_true(!!factory);
   1.176 +
   1.177 +// Test reading from a variety of files. While we're at it, write out each one
   1.178 +// and read it back to ensure that nothing changed.
   1.179 +while (testnum < testdata.length) {
   1.180 +    dump("\nINFO | test #" + ++testnum);
   1.181 +    let filename = testdata[testnum -1].filename;
   1.182 +    dump(", filename " + filename + "\n");
   1.183 +    let parser = parserForFile(filename);
   1.184 +    checkParserOutput(parser, testdata[testnum - 1].reference);
   1.185 +    if (!parser)
   1.186 +        continue;
   1.187 +    do_check_true(parser instanceof Ci.nsIINIParserWriter);
   1.188 +    // write contents out to a new file
   1.189 +    let newfilename = filename + ".new";
   1.190 +    let newfile = do_get_file(filename);
   1.191 +    newfile.leafName += ".new";
   1.192 +    parser.writeFile(newfile);
   1.193 +    // read new file and make sure the contents are the same.
   1.194 +    parser = parserForFile(newfilename);
   1.195 +    checkParserOutput(parser, testdata[testnum - 1].reference);
   1.196 +    // cleanup after the test
   1.197 +    newfile.remove(false);
   1.198 +}
   1.199 +
   1.200 +dump("INFO | test #" + ++testnum + "\n");
   1.201 +
   1.202 +// test writing to a new file.
   1.203 +let newfile = do_get_file("data/");
   1.204 +newfile.append("nonexistent-file.ini");
   1.205 +if (newfile.exists())
   1.206 +    newfile.remove(false);
   1.207 +do_check_false(newfile.exists());
   1.208 +
   1.209 +let parser = factory.createINIParser(newfile);
   1.210 +do_check_true(!!parser);
   1.211 +do_check_true(parser instanceof Ci.nsIINIParserWriter);
   1.212 +checkParserOutput(parser, {});
   1.213 +parser.writeFile();
   1.214 +do_check_true(newfile.exists());
   1.215 +
   1.216 +// test adding a new section and new key
   1.217 +parser.setString("section", "key", "value");
   1.218 +parser.writeFile();
   1.219 +do_check_true(newfile.exists());
   1.220 +checkParserOutput(parser, {section: {key: "value"} });
   1.221 +// read it in again, check for same data.
   1.222 +parser = parserForFile("data/nonexistent-file.ini");
   1.223 +checkParserOutput(parser, {section: {key: "value"} });
   1.224 +// cleanup after the test
   1.225 +newfile.remove(false);
   1.226 +
   1.227 +dump("INFO | test #" + ++testnum + "\n");
   1.228 +
   1.229 +// test modifying a existing key's value (in an existing section)
   1.230 +parser = parserForFile("data/iniparser09.ini");
   1.231 +checkParserOutput(parser, {section1: {name1: "value1"} });
   1.232 +
   1.233 +do_check_true(parser instanceof Ci.nsIINIParserWriter);
   1.234 +parser.setString("section1", "name1", "value2");
   1.235 +checkParserOutput(parser, {section1: {name1: "value2"} });
   1.236 +
   1.237 +dump("INFO | test #" + ++testnum + "\n");
   1.238 +
   1.239 +// test trying to set illegal characters
   1.240 +let caughtError;
   1.241 +caughtError = false;
   1.242 +checkParserOutput(parser, {section1: {name1: "value2"} });
   1.243 +
   1.244 +// Bad characters in section name
   1.245 +try { parser.SetString("bad\0", "ok", "ok"); } catch (e) { caughtError = true; }
   1.246 +do_check_true(caughtError);
   1.247 +caughtError = false;
   1.248 +try { parser.SetString("bad\r", "ok", "ok"); } catch (e) { caughtError = true; }
   1.249 +do_check_true(caughtError);
   1.250 +caughtError = false;
   1.251 +try { parser.SetString("bad\n", "ok", "ok"); } catch (e) { caughtError = true; }
   1.252 +do_check_true(caughtError);
   1.253 +caughtError = false;
   1.254 +try { parser.SetString("bad[", "ok", "ok"); } catch (e) { caughtError = true; }
   1.255 +do_check_true(caughtError);
   1.256 +caughtError = false;
   1.257 +try { parser.SetString("bad]", "ok", "ok"); } catch (e) { caughtError = true; }
   1.258 +do_check_true(caughtError);
   1.259 +
   1.260 +// Bad characters in key name
   1.261 +caughtError = false;
   1.262 +try { parser.SetString("ok", "bad\0", "ok"); } catch (e) { caughtError = true; }
   1.263 +do_check_true(caughtError);
   1.264 +caughtError = false;
   1.265 +try { parser.SetString("ok", "bad\r", "ok"); } catch (e) { caughtError = true; }
   1.266 +do_check_true(caughtError);
   1.267 +caughtError = false;
   1.268 +try { parser.SetString("ok", "bad\n", "ok"); } catch (e) { caughtError = true; }
   1.269 +do_check_true(caughtError);
   1.270 +caughtError = false;
   1.271 +try { parser.SetString("ok", "bad=", "ok"); } catch (e) { caughtError = true; }
   1.272 +do_check_true(caughtError);
   1.273 +
   1.274 +// Bad characters in value
   1.275 +caughtError = false;
   1.276 +try { parser.SetString("ok", "ok", "bad\0"); } catch (e) { caughtError = true; }
   1.277 +do_check_true(caughtError);
   1.278 +caughtError = false;
   1.279 +try { parser.SetString("ok", "ok", "bad\r"); } catch (e) { caughtError = true; }
   1.280 +do_check_true(caughtError);
   1.281 +caughtError = false;
   1.282 +try { parser.SetString("ok", "ok", "bad\n"); } catch (e) { caughtError = true; }
   1.283 +do_check_true(caughtError);
   1.284 +caughtError = false;
   1.285 +try { parser.SetString("ok", "ok", "bad="); } catch (e) { caughtError = true; }
   1.286 +do_check_true(caughtError);
   1.287 +
   1.288 +} catch(e) {
   1.289 +    throw "FAILED in test #" + testnum + " -- " + e;
   1.290 +}
   1.291 +}

mercurial