/* * 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 * or http://forgerock.org/license/CDDLv1.0.html. * 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 2007-2008 Sun Microsystems, Inc. * Portions copyright 2013-2015 ForgeRock AS */ package org.forgerock.opendj.config.server; import static org.fest.assertions.Assertions.assertThat; import static org.forgerock.opendj.ldif.LDIF.makeEntry; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.i18n.LocalizableMessageBuilder; import org.forgerock.opendj.config.AdminTestCase; import org.forgerock.opendj.config.AdministratorAction; import org.forgerock.opendj.config.AggregationPropertyDefinition; import org.forgerock.opendj.config.PropertyException; import org.forgerock.opendj.config.PropertyOption; import org.forgerock.opendj.config.TestCfg; import org.forgerock.opendj.config.TestChildCfg; import org.forgerock.opendj.config.TestChildCfgDefn; import org.forgerock.opendj.config.TestParentCfg; import org.forgerock.opendj.config.UndefinedDefaultBehaviorProvider; import org.forgerock.opendj.config.conditions.Conditions; import org.forgerock.opendj.config.server.spi.ConfigChangeListener; import org.forgerock.opendj.config.server.spi.ConfigDeleteListener; import org.forgerock.opendj.config.server.spi.ConfigurationRepository; import org.forgerock.opendj.ldap.Entry; import org.forgerock.opendj.ldap.schema.Schema; import org.forgerock.opendj.ldif.LDIF; import org.forgerock.opendj.server.config.client.ConnectionHandlerCfgClient; import org.forgerock.opendj.server.config.server.ConnectionHandlerCfg; import org.mockito.ArgumentCaptor; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** * Test cases for aggregations on the server-side. */ @Test(singleThreaded = true) @SuppressWarnings("javadoc") public final class AggregationServerTest extends AdminTestCase { /** * Dummy change listener for triggering change constraint call-backs. */ private static final class DummyChangeListener implements ConfigurationChangeListener<TestChildCfg> { public ConfigChangeResult applyConfigurationChange(TestChildCfg configuration) { return new ConfigChangeResult(); } public boolean isConfigurationChangeAcceptable(TestChildCfg configuration, List<LocalizableMessage> unacceptableReasons) { return true; } } /** * Dummy delete listener for triggering delete constraint call-backs. */ private static final class DummyDeleteListener implements ConfigurationDeleteListener<TestChildCfg> { public ConfigChangeResult applyConfigurationDelete(TestChildCfg configuration) { return new ConfigChangeResult(); } public boolean isConfigurationDeleteAcceptable(TestChildCfg configuration, List<LocalizableMessage> unacceptableReasons) { return true; } } // @Checkstyle:off private static final Entry TEST_CHILD_1 = makeEntry( "dn: cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config", "objectclass: top", "objectclass: ds-cfg-test-child-dummy", "cn: test child 1", "ds-cfg-enabled: true", "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider", "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real"); private static final Entry TEST_CHILD_2 = makeEntry( "dn: cn=test child 2,cn=test children,cn=test parent 1,cn=test parents,cn=config", "objectclass: top", "objectclass: ds-cfg-test-child-dummy", "cn: test child 2", "ds-cfg-enabled: true", "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider", "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real", "ds-cfg-rotation-policy: cn=LDAP Connection Handler, cn=connection handlers, cn=config"); /** Has an invalid handler reference. */ private static final Entry TEST_CHILD_3 = makeEntry( "dn: cn=test child 3,cn=test children,cn=test parent 1,cn=test parents,cn=config", "objectclass: top", "objectclass: ds-cfg-test-child-dummy", "cn: test child 3", "ds-cfg-enabled: true", "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider", "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real", "ds-cfg-rotation-policy: cn=LDAP Connection Handler, cn=bad rdn, cn=config"); private static final Entry TEST_CHILD_4 = makeEntry( "dn: cn=test child 4,cn=test children,cn=test parent 1,cn=test parents,cn=config", "objectclass: top", "objectclass: ds-cfg-test-child-dummy", "cn: test child 4", "ds-cfg-enabled: true", "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider", "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real", "ds-cfg-rotation-policy: cn=LDAP Connection Handler, cn=connection handlers, cn=config", "ds-cfg-rotation-policy: cn=LDAPS Connection Handler, cn=connection handlers, cn=config"); private static final Entry TEST_CHILD_5 = makeEntry( "dn: cn=test child 5,cn=test children,cn=test parent 1,cn=test parents,cn=config", "objectclass: top", "objectclass: ds-cfg-test-child-dummy", "cn: test child 5", "ds-cfg-enabled: true", "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider", "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real", "ds-cfg-rotation-policy: cn=BAD Connection Handler 1, cn=connection handlers, cn=config", "ds-cfg-rotation-policy: cn=BAD Connection Handler 2, cn=connection handlers, cn=config", "ds-cfg-rotation-policy: cn=LDAP Connection Handler, cn=connection handlers, cn=config"); private static final Entry TEST_CHILD_6 = makeEntry( "dn: cn=test child 6,cn=test children,cn=test parent 1,cn=test parents,cn=config", "objectclass: top", "objectclass: ds-cfg-test-child-dummy", "cn: test child 6", "ds-cfg-enabled: true", "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider", "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real", "ds-cfg-rotation-policy: cn=Test Connection Handler, cn=connection handlers, cn=config"); private static final Entry TEST_CHILD_7 = makeEntry( "dn: cn=test child 7,cn=test children,cn=test parent 1,cn=test parents,cn=config", "objectclass: top", "objectclass: ds-cfg-test-child-dummy", "cn: test child 7", "ds-cfg-enabled: false", "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider", "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real", "ds-cfg-rotation-policy: cn=Test Connection Handler, cn=connection handlers, cn=config"); static final Entry TEST_PARENTS = makeEntry( "dn: cn=test parents,cn=config", "objectclass: top", "objectclass: ds-cfg-branch", "cn: test parents"); static final Entry TEST_PARENT_1 = makeEntry( "dn: cn=test parent 1,cn=test parents,cn=config", "objectclass: top", "objectclass: ds-cfg-test-parent-dummy", "cn: test parent 1", "ds-cfg-enabled: true", "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider", "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real"); private static final Entry TEST_BASE_CHILD = LDIF.makeEntry( "dn:cn=test children,cn=test parent 1,cn=test parents,cn=config", "objectclass: top", "objectclass: ds-cfg-branch", "cn: test children"); /** This handler is disabled - see ds-cfg-enabled property. */ protected static final Entry TEST_CONNECTION_HANDLER_ENTRY_DISABLED = LDIF.makeEntry( "dn: cn=" + "Test Connection Handler" + ",cn=Connection Handlers,cn=config", "objectClass: top", "objectClass: ds-cfg-connection-handler", "objectClass: ds-cfg-ldap-connection-handler", "cn: LDAP Connection Handler", "ds-cfg-java-class: org.opends.server.protocols.ldap.LDAPConnectionHandler", "ds-cfg-enabled: false", "ds-cfg-listen-address: 0.0.0.0", "ds-cfg-listen-port: 389"); /** This handler is enabled - see ds-cfg-enabled property. */ protected static final Entry TEST_CONNECTION_HANDLER_ENTRY_ENABLED = LDIF.makeEntry( "dn: cn=" + "Test Connection Handler" + ",cn=Connection Handlers,cn=config", "objectClass: top", "objectClass: ds-cfg-connection-handler", "objectClass: ds-cfg-ldap-connection-handler", "cn: LDAP Connection Handler", "ds-cfg-java-class: org.opends.server.protocols.ldap.LDAPConnectionHandler", "ds-cfg-enabled: true", "ds-cfg-listen-address: 0.0.0.0", "ds-cfg-listen-port: 389"); // @Checkstyle:on // @Checkstyle:off /** * The default test child configuration "aggregation-property" property * definition. */ private AggregationPropertyDefinition<ConnectionHandlerCfgClient, ConnectionHandlerCfg> aggregationPropertyDefinitionDefault; /** * An aggregation where the target must be enabled if the source is enabled. */ private AggregationPropertyDefinition<ConnectionHandlerCfgClient, ConnectionHandlerCfg> aggregationPropertyDefinitionTargetAndSourceMustBeEnabled; /** An aggregation where the target must be enabled. */ private AggregationPropertyDefinition<ConnectionHandlerCfgClient, ConnectionHandlerCfg> aggregationPropertyDefinitionTargetMustBeEnabled; // @Checkstyle:on @BeforeClass public void setUp() throws Exception { TestCfg.setUp(); // Save the aggregation property definition so that it can be // replaced and restored later. aggregationPropertyDefinitionDefault = TestChildCfgDefn.getInstance().getAggregationPropertyPropertyDefinition(); // Create the two test aggregation properties. AggregationPropertyDefinition.Builder<ConnectionHandlerCfgClient, ConnectionHandlerCfg> builder; TestChildCfgDefn d = TestChildCfgDefn.getInstance(); builder = AggregationPropertyDefinition.createBuilder(d, "aggregation-property"); builder.setOption(PropertyOption.MULTI_VALUED); builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, d, "aggregation-property")); builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<String>()); builder.setParentPath("/"); builder.setRelationDefinition("connection-handler"); builder.setTargetIsEnabledCondition(Conditions.contains("enabled", "true")); aggregationPropertyDefinitionTargetMustBeEnabled = builder.getInstance(); TestCfg.initializePropertyDefinition(aggregationPropertyDefinitionTargetMustBeEnabled); builder = AggregationPropertyDefinition.createBuilder(d, "aggregation-property"); builder.setOption(PropertyOption.MULTI_VALUED); builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, d, "aggregation-property")); builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<String>()); builder.setParentPath("/"); builder.setRelationDefinition("connection-handler"); builder.setTargetIsEnabledCondition(Conditions.contains("enabled", "true")); builder.setTargetNeedsEnablingCondition(Conditions.contains("mandatory-boolean-property", "true")); aggregationPropertyDefinitionTargetAndSourceMustBeEnabled = builder.getInstance(); TestCfg.initializePropertyDefinition(aggregationPropertyDefinitionTargetAndSourceMustBeEnabled); } @AfterClass public void tearDown() throws Exception { TestCfg.cleanup(); // Restore the test child aggregation definition. TestCfg.addPropertyDefinition(aggregationPropertyDefinitionDefault); } /** * Tests that aggregation is rejected when the LDAP DN contains a valid RDN * but an invalid parent DN. */ @Test public void testAggregationBadBaseDN() throws Exception { ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_3, LDAP_CONN_HANDLER_ENTRY); ServerManagementContext context = new ServerManagementContext(configRepository); TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context); try { parentCfg.getTestChild(entryName(TEST_CHILD_3)); fail("Unexpectedly added test child 3 when it had a bad aggregation value"); } catch (ConfigException e) { assertThat(e.getCause()).isNotNull().isInstanceOf(ServerManagedObjectDecodingException.class); ServerManagedObjectDecodingException de = (ServerManagedObjectDecodingException) e.getCause(); assertThat(de.getCauses()).hasSize(1); PropertyException propertyException = de.getCauses().iterator().next(); assertThat(propertyException).isInstanceOf(PropertyException.class); assertEquals(propertyException.getPropertyDefinition(), TestChildCfgDefn.getInstance() .getAggregationPropertyPropertyDefinition()); } } /** * Tests that aggregation is rejected by a constraint violation when the DN * values are dangling. */ @Test public void testAggregationDanglingReference() throws Exception { ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_5, LDAP_CONN_HANDLER_ENTRY); ServerManagementContext context = new ServerManagementContext(configRepository); TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context); try { parentCfg.getTestChild(entryName(TEST_CHILD_5)); fail("Unexpectedly added test child 5 when it had a dangling reference"); } catch (ConfigException e) { assertThat(e.getCause()).isNotNull().isInstanceOf(ConstraintViolationException.class); ConstraintViolationException cve = (ConstraintViolationException) e.getCause(); assertThat(cve.getMessages()).isNotNull().hasSize(2); } } /** * Tests that aggregation is REJECTED by a constraint violation when an * enabled component references a disabled component and the referenced * component must always be enabled. */ @Test public void testAggregationDisabledReference1() throws Exception { ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_6, TEST_CONNECTION_HANDLER_ENTRY_DISABLED); ServerManagementContext context = new ServerManagementContext(configRepository); registerAggregationDefinitionWithTargetEnabled(); try { TestParentCfg parent = getParentCfg(TEST_PARENT_1, context); parent.getTestChild(entryName(TEST_CHILD_6)); fail("Unexpectedly added test child 6 when it had a disabled reference"); } catch (ConfigException e) { assertThat(e.getCause()).isNotNull().isInstanceOf(ConstraintViolationException.class); ConstraintViolationException cve = (ConstraintViolationException) e.getCause(); assertThat(cve.getMessages()).isNotNull().hasSize(1); } finally { putBackDefaultAggregationDefinitionFromTargetEnabled(); } } /** * Tests that aggregation is REJECTED by a constraint violation when a * disabled component references a disabled component and the referenced * component must always be enabled. */ @Test public void testAggregationDisabledReference2() throws Exception { ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_7, TEST_CONNECTION_HANDLER_ENTRY_DISABLED); ServerManagementContext context = new ServerManagementContext(configRepository); registerAggregationDefinitionWithTargetEnabled(); try { TestParentCfg parent = getParentCfg(TEST_PARENT_1, context); parent.getTestChild(entryName(TEST_CHILD_7)); fail("Unexpectedly added test child 7 when it had a disabled reference"); } catch (ConfigException e) { assertThat(e.getCause()).isNotNull().isInstanceOf(ConstraintViolationException.class); ConstraintViolationException cve = (ConstraintViolationException) e.getCause(); assertThat(cve.getMessages()).isNotNull().hasSize(1); } finally { putBackDefaultAggregationDefinitionFromTargetEnabled(); } } /** * Tests that aggregation is REJECTED by a constraint violation when an * enabled component references a disabled component and the referenced * component must always be enabled when the referencing component is * enabled. */ @Test public void testAggregationDisabledReference3() throws Exception { ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_6, TEST_CONNECTION_HANDLER_ENTRY_DISABLED); ServerManagementContext context = new ServerManagementContext(configRepository); registerAggregationDefinitionWithTargetAndSourceEnabled(); try { TestParentCfg parent = getParentCfg(TEST_PARENT_1, context); parent.getTestChild(entryName(TEST_CHILD_6)); fail("Unexpectedly added test child 6 when it had a disabled reference"); } catch (ConfigException e) { assertThat(e.getCause()).isNotNull().isInstanceOf(ConstraintViolationException.class); ConstraintViolationException cve = (ConstraintViolationException) e.getCause(); assertThat(cve.getMessages()).isNotNull().hasSize(1); } finally { putBackDefaultAggregationDefinitionFromTargetAndSourceEnabled(); } } /** * Tests that aggregation is ALLOWED when a disabled component references a * disabled component and the referenced component must always be enabled * when the referencing component is enabled. */ @Test public void testAggregationDisabledReference4() throws Exception { ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_7, TEST_CONNECTION_HANDLER_ENTRY_DISABLED); ServerManagementContext context = new ServerManagementContext(configRepository); registerAggregationDefinitionWithTargetAndSourceEnabled(); try { TestParentCfg parent = getParentCfg(TEST_PARENT_1, context); parent.getTestChild(entryName(TEST_CHILD_7)); } finally { putBackDefaultAggregationDefinitionFromTargetAndSourceEnabled(); } } /** * Tests that aggregation contains no values when it contains does not * contain any DN attribute values. */ @Test public void testAggregationEmpty() throws Exception { ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_1); ServerManagementContext context = new ServerManagementContext(configRepository); TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context); TestChildCfg testChildCfg = parentCfg.getTestChild(entryName(TEST_CHILD_1)); assertEquals(testChildCfg.getMandatoryClassProperty(), "org.opends.server.extensions.UserDefinedVirtualAttributeProvider"); assertEquals(testChildCfg.getMandatoryReadOnlyAttributeTypeProperty(), Schema.getDefaultSchema() .getAttributeType("description")); assertSetEquals(testChildCfg.getAggregationProperty(), new String[0]); } /** * Tests that aggregation contains multiple valid values when it contains a * multiple valid DN attribute values. */ @Test public void testAggregationMultipleValues() throws Exception { ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_4, LDAP_CONN_HANDLER_ENTRY, LDAPS_CONN_HANDLER_ENTRY); ServerManagementContext context = new ServerManagementContext(configRepository); TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context); TestChildCfg testChildCfg = parentCfg.getTestChild(entryName(TEST_CHILD_4)); assertEquals(testChildCfg.getMandatoryClassProperty(), "org.opends.server.extensions.UserDefinedVirtualAttributeProvider"); assertEquals(testChildCfg.getMandatoryReadOnlyAttributeTypeProperty(), Schema.getDefaultSchema() .getAttributeType("description")); assertSetEquals(testChildCfg.getAggregationProperty(), "LDAPS Connection Handler", "LDAP Connection Handler"); } /** * Tests that aggregation contains single valid value when it contains a * single valid DN attribute values. */ @Test public void testAggregationSingle() throws Exception { ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_2, LDAP_CONN_HANDLER_ENTRY); ServerManagementContext context = new ServerManagementContext(configRepository); TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context); TestChildCfg testChildCfg = parentCfg.getTestChild(entryName(TEST_CHILD_2)); assertEquals(testChildCfg.getMandatoryClassProperty(), "org.opends.server.extensions.UserDefinedVirtualAttributeProvider"); assertEquals(testChildCfg.getMandatoryReadOnlyAttributeTypeProperty(), Schema.getDefaultSchema() .getAttributeType("description")); // Test normalization. assertSetEquals(testChildCfg.getAggregationProperty(), "LDAP Connection Handler"); assertSetEquals(testChildCfg.getAggregationProperty(), " LDAP Connection Handler "); assertSetEquals(testChildCfg.getAggregationProperty(), " ldap connection HANDLER "); } /** * Tests that it is impossible to delete a referenced component when the * referenced component must always exist regardless of whether the * referencing component is enabled or not. */ @Test public void testCannotDeleteReferencedComponent() throws Exception { ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENTS, TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_7, CONN_HANDLER_ENTRY, TEST_CONNECTION_HANDLER_ENTRY_ENABLED); ServerManagementContext context = new ServerManagementContext(configRepository); registerAggregationDefinitionWithTargetEnabled(); ConfigurationDeleteListener<TestChildCfg> deleteListener = new DummyDeleteListener(); try { // Retrieve the parent and child managed objects and register // delete and change listeners respectively in order to trigger // the constraint call-backs. TestParentCfg parentCfg = getParentCfg(entryName(TEST_PARENT_1), context); parentCfg.addTestChildDeleteListener(deleteListener); ArgumentCaptor<ConfigDeleteListener> registeredListener = ArgumentCaptor.forClass(ConfigDeleteListener.class); verify(configRepository).registerDeleteListener(eq(TEST_BASE_CHILD.getName()), registeredListener.capture()); // Now simulate the delete ofthe referenced connection handler. assertThat( registeredListener.getValue().configDeleteIsAcceptable(TEST_CONNECTION_HANDLER_ENTRY_ENABLED, new LocalizableMessageBuilder())).isFalse(); } finally { putBackDefaultAggregationDefinitionFromTargetEnabled(); } } /** * Tests that it is impossible to disable a referenced component when the * referenced component must always be enabled regardless of whether the * referencing component is enabled or not. */ @Test public void testCannotDisableReferencedComponent() throws Exception { ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENTS, TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_7, CONN_HANDLER_ENTRY, TEST_CONNECTION_HANDLER_ENTRY_ENABLED); ServerManagementContext context = new ServerManagementContext(configRepository); registerAggregationDefinitionWithTargetEnabled(); ConfigurationChangeListener<TestChildCfg> changeListener = new DummyChangeListener(); try { // Retrieve the parent and child managed objects and register // delete and change listeners respectively in order to trigger // the constraint call-backs. TestParentCfg parentCfg = getParentCfg(entryName(TEST_PARENT_1), context); TestChildCfg testChildCfg = parentCfg.getTestChild(entryName(TEST_CHILD_7)); testChildCfg.addChangeListener(changeListener); ArgumentCaptor<ConfigChangeListener> registeredListener = ArgumentCaptor.forClass(ConfigChangeListener.class); verify(configRepository).registerChangeListener(eq(TEST_CHILD_7.getName()), registeredListener.capture()); // Now simulate the disabling ofthe referenced connection handler. assertThat( registeredListener.getValue().configChangeIsAcceptable(TEST_CONNECTION_HANDLER_ENTRY_DISABLED, new LocalizableMessageBuilder())).isFalse(); } finally { putBackDefaultAggregationDefinitionFromTargetEnabled(); } } /** * Register the temporary aggregation definition to be used in test. You * must call * {@code putBackDefaultAggregationDefinitionFromTargetAndSourceEnabled} * method at end of test. */ private void registerAggregationDefinitionWithTargetAndSourceEnabled() { TestCfg.removeConstraint(aggregationPropertyDefinitionDefault.getSourceConstraint()); TestCfg.addPropertyDefinition(aggregationPropertyDefinitionTargetAndSourceMustBeEnabled); TestCfg.addConstraint(aggregationPropertyDefinitionTargetAndSourceMustBeEnabled.getSourceConstraint()); } /** * Put back the default aggregation definition. */ private void putBackDefaultAggregationDefinitionFromTargetAndSourceEnabled() { TestCfg.removeConstraint(aggregationPropertyDefinitionTargetAndSourceMustBeEnabled.getSourceConstraint()); TestCfg.addPropertyDefinition(aggregationPropertyDefinitionDefault); TestCfg.addConstraint(aggregationPropertyDefinitionDefault.getSourceConstraint()); } /** * Register the temporary aggregation definition to be used in test. You * must call {@code putBackDefaultAggregationDefinitionFromTargetEnabled} * method at end of test. */ private void registerAggregationDefinitionWithTargetEnabled() { TestCfg.removeConstraint(aggregationPropertyDefinitionDefault.getSourceConstraint()); TestCfg.addPropertyDefinition(aggregationPropertyDefinitionTargetMustBeEnabled); TestCfg.addConstraint(aggregationPropertyDefinitionTargetMustBeEnabled.getSourceConstraint()); } /** * Put back the default aggregation definition. */ private void putBackDefaultAggregationDefinitionFromTargetEnabled() { TestCfg.removeConstraint(aggregationPropertyDefinitionTargetMustBeEnabled.getSourceConstraint()); TestCfg.addPropertyDefinition(aggregationPropertyDefinitionDefault); TestCfg.addConstraint(aggregationPropertyDefinitionDefault.getSourceConstraint()); } /** Asserts that the actual set of DNs contains the expected values. */ private void assertSetEquals(SortedSet<String> actual, String... expected) { SortedSet<String> values = new TreeSet<>(TestChildCfgDefn.getInstance().getAggregationPropertyPropertyDefinition()); if (expected != null) { for (String value : expected) { values.add(value); } } Assert.assertEquals((Object) actual, (Object) values); } }