/* 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 = ` false xyz123.exe `; // Missing actions const gInvalidTaskXML = ` false `; 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(); });