Bug 924916: Part 4 - xpcshell tests for OS.File.setDates(). r=yoric

This commit is contained in:
Nils Maier 2013-10-28 05:42:00 +00:00
parent 3add4b86d7
commit ef94a9ccf4
2 changed files with 209 additions and 0 deletions

View File

@ -0,0 +1,208 @@
"use strict";
Components.utils.import("resource://gre/modules/osfile.jsm");
Components.utils.import("resource://gre/modules/Task.jsm");
/**
* A test to ensure that OS.File.setDates and OS.File.prototype.setDates are
* working correctly.
* (see bug 924916)
*/
function run_test() {
do_test_pending();
run_next_test();
}
// Non-prototypical tests, operating on path names.
add_task(function test_nonproto() {
// First, create a file we can mess with.
let path = OS.Path.join(OS.Constants.Path.tmpDir,
"test_osfile_async_setDates_nonproto.tmp");
yield OS.File.writeAtomic(path, new Uint8Array(1));
try {
// 1. Try to set some well known dates.
// We choose multiples of 2000ms, because the time stamp resolution of
// the underlying OS might not support something more precise.
const accDate = 2000;
const modDate = 4000;
{
yield OS.File.setDates(path, accDate, modDate);
let stat = yield OS.File.stat(path);
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_eq(modDate, stat.lastModificationDate.getTime());
}
// 2.1 Try to omit modificationDate (which should then default to
// |Date.now()|, expect for resolution differences).
{
yield OS.File.setDates(path, accDate);
let stat = yield OS.File.stat(path);
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_neq(modDate, stat.lastModificationDate.getTime());
}
// 2.2 Try to omit accessDate as well (which should then default to
// |Date.now()|, expect for resolution differences).
{
yield OS.File.setDates(path);
let stat = yield OS.File.stat(path);
do_check_neq(accDate, stat.lastAccessDate.getTime());
do_check_neq(modDate, stat.lastModificationDate.getTime());
}
// 3. Repeat 1., but with Date objects this time
{
yield OS.File.setDates(path, new Date(accDate), new Date(modDate));
let stat = yield OS.File.stat(path);
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_eq(modDate, stat.lastModificationDate.getTime());
}
// 4. Check that invalid params will cause an exception/rejection.
{
for (let p of ["invalid", new Uint8Array(1), NaN]) {
try {
yield OS.File.setDates(path, p, modDate);
do_throw("Invalid access date should have thrown for: " + p);
} catch (ex) {
let stat = yield OS.File.stat(path);
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_eq(modDate, stat.lastModificationDate.getTime());
}
try {
yield OS.File.setDates(path, accDate, p);
do_throw("Invalid modification date should have thrown for: " + p);
} catch (ex) {
let stat = yield OS.File.stat(path);
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_eq(modDate, stat.lastModificationDate.getTime());
}
try {
yield OS.File.setDates(path, p, p);
do_throw("Invalid dates should have thrown for: " + p);
} catch (ex) {
let stat = yield OS.File.stat(path);
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_eq(modDate, stat.lastModificationDate.getTime());
}
}
}
} finally {
// Remove the temp file again
yield OS.File.remove(path);
}
});
// Prototypical tests, operating on |File| handles.
add_task(function test_proto() {
// First, create a file we can mess with.
let path = OS.Path.join(OS.Constants.Path.tmpDir,
"test_osfile_async_setDates_proto.tmp");
yield OS.File.writeAtomic(path, new Uint8Array(1));
try {
let fd = yield OS.File.open(path, {write: true});
try {
// 1. Try to set some well known dates.
// We choose multiples of 2000ms, because the time stamp resolution of
// the underlying OS might not support something more precise.
const accDate = 2000;
const modDate = 4000;
{
yield fd.setDates(accDate, modDate);
let stat = yield fd.stat();
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_eq(modDate, stat.lastModificationDate.getTime());
}
// 2.1 Try to omit modificationDate (which should then default to
// |Date.now()|, expect for resolution differences).
{
yield fd.setDates(accDate);
let stat = yield fd.stat();
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_neq(modDate, stat.lastModificationDate.getTime());
}
// 2.2 Try to omit accessDate as well (which should then default to
// |Date.now()|, expect for resolution differences).
{
yield fd.setDates();
let stat = yield fd.stat();
do_check_neq(accDate, stat.lastAccessDate.getTime());
do_check_neq(modDate, stat.lastModificationDate.getTime());
}
// 3. Repeat 1., but with Date objects this time
{
yield fd.setDates(new Date(accDate), new Date(modDate));
let stat = yield fd.stat();
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_eq(modDate, stat.lastModificationDate.getTime());
}
// 4. Check that invalid params will cause an exception/rejection.
{
for (let p of ["invalid", new Uint8Array(1), NaN]) {
try {
yield fd.setDates(p, modDate);
do_throw("Invalid access date should have thrown for: " + p);
} catch (ex) {
let stat = yield fd.stat();
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_eq(modDate, stat.lastModificationDate.getTime());
}
try {
yield fd.setDates(accDate, p);
do_throw("Invalid modification date should have thrown for: " + p);
} catch (ex) {
let stat = yield fd.stat();
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_eq(modDate, stat.lastModificationDate.getTime());
}
try {
yield fd.setDates(p, p);
do_throw("Invalid dates should have thrown for: " + p);
} catch (ex) {
let stat = yield fd.stat();
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_eq(modDate, stat.lastModificationDate.getTime());
}
}
}
} finally {
yield fd.close();
}
} finally {
// Remove the temp file again
yield OS.File.remove(path);
}
});
// Tests setting dates on directories.
add_task(function test_dirs() {
let path = OS.Path.join(OS.Constants.Path.tmpDir,
"test_osfile_async_setDates_dir");
yield OS.File.makeDir(path);
try {
// 1. Try to set some well known dates.
// We choose multiples of 2000ms, because the time stamp resolution of
// the underlying OS might not support something more precise.
const accDate = 2000;
const modDate = 4000;
{
yield OS.File.setDates(path, accDate, modDate);
let stat = yield OS.File.stat(path);
do_check_eq(accDate, stat.lastAccessDate.getTime());
do_check_eq(modDate, stat.lastModificationDate.getTime());
}
} finally {
yield OS.File.removeEmptyDir(path);
}
});
add_task(do_test_finished);

View File

@ -9,6 +9,7 @@ tail =
[test_osfile_async_bytes.js]
[test_osfile_async_copy.js]
[test_osfile_async_flush.js]
[test_osfile_async_setDates.js]
[test_profiledir.js]
[test_logging.js]
[test_creationDate.js]