From 3e8e32d7139c5f70a67f04e4e1337e8ee0b3a04b Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Tue, 10 Feb 2009 18:38:49 +0000
Subject: [PATCH] Fix issue 3775: Intermittent unit test failure in NetworkGroupTest

---
 opends/src/server/org/opends/server/core/DirectoryServer.java                                        |   14 ++++
 opends/src/server/org/opends/server/core/networkgroups/NetworkGroupConfigManager.java                |   29 +++++++++
 opends/resource/config/config.ldif                                                                   |   16 +++++
 opends/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/NetworkGroupTest.java |   71 +++++++++++++++++++++++
 4 files changed, 127 insertions(+), 3 deletions(-)

diff --git a/opends/resource/config/config.ldif b/opends/resource/config/config.ldif
index f9f22d2..91ee892 100644
--- a/opends/resource/config/config.ldif
+++ b/opends/resource/config/config.ldif
@@ -2460,6 +2460,20 @@
 dn: cn=Extensions,cn=config
 objectClass: top
 objectClass: ds-cfg-branch
-objectClass: ds-cfg-plugin-root
 cn: Extensions
 
+dn: cn=Network Groups,cn=config
+objectClass: top
+objectClass: ds-cfg-branch
+cn: Network Groups
+
+dn: cn=Workflows,cn=config
+objectClass: top
+objectClass: ds-cfg-branch
+cn: Workflows
+
+dn: cn=Workflow Elements,cn=config
+objectClass: top
+objectClass: ds-cfg-branch
+cn: Workflow Elements
+
diff --git a/opends/src/server/org/opends/server/core/DirectoryServer.java b/opends/src/server/org/opends/server/core/DirectoryServer.java
index f7dbdc3..0ee61f8 100644
--- a/opends/src/server/org/opends/server/core/DirectoryServer.java
+++ b/opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -2569,8 +2569,11 @@
     workflowConfigManager = new WorkflowConfigManager();
     workflowConfigManager.initializeWorkflows();
 
-    networkGroupConfigManager = new NetworkGroupConfigManager();
-    networkGroupConfigManager.initializeNetworkGroups();
+    if (networkGroupConfigManager == null)
+    {
+      networkGroupConfigManager = new NetworkGroupConfigManager();
+      networkGroupConfigManager.initializeNetworkGroups();
+    }
   }
 
 
@@ -2583,6 +2586,13 @@
    */
   private void configureWorkflowsAuto() throws ConfigException
   {
+    // Make sure that the network group config manager is finalized.
+    if (networkGroupConfigManager != null)
+    {
+      networkGroupConfigManager.finalizeNetworkGroups();
+      networkGroupConfigManager = null;
+    }
+
     // First of all re-initialize the current workflow configuration
     NetworkGroup.resetConfig();
     WorkflowImpl.resetConfig();
diff --git a/opends/src/server/org/opends/server/core/networkgroups/NetworkGroupConfigManager.java b/opends/src/server/org/opends/server/core/networkgroups/NetworkGroupConfigManager.java
index 5608ad9..136e0da 100644
--- a/opends/src/server/org/opends/server/core/networkgroups/NetworkGroupConfigManager.java
+++ b/opends/src/server/org/opends/server/core/networkgroups/NetworkGroupConfigManager.java
@@ -219,6 +219,35 @@
 
 
   /**
+   * Finalizes all network groups currently defined in the Directory
+   * Server configuration. This should only be called at Directory
+   * Server shutdown.
+   */
+  public void finalizeNetworkGroups()
+  {
+    // Get the root configuration object.
+    ServerManagementContext managementContext =
+        ServerManagementContext.getInstance();
+    RootCfg rootConfiguration =
+        managementContext.getRootConfiguration();
+
+    // Remove add / delete listeners.
+    rootConfiguration.removeNetworkGroupAddListener(this);
+    rootConfiguration.removeNetworkGroupDeleteListener(this);
+
+    // Finalize the existing network groups.
+    for (NetworkGroup networkGroup : networkGroups.values())
+    {
+      networkGroup.finalizeNetworkGroup();
+    }
+
+    // Clean up remaining state so that it is possible to reinitialize.
+    networkGroups.clear();
+  }
+
+
+
+  /**
    * Initializes all network groups currently defined in the Directory
    * Server configuration. This should only be called at Directory
    * Server startup.
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/NetworkGroupTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/NetworkGroupTest.java
index 6fb0afd..e370540 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/NetworkGroupTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/NetworkGroupTest.java
@@ -747,6 +747,77 @@
   }
 
 
+
+  /**
+   * Tests that routing mode changes cause the network group config
+   * manager to be initialized, shutdown, and reinitialized correctly.
+   *
+   * @see <a
+   *      href="https://opends.dev.java.net/issues/show_bug.cgi?id=3775">Issue 3775</a>
+   * @throws Exception
+   *           If an unexpected error occurred.
+   */
+  @Test
+  public void testIssue3775() throws Exception
+  {
+    // Switch to and from manual mode twice in order to ensure that the
+    // config manager is initialized twice. Then register a network
+    // group. If the initialization has worked properly the network
+    // group should be added successfully. In the case of issue 3775,
+    // the config add listeners ended up being added twice so adding a
+    // network group failed because the admin framework thought it had
+    // been added twice.
+
+    // Switch to manual mode once.
+    TestCaseUtils.dsconfig(
+        "set-global-configuration-prop",
+        "--set", "workflow-configuration-mode:manual");
+
+    try
+    {
+      // Switch back.
+      TestCaseUtils.dsconfig(
+          "set-global-configuration-prop",
+          "--set", "workflow-configuration-mode:auto");
+
+      // Switch to manual mode twice.
+      TestCaseUtils.dsconfig(
+          "set-global-configuration-prop",
+          "--set", "workflow-configuration-mode:manual");
+
+      // Now add network group.
+      final String networkGroupID = "Network group issue 3775";
+
+      TestCaseUtils.dsconfig(
+          "create-network-group",
+          "--group-name", networkGroupID,
+          "--set", "enabled:true",
+          "--set", "priority:" + 123);
+
+      try
+      {
+        // Ensure that the network group was created ok.
+        NetworkGroup networkGroup = NetworkGroup.getNetworkGroup(networkGroupID);
+        assertNotNull(networkGroup, "The network group does not seem to be registered.");
+      }
+      finally
+      {
+        // Remove the network group.
+        TestCaseUtils.dsconfig(
+            "delete-network-group",
+            "--group-name", networkGroupID);
+      }
+    }
+    finally
+    {
+      TestCaseUtils.dsconfig(
+          "set-global-configuration-prop",
+          "--set", "workflow-configuration-mode:auto");
+    }
+  }
+
+
+
   /**
    * Tests the network group resource limits
    *

--
Gitblit v1.10.0