@Test
  public void activeDirectory() {
    Settings settings =
        new Settings()
            .setProperty("ldap.user.baseDn", "cn=users")
            .setProperty("ldap.user.objectClass", "user")
            .setProperty("ldap.user.loginAttribute", "sAMAccountName");

    LdapUserMapping userMapping = new LdapUserMapping(settings);
    LdapSearch search = userMapping.createSearch(null, "tester");
    assertThat(search.getBaseDn(), equalTo("cn=users"));
    assertThat(search.getRequest(), equalTo("(&(objectClass=user)(sAMAccountName={0}))"));
    assertThat(search.getParameters(), equalTo(new String[] {"tester"}));
    assertThat(search.getReturningAttributes(), equalTo(null));

    assertThat(
        userMapping.toString(),
        equalTo(
            "LdapUserMapping{"
                + "baseDn=cn=users,"
                + " objectClass=user,"
                + " loginAttribute=sAMAccountName,"
                + " realNameAttribute=cn,"
                + " emailAttribute=mail}"));
  }
  @Test
  public void subtreeSearch() throws Exception {
    LdapSearch search =
        new LdapSearch(contextFactory)
            .setBaseDn("dc=example,dc=org")
            .setRequest("(objectClass={0})")
            .setParameters("inetOrgPerson")
            .returns("objectClass");

    assertThat(search.getBaseDn(), is("dc=example,dc=org"));
    assertThat(search.getScope(), is(SearchControls.SUBTREE_SCOPE));
    assertThat(search.getRequest(), is("(objectClass={0})"));
    assertThat(search.getParameters(), is(new String[] {"inetOrgPerson"}));
    assertThat(search.getReturningAttributes(), is(new String[] {"objectClass"}));
    assertThat(
        search.toString(),
        is(
            "LdapSearch{baseDn=dc=example,dc=org, scope=subtree, request=(objectClass={0}), parameters=[inetOrgPerson], attributes=[objectClass]}"));
    assertThat(Iterators.size(Iterators.forEnumeration(search.find())), is(3));
    thrown.expect(NamingException.class);
    thrown.expectMessage("Non unique result for " + search.toString());
    search.findUnique();
  }
  @Test
  public void objectSearch() throws Exception {
    LdapSearch search =
        new LdapSearch(contextFactory)
            .setBaseDn("cn=bind,ou=users,dc=example,dc=org")
            .setScope(SearchControls.OBJECT_SCOPE)
            .setRequest("(objectClass={0})")
            .setParameters("uidObject")
            .returns("uid");

    assertThat(search.getBaseDn(), is("cn=bind,ou=users,dc=example,dc=org"));
    assertThat(search.getScope(), is(SearchControls.OBJECT_SCOPE));
    assertThat(search.getRequest(), is("(objectClass={0})"));
    assertThat(search.getParameters(), is(new String[] {"uidObject"}));
    assertThat(search.getReturningAttributes(), is(new String[] {"uid"}));
    assertThat(
        search.toString(),
        is(
            "LdapSearch{baseDn=cn=bind,ou=users,dc=example,dc=org, scope=object, request=(objectClass={0}), parameters=[uidObject], attributes=[uid]}"));
    assertThat(Iterators.size(Iterators.forEnumeration(search.find())), is(1));
    assertThat(search.findUnique(), not(nullValue()));
  }
  @Test
  public void oneLevelSearch() throws Exception {
    LdapSearch search =
        new LdapSearch(contextFactory)
            .setBaseDn("dc=example,dc=org")
            .setScope(SearchControls.ONELEVEL_SCOPE)
            .setRequest("(objectClass={0})")
            .setParameters("inetOrgPerson")
            .returns("cn");

    assertThat(search.getBaseDn(), is("dc=example,dc=org"));
    assertThat(search.getScope(), is(SearchControls.ONELEVEL_SCOPE));
    assertThat(search.getRequest(), is("(objectClass={0})"));
    assertThat(search.getParameters(), is(new String[] {"inetOrgPerson"}));
    assertThat(search.getReturningAttributes(), is(new String[] {"cn"}));
    assertThat(
        search.toString(),
        is(
            "LdapSearch{baseDn=dc=example,dc=org, scope=onelevel, request=(objectClass={0}), parameters=[inetOrgPerson], attributes=[cn]}"));
    assertThat(Iterators.size(Iterators.forEnumeration(search.find())), is(0));
    assertThat(search.findUnique(), nullValue());
  }