| New file |
| | |
| | | /* |
| | | * 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 |
| | | * trunk/opends/resource/legal-notices/OpenDS.LICENSE |
| | | * or https://OpenDS.dev.java.net/OpenDS.LICENSE. |
| | | * 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 |
| | | * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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 |
| | | * |
| | | * |
| | | * Portions Copyright 2007 Sun Microsystems, Inc. |
| | | */ |
| | | package org.opends.server.backends.task; |
| | | |
| | | |
| | | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | import java.util.TimeZone; |
| | | |
| | | import org.testng.annotations.AfterClass; |
| | | import org.testng.annotations.BeforeClass; |
| | | import org.testng.annotations.Test; |
| | | |
| | | import org.opends.server.TestCaseUtils; |
| | | import org.opends.server.backends.BackendTestCase; |
| | | import org.opends.server.core.DirectoryServer; |
| | | import org.opends.server.tasks.TasksTestCase; |
| | | import org.opends.server.types.DN; |
| | | |
| | | import static org.testng.Assert.*; |
| | | |
| | | import static org.opends.server.util.ServerConstants.*; |
| | | import static org.opends.server.util.StaticUtils.*; |
| | | |
| | | |
| | | |
| | | /** |
| | | * 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. |
| | | */ |
| | | @BeforeClass() |
| | | public void startServer() |
| | | throws Exception |
| | | { |
| | | TestCaseUtils.startServer(); |
| | | TestCaseUtils.initializeTestBackend(true); |
| | | |
| | | TestCaseUtils.dsconfig( |
| | | "set-global-configuration-prop", |
| | | "--add", "allowed-task:org.opends.server.tasks.DummyTask"); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Remove the dummy task from the set of allowed tasks. |
| | | */ |
| | | @AfterClass() |
| | | public void cleanUp() |
| | | throws Exception |
| | | { |
| | | TestCaseUtils.dsconfig( |
| | | "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. |
| | | String taskID = "testDeletePendingTask"; |
| | | String taskDN = "ds-task-id=" + taskID + ",cn=Scheduled Tasks,cn=tasks"; |
| | | |
| | | long startTime = System.currentTimeMillis() + 3600000L; |
| | | SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_GMT_TIME); |
| | | dateFormat.setTimeZone(TimeZone.getTimeZone(TIME_ZONE_UTC)); |
| | | String startTimeStr = dateFormat.format(new Date(startTime)); |
| | | |
| | | TestCaseUtils.addEntry( |
| | | "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"); |
| | | assertTrue(DirectoryServer.entryExists(DN.decode(taskDN))); |
| | | |
| | | Task task = TasksTestCase.getTask(DN.decode(taskDN)); |
| | | assertTrue(TaskState.isPending(task.getTaskState())); |
| | | |
| | | // Perform a modification to delete that task. |
| | | int resultCode = TestCaseUtils.applyModifications( |
| | | "dn: " + taskDN, |
| | | "changetype: delete"); |
| | | assertEquals(resultCode, 0); |
| | | assertFalse(DirectoryServer.entryExists(DN.decode(taskDN))); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 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 30 |
| | | // seconds. |
| | | String taskID = "testDeleteRunningTask"; |
| | | String taskDN = "ds-task-id=" + taskID + ",cn=Scheduled Tasks,cn=tasks"; |
| | | |
| | | TestCaseUtils.addEntry( |
| | | "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: 30000"); |
| | | assertTrue(DirectoryServer.entryExists(DN.decode(taskDN))); |
| | | |
| | | |
| | | // Wait until we're sure that the task has started running. |
| | | long startTime = System.currentTimeMillis(); |
| | | Task task = TasksTestCase.getTask(DN.decode(taskDN)); |
| | | while (TaskState.isPending(task.getTaskState())) |
| | | { |
| | | Thread.sleep(10); |
| | | if (System.currentTimeMillis() > (startTime + 30000L)) |
| | | { |
| | | throw new AssertionError("Waited too long for the task to start"); |
| | | } |
| | | } |
| | | |
| | | assertTrue(TaskState.isRunning(task.getTaskState())); |
| | | |
| | | |
| | | // Perform a modification to delete that task. |
| | | int resultCode = TestCaseUtils.applyModifications( |
| | | "dn: " + taskDN, |
| | | "changetype: delete"); |
| | | assertFalse(resultCode == 0); |
| | | assertTrue(DirectoryServer.entryExists(DN.decode(taskDN))); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 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. |
| | | String taskID = "testDeleteCompltedTask"; |
| | | String taskDN = "ds-task-id=" + taskID + ",cn=Scheduled Tasks,cn=tasks"; |
| | | |
| | | TestCaseUtils.addEntry( |
| | | "dn: " + taskDN, |
| | | "objectClass: top", |
| | | "objectClass: ds-task", |
| | | "objectClass: extensibleObject", |
| | | "ds-task-id: " + taskID, |
| | | "ds-task-class-name: org.opends.server.tasks.DummyTask"); |
| | | assertTrue(DirectoryServer.entryExists(DN.decode(taskDN))); |
| | | |
| | | |
| | | // Wait until the task has completed. |
| | | Task task = TasksTestCase.getCompletedTask(DN.decode(taskDN)); |
| | | assertTrue(TaskState.isDone(task.getTaskState())); |
| | | |
| | | |
| | | // Perform a modification to delete that task. |
| | | int resultCode = TestCaseUtils.applyModifications( |
| | | "dn: " + taskDN, |
| | | "changetype: delete"); |
| | | assertEquals(resultCode, 0); |
| | | assertFalse(DirectoryServer.entryExists(DN.decode(taskDN))); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 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. |
| | | String taskID = "testModifyPendingTask"; |
| | | String taskDN = "ds-task-id=" + taskID + ",cn=Scheduled Tasks,cn=tasks"; |
| | | |
| | | long startTime = System.currentTimeMillis() + 3600000L; |
| | | SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_GMT_TIME); |
| | | dateFormat.setTimeZone(TimeZone.getTimeZone(TIME_ZONE_UTC)); |
| | | String startTimeStr = dateFormat.format(new Date(startTime)); |
| | | |
| | | TestCaseUtils.addEntry( |
| | | "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"); |
| | | assertTrue(DirectoryServer.entryExists(DN.decode(taskDN))); |
| | | |
| | | Task task = TasksTestCase.getTask(DN.decode(taskDN)); |
| | | assertTrue(TaskState.isPending(task.getTaskState())); |
| | | |
| | | // Perform a modification to update a non-state attribute. |
| | | int resultCode = TestCaseUtils.applyModifications( |
| | | "dn: " + taskDN, |
| | | "changetype: modify", |
| | | "add: description", |
| | | "description: foo"); |
| | | assertEquals(resultCode, 0); |
| | | |
| | | |
| | | // Perform a modification to update the task state. |
| | | resultCode = TestCaseUtils.applyModifications( |
| | | "dn: " + taskDN, |
| | | "changetype: modify", |
| | | "replace: ds-task-state", |
| | | "ds-task-state: " + TaskState.CANCELED_BEFORE_STARTING.toString()); |
| | | assertEquals(resultCode, 0); |
| | | |
| | | // Delete the task. |
| | | resultCode = TestCaseUtils.applyModifications( |
| | | "dn: " + taskDN, |
| | | "changetype: delete"); |
| | | assertEquals(resultCode, 0); |
| | | assertFalse(DirectoryServer.entryExists(DN.decode(taskDN))); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 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 30 |
| | | // seconds. |
| | | String taskID = "testModifyRunningTask"; |
| | | String taskDN = "ds-task-id=" + taskID + ",cn=Scheduled Tasks,cn=tasks"; |
| | | |
| | | TestCaseUtils.addEntry( |
| | | "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: 30000"); |
| | | assertTrue(DirectoryServer.entryExists(DN.decode(taskDN))); |
| | | |
| | | |
| | | // Wait until we're sure that the task has started running. |
| | | long startTime = System.currentTimeMillis(); |
| | | Task task = TasksTestCase.getTask(DN.decode(taskDN)); |
| | | while (TaskState.isPending(task.getTaskState())) |
| | | { |
| | | Thread.sleep(10); |
| | | if (System.currentTimeMillis() > (startTime + 30000L)) |
| | | { |
| | | throw new AssertionError("Waited too long for the task to start"); |
| | | } |
| | | } |
| | | |
| | | assertTrue(TaskState.isRunning(task.getTaskState())); |
| | | |
| | | |
| | | // Perform a modification to change something other than the state. |
| | | int resultCode = TestCaseUtils.applyModifications( |
| | | "dn: " + taskDN, |
| | | "changetype: modify", |
| | | "replace: description", |
| | | "description: foo"); |
| | | assertFalse(resultCode == 0); |
| | | |
| | | |
| | | // Perform a modification to cancel the task. |
| | | resultCode = TestCaseUtils.applyModifications( |
| | | "dn: " + taskDN, |
| | | "changetype: modify", |
| | | "replace: ds-task-state", |
| | | "ds-task-state: cancel"); |
| | | assertEquals(resultCode, 0); |
| | | |
| | | |
| | | // We may have to wait for the task to register as done, but it should |
| | | // definitely be done before it would have stopped normally. |
| | | task = TasksTestCase.getCompletedTask(DN.decode(taskDN)); |
| | | assertTrue((System.currentTimeMillis() - startTime) < 30000L); |
| | | assertTrue(TaskState.isDone(task.getTaskState())); |
| | | |
| | | |
| | | // Perform a modification to delete that task. |
| | | resultCode = TestCaseUtils.applyModifications( |
| | | "dn: " + taskDN, |
| | | "changetype: delete"); |
| | | assertEquals(resultCode, 0); |
| | | assertFalse(DirectoryServer.entryExists(DN.decode(taskDN))); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 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 immediately that will simply sleep for 30 |
| | | // seconds. |
| | | String taskID = "testModifyCompltedTask"; |
| | | String taskDN = "ds-task-id=" + taskID + ",cn=Scheduled Tasks,cn=tasks"; |
| | | |
| | | TestCaseUtils.addEntry( |
| | | "dn: " + taskDN, |
| | | "objectClass: top", |
| | | "objectClass: ds-task", |
| | | "objectClass: extensibleObject", |
| | | "ds-task-id: " + taskID, |
| | | "ds-task-class-name: org.opends.server.tasks.DummyTask"); |
| | | assertTrue(DirectoryServer.entryExists(DN.decode(taskDN))); |
| | | |
| | | |
| | | // Wait until the task has completed. |
| | | Task task = TasksTestCase.getCompletedTask(DN.decode(taskDN)); |
| | | assertTrue(TaskState.isDone(task.getTaskState())); |
| | | |
| | | |
| | | // Perform a modification to update a non-state attribute. |
| | | int resultCode = TestCaseUtils.applyModifications( |
| | | "dn: " + taskDN, |
| | | "changetype: modify", |
| | | "add: description", |
| | | "description: foo"); |
| | | assertFalse(resultCode == 0); |
| | | |
| | | |
| | | // Perform a modification to delete that task. |
| | | resultCode = TestCaseUtils.applyModifications( |
| | | "dn: " + taskDN, |
| | | "changetype: delete"); |
| | | assertEquals(resultCode, 0); |
| | | assertFalse(DirectoryServer.entryExists(DN.decode(taskDN))); |
| | | } |
| | | } |
| | | |