/*
* 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 2006-2009 Sun Microsystems, Inc.
* Portions Copyright 2014-2015 ForgeRock AS
*/
package org.opends.server.protocols.ldap;
import java.util.Arrays;
import java.util.LinkedHashSet;
import org.forgerock.opendj.io.ASN1;
import org.forgerock.opendj.io.ASN1Reader;
import org.forgerock.opendj.io.ASN1Writer;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ByteStringBuilder;
import org.forgerock.opendj.ldap.DereferenceAliasesPolicy;
import org.forgerock.opendj.ldap.SearchScope;
import org.opends.server.types.LDAPException;
import org.testng.annotations.Test;
import static org.opends.server.protocols.ldap.LDAPConstants.*;
import static org.testng.Assert.*;
/**
* Test class for LDAP Search protocol operation classes.
*/
@SuppressWarnings("javadoc")
public class TestSearchProtocolOp extends LdapTestCase
{
private ByteString baseDN = ByteString.valueOfUtf8("dc=example,dc=COM");
private SearchScope scope = SearchScope.WHOLE_SUBTREE;
private DereferenceAliasesPolicy dereferencePolicy =
DereferenceAliasesPolicy.IN_SEARCHING;
private int sizeLimit = Integer.MAX_VALUE;
private int timeLimit = Integer.MAX_VALUE;
private boolean typesOnly = true;
private LDAPFilter filter = LDAPFilter.objectClassPresent();
private LinkedHashSet<String> attributes = new LinkedHashSet<>(
Arrays.asList("description", "cn", "cn;optionA"));
/**
* Create a test search request protocol op.
* @return A test search request protocol op.
* @throws LDAPException If the test object could not be created.
*/
private SearchRequestProtocolOp buildSearchRequestProtocolOp()
throws LDAPException
{
return new SearchRequestProtocolOp(baseDN,
scope,
dereferencePolicy,
sizeLimit,
timeLimit,
typesOnly,
filter,
attributes);
}
@Test
public void testSearchRequestToString() throws Exception
{
SearchRequestProtocolOp protocolOp = buildSearchRequestProtocolOp();
StringBuilder sb = new StringBuilder();
protocolOp.toString(sb);
protocolOp.toString(sb, 1);
}
@Test
public void testSearchRequestEncodeDecode() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
// Construct a protocol op.
SearchRequestProtocolOp protocolOp = buildSearchRequestProtocolOp();
// Encode to ASN1.
protocolOp.write(writer);
// Decode to a new protocol op.
ASN1Reader reader = ASN1.getReader(builder.toByteString());
ProtocolOp decodedProtocolOp = LDAPReader.readProtocolOp(reader);
// Make sure the protocol op is the correct type.
assertTrue(decodedProtocolOp instanceof SearchRequestProtocolOp);
SearchRequestProtocolOp searchOp =
(SearchRequestProtocolOp)decodedProtocolOp;
// Check that the fields have not been changed during encode and decode.
assertEquals(protocolOp.getBaseDN(), searchOp.getBaseDN());
assertEquals(protocolOp.getScope(), searchOp.getScope());
assertEquals(protocolOp.getDereferencePolicy(), searchOp.getDereferencePolicy());
assertEquals(protocolOp.getSizeLimit(), searchOp.getSizeLimit());
assertEquals(protocolOp.getTimeLimit(), searchOp.getTimeLimit());
assertEquals(protocolOp.getFilter().toString(), searchOp.getFilter().toString());
// Check that the attributes are in the correct order (comparing the sets
// directly does not guarantee this).
assertTrue(Arrays.equals(protocolOp.getAttributes().toArray(),
searchOp.getAttributes().toArray()));
}
@Test (expectedExceptions = LDAPException.class)
public void testInvalidSearchRequestSequence() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
writer.writeInteger(OP_TYPE_SEARCH_REQUEST, 0);
ASN1Reader reader = ASN1.getReader(builder.toByteString());
LDAPReader.readProtocolOp(reader);
}
/**
* This should succeed since we are ignoring trailing SEQUENCE
* components.
*/
@Test
public void testInvalidSearchRequestTooManyElements() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
writer.writeOctetString(baseDN);
writer.writeInteger(scope.intValue());
writer.writeInteger(dereferencePolicy.intValue());
writer.writeInteger(sizeLimit);
writer.writeInteger(timeLimit);
writer.writeBoolean(typesOnly);
filter.write(writer);
writer.writeStartSequence();
for(String attribute : attributes)
{
writer.writeOctetString(attribute);
}
writer.writeEndSequence();
writer.writeBoolean(true);
writer.writeEndSequence();
ASN1Reader reader = ASN1.getReader(builder.toByteString());
ProtocolOp decodedProtocolOp = LDAPReader.readProtocolOp(reader);
// Make sure the protocol op is the correct type.
assertTrue(decodedProtocolOp instanceof SearchRequestProtocolOp);
SearchRequestProtocolOp searchOp =
(SearchRequestProtocolOp)decodedProtocolOp;
// Check that the fields have not been changed during encode and decode.
assertEquals(baseDN, searchOp.getBaseDN());
assertEquals(scope, searchOp.getScope());
assertEquals(dereferencePolicy, searchOp.getDereferencePolicy());
assertEquals(sizeLimit, searchOp.getSizeLimit());
assertEquals(timeLimit, searchOp.getTimeLimit());
assertEquals(filter.toString(), searchOp.getFilter().toString());
// Check that the attributes are in the correct order (comparing the sets
// directly does not guarantee this).
assertTrue(Arrays.equals(attributes.toArray(),
searchOp.getAttributes().toArray()));
}
@Test (expectedExceptions = LDAPException.class)
public void testInvalidSearchRequestTooFewElements() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
writer.writeInteger(scope.intValue());
writer.writeInteger(dereferencePolicy.intValue());
writer.writeInteger(sizeLimit);
writer.writeInteger(timeLimit);
writer.writeBoolean(typesOnly);
filter.write(writer);
writer.writeStartSequence();
for(String attribute : attributes)
{
writer.writeOctetString(attribute);
}
writer.writeEndSequence();
writer.writeEndSequence();
ASN1Reader reader = ASN1.getReader(builder.toByteString());
LDAPReader.readProtocolOp(reader);
}
@Test (expectedExceptions = LDAPException.class)
public void testInvalidSearchRequestScope() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
writer.writeOctetString(baseDN);
writer.writeInteger(9);
writer.writeInteger(dereferencePolicy.intValue());
writer.writeInteger(sizeLimit);
writer.writeInteger(timeLimit);
writer.writeBoolean(typesOnly);
filter.write(writer);
writer.writeStartSequence();
for(String attribute : attributes)
{
writer.writeOctetString(attribute);
}
writer.writeEndSequence();
writer.writeEndSequence();
ASN1Reader reader = ASN1.getReader(builder.toByteString());
LDAPReader.readProtocolOp(reader);
}
@Test (expectedExceptions = LDAPException.class)
public void testInvalidSearchRequestDerefPolicy() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
writer.writeOctetString(baseDN);
writer.writeInteger(scope.intValue());
writer.writeInteger(9);
writer.writeInteger(sizeLimit);
writer.writeInteger(timeLimit);
writer.writeBoolean(typesOnly);
filter.write(writer);
writer.writeStartSequence();
for(String attribute : attributes)
{
writer.writeOctetString(attribute);
}
writer.writeEndSequence();
writer.writeEndSequence();
ASN1Reader reader = ASN1.getReader(builder.toByteString());
LDAPReader.readProtocolOp(reader);
}
@Test (expectedExceptions = LDAPException.class)
public void testInvalidSearchRequestElement1() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
writer.writeOctetString(baseDN);
writer.writeNull(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
writer.writeInteger(dereferencePolicy.intValue());
writer.writeInteger(sizeLimit);
writer.writeInteger(timeLimit);
writer.writeBoolean(typesOnly);
filter.write(writer);
writer.writeStartSequence();
for(String attribute : attributes)
{
writer.writeOctetString(attribute);
}
writer.writeEndSequence();
writer.writeEndSequence();
ASN1Reader reader = ASN1.getReader(builder.toByteString());
LDAPReader.readProtocolOp(reader);
}
@Test (expectedExceptions = LDAPException.class)
public void testInvalidSearchRequestElement2() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
writer.writeOctetString(baseDN);
writer.writeInteger(scope.intValue());
writer.writeNull(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
writer.writeInteger(sizeLimit);
writer.writeInteger(timeLimit);
writer.writeBoolean(typesOnly);
filter.write(writer);
writer.writeStartSequence();
for(String attribute : attributes)
{
writer.writeOctetString(attribute);
}
writer.writeEndSequence();
writer.writeEndSequence();
ASN1Reader reader = ASN1.getReader(builder.toByteString());
LDAPReader.readProtocolOp(reader);
}
@Test (expectedExceptions = LDAPException.class)
public void testInvalidSearchRequestElement3() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
writer.writeOctetString(baseDN);
writer.writeInteger(scope.intValue());
writer.writeInteger(dereferencePolicy.intValue());
writer.writeNull(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
writer.writeInteger(timeLimit);
writer.writeBoolean(typesOnly);
filter.write(writer);
writer.writeStartSequence();
for(String attribute : attributes)
{
writer.writeOctetString(attribute);
}
writer.writeEndSequence();
writer.writeEndSequence();
ASN1Reader reader = ASN1.getReader(builder.toByteString());
LDAPReader.readProtocolOp(reader);
}
@Test (expectedExceptions = LDAPException.class)
public void testInvalidSearchRequestElement4() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
writer.writeOctetString(baseDN);
writer.writeInteger(scope.intValue());
writer.writeInteger(dereferencePolicy.intValue());
writer.writeInteger(sizeLimit);
writer.writeNull(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
writer.writeBoolean(typesOnly);
filter.write(writer);
writer.writeStartSequence();
for(String attribute : attributes)
{
writer.writeOctetString(attribute);
}
writer.writeEndSequence();
writer.writeEndSequence();
ASN1Reader reader = ASN1.getReader(builder.toByteString());
LDAPReader.readProtocolOp(reader);
}
@Test (expectedExceptions = LDAPException.class)
public void testInvalidSearchRequestElement5() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
writer.writeOctetString(baseDN);
writer.writeInteger(scope.intValue());
writer.writeInteger(dereferencePolicy.intValue());
writer.writeInteger(sizeLimit);
writer.writeInteger(timeLimit);
writer.writeNull(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
filter.write(writer);
writer.writeStartSequence();
for(String attribute : attributes)
{
writer.writeOctetString(attribute);
}
writer.writeEndSequence();
writer.writeEndSequence();
ASN1Reader reader = ASN1.getReader(builder.toByteString());
LDAPReader.readProtocolOp(reader);
}
@Test (expectedExceptions = LDAPException.class)
public void testInvalidSearchRequestElement6() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
writer.writeOctetString(baseDN);
writer.writeInteger(scope.intValue());
writer.writeInteger(dereferencePolicy.intValue());
writer.writeInteger(sizeLimit);
writer.writeInteger(timeLimit);
writer.writeBoolean(typesOnly);
writer.writeNull(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
writer.writeStartSequence();
for(String attribute : attributes)
{
writer.writeOctetString(attribute);
}
writer.writeEndSequence();
writer.writeEndSequence();
ASN1Reader reader = ASN1.getReader(builder.toByteString());
LDAPReader.readProtocolOp(reader);
}
@Test (expectedExceptions = LDAPException.class)
public void testInvalidSearchRequestElement7() throws Exception
{
ByteStringBuilder builder = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(builder);
writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
writer.writeOctetString(baseDN);
writer.writeInteger(scope.intValue());
writer.writeInteger(dereferencePolicy.intValue());
writer.writeInteger(sizeLimit);
writer.writeInteger(timeLimit);
writer.writeBoolean(typesOnly);
filter.write(writer);
writer.writeInteger(0);
writer.writeEndSequence();
ASN1Reader reader = ASN1.getReader(builder.toByteString());
LDAPReader.readProtocolOp(reader);
}
}