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()); } }