/*
|
* 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-2008 Sun Microsystems, Inc.
|
* Portions Copyright 2014-2015 ForgeRock AS
|
*/
|
package org.opends.server.protocols.ldap;
|
|
import static org.forgerock.util.Utils.*;
|
import static org.opends.server.util.ServerConstants.*;
|
import static org.testng.Assert.*;
|
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.List;
|
|
import org.forgerock.i18n.LocalizableMessage;
|
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.opends.server.DirectoryServerTestCase;
|
import org.opends.server.TestCaseUtils;
|
import org.opends.server.core.DirectoryServer;
|
import org.opends.server.types.AttributeType;
|
import org.opends.server.types.DN;
|
import org.opends.server.types.LDAPException;
|
import org.opends.server.types.RDN;
|
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.Test;
|
|
/**
|
* This class defines a set of tests for the
|
* org.opends.server.protocol.ldap.AddResponseProtocolOp class.
|
*/
|
public class TestAddResponseProtocolOp extends DirectoryServerTestCase {
|
/** The protocol op type for add responses. */
|
private static final byte OP_TYPE_ADD_RESPONSE = 0x69;
|
/** The result code for add result operations. */
|
private static final int resultCode = 10;
|
/** The error message to use for add result operations. */
|
private static final LocalizableMessage resultMsg = LocalizableMessage.raw("Test Successful");
|
|
/** The DN to use for add result operations. */
|
private DN dn;
|
|
@BeforeClass
|
public void setupDN() throws Exception
|
{
|
// Starts the server if not already started
|
TestCaseUtils.startServer();
|
|
//Setup the DN to use in the response tests.
|
AttributeType attribute = DirectoryServer.getAttributeTypeOrDefault("testAttribute");
|
ByteString attributeValue = ByteString.valueOf("testValue");
|
dn = new DN(new RDN[] { RDN.create(attribute, attributeValue) });
|
}
|
|
/**
|
* Test to make sure the class processes the right LDAP op type.
|
*
|
* @throws Exception If the test failed unexpectedly.
|
*/
|
@Test
|
public void testOpType() throws Exception
|
{
|
AddResponseProtocolOp addResponse = new AddResponseProtocolOp(resultCode);
|
assertEquals(addResponse.getType(), OP_TYPE_ADD_RESPONSE);
|
}
|
|
/**
|
* Test to make sure the class returns the correct protocol name.
|
*
|
* @throws Exception If the test failed unexpectedly.
|
*/
|
@Test
|
public void testProtocolOpName() throws Exception
|
{
|
AddResponseProtocolOp addResponse = new AddResponseProtocolOp(resultCode);
|
assertEquals(addResponse.getProtocolOpName(), "Add Response");
|
}
|
|
/**
|
* Test the constructors to make sure the right objects are constructed.
|
*
|
* @throws Exception If the test failed unexpectedly.
|
*/
|
@Test
|
public void testConstructors() throws Exception
|
{
|
//Test to make sure the constructor with result code param works.
|
AddResponseProtocolOp addResponse = new AddResponseProtocolOp(resultCode);
|
assertEquals(addResponse.getResultCode(), resultCode);
|
|
//Test to make sure the constructor with result code and error message
|
//params works.
|
addResponse = new AddResponseProtocolOp(resultCode, resultMsg);
|
assertEquals(addResponse.getErrorMessage(), resultMsg);
|
assertEquals(addResponse.getResultCode(), resultCode);
|
|
//Test to make sure the constructor with result code, message, dn, and
|
//referral params works.
|
ArrayList<String> referralURLs = new ArrayList<>();
|
referralURLs.add("ds1.example.com");
|
referralURLs.add("ds2.example.com");
|
referralURLs.add("ds3.example.com");
|
|
addResponse = new AddResponseProtocolOp(resultCode, resultMsg, dn,
|
referralURLs);
|
assertEquals(addResponse.getErrorMessage(), resultMsg);
|
assertEquals(addResponse.getResultCode(), resultCode);
|
assertEquals(addResponse.getMatchedDN(), dn);
|
assertEquals(addResponse.getReferralURLs(), referralURLs);
|
}
|
|
/**
|
* Test the decode method when an empty element is passed
|
*
|
* @throws Exception If the test failed unexpectedly.
|
*/
|
@Test(expectedExceptions = LDAPException.class)
|
public void testDecodeEmptyElement() throws Exception
|
{
|
ByteStringBuilder builder = new ByteStringBuilder();
|
ASN1Writer writer = ASN1.getWriter(builder);
|
writer.writeStartSequence(OP_TYPE_ADD_RESPONSE);
|
writer.writeEndSequence();
|
|
ASN1Reader reader = ASN1.getReader(builder.toByteString());
|
LDAPReader.readProtocolOp(reader);
|
}
|
|
/**
|
* Test the decode method when an element with a invalid result code is
|
* passed
|
*
|
* @throws Exception If the test failed unexpectedly.
|
*/
|
@Test(expectedExceptions = LDAPException.class)
|
public void testDecodeInvalidResultCode() throws Exception
|
{
|
ByteStringBuilder builder = new ByteStringBuilder();
|
ASN1Writer writer = ASN1.getWriter(builder);
|
writer.writeStartSequence(OP_TYPE_ADD_RESPONSE);
|
writer.writeOctetString("Invalid Data");
|
writer.writeNull();
|
writer.writeNull();
|
writer.writeEndSequence();
|
|
ASN1Reader reader = ASN1.getReader(builder.toByteString());
|
LDAPReader.readProtocolOp(reader);
|
}
|
|
/**
|
* Test the decode method when an element with a invalid dn is
|
* passed. Never throws an exception as long as the element is not null.
|
* This is the expected behavior.
|
*
|
* @throws Exception If the test failed unexpectedly.
|
*/
|
@Test
|
public void testDecodeInvalidDN() throws Exception
|
{
|
ByteStringBuilder builder = new ByteStringBuilder();
|
ASN1Writer writer = ASN1.getWriter(builder);
|
writer.writeStartSequence(OP_TYPE_ADD_RESPONSE);
|
writer.writeInteger(resultCode);
|
writer.writeNull();
|
writer.writeNull();
|
writer.writeEndSequence();
|
|
ASN1Reader reader = ASN1.getReader(builder.toByteString());
|
LDAPReader.readProtocolOp(reader);
|
}
|
|
/**
|
* Test the decode method when an element with a invalid result message is
|
* passed. Never throws an exception as long as the element is not null.
|
* This is the expected behavior.
|
*
|
* @throws Exception If the test failed unexpectedly.
|
*/
|
@Test
|
public void testDecodeInvalidResultMsg() throws Exception
|
{
|
ByteStringBuilder builder = new ByteStringBuilder();
|
ASN1Writer writer = ASN1.getWriter(builder);
|
writer.writeStartSequence(OP_TYPE_ADD_RESPONSE);
|
writer.writeInteger(resultCode);
|
writer.writeOctetString(dn.toString());
|
writer.writeNull();
|
writer.writeEndSequence();
|
|
ASN1Reader reader = ASN1.getReader(builder.toByteString());
|
LDAPReader.readProtocolOp(reader);
|
}
|
|
/**
|
* Test the decode method when an element with a invalid referral URL is
|
* passed. Never throws an exception as long as the element is not null.
|
* This is the expected behavior.
|
*
|
* @throws Exception If the test failed unexpectedly.
|
*/
|
@Test
|
public void testDecodeInvalidReferralURLs() throws Exception
|
{
|
ByteStringBuilder builder = new ByteStringBuilder();
|
ASN1Writer writer = ASN1.getWriter(builder);
|
writer.writeStartSequence(OP_TYPE_ADD_RESPONSE);
|
writer.writeInteger(resultCode);
|
writer.writeOctetString(dn.toString());
|
writer.writeOctetString(resultMsg.toString());
|
writer.writeNull();
|
writer.writeEndSequence();
|
|
ASN1Reader reader = ASN1.getReader(builder.toByteString());
|
LDAPReader.readProtocolOp(reader);
|
}
|
|
/**
|
* Test the encode and decode methods and corner cases.
|
*
|
* @throws Exception If the test failed unexpectedly.
|
*/
|
@Test
|
public void testEncodeDecode() throws Exception
|
{
|
ByteStringBuilder builder = new ByteStringBuilder();
|
ASN1Writer writer = ASN1.getWriter(builder);
|
AddResponseProtocolOp addEncoded;
|
AddResponseProtocolOp addDecoded;
|
|
ArrayList<String> referralURLs = new ArrayList<>();
|
referralURLs.add("ds1.example.com");
|
referralURLs.add("ds2.example.com");
|
referralURLs.add("ds3.example.com");
|
|
|
//Test case for a full encode decode operation with normal params.
|
addEncoded = new AddResponseProtocolOp(resultCode, resultMsg, dn,
|
referralURLs);
|
addEncoded.write(writer);
|
ASN1Reader reader = ASN1.getReader(builder.toByteString());
|
addDecoded = (AddResponseProtocolOp)LDAPReader.readProtocolOp(reader);
|
|
assertEquals(addEncoded.getType(), OP_TYPE_ADD_RESPONSE);
|
assertEquals(addEncoded.getMatchedDN().compareTo(addDecoded.getMatchedDN()),
|
0);
|
assertEquals(addEncoded.getErrorMessage(), addDecoded.getErrorMessage());
|
assertEquals(addEncoded.getResultCode(), addDecoded.getResultCode());
|
assertEquals(addEncoded.getReferralURLs(), addDecoded.getReferralURLs());
|
|
|
//Test case for a full encode decode operation with an empty DN params.
|
addEncoded = new AddResponseProtocolOp(resultCode, resultMsg, DN.rootDN(),
|
referralURLs);
|
builder.clear();
|
addEncoded.write(writer);
|
reader = ASN1.getReader(builder.toByteString());
|
addDecoded = (AddResponseProtocolOp)LDAPReader.readProtocolOp(reader);
|
assertNull(addDecoded.getMatchedDN());
|
|
//Test case for a full empty referral url param.
|
ArrayList<String> emptyReferralURLs = new ArrayList<>();
|
addEncoded = new AddResponseProtocolOp(resultCode, resultMsg, dn,
|
emptyReferralURLs);
|
builder.clear();
|
addEncoded.write(writer);
|
reader = ASN1.getReader(builder.toByteString());
|
addDecoded = (AddResponseProtocolOp)LDAPReader.readProtocolOp(reader);
|
assertNull(addDecoded.getReferralURLs());
|
|
//Test case for a full encode decode operation with resultCode param only.
|
addEncoded = new AddResponseProtocolOp(resultCode);
|
builder.clear();
|
addEncoded.write(writer);
|
reader = ASN1.getReader(builder.toByteString());
|
addDecoded = (AddResponseProtocolOp)LDAPReader.readProtocolOp(reader);
|
|
assertNull(addDecoded.getMatchedDN());
|
assertNull(addDecoded.getErrorMessage());
|
assertEquals(addEncoded.getResultCode(), addDecoded.getResultCode());
|
assertNull(addDecoded.getReferralURLs());
|
}
|
|
/**
|
* Test the toString (single line) method.
|
*
|
* @throws Exception If the test fails unexpectedly.
|
*/
|
@Test
|
public void TestToStringSingleLine() throws Exception
|
{
|
List<String> referralURLs = Arrays.asList(
|
"ds1.example.com",
|
"ds2.example.com",
|
"ds3.example.com");
|
|
AddResponseProtocolOp addResponse = new AddResponseProtocolOp(resultCode, resultMsg, dn, referralURLs);
|
|
StringBuilder buffer = new StringBuilder();
|
addResponse.toString(buffer);
|
|
String key = "AddResponse(resultCode=" + resultCode
|
+ ", errorMessage=" + resultMsg
|
+ ", matchedDN=" + dn +
|
", referralURLs={" + joinAsString(", ", referralURLs) + "})";
|
|
assertEquals(buffer.toString(), key);
|
}
|
|
/**
|
* Test the toString (multi line) method.
|
*
|
* @throws Exception If the test fails unexpectedly.
|
*/
|
@Test
|
public void TestToStringMultiLine() throws Exception
|
{
|
AddResponseProtocolOp addResponse;
|
StringBuilder buffer = new StringBuilder();
|
StringBuilder key = new StringBuilder();
|
|
ArrayList<String> referralURLs = new ArrayList<>();
|
referralURLs.add("ds1.example.com");
|
referralURLs.add("ds2.example.com");
|
referralURLs.add("ds3.example.com");
|
int indent = 5;
|
int i;
|
|
addResponse = new AddResponseProtocolOp(resultCode, resultMsg, dn, referralURLs);
|
addResponse.toString(buffer, indent);
|
|
StringBuilder indentBuf = new StringBuilder(indent);
|
for (i=0 ; i < indent; i++)
|
{
|
indentBuf.append(' ');
|
}
|
|
key.append(indentBuf).append("Add Response").append(EOL);
|
key.append(indentBuf).append(" Result Code: ").append(resultCode).append(EOL);
|
key.append(indentBuf).append(" Error Message: ").append(resultMsg).append(EOL);
|
key.append(indentBuf).append(" Matched DN: ").append(dn).append(EOL);
|
|
key.append(indentBuf).append(" Referral URLs: ").append(EOL);
|
for (String url : referralURLs)
|
{
|
key.append(indentBuf).append(" ").append(url).append(EOL);
|
}
|
|
assertEquals(buffer.toString(), key.toString());
|
}
|
}
|