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 +}