/* * 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-2015 ForgeRock AS. */ package org.forgerock.opendj.adapter.server3x; import static org.assertj.core.api.Assertions.*; import static org.forgerock.opendj.adapter.server3x.Converters.*; import static org.mockito.Mockito.*; import java.net.InetAddress; import java.util.Iterator; import java.util.List; import org.forgerock.opendj.ldap.ByteString; import org.forgerock.opendj.ldap.Filter; import org.forgerock.opendj.ldap.LinkedAttribute; import org.forgerock.opendj.ldap.LinkedHashMapEntry; import org.forgerock.opendj.ldap.Modification; import org.forgerock.opendj.ldap.ModificationType; import org.forgerock.opendj.ldap.ResultCode; import org.forgerock.opendj.ldap.controls.Control; import org.forgerock.opendj.ldap.controls.GenericControl; import org.forgerock.opendj.ldap.controls.PersistentSearchChangeType; import org.forgerock.opendj.ldap.controls.PersistentSearchRequestControl; import org.forgerock.opendj.ldap.controls.PostReadRequestControl; import org.forgerock.opendj.ldap.controls.ProxiedAuthV2RequestControl; import org.forgerock.opendj.ldap.requests.BindClient; import org.forgerock.opendj.ldap.requests.CRAMMD5SASLBindRequest; import org.forgerock.opendj.ldap.requests.GenericBindRequest; import org.forgerock.opendj.ldap.requests.PlainSASLBindRequest; import org.forgerock.opendj.ldap.requests.Requests; import org.forgerock.opendj.ldap.responses.BindResult; import org.forgerock.opendj.ldap.responses.CompareResult; import org.forgerock.opendj.ldap.responses.ExtendedResult; import org.forgerock.opendj.ldap.responses.GenericExtendedResult; import org.forgerock.opendj.ldap.responses.PasswordModifyExtendedResult; import org.forgerock.opendj.ldap.responses.Responses; import org.forgerock.opendj.ldap.responses.Result; import org.opends.server.DirectoryServerTestCase; import org.opends.server.TestCaseUtils; import org.opends.server.admin.std.meta.VirtualAttributeCfgDefn.Scope; import org.opends.server.core.BindOperation; import org.opends.server.core.CompareOperation; import org.opends.server.core.DirectoryServer; import org.opends.server.core.ExtendedOperation; import org.opends.server.core.SearchOperation; import org.opends.server.protocols.ldap.LDAPControl; import org.opends.server.protocols.ldap.LDAPFilter; import org.opends.server.types.Attribute; import org.opends.server.types.Attributes; import org.opends.server.types.DirectoryException; import org.opends.server.types.FilterType; import org.opends.server.types.LDAPException; import org.opends.server.types.Operation; import org.opends.server.types.SearchResultEntry; import org.opends.server.types.SearchResultReference; import org.opends.server.util.CollectionUtils; import org.opends.server.util.ServerConstants; import org.testng.annotations.BeforeGroups; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** * This class defines a set of tests for the StaticUtils.class. * <p> * Reminder : * * <pre> * to - from SDK to server. * from - from server to SDK. * </pre> */ @SuppressWarnings("javadoc") @Test(sequential=true) public class ConvertersTestCase extends DirectoryServerTestCase { /** * Launched before the tests, this function starts the embedded server. * * @throws Exception * If the server could not be initialized. */ @BeforeGroups(groups = "needRunningServer") public void startServer() throws Exception { TestCaseUtils.startServer(); } /** * Converts a SDK {@link SearchResultEntry} to an LDAP Server * {@link SearchResultEntry}. */ @Test public final void testToSearchResultEntry() throws Exception { org.forgerock.opendj.ldap.responses.SearchResultEntry entry = Responses.newSearchResultEntry(org.forgerock.opendj.ldap.DN .valueOf("uid=scarter,ou=People,dc=example,dc=com")); for (Control control : generateSdkControlsList()) { entry.addControl(control); } entry.addAttribute(new LinkedAttribute("test", "value1")); entry.addAttribute(new LinkedAttribute("Another", ByteString.valueOfUtf8("myValue"))); SearchResultEntry result = to(entry); assertThat(result.getName().toString()).isEqualTo(entry.getName().toString()); assertThat(result.getControls()).hasSize(entry.getControls().size()); assertThat(result.getAttributes()).hasSize(2); } /** * Converts a SDK {@link Entry} to an LDAP Server * {@link Entry}. */ @Test public final void testToEntry() throws Exception { org.forgerock.opendj.ldap.Entry entry = new LinkedHashMapEntry(org.forgerock.opendj.ldap.DN .valueOf("uid=scarter,ou=People,dc=example,dc=com")); entry.addAttribute(new LinkedAttribute("test", "value1")); entry.addAttribute(new LinkedAttribute("Another", ByteString.valueOfUtf8("myValue"))); org.opends.server.types.Entry result = to(entry); assertThat(result.getName().toString()).isEqualTo(entry.getName().toString()); assertThat(result.getAttributes()).hasSize(2); } /** * Converts a SDK Distinguished Name to a LDAP server Distinguish Name. Needs * a running server to work. * * @throws DirectoryException */ @Test(groups = { "needRunningServer" }) public final void testToDN() throws DirectoryException { final String dnString = "uid=scarter,ou=People,dc=example,dc=com"; org.forgerock.opendj.ldap.DN sdkDN = org.forgerock.opendj.ldap.DN.valueOf(dnString); org.opends.server.types.DN srvDN = to(sdkDN); assertThat(srvDN.toString()).isEqualTo(dnString); } @Test public final void testToRDN() throws DirectoryException { final String rdnString = "uid=scarter"; org.forgerock.opendj.ldap.RDN sdkRDN = org.forgerock.opendj.ldap.RDN.valueOf(rdnString); org.opends.server.types.RDN srvRDN = to(sdkRDN); assertThat(srvRDN.toString()).isEqualTo(rdnString); } /** * Converts a SDK control to a LDAP server control. * * @throws DirectoryException */ @Test public final void testToControl() throws DirectoryException { final PersistentSearchRequestControl control = PersistentSearchRequestControl.newControl(false, true, true, // isCritical, changesOnly, returnECs PersistentSearchChangeType.ADD, PersistentSearchChangeType.DELETE, PersistentSearchChangeType.MODIFY, PersistentSearchChangeType.MODIFY_DN); // control : // PersistentSearchRequestControl(oid=2.16.840.1.113730.3.4.3, criticality=true, // changeTypes=[add, delete, modify, modifyDN]([add, delete, modify, modifyDN]), // changesOnly=true, returnECs=true) org.opends.server.protocols.ldap.LDAPControl srvControl = to(control); assertThat(srvControl.isCritical()).isFalse(); assertThat(srvControl.getOID()).isEqualTo("2.16.840.1.113730.3.4.3"); assertThat(control.getValue().toString()).isEqualTo(srvControl.getValue().toString()); // A PostReadRequestControl(SDK) final PostReadRequestControl control2 = PostReadRequestControl.newControl(true, "description"); srvControl = to(control2); assertThat(srvControl.getOID()).isEqualTo("1.3.6.1.1.13.2"); assertThat(srvControl.isCritical()).isTrue(); assertThat(control2.getValue().toString()).isEqualTo(srvControl.getValue().toString()); } /** * Converts a list of SDK controls to a list of LDAP server controls. * * @throws DirectoryException */ @Test public final void testToListOfControl() throws DirectoryException { List<org.forgerock.opendj.ldap.controls.Control> mySDKControlsList = generateSdkControlsList(); List<org.opends.server.types.Control> listofControl = to(mySDKControlsList); assertThat(listofControl.size()).isEqualTo(3); assertThat(listofControl.get(0).getOID()).isEqualTo(mySDKControlsList.get(0).getOID()); assertThat(listofControl.get(0).isCritical()).isFalse(); assertThat(listofControl.get(1).getOID()).isEqualTo(mySDKControlsList.get(1).getOID()); assertThat(listofControl.get(1).isCritical()).isTrue(); assertThat(listofControl.get(2).getOID()).isEqualTo(mySDKControlsList.get(2).getOID()); assertThat(listofControl.get(2).isCritical()).isTrue(); } private List<org.forgerock.opendj.ldap.controls.Control> generateSdkControlsList() { final PersistentSearchRequestControl control = PersistentSearchRequestControl.newControl(false, true, true, // isCritical, changesOnly, returnECs PersistentSearchChangeType.ADD, PersistentSearchChangeType.DELETE, PersistentSearchChangeType.MODIFY, PersistentSearchChangeType.MODIFY_DN); assertThat(control.getOID()).isEqualTo("2.16.840.1.113730.3.4.3"); final PostReadRequestControl control2 = PostReadRequestControl.newControl(true, "description"); assertThat(control2.getOID()).isEqualTo("1.3.6.1.1.13.2"); final ProxiedAuthV2RequestControl control3 = ProxiedAuthV2RequestControl .newControl("dn:uid=kvaughan,ou=People,dc=example,dc=com"); assertThat(control3.getOID()).isEqualTo("2.16.840.1.113730.3.4.18"); return CollectionUtils.newLinkedList(control, control2, control3); } /** * Converts an SDK attribute to an LDAP server attribute. */ @Test public final void testToRawAttribute() throws DirectoryException { org.forgerock.opendj.ldap.Attribute attribute = new LinkedAttribute("test", "value1"); org.opends.server.types.RawAttribute srvAttribute = to(attribute); assertThat(srvAttribute.getAttributeType()).isEqualTo("test"); assertThat(srvAttribute.getValues()).hasSize(1); assertThat(srvAttribute.getValues().get(0).toString()).isEqualTo("value1"); org.forgerock.opendj.ldap.Attribute attribute2 = new LinkedAttribute("Another", ByteString.valueOfUtf8("myValue")); org.opends.server.types.RawAttribute srvAttribute2 = to(attribute2); assertThat(srvAttribute2.getAttributeType()).isEqualTo("Another"); assertThat(srvAttribute2.getValues()).hasSize(1); assertThat(srvAttribute2.getValues().get(0).toString()).isEqualTo("myValue"); } @Test(groups = { "needRunningServer" }) public final void testToAttribute() throws DirectoryException { org.forgerock.opendj.ldap.Attribute attribute = new LinkedAttribute("test", "value1"); org.opends.server.types.Attribute srvAttribute = toAttribute(attribute); assertThat(srvAttribute.getAttributeType().getNameOrOID()).isEqualTo("test"); assertThat(srvAttribute.size()).isEqualTo(1); assertThat(srvAttribute.iterator().next().toString()).isEqualTo("value1"); org.forgerock.opendj.ldap.Attribute attribute2 = new LinkedAttribute("Another", ByteString.valueOfUtf8("myValue")); org.opends.server.types.Attribute srvAttribute2 = toAttribute(attribute2); assertThat(srvAttribute2.getAttributeType().getNameOrOID()).isEqualTo("Another"); assertThat(srvAttribute2.size()).isEqualTo(1); assertThat(srvAttribute2.iterator().next().toString()).isEqualTo("myValue"); } /** * Converts an SDK multi-valued attribute to an LDAP Server Attribute. */ @Test(groups = { "needRunningServer" }) public final void testToRawAttributeMultiValued() throws DirectoryException { org.forgerock.opendj.ldap.Attribute attribute = new LinkedAttribute("testMultiValuedAttribute", "value1", "value2"); org.opends.server.types.RawAttribute srvAttribute = to(attribute); assertThat(srvAttribute.getAttributeType()) .isEqualTo("testMultiValuedAttribute"); assertThat(srvAttribute.getValues().size()).isEqualTo(2); assertThat(srvAttribute.getValues().get(0).toString()).isEqualTo("value1"); assertThat(srvAttribute.getValues().get(1).toString()).isEqualTo("value2"); org.forgerock.opendj.ldap.Attribute attribute2 = new LinkedAttribute("AnotherMultiValuedAttribute", "value1", "value2", "value3", "value4"); org.opends.server.types.RawAttribute srvAttribute2 = to(attribute2); assertThat(srvAttribute2.getAttributeType()).isEqualTo( "AnotherMultiValuedAttribute"); assertThat(srvAttribute2.getValues().size()).isEqualTo(4); assertThat(srvAttribute2.getValues().get(0).toString()).isEqualTo("value1"); assertThat(srvAttribute2.getValues().get(1).toString()).isEqualTo("value2"); assertThat(srvAttribute2.getValues().get(2).toString()).isEqualTo("value3"); assertThat(srvAttribute2.getValues().get(3).toString()).isEqualTo("value4"); } @Test public final void testToAttributeMultiValued() throws DirectoryException { org.forgerock.opendj.ldap.Attribute attribute = new LinkedAttribute("testMultiValuedAttribute", "value1", "value2"); org.opends.server.types.Attribute srvAttribute = toAttribute(attribute); assertThat(srvAttribute.getAttributeType().getNameOrOID()) .isEqualTo("testMultiValuedAttribute"); assertThat(srvAttribute.size()).isEqualTo(2); Iterator<ByteString> iter = srvAttribute.iterator(); assertThat(iter.next().toString()).isEqualTo("value1"); assertThat(iter.next().toString()).isEqualTo("value2"); org.forgerock.opendj.ldap.Attribute attribute2 = new LinkedAttribute("AnotherMultiValuedAttribute", "value1", "value2", "value3", "value4"); org.opends.server.types.Attribute srvAttribute2 = toAttribute(attribute2); assertThat(srvAttribute2.getAttributeType().getNameOrOID()) .isEqualTo("AnotherMultiValuedAttribute"); assertThat(srvAttribute2.size()).isEqualTo(4); iter = srvAttribute2.iterator(); assertThat(iter.next().toString()).isEqualTo("value1"); assertThat(iter.next().toString()).isEqualTo("value2"); assertThat(iter.next().toString()).isEqualTo("value3"); assertThat(iter.next().toString()).isEqualTo("value4"); } /** * Converts a SDK modification to an LDAP server raw modification. */ @Test public final void testToRawModification() { org.forgerock.opendj.ldap.Attribute attribute = new LinkedAttribute("test", ByteString.valueOfUtf8("value1"), ByteString .valueOfUtf8("value2")); Modification mod = new Modification(ModificationType.ADD, attribute); org.opends.server.types.RawModification srvModification = to(mod); assertThat(srvModification.getModificationType()).isEqualTo(ModificationType.ADD); assertThat(srvModification.getAttribute().getAttributeType()).isEqualTo("test"); assertThat(srvModification.getAttribute().getValues().size()).isEqualTo(2); mod = new Modification(ModificationType.INCREMENT, attribute); srvModification = to(mod); assertThat(srvModification.getModificationType()).isEqualTo(ModificationType.INCREMENT); } @Test public final void testToModification() { org.forgerock.opendj.ldap.Attribute attribute = new LinkedAttribute("test", ByteString.valueOfUtf8("value1"), ByteString .valueOfUtf8("value2")); Modification mod = new Modification(ModificationType.ADD, attribute); org.opends.server.types.Modification srvModification = toModification(mod); assertThat(srvModification.getModificationType()).isEqualTo(ModificationType.ADD); assertThat(srvModification.getAttribute().getAttributeType().getNameOrOID()).isEqualTo("test"); assertThat(srvModification.getAttribute().size()).isEqualTo(2); mod = new Modification(ModificationType.INCREMENT, attribute); srvModification = toModification(mod); assertThat(srvModification.getModificationType()).isEqualTo(ModificationType.INCREMENT); } /** * Converts a SDK filter to an LDAP server filter. */ @Test public final void testToFilter() throws LDAPException { Filter filter = Filter.valueOf("!(description=*)"); org.opends.server.protocols.ldap.LDAPFilter srvFilter = LDAPFilter.decode(filter.toString()); assertThat(srvFilter.getAttributeType()).isNull(); assertThat(srvFilter.getFilterType()).isEqualTo(FilterType.NOT); assertThat(srvFilter.getNOTComponent().toString()).isEqualTo("(description=*)"); filter = Filter.valueOf("(description=bjensen)"); srvFilter = LDAPFilter.decode(filter.toString()); assertThat(srvFilter.getAttributeType()).isEqualTo("description"); assertThat(srvFilter.getFilterType()).isEqualTo(FilterType.EQUALITY); assertThat(srvFilter.getAssertionValue().toString()).isEqualTo("bjensen"); } /** * Converts a SDK search result reference to a LDAP server search result * reference. */ @Test public final void testToSearchResultReference() throws LDAPException { String uri = "ldap://hostb/OU=People,O=MNN,C=WW??sub"; final org.forgerock.opendj.ldap.responses.SearchResultReference sdkSearchResultReference = Responses.newSearchResultReference(uri); final org.opends.server.types.SearchResultReference srvResultReference = new SearchResultReference(uri); final org.opends.server.types.SearchResultReference srvResultReference2 = to(sdkSearchResultReference); assertThat(srvResultReference.getReferralURLString()).isEqualTo( srvResultReference2.getReferralURLString()); } /** * Converts an LDAP attribute to an SDK attribute. */ @Test(groups = { "needRunningServer" }) public final void testFromAttribute() throws DirectoryException { final org.opends.server.types.Attribute srvAttribute = Attributes.create("CN", "JOHN DOE"); final org.forgerock.opendj.ldap.Attribute sdkAttribute = from(srvAttribute); assertThat(sdkAttribute.getAttributeDescriptionAsString()).isEqualTo("CN"); assertThat(sdkAttribute.size()).isEqualTo(1); assertThat(sdkAttribute.firstValueAsString()).isEqualTo("JOHN DOE"); } /** * Converts an LDAP attribute to an SDK attribute using binary attribute value. */ @Test(groups = { "needRunningServer" }) public final void testFromAttributeUsingBinary() throws DirectoryException { byte[] data = { 0x00, 0x01, 0x02, (byte) 0xff }; ByteString attrValue = ByteString.wrap(data); Attribute attribute = Attributes.create(DirectoryServer.getAttributeTypeOrNull("cn"), attrValue); assertThat(from(attribute).firstValue().toByteArray()).isEqualTo(data); } /** * Converts an LDAP control to an SDK control. */ @Test public static void testFromLDAPControl() { org.opends.server.protocols.ldap.LDAPControl ldapControl = new LDAPControl("1.2.3.4", false, ByteString.valueOfUtf8("myData")); Control sdkControl = from(ldapControl); Control expectedSdkControl = GenericControl.newControl("1.2.3.4", false, "myData"); assertThat(sdkControl.getOID()).isEqualTo(expectedSdkControl.getOID()); assertThat(sdkControl.isCritical()).isEqualTo(expectedSdkControl.isCritical()); assertThat(sdkControl.getValue()).isEqualTo(expectedSdkControl.getValue()); } /** * Converts an Scope to an SDK Scope. */ @Test public static void testFromScope() { // WHOLE SUBTREE assertThat(org.forgerock.opendj.ldap.SearchScope.WHOLE_SUBTREE).isEqualTo(from(Scope.WHOLE_SUBTREE)); // BASE OBJECT assertThat(org.forgerock.opendj.ldap.SearchScope.BASE_OBJECT).isEqualTo(from(Scope.BASE_OBJECT)); // SINGLE LEVEL assertThat(org.forgerock.opendj.ldap.SearchScope.SINGLE_LEVEL).isEqualTo(from(Scope.SINGLE_LEVEL)); // SUBORDINATE assertThat(org.forgerock.opendj.ldap.SearchScope.SUBORDINATES).isEqualTo(from(Scope.SUBORDINATE_SUBTREE)); } /** * Converts a server control to an SDK control. */ @Test public static void testFromControl() { final org.opends.server.types.Control control = new LDAPControl("1.2.3.4", false, ByteString.valueOfUtf8("myData")); Control sdkControl = from(control); Control expectedSdkControl = GenericControl.newControl("1.2.3.4", false, "myData"); assertThat(sdkControl.getOID()).isEqualTo(expectedSdkControl.getOID()); assertThat(sdkControl.isCritical()).isEqualTo(expectedSdkControl.isCritical()); assertThat(sdkControl.getValue()).isEqualTo(expectedSdkControl.getValue()); } /** * Converts a a LDAP server Distinguish Name to a SDK Distinguished Name. * * @throws DirectoryException */ @Test public final void testFromDN() throws DirectoryException { final String dnString = "uid=scarter,ou=People,dc=example,dc=com"; org.opends.server.types.DN srvDN = org.opends.server.types.DN.valueOf(dnString); org.forgerock.opendj.ldap.DN sdkDN = from(srvDN); assertThat(sdkDN.toString()).isEqualTo(dnString); } /** * For an SASL bind request, credentials are composed by uid and password * (in this config). */ @Test(groups = { "needRunningServer" }) public static void testgetCredentials() throws Exception { final PlainSASLBindRequest request = Requests.newPlainSASLBindRequest("u:user.0", "password".toCharArray()); String serverName = InetAddress.getByName(null).getCanonicalHostName(); final BindClient bindClient = request.createBindClient(serverName); final GenericBindRequest genericBindRequest = bindClient.nextBindRequest(); assertThat(getCredentials(genericBindRequest.getAuthenticationValue())).isEqualTo( ByteString.valueOfUtf8("\u0000u:user.0\u0000password")); } /** * For an CRAMMD5 SALS request, the credentials are empty. */ @Test(groups = { "needRunningServer" }) public static void testgetCredentialsEmptyByteString() throws Exception { final CRAMMD5SASLBindRequest request = Requests.newCRAMMD5SASLBindRequest("u:user.2", "password".toCharArray()); String serverName = InetAddress.getByName(null).getCanonicalHostName(); final BindClient bindClient = request.createBindClient(serverName); final GenericBindRequest genericBindRequest = bindClient.nextBindRequest(); assertThat(getCredentials(genericBindRequest.getAuthenticationValue())).isEqualTo( ByteString.empty()); } @DataProvider public Object[][] operationResultTypes() { return new Object[][] { { BindOperation.class, BindResult.class }, { CompareOperation.class, CompareResult.class }, { SearchOperation.class, Result.class }, }; } /** Tests the type of the result based on the type of the provided operation. */ @Test(dataProvider = "operationResultTypes") public <O extends Operation, R extends Result> void testGetResponseResultAndResultType( Class<O> operationType, Class<R> resultType) throws Exception { // Given O operation = mock(operationType); when(operation.getResultCode()).thenReturn(ResultCode.SUCCESS); // When Result result = getResponseResult(operation); // Then assertThat(result.getResultCode()).isEqualTo(org.forgerock.opendj.ldap.ResultCode.SUCCESS); assertThat(result).isInstanceOf(resultType); } @DataProvider public Object[][] operationExtendedResultTypes() { return new Object[][] { { "", GenericExtendedResult.class }, { ServerConstants.OID_PASSWORD_MODIFY_REQUEST , PasswordModifyExtendedResult.class } }; } /** Tests the type of the result based on the type of the provided operation. */ @Test(dataProvider = "operationExtendedResultTypes") public <R extends ExtendedResult> void testGetResponseResultAndResultType( String requestOID, Class<R> resultType) throws Exception { // Given ExtendedOperation operation = mock(ExtendedOperation.class); when(operation.getResultCode()).thenReturn(ResultCode.SUCCESS); when(operation.getRequestOID()).thenReturn(requestOID); // When Result result = getResponseResult(operation); // Then assertThat(result.getResultCode()).isEqualTo(org.forgerock.opendj.ldap.ResultCode.SUCCESS); assertThat(result).isInstanceOf(resultType); } }