Bug 707679 - Companion testsuite. r=taras

This commit is contained in:
David Rajchenbach-Teller 2012-05-15 15:08:30 +02:00
parent 688bfea1b1
commit 0fbf2cf36d
4 changed files with 297 additions and 0 deletions

View File

@ -0,0 +1,11 @@
DEPTH = ../../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
relativesrcdir = toolkit/components/osfile/tests
MODULE = test_osfile
DIRS = mochi
include $(DEPTH)/config/autoconf.mk
include $(topsrcdir)/config/rules.mk

View File

@ -0,0 +1,16 @@
DEPTH = ../../../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
relativesrcdir = toolkit/components/osfile/tests/mochi
MODULE = osfile
_CHROME_TEST_FILES = \
test_osfile_back.xul \
worker_test_osfile_unix.js \
$(NULL)
include $(topsrcdir)/config/rules.mk
libs:: $(_CHROME_TEST_FILES)
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/chrome/$(relativesrcdir)

View File

@ -0,0 +1,64 @@
<?xml version="1.0"?>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<window title="Testing OS.File on a chrome worker thread"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
onload="test();">
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
<script type="application/javascript">
<![CDATA[
let worker;
function test() {
ok(true, "test_osfile.xul: Starting test");
if (navigator.platform.indexOf("Win") != -1) {
ok(true, "test_osfile.xul: This is a Windows platform, bailing out");
return;
} else {
worker = new ChromeWorker("worker_test_osfile_unix.js");
}
SimpleTest.waitForExplicitFinish();
ok(true, "test_osfile.xul: Chrome worker created");
dump("MAIN: go\n");
worker.onmessage = function(msg) {
ok(true, "MAIN: onmessage "+JSON.stringify(msg.data));
switch (msg.data.kind) {
case "is":
SimpleTest.ok(msg.data.outcome, msg.data.description +
"( "+ msg.data.a + " ==? " + msg.data.b + ")" );
return;
case "isnot":
SimpleTest.ok(msg.data.outcome, msg.data.description +
"( "+ msg.data.a + " !=? " + msg.data.b + ")" );
return;
case "ok":
SimpleTest.ok(msg.data.condition, msg.data.description);
return;
case "finish":
SimpleTest.finish();
return;
default:
SimpleTest.ok(false, "test_osfile.xul: wrong message "+JSON.stringify(msg.data));
return;
}
};
worker.postMessage(0);
ok(true, "test_osfile.xul: Test in progress");
};
]]>
</script>
<body xmlns="http://www.w3.org/1999/xhtml">
<p id="display"></p>
<div id="content" style="display:none;"></div>
<pre id="test"></pre>
</body>
<label id="test-result"/>
</window>

View File

