From 2273c26793fe6e3abfd90a400823e8e46b3303bb Mon Sep 17 00:00:00 2001
From: abobrov <abobrov@localhost>
Date: Mon, 15 Dec 2008 16:07:29 +0000
Subject: [PATCH] - [Issue 274]  Recurring Tasks

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java |  131 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 129 insertions(+), 2 deletions(-)

diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java
index 0293b9a..beafe6b 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java
@@ -30,8 +30,10 @@
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.GregorianCalendar;
 import java.util.TimeZone;
 
+import java.util.UUID;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
@@ -42,10 +44,10 @@
 import org.opends.server.tasks.TasksTestCase;
 import org.opends.server.types.DN;
 
+import org.opends.server.types.ResultCode;
 import static org.testng.Assert.*;
 
 import static org.opends.server.util.ServerConstants.*;
-import static org.opends.server.util.StaticUtils.*;
 
 
 
@@ -405,5 +407,130 @@
     assertEquals(resultCode, 0);
     assertFalse(DirectoryServer.entryExists(DN.decode(taskDN)));
   }
-}
 
+
+
+  /**
+   * Tests basic recurring task functionality and parser.
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test()
+  public void testRecurringTask()
+         throws Exception
+  {
+    String taskID = "testRecurringTask";
+    String taskDN = "ds-recurring-task-id=" +
+      taskID + ",cn=Recurring Tasks,cn=tasks";
+    String taskSchedule = "00 * * * *";
+
+    String[] invalidTaskSchedules = {
+      "* * * *", "* * * * * *", "*:*:*:*:*",
+      "60 * * * *", "-1 * * * *", "1-60 * * * *", "1,60 * * * *",
+      "* 24 * * *", "* -1 * * *", "* 1-24 * * *", "* 1,24 * * *",
+      "* * 32 * *", "* * 0 * *", "* * 1-32 * *", "* * 1,32 * *",
+      "* * * 13 *", "* * * 0 *", "* * * 1-13 *", "* * * 1,13 *",
+      "* * * * 7", "* * * * -1", "* * * * 1-7", "* * * * 1,7",
+      "* * 31 2 *" };
+    String[] validTaskSchedules = {
+      "* * * * *",
+      "59 * * * *", "0 * * * *", "0-59 * * * *", "0,59 * * * *",
+      "* 23 * * *", "* 0 * * *", "* 0-23 * * *", "* 0,23 * * *",
+      "* * 31 * *", "* * 1 * *", "* * 1-31 * *", "* * 1,31 * *",
+      "* * * 12 *", "* * * 1 *", "* * * 1-12 *", "* * * 1,12 *",
+      "* * * * 6", "* * * * 0", "* * * * 0-6", "* * * * 0,6" };
+
+    GregorianCalendar calendar = new GregorianCalendar();
+    calendar.setFirstDayOfWeek(GregorianCalendar.SUNDAY);
+    calendar.setLenient(false);
+    calendar.add(GregorianCalendar.HOUR_OF_DAY, 1);
+    calendar.set(GregorianCalendar.MINUTE, 0);
+    calendar.set(GregorianCalendar.SECOND, 0);
+
+    Date scheduledDate = calendar.getTime();
+    String scheduledTaskID = taskID + " - " + scheduledDate.toString();
+    String scheduledTaskDN = "ds-task-id=" + scheduledTaskID +
+      ",cn=Scheduled Tasks,cn=tasks";
+
+    assertTrue(addRecurringTask(taskID, taskSchedule));
+
+    Task scheduledTask = TasksTestCase.getTask(DN.decode(scheduledTaskDN));
+    assertTrue(TaskState.isPending(scheduledTask.getTaskState()));
+
+    // Perform a modification to update a non-state attribute.
+    int resultCode = TestCaseUtils.applyModifications(true,
+      "dn: " + taskDN,
+      "changetype: modify",
+      "replace: ds-recurring-task-schedule",
+      "ds-recurring-task-schedule: * * * * *");
+    assertFalse(resultCode == 0);
+
+    // Delete recurring task.
+    resultCode = TestCaseUtils.applyModifications(true,
+      "dn: " + taskDN,
+      "changetype: delete");
+    assertEquals(resultCode, 0);
+    assertFalse(DirectoryServer.entryExists(DN.decode(taskDN)));
+
+    // Make sure scheduled task got canceled.
+    scheduledTask = TasksTestCase.getTask(DN.decode(scheduledTaskDN));
+    assertTrue(TaskState.isCancelled(scheduledTask.getTaskState()));
+
+    // Test parser with invalid schedules.
+    for (String invalidSchedule : invalidTaskSchedules) {
+      assertFalse(addRecurringTask(taskID, invalidSchedule));
+    }
+
+    // Test parser with valid schedules.
+    for (String validSchedule : validTaskSchedules) {
+      taskID = "testRecurringTask" + "-" + UUID.randomUUID();
+      taskDN = "ds-recurring-task-id=" + taskID +
+        ",cn=Recurring Tasks,cn=tasks";
+      assertTrue(addRecurringTask(taskID, validSchedule));
+      // Delete recurring task.
+      resultCode = TestCaseUtils.applyModifications(true,
+        "dn: " + taskDN,
+        "changetype: delete");
+      assertEquals(resultCode, 0);
+      assertFalse(DirectoryServer.entryExists(DN.decode(taskDN)));
+    }
+  }
+
+
+
+  /**
+   * 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.
+   */
+  @Test(enabled=false) // This isn't a test method, but TestNG thinks it is.
+  private boolean addRecurringTask(String taskID, String taskSchedule)
+          throws Exception
+  {
+    String taskDN = "ds-recurring-task-id=" +
+      taskID + ",cn=Recurring Tasks,cn=tasks";
+
+    ResultCode rc = TestCaseUtils.addEntryOperation(
+      "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");
+
+    if (rc != ResultCode.SUCCESS) {
+      return false;
+    }
+    return DirectoryServer.entryExists(DN.decode(taskDN));
+  }
+}

--
Gitblit v1.10.0