183 lines
4.5 KiB
JavaScript
183 lines
4.5 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
"use strict";
|
|
|
|
// Unit tests for access to the Windows Task Scheduler via nsIWinTaskSchedulerService.
|
|
|
|
const svc = Cc["@mozilla.org/win-task-scheduler-service;1"].getService(
|
|
Ci.nsIWinTaskSchedulerService
|
|
);
|
|
|
|
function randomName() {
|
|
return (
|
|
"moz-taskschd-test-" + Services.uuid.generateUUID().toString().slice(1, -1)
|
|
);
|
|
}
|
|
|
|
const gParentFolderName = randomName();
|
|
const gParentFolderPath = `\\${gParentFolderName}`;
|
|
const gSubFolderName = randomName();
|
|
const gSubFolderPath = `\\${gParentFolderName}\\${gSubFolderName}`;
|
|
// This folder will not be created
|
|
const gMissingFolderName = randomName();
|
|
const gMissingFolderPath = `\\${gParentFolderName}\\${gMissingFolderName}`;
|
|
|
|
const gValidTaskXML = `<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
|
<Triggers />
|
|
<Settings>
|
|
<Enabled>false</Enabled>
|
|
</Settings>
|
|
<Actions>
|
|
<Exec>
|
|
<Command>xyz123.exe</Command>
|
|
</Exec>
|
|
</Actions>
|
|
</Task>`;
|
|
|
|
// Missing actions
|
|
const gInvalidTaskXML = `<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
|
<Triggers />
|
|
<Settings>
|
|
<Enabled>false</Enabled>
|
|
</Settings>
|
|
</Task>`;
|
|
|
|
function cleanup() {
|
|
let tasksToDelete = svc.getFolderTasks(gSubFolderPath);
|
|
|
|
for (const task of tasksToDelete) {
|
|
svc.deleteTask(gSubFolderPath, task);
|
|
}
|
|
|
|
svc.deleteFolder(gParentFolderPath, gSubFolderName);
|
|
|
|
svc.deleteFolder("\\", gParentFolderPath);
|
|
}
|
|
|
|
registerCleanupFunction(() => {
|
|
try {
|
|
cleanup();
|
|
} catch (_ex) {
|
|
// Folders may not exist
|
|
}
|
|
});
|
|
|
|
add_task(async function test_svc() {
|
|
/***** FOLDERS *****/
|
|
|
|
// Try creating subfolder before parent folder exists
|
|
Assert.throws(
|
|
() => svc.createFolder(gParentFolderPath, gSubFolderName),
|
|
/NS_ERROR_FILE_NOT_FOUND/
|
|
);
|
|
|
|
// Create parent folder
|
|
svc.createFolder("\\", gParentFolderName);
|
|
|
|
// Create subfolder
|
|
svc.createFolder(gParentFolderPath, gSubFolderName);
|
|
|
|
// Try creating existing folder
|
|
Assert.throws(
|
|
() => svc.createFolder(gParentFolderPath, gSubFolderName),
|
|
/NS_ERROR_FILE_ALREADY_EXISTS/
|
|
);
|
|
|
|
// Try deleting nonexistent subfolder
|
|
Assert.throws(
|
|
() => svc.deleteFolder(gParentFolderPath, gMissingFolderName),
|
|
/NS_ERROR_FILE_NOT_FOUND/
|
|
);
|
|
|
|
/***** TASKS *****/
|
|
const taskNames = [randomName(), randomName(), randomName()];
|
|
|
|
// Try enumerating nonexistent subfolder
|
|
Assert.throws(
|
|
() => svc.getFolderTasks(gMissingFolderPath),
|
|
/NS_ERROR_FILE_NOT_FOUND/
|
|
);
|
|
|
|
// List empty subfolder
|
|
Assert.deepEqual(svc.getFolderTasks(gSubFolderPath), []);
|
|
|
|
// Try to create task in nonexistent subfolder
|
|
Assert.throws(
|
|
() => svc.registerTask(gMissingFolderPath, taskNames[0], gValidTaskXML),
|
|
/NS_ERROR_FILE_NOT_FOUND/
|
|
);
|
|
|
|
// Create task 0
|
|
|
|
svc.registerTask(gSubFolderPath, taskNames[0], gValidTaskXML);
|
|
|
|
// Try to recreate task 0
|
|
Assert.throws(
|
|
() => svc.registerTask(gSubFolderPath, taskNames[0], gValidTaskXML),
|
|
/NS_ERROR_FILE_ALREADY_EXISTS/
|
|
);
|
|
|
|
// Update task 0
|
|
svc.registerTask(
|
|
gSubFolderPath,
|
|
taskNames[0],
|
|
gValidTaskXML,
|
|
true /* aUpdateExisting */
|
|
);
|
|
|
|
// Read back XML
|
|
Assert.ok(svc.getTaskXML(gSubFolderPath, taskNames[0]));
|
|
|
|
// Create remaining tasks
|
|
for (const task of taskNames.slice(1)) {
|
|
svc.registerTask(gSubFolderPath, task, gValidTaskXML);
|
|
}
|
|
|
|
// Try to create with invalid XML
|
|
Assert.throws(
|
|
() => svc.registerTask(gSubFolderPath, randomName(), gInvalidTaskXML),
|
|
/NS_ERROR_FAILURE/
|
|
);
|
|
|
|
// Validate XML
|
|
Assert.equal(svc.validateTaskDefinition(gValidTaskXML), 0 /* S_OK */);
|
|
|
|
// Try to validate invalid XML
|
|
Assert.notEqual(svc.validateTaskDefinition(gInvalidTaskXML), 0 /* S_OK */);
|
|
|
|
// Test enumeration
|
|
{
|
|
let foundTasks = svc.getFolderTasks(gSubFolderPath);
|
|
foundTasks.sort();
|
|
|
|
let allTasks = taskNames.slice();
|
|
allTasks.sort();
|
|
|
|
Assert.deepEqual(foundTasks, allTasks);
|
|
}
|
|
|
|
// Try deleting non-empty folder
|
|
Assert.throws(
|
|
() => svc.deleteFolder(gParentFolderPath, gSubFolderName),
|
|
/NS_ERROR_FILE_DIR_NOT_EMPTY/
|
|
);
|
|
|
|
const missingTaskName = randomName();
|
|
|
|
// Try deleting non-existent task
|
|
Assert.throws(
|
|
() => svc.deleteTask(gSubFolderName, missingTaskName),
|
|
/NS_ERROR_FILE_NOT_FOUND/
|
|
);
|
|
|
|
// Try reading non-existent task
|
|
Assert.throws(
|
|
() => svc.getTaskXML(gSubFolderPath, missingTaskName),
|
|
/NS_ERROR_FILE_NOT_FOUND/
|
|
);
|
|
|
|
/***** Cleanup *****/
|
|
// Explicitly call cleanup() to test that it removes the folder without error.
|
|
cleanup();
|
|
});
|