gecko-dev/toolkit/components/feeds/test/test_xml.js

98 строки
2.8 KiB
JavaScript

/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* test_xml.js
* This file sets up the unit test environment by building an array of files
* to be tested. It assumes it lives in a folder adjacent to the a folder
* called 'xml', where the testcases live.
*
* The directory layout looks something like this:
*
* tests/test_xml.js*
* |
* - head.js
* |
* - xml/ -- rss1/...
* |
* -- rss2/...
* |
* -- atom/testcase.xml
*
* To add more tests, just include the file in the xml subfolder and add its name to xpcshell.ini
*/
"use strict";
// Listens to feeds being loaded. Runs the tests built into the feed afterwards to veryify they
// were parsed correctly.
function FeedListener(testcase) {
this.testcase = testcase;
}
FeedListener.prototype = {
handleResult: function(result) {
var feed = result.doc;
try {
do_print("Testing feed " + this.testcase.file.path);
Assert.ok(isIID(feed, Ci.nsIFeed), "Has feed interface");
if (!eval(this.testcase.expect)) {
Assert.ok(false, "expect failed for " + this.testcase.desc);
} else {
Assert.ok(true, "expect passed for " + this.testcase.desc);
}
} catch(e) {
Assert.ok(false, "expect failed for " + this.testcase.desc + " ---- " + e.message);
}
run_next_test();
}
}
function createTest(data) {
return function() {
var uri;
if (data.base == null) {
uri = NetUtil.newURI('http://example.org/' + data.path);
} else {
uri = data.base;
}
do_print("Testing " + data.file.leafName);
var parser = Cc["@mozilla.org/feed-processor;1"].createInstance(Ci.nsIFeedProcessor);
var stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
stream.init(data.file, 0x01, parseInt("0444", 8), 0);
parser.listener = new FeedListener(data);
try {
parser.parseFromStream(stream, uri);
} catch(e) {
Assert.ok(false, "parse failed for " + data.file.leafName + " ---- " + e.message);
// If the parser failed, the listener won't be notified, run the next test here.
run_next_test();
} finally {
stream.close();
}
}
}
function run_test() {
// Get the 'xml' directory in here
var topDir = Services.dirsvc.get("CurWorkD", Ci.nsIFile);
topDir.append("xml");
// Every file in the test dir contains an encapulated RSS "test". Iterate through
// them all and add them to the test runner.
iterateDir(topDir, true, file => {
var data = readTestData(file);
add_test(createTest(data));
});
// Now run!
run_next_test();
}