* Test the decoding of a AddRequest
*/
@Test
public void testDecodeAddRequestSuccess() throws NamingException
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x59 );
stream.put( new byte[]
{
0x30,
0x57, // LDAPMessage ::= SEQUENCE {
0x02,
0x01,
0x01, // messageID MessageID
0x68,
0x52, // CHOICE { ..., addRequest AddRequest, ...
// AddRequest ::= [APPLICATION 8] SEQUENCE {
// entry LDAPDN,
0x04, 0x20, 'c', 'n', '=', 't', 'e', 's', 't', 'M', 'o', 'd', 'i', 'f', 'y', ',', 'o', 'u', '=', 'u',
's', 'e', 'r', 's', ',', 'o', 'u', '=', 's', 'y', 's', 't', 'e', 'm',
// attributes AttributeList }
0x30,
0x2E, // AttributeList ::= SEQUENCE OF SEQUENCE {
0x30,
0x0c, // attribute 1
0x04, 0x01,
'l', // type AttributeDescription,
0x31,
0x07, // vals SET OF AttributeValue }
0x04, 0x05, 'P', 'a', 'r', 'i', 's',
0x30,
0x1E, // attribute 2
// type AttributeDescription,
0x04, 0x05, 'a', 't', 't', 'r',
's',
0x31,
0x15, // vals SET
// OF
// AttributeValue
// }
0x04, 0x05, 't', 'e', 's', 't', '1', 0x04, 0x05, 't', 'e', 's', 't', '2', 0x04, 0x05, 't', 'e', 's',
't', '3', } );
Strings.dumpBytes( stream.array() );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<AddRequestDecorator> container =
new LdapMessageContainer<AddRequestDecorator>( codec );
// Decode a AddRequest message
try
{
ldapDecoder.decode( stream, container );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
AddRequest addRequest = container.getMessage();
// Check the decoded message
assertEquals( 1, addRequest.getMessageId() );
assertEquals( "cn=testModify,ou=users,ou=system", addRequest.getEntryDn().toString() );
Entry entry = addRequest.getEntry();
assertEquals( 2, entry.size() );
Set<String> expectedTypes = new HashSet<String>();
expectedTypes.add( "l" );
expectedTypes.add( "attrs" );
Map<String, Set<String>> typesVals = new HashMap<String, Set<String>>();
Set<String> lVal1 = new HashSet<String>();
lVal1.add( "Paris" );
typesVals.put( "l", lVal1 );
Set<String> lVal2 = new HashSet<String>();
lVal2.add( "test1" );
lVal2.add( "test2" );
lVal2.add( "test3" );
typesVals.put( "attrs", lVal2 );
Attribute attribute = entry.get( "l" );
assertTrue( expectedTypes.contains( Strings.toLowerCase( attribute.getId() ) ) );
Set<String> vals = ( Set<String> ) typesVals.get( Strings.toLowerCase( attribute.getId() ) );
for ( Value<?> value : attribute )
{
assertTrue( vals.contains( value.getValue() ) );
vals.remove( value.getValue() );
}
attribute = entry.get( "attrs" );
assertTrue( expectedTypes.contains( Strings.toLowerCase( attribute.getId() ) ) );
vals = ( Set<String> ) typesVals.get( Strings.toLowerCase( attribute.getId() ) );
for ( Value<?> value : attribute )
{
assertTrue( vals.contains( value.getValue() ) );
vals.remove( value.getValue() );
}
// Check the encoding
try
{
ByteBuffer bb = encoder.encodeMessage( addRequest );
// Check the length
assertEquals( 0x59, bb.limit() );
// We cannot compare the PDU, as the attributes order is not
// kept. Let's decode again and compare the resulting AddRequest
try
{
ldapDecoder.decode( bb, container );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );