/*
* 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);
}
}