blob: 608c492ca961ffe863ecc221e3329c4440afcd37 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.server.operations.search;
import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.OperationNotSupportedException;
import javax.naming.SizeLimitExceededException;
import javax.naming.directory.DirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.LdapContext;
import javax.naming.ldap.PagedResultsResponseControl;
import org.apache.directory.junit.tools.MultiThreadedMultiInvoker;
import org.apache.directory.server.annotations.CreateLdapServer;
import org.apache.directory.server.annotations.CreateTransport;
import org.apache.directory.server.core.annotations.ApplyLdifs;
import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
import org.apache.directory.server.core.integ.FrameworkRunner;
import org.apache.directory.server.ldap.LdapServer;
import org.apache.directory.shared.asn1.EncoderException;
import org.apache.directory.shared.ldap.codec.DefaultLdapCodecService;
import org.apache.directory.shared.ldap.codec.ILdapCodecService;
import org.apache.directory.shared.ldap.codec.search.controls.pagedSearch.PagedResultsDecorator;
import org.apache.directory.shared.ldap.model.message.Control;
import org.apache.directory.shared.ldap.util.JndiUtils;
import org.apache.directory.shared.util.Strings;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Test the PagedSearchControl. The following tables covers all the
* possible cases for both an admin and a simple user, combining the
* Server SizeLimit (SL), the requested SizeLimit (SL) and the paged
* size limit (PL). The 'X' column tells if we are supposed to receive
* a SizeLimitExceededException.<br>
* <br>
* Administrator<br>
* <pre>
* +-------+----+----+----+---------------------+----+---+<br>
* |test | SL | RL | PL | Nb of responses | nb | X |<br>
* +-------+----+----+----+---------------------+----+---+<br>
* |test1 | 0 | 0 | 3 | 4 ( 3 + 3 + 3 + 1 ) | 10 | |<br>
* |test2 | 0 | 0 | 5 | 2 ( 5 + 5 ) | 10 | |<br>
* |test3 | 3 | 0 | 5 | 2 ( 5 + 5 ) | 10 | |<br>
* |test4 | 0 | 3 | 5 | 1 ( 3 ) | 3 | Y |<br>
* |test5 | 5 | 0 | 3 | 4 ( 3 + 3 + 3 + 1 ) | 10 | |<br>
* |test6 | 0 | 9 | 5 | 2 ( 5 + 4 ) | 5 | Y |<br>
* |test7 | 5 | 0 | 5 | 2 ( 5 + 5 ) | 10 | |<br>
* |test8 | 0 | 5 | 5 | 1 ( 5 ) | 5 | Y |<br>
* |test9 | 5 | 4 | 3 | 2 ( 3 + 1 ) | 4 | Y |<br>
* |test10 | 4 | 5 | 3 | 2 ( 3 + 2 ) | 5 | Y |<br>
* |test11 | 5 | 3 | 4 | 1 ( 3 ) | 3 | Y |<br>
* |test12 | 5 | 4 | 3 | 2 ( 3 + 1 ) | 4 | Y |<br>
* |test13 | 4 | 5 | 3 | 2 ( 3 + 2 ) | 5 | Y |<br>
* |test14 | 4 | 3 | 5 | 1 ( 3 ) | 3 | Y |<br>
* |test15 | 3 | 5 | 4 | 2 ( 4 + 1 ) | 5 | Y |<br>
* |test16 | 3 | 4 | 5 | 1 ( 4 ) | 4 | Y |<br>
* |test17 | 5 | 5 | 5 | 1 ( 5 ) | 5 | Y |<br>
* +-------+----+----+----+---------------------+----+---+<br>
* <br>
* Simple user<br>
* <br>
* +-------+----+----+----+---------------------+----+---+<br>
* |test | SL | RL | PL | Nb of responses | nb | X |<br>
* +-------+----+----+----+---------------------+----+---+<br>
* |test18 | 0 | 0 | 3 | 4 ( 3 + 3 + 3 + 1 ) | 10 | |<br>
* |test19 | 0 | 0 | 5 | 2 ( 5 + 5 ) | 10 | |<br>
* |test20 | 3 | 0 | 5 | 1 ( 3 ) | 3 | Y |<br>
* |test21 | 0 | 3 | 5 | 1 ( 3 ) | 3 | Y |<br>
* |test22 | 5 | 0 | 3 | 2 ( 3 + 2 ) | 5 | Y |<br>
* |test23 | 0 | 9 | 5 | 2 ( 5 + 4 ) | 9 | Y |<br>
* |test24 | 5 | 0 | 5 | 1 ( 5 ) | 5 | Y |<br>
* |test25 | 0 | 5 | 5 | 1 ( 5 ) | 5 | Y |<br>
* |test26 | 5 | 4 | 3 | 2 ( 3 + 1 ) | 4 | Y |<br>
* |test27 | 4 | 5 | 3 | 2 ( 3 + 1 ) | 4 | Y |<br>
* |test28 | 5 | 3 | 4 | 1 ( 3 ) | 3 | Y |<br>
* |test29 | 5 | 4 | 3 | 2 ( 3 + 1 ) | 4 | Y |<br>
* |test30 | 4 | 5 | 3 | 2 ( 3 + 1 ) | 4 | Y |<br>
* |test31 | 4 | 3 | 5 | 1 ( 3 ) | 3 | Y |<br>
* |test32 | 3 | 5 | 4 | 1 ( 3 ) | 3 | Y |<br>
* |test33 | 3 | 4 | 5 | 1 ( 3 ) | 3 | Y |<br>
* |test34 | 5 | 5 | 5 | 1 ( 5 ) | 5 | Y |<br>
* +-------+----+----+----+---------------------+----+---+<br>
*</pre>
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
@RunWith ( FrameworkRunner.class )
@CreateLdapServer (
transports =
{
@CreateTransport( protocol = "LDAP" )
})
@ApplyLdifs( {
// Add 10 new entries
"dn: dc=users,ou=system",
"objectClass: top",
"objectClass: domain",
"dc: users",
//
"dn: cn=user0,dc=users,ou=system",
"objectClass: top",
"objectClass: person",
"cn: user0",
"sn: user 0",
//
"dn: cn=user1,dc=users,ou=system",
"objectClass: top",
"objectClass: person",
"cn: user1",
"sn: user 1",
//
"dn: cn=user2,dc=users,ou=system",
"objectClass: top",
"objectClass: person",
"cn: user2",
"sn: user 2",
//
"dn: cn=user3,dc=users,ou=system",
"objectClass: top",
"objectClass: person",
"cn: user3",
"sn: user 3",
//
"dn: cn=user4,dc=users,ou=system",
"objectClass: top",
"objectClass: person",
"cn: user4",
"sn: user 4",
//
"dn: cn=user5,dc=users,ou=system",
"objectClass: top",
"objectClass: person",
"cn: user5",
"sn: user 5",
//
"dn: cn=user6,dc=users,ou=system",
"objectClass: top",
"objectClass: person",
"cn: user6",
"sn: user 6",
//
"dn: cn=user7,dc=users,ou=system",
"objectClass: top",
"objectClass: person",
"cn: user7",
"sn: user 7",
//
"dn: cn=user8,dc=users,ou=system",
"objectClass: top",
"objectClass: person",
"cn: user8",
"sn: user 8",
//
"dn: cn=user9,dc=users,ou=system",
"objectClass: top",
"objectClass: person",
"cn: user9",
"sn: user 9",
"",
// Add another user for non admin tests
"dn: cn=user,ou=system",
"objectClass: top",
"objectClass: person",
"cn: user",
"userPassword: secret",
"sn: user"
}
)
public class PagedSearchIT extends AbstractLdapTestUnit
{
@Rule
public MultiThreadedMultiInvoker i = new MultiThreadedMultiInvoker( MultiThreadedMultiInvoker.THREADSAFE );
private ILdapCodecService codec = new DefaultLdapCodecService();
/**
* Create the searchControls with a paged size
* @throws EncoderException on codec failures
*/
private SearchControls createSearchControls( DirContext ctx, int sizeLimit, int pagedSize )
throws NamingException, EncoderException
{
SearchControls controls = new SearchControls();
controls.setCountLimit( sizeLimit );
controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
PagedResultsDecorator pagedSearchControl = new PagedResultsDecorator( codec );
pagedSearchControl.setSize( pagedSize );
((LdapContext)ctx).setRequestControls( JndiUtils.toJndiControls( codec, new Control[] {pagedSearchControl} ) );
return controls;
}
/**
* Create the searchControls with a paged size
* @throws EncoderException on codec failures
*/
private void createNextSearchControls( DirContext ctx, byte[] cookie, int pagedSize )
throws NamingException, EncoderException
{
PagedResultsDecorator pagedSearchControl = new PagedResultsDecorator( codec );
pagedSearchControl.setCookie( cookie );
pagedSearchControl.setSize( pagedSize );
((LdapContext)ctx).setRequestControls( JndiUtils.toJndiControls( codec, new Control[] {pagedSearchControl} ) );
}
/**
* Check that we got the correct result set
*/
private void checkResults( List<SearchResult> results, int expectedSize ) throws NamingException
{
assertEquals( expectedSize, results.size() );
// check that we have correctly read all the entries
for ( int i = 0; i < expectedSize; i++ )
{
SearchResult entry = results.get( i );
assertEquals( "user" + i, entry.getAttributes().get( "cn" ).get() );
}
}
/**
* Do the loop over the entries, until we can't get any more, or until we
* reach a limit. It will check that we have got all the expected entries.
* @throws EncoderException on codec failures
*/
private void doLoop( DirContext ctx, SearchControls controls, int pagedSizeLimit,
int expectedLoop, int expectedNbEntries, boolean expectedException ) throws NamingException, EncoderException
{
// Loop over all the elements
int loop = 0;
boolean hasSizeLimitException = false;
List<SearchResult> results = new ArrayList<SearchResult>();
while ( true )
{
loop++;
NamingEnumeration<SearchResult> list = null;
try
{
list = ctx.search( "dc=users,ou=system", "(cn=*)", controls );
while ( list.hasMore() )
{
SearchResult result = list.next();
results.add( result );
}
}
catch ( SizeLimitExceededException e )
{
hasSizeLimitException = true;
break;
}
finally
{
// Close the NamingEnumeration
if ( list != null )
{
list.close();
}
}
// Now read the next ones
javax.naming.ldap.Control[] responseControls = ((LdapContext)ctx).getResponseControls();
PagedResultsResponseControl responseControl =
(PagedResultsResponseControl)responseControls[0];
assertEquals( 0, responseControl.getResultSize() );
// check if this is over
byte[] cookie = responseControl.getCookie();
if ( Strings.isEmpty(cookie) )
{
// If so, exit the loop
break;
}
// Prepare the next iteration
createNextSearchControls( ctx, responseControl.getCookie(), pagedSizeLimit );
}
assertEquals( expectedException, hasSizeLimitException );
assertEquals( expectedLoop, loop );
checkResults( results, expectedNbEntries );
// And close the connection
closeConnection( ctx );
}
/**
* Close a connection, and wait a bit to be sure it's done
*/
private void closeConnection( DirContext ctx ) throws NamingException
{
if ( ctx != null )
{
ctx.close();
try
{
Thread.sleep(10);
}
catch ( Exception e )
{
}
}
}
/**
* Admin = yes <br>
* SL = none<br>
* RL = none<br>
* PL = 3<br>
* expected exception : no<br>
* expected number of entries returned : 10 ( 3 + 3 + 3 + 1 )<br>
*/
@Test
public void testPagedSearchtest1() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, 3 );
doLoop( ctx, controls, 3, 4, 10, false );
}
/**
* Admin = yes <br>
* SL = none<br>
* RL = none<br>
* PL = 5<br>
* expected exception : no<br>
* expected number of entries returned : 10 ( 5 + 5 )<br>
*/
@Test
public void testPagedSearchtest2() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, 5 );
doLoop( ctx, controls, 5, 2, 10, false );
}
/**
* Admin = yes <br>
* SL = 3<br>
* RL = none<br>
* PL = 5<br>
* expected exception : no<br>
* expected number of entries returned : 10 ( 5 + 5 )<br>
*/
@Test
public void testPagedSearchTest3() throws Exception
{
ldapServer.setMaxSizeLimit( 3 );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, 5 );
doLoop( ctx, controls, 5, 2, 10, false );
}
/**
* Admin = yes <br>
* SL = none<br>
* RL = 3<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 3<br>
*/
@Test
public void testPagedSearchTest4() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, 3, 5 );
doLoop( ctx, controls, 5, 1, 3, true );
}
/**
* Admin = yes <br>
* SL = 5<br>
* RL = none<br>
* PL = 3<br>
* expected exception : no<br>
* expected number of entries returned : 10 ( 3 + 3 + 3 + 1 )<br>
*/
@Test
public void testPagedSearchtest5() throws Exception
{
ldapServer.setMaxSizeLimit( 5 );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, 3 );
doLoop( ctx, controls, 3, 4, 10, false );
}
/**
* Admin = yes <br>
* SL = none<br>
* RL = 9<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 9 ( 5 + 4 )<br>
*/
@Test
public void testPagedSearchTest6() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, 9, 5 );
doLoop( ctx, controls, 5, 2, 9, true );
}
/**
* Admin = yes <br>
* SL = 5<br>
* RL = none<br>
* PL = 5<br>
* expected exception : no<br>
* expected number of entries returned : 10 ( 5 + 5 )<br>
*/
@Test
public void testPagedSearchtest7() throws Exception
{
ldapServer.setMaxSizeLimit( 5 );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, 5 );
doLoop( ctx, controls, 5, 2, 10, false );
}
/**
* Admin = yes <br>
* SL = none<br>
* RL = 5<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 5<br>
*/
@Test
public void testPagedSearchTest8() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, 5, 5 );
doLoop( ctx, controls, 5, 1, 5, true );
}
/**
* Admin = yes <br>
* SL = 5<br>
* RL = 4<br>
* PL = 3<br>
* expected exception : yes<br>
* expected number of entries returned : 2 ( 3 + 1 )<br>
*/
@Test
public void testPagedSearchTest9() throws Exception
{
ldapServer.setMaxSizeLimit( 5 );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, 4, 3 );
doLoop( ctx, controls, 3, 2, 4, true );
}
/**
* Admin = yes <br>
* SL = 4<br>
* RL = 5<br>
* PL = 3<br>
* expected exception : yes<br>
* expected number of entries returned : 5 ( 3 + 2 )<br>
*/
@Test
public void testPagedSearchtest10() throws Exception
{
ldapServer.setMaxSizeLimit( 4 );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, 5, 3 );
doLoop( ctx, controls, 3, 2, 5, true );
}
/**
* Admin = yes <br>
* SL = 5<br>
* RL = 3<br>
* PL = 4<br>
* expected exception : yes<br>
* expected number of entries returned : 3<br>
*/
@Test
public void testPagedSearchtest11() throws Exception
{
ldapServer.setMaxSizeLimit( 5 );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, 3, 4 );
doLoop( ctx, controls, 4, 1, 3, true );
}
/**
* Admin = yes <br>
* SL = 5<br>
* RL = 4<br>
* PL = 3<br>
* expected exception : yes<br>
* expected number of entries returned : 4 ( 3 + 1 )<br>
*/
@Test
public void testPagedSearchtest12() throws Exception
{
ldapServer.setMaxSizeLimit( 5 );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, 4, 3 );
doLoop( ctx, controls, 3, 2, 4, true );
}
/**
* Admin = yes <br>
* SL = 4<br>
* RL = 5<br>
* PL = 3<br>
* expected exception : yes<br>
* expected number of entries returned : 5 ( 3 + 2 )<br>
*/
@Test
public void testPagedSearchtest13() throws Exception
{
ldapServer.setMaxSizeLimit( 4 );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, 5, 3 );
doLoop( ctx, controls, 3, 2, 5, true );
}
/**
* Admin = yes <br>
* SL = 4<br>
* RL = 3<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 3 <br>
*/
@Test
public void testPagedSearchtest14() throws Exception
{
ldapServer.setMaxSizeLimit( 4 );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, 3, 5 );
doLoop( ctx, controls, 5, 1, 3, true );
}
/**
* Admin = yes <br>
* SL = 3<br>
* RL = 5<br>
* PL = 4<br>
* expected exception : yes<br>
* expected number of entries returned : 5 ( 4 + 1 )<br>
*/
@Test
public void testPagedSearchtest15() throws Exception
{
ldapServer.setMaxSizeLimit( 3 );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, 5, 4 );
doLoop( ctx, controls, 4, 2, 5, true );
}
/**
* Admin = yes <br>
* SL = 3<br>
* RL = 4<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 4 <br>
*/
@Test
public void testPagedSearchtest16() throws Exception
{
ldapServer.setMaxSizeLimit( 3 );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, 4, 5 );
doLoop( ctx, controls, 5, 1, 4, true );
}
/**
* Admin = yes <br>
* SL = 5<br>
* RL = 5<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 5 <br>
*/
@Test
public void testPagedSearchtest17() throws Exception
{
ldapServer.setMaxSizeLimit( 5 );
DirContext ctx = getWiredContext( ldapServer );
SearchControls controls = createSearchControls( ctx, 5, 5 );
doLoop( ctx, controls, 5, 1, 5, true );
}
/**
* Admin = no <br>
* SL = none<br>
* RL = none<br>
* PL = 3<br>
* expected exception : no<br>
* expected number of entries returned : 10 ( 3 + 3 + 3 + 1 )<br>
*/
@Test
public void testPagedSearchtest18() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, 3 );
doLoop( ctx, controls, 3, 4, 10, false );
}
/**
* Admin = no <br>
* SL = none<br>
* RL = none<br>
* PL = 5<br>
* expected exception : no<br>
* expected number of entries returned : 10 ( 5 + 5 )<br>
*/
@Test
public void testPagedSearchtest19() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, 5 );
doLoop( ctx, controls, 5, 2, 10, false );
}
/**
* Admin = no <br>
* SL = 3<br>
* RL = none<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 3<br>
*/
@Test
public void testPagedSearchTest20() throws Exception
{
ldapServer.setMaxSizeLimit( 3 );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, 5 );
doLoop( ctx, controls, 5, 1, 3, true );
}
/**
* Admin = no <br>
* SL = none<br>
* RL = 3<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 3<br>
*/
@Test
public void testPagedSearchTest21() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, 3, 5 );
doLoop( ctx, controls, 5, 1, 3, true );
}
/**
* Admin = no <br>
* SL = 5<br>
* RL = none<br>
* PL = 3<br>
* expected exception : yes<br>
* expected number of entries returned : 5 ( 3 + 2 )<br>
*/
@Test
public void testPagedSearchtest22() throws Exception
{
ldapServer.setMaxSizeLimit( 5 );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, 3 );
doLoop( ctx, controls, 3, 2, 5, true );
}
/**
* Admin = no <br>
* SL = none<br>
* RL = 9<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 9 ( 5 + 4 )<br>
*/
@Test
public void testPagedSearchTest23() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, 9, 5 );
doLoop( ctx, controls, 5, 2, 9, true );
}
/**
* Admin = no <br>
* SL = 5<br>
* RL = none<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 5<br>
*/
@Test
public void testPagedSearchtest24() throws Exception
{
ldapServer.setMaxSizeLimit( 5 );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, 5 );
doLoop( ctx, controls, 5, 1, 5, true );
}
/**
* Admin = no <br>
* SL = none<br>
* RL = 5<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 5<br>
*/
@Test
public void testPagedSearchTest25() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, 5, 5 );
doLoop( ctx, controls, 5, 1, 5, true );
}
/**
* Admin = no <br>
* SL = 5<br>
* RL = 4<br>
* PL = 3<br>
* expected exception : yes<br>
* expected number of entries returned : 2 ( 3 + 1 )<br>
*/
@Test
public void testPagedSearchTest26() throws Exception
{
ldapServer.setMaxSizeLimit( 5 );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, 4, 3 );
doLoop( ctx, controls, 3, 2, 4, true );
}
/**
* Admin = no <br>
* SL = 4<br>
* RL = 5<br>
* PL = 3<br>
* expected exception : yes<br>
* expected number of entries returned : 4 ( 3 + 1 )<br>
*/
@Test
public void testPagedSearchtest27() throws Exception
{
ldapServer.setMaxSizeLimit( 4 );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, 5, 3 );
doLoop( ctx, controls, 3, 2, 4, true );
}
/**
* Admin = no <br>
* SL = 5<br>
* RL = 3<br>
* PL = 4<br>
* expected exception : yes<br>
* expected number of entries returned : 3<br>
*/
@Test
public void testPagedSearchtest28() throws Exception
{
ldapServer.setMaxSizeLimit( 5 );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, 3, 4 );
doLoop( ctx, controls, 4, 1, 3, true );
}
/**
* Admin = no <br>
* SL = 5<br>
* RL = 4<br>
* PL = 3<br>
* expected exception : yes<br>
* expected number of entries returned : 4 ( 3 + 1 )<br>
*/
@Test
public void testPagedSearchtest29() throws Exception
{
ldapServer.setMaxSizeLimit( 5 );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, 4, 3 );
doLoop( ctx, controls, 3, 2, 4, true );
}
/**
* Admin = no <br>
* SL = 4<br>
* RL = 5<br>
* PL = 3<br>
* expected exception : yes<br>
* expected number of entries returned : 4 ( 3 + 1 )<br>
*/
@Test
public void testPagedSearchtest30() throws Exception
{
ldapServer.setMaxSizeLimit( 4 );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, 5, 3 );
doLoop( ctx, controls, 3, 2, 4, true );
}
/**
* Admin = no <br>
* SL = 4<br>
* RL = 3<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 3 <br>
*/
@Test
public void testPagedSearchtest31() throws Exception
{
ldapServer.setMaxSizeLimit( 4 );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, 3, 5 );
doLoop( ctx, controls, 3, 1, 3, true );
}
/**
* Admin = no <br>
* SL = 3<br>
* RL = 5<br>
* PL = 4<br>
* expected exception : yes<br>
* expected number of entries returned : 3 <br>
*/
@Test
public void testPagedSearchtest32() throws Exception
{
ldapServer.setMaxSizeLimit( 3 );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, 5, 4 );
doLoop( ctx, controls, 3, 1, 3, true );
}
/**
* Admin = no <br>
* SL = 3<br>
* RL = 4<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 3 <br>
*/
@Test
public void testPagedSearchtest33() throws Exception
{
ldapServer.setMaxSizeLimit( 3 );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, 4, 5 );
doLoop( ctx, controls, 3, 1, 3, true );
}
/**
* Admin = no <br>
* SL = 5<br>
* RL = 5<br>
* PL = 5<br>
* expected exception : yes<br>
* expected number of entries returned : 5 <br>
*/
@Test
public void testPagedSearchtest34() throws Exception
{
ldapServer.setMaxSizeLimit( 5 );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, 5, 5 );
doLoop( ctx, controls, 5, 1, 5, true );
}
/**
* Admin = no <br>
* SL = none<br>
* RL = none<br>
* PL = -2<br>
* expected exception : no<br>
* expected number of entries returned : 10 <br>
*/
@Test
public void testPagedSearchWithNegativePL() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, -2 );
doLoop( ctx, controls, -2, 1, 10, false );
}
/**
* Do a test with a paged search and send a wrong cookie in the middle
*/
@Test
public void testPagedSearchWrongCookie() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, 3 );
// Loop over all the elements
int loop = 0;
List<SearchResult> results = new ArrayList<SearchResult>();
boolean hasUnwillingToPerform = false;
while ( true )
{
loop++;
try
{
NamingEnumeration<SearchResult> list =
ctx.search( "dc=users,ou=system", "(cn=*)", controls );
while ( list.hasMore() )
{
SearchResult result = list.next();
results.add( result );
}
}
catch ( OperationNotSupportedException onse )
{
hasUnwillingToPerform = true;
break;
}
// Now read the next ones
javax.naming.ldap.Control[] responseControls = ((LdapContext)ctx).getResponseControls();
PagedResultsResponseControl responseControl =
(PagedResultsResponseControl)responseControls[0];
assertEquals( 0, responseControl.getResultSize() );
// check if this is over
byte[] cookie = responseControl.getCookie();
if ( Strings.isEmpty(cookie) )
{
// If so, exit the loop
break;
}
// Prepare the next iteration, sending a bad cookie
createNextSearchControls( ctx, "test".getBytes( "UTF-8" ), 3 );
}
assertTrue( hasUnwillingToPerform );
}
/**
* Do a test with a paged search, changing the number of entries to
* return in the middle of the loop
*/
@Test
public void testPagedSearchModifyingPagedLimit() throws Exception
{
ldapServer.setMaxSizeLimit( LdapServer.NO_SIZE_LIMIT );
DirContext ctx = getWiredContext( ldapServer, "cn=user,ou=system", "secret" );
SearchControls controls = createSearchControls( ctx, (int)LdapServer.NO_SIZE_LIMIT, 4 );
// Loop over all the elements
int loop = 0;
List<SearchResult> results = new ArrayList<SearchResult>();
// The expected size after each loop.
int[] expectedSize = new int[]{4, 7, 9, 10};
while ( true )
{
loop++;
NamingEnumeration<SearchResult> list =
ctx.search( "dc=users,ou=system", "(cn=*)", controls );
while ( list.hasMore() )
{
SearchResult result = list.next();
results.add( result );
}
// Now read the next ones
javax.naming.ldap.Control[] responseControls = ((LdapContext)ctx).getResponseControls();
PagedResultsResponseControl responseControl =
(PagedResultsResponseControl)responseControls[0];
assertEquals( 0, responseControl.getResultSize() );
// check if this is over
byte[] cookie = responseControl.getCookie();
if ( Strings.isEmpty(cookie) )
{
// If so, exit the loop
break;
}
// Prepare the next iteration, sending a bad cookie
createNextSearchControls( ctx, responseControl.getCookie(), 4-loop );
assertEquals( expectedSize[loop-1], results.size() );
}
assertEquals( 4, loop );
checkResults( results, 10 );
}
}