@ -0,0 +1,206 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
function log(text) {
dump("WORKER "+text+"\n");
}
function send(message) {
log("Sending " + JSON.stringify(message) + "errno: " + ctypes.errno);
self.postMessage(message);
}
self.onmessage = function(msg) {
log("received message "+JSON.stringify(msg.data));
self.onmessage = function(msg) {
log("ignored message "+JSON.stringify(msg.data));
};
test_init();
test_getcwd();
test_open_close();
test_create_file();
test_access();
test_read_write();
finish();
};
function finish() {
send({kind: "finish"});
}
function ok(condition, description) {
send({kind: "ok", condition: condition, description:description});
}
function is(a, b, description) {
let outcome = a == b; // Need to decide outcome here, as not everything can be serialized
send({kind: "is", outcome: outcome, description: description, a:""+a, b:""+b});
}
function isnot(a, b, description) {
let outcome = a != b; // Need to decide outcome here, as not everything can be serialized
send({kind: "isnot", outcome: outcome, description: description, a:""+a, b:""+b});
}
function test_init() {
ok(true, "Starting test_init");
importScripts("resource:///modules/osfile.jsm");
OS.Unix.File._init();
}
function test_open_close() {
ok(true, "Starting test_open_close");
is(typeof OS.Unix.File.open, "function", "OS.Unix.File.open is a function");
let file = OS.Unix.File.open("chrome/toolkit/components/osfile/tests/mochi/worker_test_osfile_unix.js", OS.Constants.libc.O_RDONLY, 0);
isnot(file, -1, "test_open_close: opening succeeded");
ok(true, "Close: "+OS.Unix.File.close.toSource());
let result = OS.Unix.File.close(file);
is(result, 0, "test_open_close: close succeeded");
file = OS.Unix.File.open("/i do not exist", OS.Constants.libc.O_RDONLY, 0);
is(file, -1, "test_open_close: opening of non-existing file failed");
is(ctypes.errno, OS.Constants.libc.ENOENT, "test_open_close: error is ENOENT");
}
function test_create_file()
{
ok(true, "Starting test_create_file");
let file = OS.Unix.File.open("test.tmp", OS.Constants.libc.O_RDWR
| OS.Constants.libc.O_CREAT
| OS.Constants.libc.O_TRUNC,
OS.Constants.libc.S_IRWXU);
isnot(file, -1, "test_create_file: file created");
OS.Unix.File.close(file);
}
function test_access()
{
ok(true, "Starting test_access");
let file = OS.Unix.File.open("test1.tmp", OS.Constants.libc.O_RDWR
| OS.Constants.libc.O_CREAT
| OS.Constants.libc.O_TRUNC,
OS.Constants.libc.S_IRWXU);
let result = OS.Unix.File.access("test1.tmp", OS.Constants.libc.R_OK | OS.Constants.libc.W_OK | OS.Constants.libc.X_OK | OS.Constants.libc.F_OK);
is(result, 0, "first call to access() succeeded");
OS.Unix.File.close(file);
file = OS.Unix.File.open("test1.tmp", OS.Constants.libc.O_WRONLY
| OS.Constants.libc.O_CREAT
| OS.Constants.libc.O_TRUNC,
OS.Constants.libc.S_IWUSR);
ok(true, "test_access: preparing second call to access()");
result = OS.Unix.File.access("test2.tmp", OS.Constants.libc.R_OK
| OS.Constants.libc.W_OK
| OS.Constants.libc.X_OK
| OS.Constants.libc.F_OK);
is(result, -1, "test_access: second call to access() failed as expected");
is(ctypes.errno, OS.Constants.libc.ENOENT, "This is the correct error");
OS.Unix.File.close(file);
}
function test_getcwd()
{
let array = new (ctypes.ArrayType(ctypes.char, 32768))();
let path = OS.Unix.File.getcwd(array, array.length);
if (ctypes.char.ptr(path).isNull()) {
ok(false, "test_get_cwd: getcwd returned null, errno: " + ctypes.errno);
}
let path2;
if (OS.Unix.File.get_current_dir_name) {
path2 = OS.Unix.File.get_current_dir_name();
} else {
path2 = OS.Unix.File.getwd_auto(null);
}
if (ctypes.char.ptr(path2).isNull()) {
ok(false, "test_get_cwd: getwd_auto/get_current_dir_name returned null, errno: " + ctypes.errno);
}
is(path.readString(), path2.readString(), "test_get_cwd: getcwd and getwd return the same path");
}
function test_read_write()
{
let output_name = "osfile_copy.tmp";
// Copy file
let input = OS.Unix.File.open(
"chrome/toolkit/components/osfile/tests/mochi/worker_test_osfile_unix.js",
OS.Constants.libc.O_RDONLY, 0);
isnot(input, -1, "test_read_write: input file opened");
let output = OS.Unix.File.open("osfile_copy.tmp", OS.Constants.libc.O_RDWR
| OS.Constants.libc.O_CREAT
| OS.Constants.libc.O_TRUNC,
OS.Constants.libc.S_IRWXU);
isnot(output, -1, "test_read_write: output file opened");
let array = new (ctypes.ArrayType(ctypes.char, 4096))();
let bytes = -1;
let total = 0;
while (true) {
bytes = OS.Unix.File.read(input, array, 4096);
ok(bytes != undefined, "test_read_write: bytes is defined");
isnot(bytes, -1, "test_read_write: no read error");
let write_from = 0;
if (bytes == 0) {
break;
}
while (bytes > 0) {
let ptr = array.addressOfElement(write_from);
// Note: |write| launches an exception in case of error
let written = OS.Unix.File.write(output, array, bytes);
isnot(written, -1, "test_read_write: no write error");
write_from += written;
bytes -= written;
}
total += write_from;
}
ok(true, "test_read_write: copy complete " + total);
// Compare files
let result;
ok(true, "SEEK_SET: " + OS.Constants.libc.SEEK_SET);
ok(true, "Input: " + input + "(" + input.toSource() + ")");
ok(true, "Output: " + output + "(" + output.toSource() + ")");
result = OS.Unix.File.lseek(input, 0, OS.Constants.libc.SEEK_SET);
ok(true, "Result of lseek: " + result);
isnot(result, -1, "test_read_write: input seek succeeded " + ctypes.errno);
result = OS.Unix.File.lseek(output, 0, OS.Constants.libc.SEEK_SET);
isnot(result, -1, "test_read_write: output seek succeeded " + ctypes.errno);
let array2 = new (ctypes.ArrayType(ctypes.char, 4096))();
let bytes2 = -1;
let pos = 0;
while (true) {
bytes = OS.Unix.File.read(input, array, 4096);
isnot(bytes, -1, "test_read_write: input read succeeded");
bytes2 = OS.Unix.File.read(output, array2, 4096);
isnot(bytes, -1, "test_read_write: output read succeeded");
is(bytes > 0, bytes2 > 0, "Both files contain data or neither does "+bytes+", "+bytes2);
if (bytes == 0) {
break;
}
if (bytes != bytes2) {
// This would be surprising, but theoretically possible with a
// remote file system, I believe.
bytes = Math.min(bytes, bytes2);
pos += bytes;
result = OS.Unix.File.lseek(input, pos, OS.Constants.libc.SEEK_SET);
isnot(result, -1, "test_read_write: input seek succeeded");
result = OS.Unix.File.lseek(output, pos, OS.Constants.libc.SEEK_SET);
isnot(result, -1, "test_read_write: output seek succeeded");
} else {
pos += bytes;
}
for (let i = 0; i < bytes; ++i) {
if (array[i] != array2[i]) {
ok(false, "Files do not match at position " + i
+ " ("+array[i] + "/"+array2[i] + ")");
}
}
}
ok(true, "test_read_write test complete");
result = OS.Unix.File.close(input);
isnot(result, -1, "test_read_write: input close succeeded");
result = OS.Unix.File.close(output);
isnot(result, -1, "test_read_write: output close succeeded");
result = OS.Unix.File.unlink(output_name);
isnot(result, -1, "test_read_write: input remove succeeded");
ok(true, "test_read_write cleanup complete");
}