From 21cf19d0b49b67163ed8efc653a49f6c51bfb470 Mon Sep 17 00:00:00 2001
From: coulbeck <coulbeck@localhost>
Date: Thu, 14 Sep 2006 20:41:34 +0000
Subject: [PATCH] Add some unit test cases for backup tasks.

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/TasksTestCase.java           |  127 +++++++++++++++++++++
 opends/ext/testng/testng.xml                                                                   |    1 
 opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/TestBackupTaskArguments.java |  178 +++++++++++++++++++++++++++++
 3 files changed, 306 insertions(+), 0 deletions(-)

diff --git a/opends/ext/testng/testng.xml b/opends/ext/testng/testng.xml
index 4bb8929..d0f06bb 100644
--- a/opends/ext/testng/testng.xml
+++ b/opends/ext/testng/testng.xml
@@ -12,6 +12,7 @@
             <package name="org.opends.server.schema"/>
             <package name="org.opends.server.monitors"/>
             <package name="org.opends.server.extensions"/>
+            <package name="org.opends.server.tasks"/>
         </packages>
     </test>
 
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/TasksTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/TasksTestCase.java
new file mode 100644
index 0000000..27abda1
--- /dev/null
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/TasksTestCase.java
@@ -0,0 +1,127 @@
+/*
+ * 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 2006 Sun Microsystems, Inc.
+ */
+
+
+package org.opends.server.tasks;
+
+import org.testng.annotations.Test;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.opends.server.DirectoryServerTestCase;
+import org.opends.server.schema.DirectoryStringSyntax;
+import static org.opends.server.config.ConfigConstants.
+     ATTR_TASK_COMPLETION_TIME;
+import static org.opends.server.config.ConfigConstants.ATTR_TASK_STATE;
+import static org.opends.server.config.ConfigConstants.ATTR_TASK_LOG_MESSAGES;
+import org.opends.server.core.AddOperation;
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.protocols.internal.InternalClientConnection;
+import org.opends.server.protocols.internal.InternalSearchOperation;
+import org.opends.server.backends.task.TaskState;
+import org.opends.server.types.*;
+
+import java.util.ArrayList;
+
+/**
+ * A base class for all tasks test cases.
+ */
+@Test(groups = { "precommit", "tasks" })
+public class TasksTestCase extends DirectoryServerTestCase {
+
+  /**
+   * Add a task definition and check that it completes with the expected state.
+   * @param taskEntry The task entry.
+   * @param expectedState The expected completion state of the task.
+   * @throws Exception If the test fails.
+   */
+  protected void testTask(Entry taskEntry, TaskState expectedState)
+       throws Exception
+  {
+    InternalClientConnection connection =
+         InternalClientConnection.getRootConnection();
+
+    // Add the task.
+    AddOperation addOperation =
+         connection.processAdd(taskEntry.getDN(),
+                               taskEntry.getObjectClasses(),
+                               taskEntry.getUserAttributes(),
+                               taskEntry.getOperationalAttributes());
+    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS,
+                 "Add of the task definition was not successful");
+
+    // Wait until the task completes.
+    AttributeType completionTimeType = DirectoryServer.getAttributeType(
+         ATTR_TASK_COMPLETION_TIME.toLowerCase());
+    SearchFilter filter =
+         SearchFilter.createFilterFromString("(objectclass=*)");
+    Entry resultEntry;
+    String completionTime;
+    int countdown = 10; // Do not wait forever.
+    do
+    {
+      countdown--;
+      Thread.sleep(1000);
+
+      InternalSearchOperation searchOperation =
+           connection.processSearch(taskEntry.getDN(),
+                                    SearchScope.BASE_OBJECT,
+                                    filter);
+      resultEntry = searchOperation.getSearchEntries().getFirst();
+      completionTime =
+           resultEntry.getAttributeValue(completionTimeType,
+                                         DirectoryStringSyntax.DECODER);
+
+    } while (completionTime == null && countdown > 0);
+
+    assertNotNull(completionTime,
+                  "The task did not complete");
+
+    // Check that the task state is as expected.
+    AttributeType taskStateType =
+         DirectoryServer.getAttributeType(ATTR_TASK_STATE.toLowerCase());
+    String stateString =
+         resultEntry.getAttributeValue(taskStateType,
+                                       DirectoryStringSyntax.DECODER);
+    TaskState taskState = TaskState.fromString(stateString);
+    assertEquals(taskState, expectedState,
+                 "The task completed in an unexpected state");
+
+    // Check that the task contains some log messages.
+    AttributeType logMessagesType = DirectoryServer.getAttributeType(
+         ATTR_TASK_LOG_MESSAGES.toLowerCase());
+    ArrayList<String> logMessages = new ArrayList<String>();
+    resultEntry.getAttributeValues(logMessagesType,
+                                   DirectoryStringSyntax.DECODER,
+                                   logMessages);
+    if (logMessages.size() == 0)
+    {
+      // NYI see issue 647.
+//      fail("No log messages were written to the task entry");
+    }
+  }
+
+}
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/TestBackupTaskArguments.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/TestBackupTaskArguments.java
new file mode 100644
index 0000000..7219074
--- /dev/null
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/TestBackupTaskArguments.java
@@ -0,0 +1,178 @@
+/*
+ * 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 2006 Sun Microsystems, Inc.
+ */
+
+
+package org.opends.server.tasks;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import org.testng.annotations.BeforeClass;
+import org.opends.server.backends.task.TaskState;
+import org.opends.server.types.*;
+import org.opends.server.TestCaseUtils;
+
+import java.util.UUID;
+
+/**
+ * Tests various valid and invalid combinations of arguments to the backup task.
+ */
+public class TestBackupTaskArguments extends TasksTestCase
+{
+  @BeforeClass
+  public final void setUp() throws Exception {
+    TestCaseUtils.startServer();
+  }
+
+
+  /**
+   * Backup tasks test data provider.
+   *
+   * @return The array of tasks test data.  The first column is a task entry
+   *  and the second column is the expected completed task state.
+   */
+  @DataProvider(name = "backups")
+  public Object[][] createData() throws Exception
+  {
+    return new Object[][] {
+         {
+              // A valid backup task.
+              TestCaseUtils.makeEntry(
+                   "dn: ds-task-id=" + UUID.randomUUID() +
+                        ",cn=Scheduled Tasks,cn=Tasks",
+                   "objectclass: top",
+                   "objectclass: ds-task",
+                   "objectclass: ds-task-backup",
+                   "ds-task-class-name: org.opends.server.tasks.BackupTask",
+                   "ds-backup-directory-path: bak",
+                   "ds-task-backup-all: TRUE"
+              ),
+              TaskState.COMPLETED_SUCCESSFULLY
+         },
+         {
+              // Incompatible settings of backup-directory-path and
+              // incremental-base-id.
+              TestCaseUtils.makeEntry(
+                   "dn: ds-task-id=" + UUID.randomUUID() +
+                        ",cn=Scheduled Tasks,cn=Tasks",
+                   "objectclass: top",
+                   "objectclass: ds-task",
+                   "objectclass: ds-task-backup",
+                   "ds-task-class-name: org.opends.server.tasks.BackupTask",
+                   "ds-backup-directory-path: bak",
+                   "ds-task-backup-incremental: TRUE",
+                   "ds-task-backup-incremental-base-id: monday",
+                   "ds-task-backup-all: TRUE"),
+              TaskState.COMPLETED_WITH_ERRORS
+         },
+         {
+              // Incompatible settings for backend-id and backup-all.
+              TestCaseUtils.makeEntry(
+                   "dn: ds-task-id=" + UUID.randomUUID() +
+                        ",cn=Scheduled Tasks,cn=Tasks",
+                   "objectclass: top",
+                   "objectclass: ds-task",
+                   "objectclass: ds-task-backup",
+                   "ds-task-class-name: org.opends.server.tasks.BackupTask",
+                   "ds-backup-directory-path: bak",
+                   "ds-task-backup-backend-id: example",
+                   "ds-task-backup-all: TRUE"),
+              TaskState.STOPPED_BY_ERROR
+         },
+         {
+              // Neither of backend-id or backup-all specified.
+              TestCaseUtils.makeEntry(
+                   "dn: ds-task-id=" + UUID.randomUUID() +
+                        ",cn=Scheduled Tasks,cn=Tasks",
+                   "objectclass: top",
+                   "objectclass: ds-task",
+                   "objectclass: ds-task-backup",
+                   "ds-task-class-name: org.opends.server.tasks.BackupTask",
+                   "ds-backup-directory-path: bak"),
+              TaskState.STOPPED_BY_ERROR
+         },
+         {
+              // Incompatible settings for incremental and incremental-base-id.
+              TestCaseUtils.makeEntry(
+                   "dn: ds-task-id=" + UUID.randomUUID() +
+                        ",cn=Scheduled Tasks,cn=Tasks",
+                   "objectclass: top",
+                   "objectclass: ds-task",
+                   "objectclass: ds-task-backup",
+                   "ds-task-class-name: org.opends.server.tasks.BackupTask",
+                   "ds-backup-directory-path: bak",
+                   "ds-task-backup-all: TRUE",
+                   "ds-task-backup-incremental-base-id: monday",
+                   "ds-task-backup-incremental: FALSE"),
+              TaskState.STOPPED_BY_ERROR
+         },
+         {
+              // Incompatible settings for hash and sign-hash.
+              TestCaseUtils.makeEntry(
+                   "dn: ds-task-id=" + UUID.randomUUID() +
+                        ",cn=Scheduled Tasks,cn=Tasks",
+                   "objectclass: top",
+                   "objectclass: ds-task",
+                   "objectclass: ds-task-backup",
+                   "ds-task-class-name: org.opends.server.tasks.BackupTask",
+                   "ds-backup-directory-path: bak",
+                   "ds-task-backup-all: TRUE",
+                   "ds-task-backup-hash: FALSE",
+                   "ds-task-backup-sign-hash: TRUE"
+                   ),
+              TaskState.STOPPED_BY_ERROR
+         },
+         {
+              // Specified backend does not support backup.
+              TestCaseUtils.makeEntry(
+                   "dn: ds-task-id=" + UUID.randomUUID() +
+                        ",cn=Scheduled Tasks,cn=Tasks",
+                   "objectclass: top",
+                   "objectclass: ds-task",
+                   "objectclass: ds-task-backup",
+                   "ds-task-class-name: org.opends.server.tasks.BackupTask",
+                   "ds-backup-directory-path: bak",
+                   "ds-task-backup-backend-id: monitor"),
+              TaskState.STOPPED_BY_ERROR
+         },
+    };
+  }
+
+
+
+  /**
+   * Test that various backup task definitions complete with the expected state.
+   * @param taskEntry The task entry.
+   * @param expectedState The expected completion state of the task.
+   */
+  @Test(dataProvider = "backups")
+  public void testBackups(Entry taskEntry, TaskState expectedState)
+       throws Exception
+  {
+    testTask(taskEntry, expectedState);
+  }
+
+}

--
Gitblit v1.10.0