mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Nicolas Capponi
06.42.2014 84c12056831d812737d3950ce4d5a7083087d74f
Improve behavior of ConfigurationMock class and export it
in "tests" jar to allow usage by other modules

* Handle property methods with booleans
* Default to mockito behavior (default values) for non-property
methods or property methods with no default value in configuration
* Add more unit tests to ConfigurationMockTest class
3 files modified
128 ■■■■ changed files
opendj-config/pom.xml 40 ●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/ConfigurationMock.java 59 ●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/ConfigurationMockTest.java 29 ●●●●● patch | view | raw | blame | history
opendj-config/pom.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- ! 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 2013 ForgeRock
<!-- ! 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 2013 ForgeRock
  AS ! -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
@@ -68,6 +68,24 @@
  <build>
    <plugins>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <executions>
            <execution>
              <goals>
                <goal>test-jar</goal>
              </goals>
              <configuration>
                 <includes>
                    <!-- Classes to have mocks with configuration defaults -->
                    <include>**/ConfigurationMock.class</include>
                    <include>**/ConfigurationMock$*.class</include>
                 </includes>
              </configuration>
            </execution>
          </executions>
        </plugin>
      <plugin>
        <groupId>org.forgerock.commons</groupId>
        <artifactId>i18n-maven-plugin</artifactId>
        <executions>
opendj-config/src/test/java/org/forgerock/opendj/config/ConfigurationMock.java
@@ -21,7 +21,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2013 ForgeRock AS.
 *      Copyright 2013-2014 ForgeRock AS.
 */
package org.forgerock.opendj.config;
@@ -33,6 +33,7 @@
import java.util.SortedSet;
import java.util.TreeSet;
import org.mockito.internal.stubbing.defaultanswers.ReturnsEmptyValues;
import org.mockito.invocation.InvocationOnMock;
/**
@@ -76,20 +77,47 @@
     * A stubbed answer for Configuration objects, allowing to return default
     * value for settings when available.
     */
    private static class ConfigAnswer implements org.mockito.stubbing.Answer<Object> {
    private static class ConfigAnswer extends ReturnsEmptyValues {
        private static final long serialVersionUID = 1L;
        /** {@inheritDoc} */
        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            String definitionClassName = toDefinitionClassName(invocation.getMethod().getDeclaringClass()
                    .getName());
            Class<?> definitionClass = Class.forName(definitionClassName);
            ManagedObjectDefinition<?, ?> definition = (ManagedObjectDefinition<?, ?>) definitionClass.getMethod(
                    "getInstance").invoke(null);
            Method getPropertyDefMethod =
                    definitionClass.getMethod(invocation.getMethod().getName() + "PropertyDefinition");
            Class<?> propertyReturnType = getPropertyReturnType(getPropertyDefMethod);
            return getDefaultValue(definition, getPropertyDefMethod, propertyReturnType);
        public Object answer(InvocationOnMock invocation) {
            try {
                String definitionClassName =
                    toDefinitionClassName(invocation.getMethod().getDeclaringClass().getName());
                Class<?> definitionClass = Class.forName(definitionClassName);
                ManagedObjectDefinition<?, ?> definition =
                    (ManagedObjectDefinition<?, ?>) definitionClass.getMethod("getInstance").invoke(null);
                String invokedMethodName = invocation.getMethod().getName();
                if (!isGetterMethod(invokedMethodName)) {
                    return answerFromDefaultMockitoBehavior(invocation);
                }
                Method getPropertyDefMethod = getPropertyDefinitionMethod(definitionClass, invokedMethodName);
                Class<?> propertyReturnType = getPropertyReturnType(getPropertyDefMethod);
                Object defaultValue = getDefaultValue(definition, getPropertyDefMethod, propertyReturnType);
                if (defaultValue == null) {
                    return answerFromDefaultMockitoBehavior(invocation);
                }
                return defaultValue;
            } catch (Exception e) {
                return answerFromDefaultMockitoBehavior(invocation);
            }
        }
        private Object answerFromDefaultMockitoBehavior(InvocationOnMock invocation) {
            return super.answer(invocation);
        }
        private boolean isGetterMethod(String invokedMethodName) {
            return invokedMethodName.startsWith("get") || invokedMethodName.startsWith("is");
        }
        private Method getPropertyDefinitionMethod(Class<?> definitionClass, String invokedMethodName)
                throws SecurityException, NoSuchMethodException {
            // Methods for boolean starts with "is" in Cfg class but with "get" in CfgDefn class.
            return definitionClass.getMethod(invokedMethodName.replaceAll("^is", "get") + "PropertyDefinition");
        }
        /**
@@ -141,10 +169,13 @@
            MockProviderVisitor<T> visitor = new MockProviderVisitor<T>(propertyDefinition);
            Collection<T> values = defaultBehaviorProvider.accept(visitor, null);
            if (propertyDefinition.hasOption(PropertyOption.MULTI_VALUED)) {
            if (values == null) {
                // No default behavior defined
                return null;
            } else if (propertyDefinition.hasOption(PropertyOption.MULTI_VALUED)) {
                return values;
            } else {
                // single value returned
                // Single value returned
                return values.iterator().next();
            }
        }
opendj-config/src/test/java/org/forgerock/opendj/config/ConfigurationMockTest.java
@@ -27,11 +27,14 @@
import static org.fest.assertions.Assertions.assertThat;
import static org.forgerock.opendj.config.ConfigurationMock.mockCfg;
import static org.mockito.Mockito.*;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.schema.Schema;
import org.forgerock.opendj.server.config.meta.PluginCfgDefn.PluginType;
import org.forgerock.opendj.server.config.server.AttributeCleanupPluginCfg;
import org.forgerock.opendj.server.config.server.CollectiveAttributeSubentriesVirtualAttributeCfg;
import org.forgerock.opendj.server.config.server.CoreSchemaCfg;
import org.forgerock.opendj.server.config.server.GoverningStructureRuleVirtualAttributeCfg;
import org.forgerock.opendj.server.config.server.LDAPConnectionHandlerCfg;
import org.testng.annotations.Test;
@@ -68,4 +71,30 @@
        assertThat(mock.getAttributeType()).isEqualTo(
                Schema.getDefaultSchema().getAttributeType("collectiveAttributeSubentries"));
    }
    @Test
    public void testPropertyWithNoDefaultBooleanReturnValue() throws Exception {
        CollectiveAttributeSubentriesVirtualAttributeCfg mock =
            mockCfg(CollectiveAttributeSubentriesVirtualAttributeCfg.class);
        // should use default mockito behavior
        assertThat(mock.isEnabled()).isEqualTo(false);
    }
    @Test
    public void testPropertyWithDefaultBooleanReturnValue() throws Exception {
        CoreSchemaCfg mock = mockCfg(CoreSchemaCfg.class);
        assertThat(mock.isStrictFormatCountryString()).isEqualTo(true);
    }
    @Test
    public void testNonPropertyMethod() throws Exception {
        CoreSchemaCfg mock = mockCfg(CoreSchemaCfg.class);
        assertThat(mock.dn()).isNull();
        // Ensure we can add behavior to the mock
        when(mock.dn()).thenReturn(DN.rootDN());
        assertThat(mock.dn()).isNotNull();
        assertThat(mock.dn().toString()).isEqualTo(DN.rootDN().toString());
    }
}