TaskBackendTestCase.java revision ea1068c292e9b341af6d6b563cd8988a96be20a9
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at legal-notices/CDDLv1_0.txt.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2008-2010 Sun Microsystems, Inc.
* Portions Copyright 2014-2015 ForgeRock AS
*/
/**
* A set of test cases that can be used to test the task backend.
*/
public class TaskBackendTestCase
extends BackendTestCase
{
/**
* Ensures that the Directory Server is running, and that we are allowed to
* schedule the dummy task.
*
* @throws Exception If an unexpected problem occurs.
*/
public void startServer()
throws Exception
{
"set-global-configuration-prop",
"--add", "allowed-task:org.opends.server.tasks.DummyTask");
}
/**
* Remove the dummy task from the set of allowed tasks.
* @throws Exception If an unexpected error occurred.
*/
public void cleanUp()
throws Exception
{
"set-global-configuration-prop",
"--remove", "allowed-task:org.opends.server.tasks.DummyTask");
}
/**
* Tests to ensure that we can delete a task that is scheduled but hasn't
* yet started.
*
* @throws Exception If an unexpected problem occurs.
*/
@Test
public void testDeletePendingTask()
throws Exception
{
// Schedule a task to start one hour from now that will simply sleep for
// 30 seconds.
"dn: " + taskDN,
"objectClass: top",
"objectClass: ds-task",
"objectClass: extensibleObject",
"ds-task-id: " + taskID,
"ds-task-class-name: org.opends.server.tasks.DummyTask",
"ds-task-scheduled-start-time: " + startTimeStr,
"ds-task-dummy-sleep-time: 30000");
// Perform a modification to delete that task.
"dn: " + taskDN,
"changetype: delete");
}
/**
* Tests to ensure that we cannot delete a task that is currently running.
*
* @throws Exception If an unexpected problem occurs.
*/
@Test
public void testDeleteRunningTask()
throws Exception
{
// Schedule a task to start immediately that will simply sleep for 5
// minutes.
"dn: " + taskDN,
"objectClass: top",
"objectClass: ds-task",
"objectClass: extensibleObject",
"ds-task-id: " + taskID,
"ds-task-class-name: org.opends.server.tasks.DummyTask",
"ds-task-dummy-sleep-time: 300000");
// Wait until we're sure that the task has started running.
{
{
throw new AssertionError("Waited too long for the task to start");
}
}
// Perform a modification to delete that task.
"dn: " + taskDN,
"changetype: delete");
}
/**
* Tests to ensure that we can delete a task that has completed.
*
* @throws Exception If an unexpected problem occurs.
*/
@Test
public void testDeleteCompletedTask()
throws Exception
{
// Schedule a task to start immediately that will simply sleep for 30
// seconds.
"dn: " + taskDN,
"objectClass: top",
"objectClass: ds-task",
"objectClass: extensibleObject",
"ds-task-id: " + taskID,
"ds-task-class-name: org.opends.server.tasks.DummyTask");
// Wait until the task has completed.
// Perform a modification to delete that task.
"dn: " + taskDN,
"changetype: delete");
}
/**
* Tests to ensure that we can modify a task that is scheduled but hasn't
* yet started to change the task state as well as other attributes in the
* task entry.
*
* @throws Exception If an unexpected problem occurs.
*/
@Test
public void testModifyPendingTask()
throws Exception
{
// Schedule a task to start one hour from now that will simply sleep for
// 30 seconds.
"dn: " + taskDN,
"objectClass: top",
"objectClass: ds-task",
"objectClass: extensibleObject",
"ds-task-id: " + taskID,
"ds-task-class-name: org.opends.server.tasks.DummyTask",
"ds-task-scheduled-start-time: " + startTimeStr,
"ds-task-dummy-sleep-time: 30000");
// Perform a modification to update a non-state attribute.
"dn: " + taskDN,
"changetype: modify",
"add: description",
"description: foo");
// Perform a modification to update the task state.
"dn: " + taskDN,
"changetype: modify",
"replace: ds-task-state",
// Delete the task unless it is already deleted by the task scheduler.
"dn: " + taskDN,
"changetype: delete");
}
/**
* Tests to ensure that we cannot modify a task that is currently running
* other than to change its state.
*
* @throws Exception If an unexpected problem occurs.
*/
@Test
public void testModifyRunningTask()
throws Exception
{
// Schedule a task to start immediately that will simply sleep for 5
// minutes.
"dn: " + taskDN,
"objectClass: top",
"objectClass: ds-task",
"objectClass: extensibleObject",
"ds-task-id: " + taskID,
"ds-task-class-name: org.opends.server.tasks.DummyTask",
"ds-task-dummy-sleep-time: 300000");
// Wait until we're sure that the task has started running.
{
{
throw new AssertionError("Waited too long for the task to start");
}
}
// Perform a modification to change something other than the state.
"dn: " + taskDN,
"changetype: modify",
"replace: description",
"description: foo");
// Perform a modification to cancel the task.
"dn: " + taskDN,
"changetype: modify",
"replace: ds-task-state",
"ds-task-state: cancel");
// We may have to wait for the task to register as done, but it should
// definitely be done before it would have stopped normally.
// Perform a modification to delete that task unless
// it is already deleted by the task scheduler.
"dn: " + taskDN,
"changetype: delete");
}
/**
* Tests to ensure that we cannot modify a task that has completed.
*
* @throws Exception If an unexpected problem occurs.
*/
@Test
public void testModifyCompletedTask()
throws Exception
{
// Schedule a task to start and complete immediately.
"dn: " + taskDN,
"objectClass: top",
"objectClass: ds-task",
"objectClass: extensibleObject",
"ds-task-id: " + taskID,
"ds-task-class-name: org.opends.server.tasks.DummyTask");
// Wait until the task has completed.
// Perform a modification to update a non-state attribute.
"dn: " + taskDN,
"changetype: modify",
"add: description",
"description: foo");
// Perform a modification to delete that task.
"dn: " + taskDN,
"changetype: delete");
}
/**
* Creates test schedules for recurring tasks tests.
*
* @return The set of invalid and valid schedules.
*/
public Object[][] createRecurringTaskSchedules() {
return new Object[][] {
{ "* * * *", false },
{ "* * * * * *", false },
{ "*:*:*:*:*", false },
{ "60 * * * *", false },
{ "-1 * * * *", false },
{ "1-60 * * * *", false },
{ "1,60 * * * *", false },
{ "* 24 * * *", false },
{ "* -1 * * *", false },
{ "* 1-24 * * *", false },
{ "* 1,24 * * *", false },
{ "* * 32 * *", false },
{ "* * 0 * *", false },
{ "* * 1-32 * *", false },
{ "* * 1,32 * *", false },
{ "* * * 13 *", false },
{ "* * * 0 *", false },
{ "* * * 1-13 *", false },
{ "* * * 1,13 *", false },
{ "* * * * 7", false },
{ "* * * * -1", false },
{ "* * * * 1-7", false },
{ "* * * * 1,7", false },
{ "* * 31 2 *", false },
{ "*/foo * * * *", false },
{ "1-3,10/4,13 * * * *", false },
{ "1-5/,10,13 * * * *", false },
{ "1-5/foo,10,13 * * * *", false },
{ "* * 29 2 *", true },
{ "* * * * *", true },
{ "59 * * * *", true },
{ "0 * * * *", true },
{ "0-59 * * * *", true },
{ "0,59 * * * *", true },
{ "* 23 * * *", true },
{ "* 0 * * *", true },
{ "* 0-23 * * *", true },
{ "* 0,23 * * *", true },
{ "* * 31 * *", true },
{ "* * 1 * *", true },
{ "* * 1-31 * *", true },
{ "* * 1,31 * *", true },
{ "* * * 12 *", true },
{ "* * * 1 *", true },
{ "* * * 1-12 *", true },
{ "* * * 1,12 *", true },
{ "* * * * 6", true },
{ "* * * * 0", true },
{ "* * * * 0-6", true },
{ "* * * * 0,6", true },
{ "*/2 * * * *", true },
{ "1-3,10-13 * * * *", true },
{ "1-3,10,13 * * * *", true },
{ "1-5/2,10,13 * * * *", true },
{ "1-5/2,11-15/2 * * * *", true }
};
}
/**
* Tests basic recurring task functionality and parser.
*
* @throws Exception
* If an unexpected problem occurs.
*/
@Test
public void testRecurringTask() throws Exception
{
calendar.setLenient(false);
int scheduledMonth =
"ds-recurring-task-id=" + taskID
+ ",cn=Recurring Tasks,cn=tasks";
"cn=Scheduled Tasks,cn=tasks"), true);
// Make sure recurring task iteration got scheduled.
"cn=Scheduled Tasks,cn=tasks"), true);
// Perform a modification to update a non-state attribute.
int resultCode =
"changetype: modify",
"replace: ds-recurring-task-schedule",
"ds-recurring-task-schedule: * * * * *");
// Delete recurring task.
"changetype: delete");
// Make sure recurring task iteration got canceled and removed.
"cn=Scheduled Tasks,cn=tasks"), true);
}
/**
* Tests basic recurring task functionality and parser.
*
* @param schedule
* The schedule string.
* @param isValid
* <code>true</code> if the schedule is expected to be valid.
* @throws Exception
* If an unexpected problem occurs.
*/
{
"ds-recurring-task-id=" + taskID
+ ",cn=Recurring Tasks,cn=tasks";
try
{
if (isValid)
{
// Delete recurring task.
int resultCode =
"changetype: delete");
}
}
finally
{
try
{
// Force deletion of recurring task.
"changetype: delete");
}
finally
{
// Do nothing.
}
}
}
/**
* Adds recurring task to the task backend.
*
* @param taskID recurring task id.
*
* @param taskSchedule recurring task schedule.
*
* @throws Exception If an unexpected problem occurs.
*
* @return <CODE>true</CODE> if task successfully added to
* the task backend, <CODE>false</CODE> otherwise.
*/
throws Exception
{
taskID + ",cn=Recurring Tasks,cn=tasks";
"dn: " + taskDN,
"objectClass: top",
"objectClass: ds-task",
"objectClass: ds-recurring-task",
"objectClass: extensibleObject",
"ds-recurring-task-id: " + taskID,
"ds-recurring-task-schedule: " + taskSchedule,
"ds-task-id: " + taskID,
"ds-task-class-name: org.opends.server.tasks.DummyTask",
"ds-task-dummy-sleep-time: 0");
return false;
}
}
}