/*
* Copyright 2015 JBoss Inc
*
* Licensed 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 io.apiman.gateway.platforms.vertx3.components.ldap;
import io.apiman.gateway.engine.components.ldap.ILdapClientConnection;
import io.apiman.gateway.engine.components.ldap.ILdapSearchEntry;
import io.apiman.gateway.engine.components.ldap.LdapSearchScope;
import io.apiman.gateway.engine.components.ldap.result.LdapResultCode;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestCompletion;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.TestSuite;
import java.util.List;
import org.junit.After;
import org.junit.Test;
/**
* @author Marc Savy {@literal <msavy@redhat.com>}
*/
@SuppressWarnings("nls")
public class LdapQueryTests extends LdapTestParent {
public ILdapClientConnection connection;
@After
public void after() {
if (connection != null)
connection.close();
}
@Test
public void shouldConnectSuccessfully() throws InterruptedException {
config.setBindDn("uid=admin,ou=system");
config.setBindPassword("secret");
TestCompletion completion = TestSuite.create("").test("", context -> {
Async async = context.async();
ldapClientComponent.connect(config, connectionResult -> {
context.assertTrue(connectionResult.isSuccess());
connection = connectionResult.getResult();
async.complete();
});
async.awaitSuccess();
}).run();
completion.awaitSuccess();
}
@Test
public void shouldCompleteSimpleQuery() throws InterruptedException {
config.setBindDn("uid=admin,ou=system");
config.setBindPassword("secret");
connect((connection, context) -> {
Async async = context.async();
connection.search("ou=people,o=apiman", "(uid=msavy)", LdapSearchScope.SUBTREE)
.search(searchResult -> {
context.assertTrue(searchResult.isSuccess());
List<ILdapSearchEntry> result = searchResult.getResult();
context.assertEquals(1, result.size());
async.complete();
});
});
}
@Test
public void shouldCompleteMultipleSimpleQueries() throws InterruptedException {
config.setBindDn("uid=admin,ou=system");
config.setBindPassword("secret");
connect((connection, context) -> {
Async async = context.async();
Async async2 = context.async();
connection.search("ou=people,o=apiman", "(uid=msavy)", LdapSearchScope.SUBTREE)
.search(searchResult -> {
context.assertTrue(searchResult.isSuccess());
List<ILdapSearchEntry> result = searchResult.getResult();
context.assertEquals(1, result.size());
async.complete();
});
connection.search("ou=people,o=apiman", "(uid=ewittman)", LdapSearchScope.SUBTREE).
search(searchResult -> {
context.assertTrue(searchResult.isSuccess());
List<ILdapSearchEntry> result = searchResult.getResult();
context.assertEquals(1, result.size());
async2.complete();
});
});
}
@Test
public void shouldReturnEmptyForUnmatchedFilter() throws InterruptedException {
config.setBindDn("uid=admin,ou=system");
config.setBindPassword("secret");
connect((connection, context) -> {
Async async = context.async();
connection.search("ou=people,o=apiman", "(uid=sushi)", LdapSearchScope.SUBTREE)
.search(searchResult -> {
context.assertTrue(searchResult.isSuccess());
List<ILdapSearchEntry> result = searchResult.getResult();
context.assertEquals(0, result.size());
async.complete();
});
});
}
@Test
public void shouldErrorIfSearchDnInvalid() throws InterruptedException {
config.setBindDn("uid=admin,ou=system");
config.setBindPassword("secret");
connect((connection, context) -> {
Async async = context.async();
connection.search("invalid", "(uid=msavy)", LdapSearchScope.SUBTREE)
.setLdapErrorHandler(error -> {
System.err.println(error.getResultCode());
context.assertTrue(error.getResultCode().equals(LdapResultCode.INVALID_DN_SYNTAX));
async.complete();
})
.search(searchResult -> {
context.assertFalse(true); // Should not be executed
});
});
}
@Test
public void shouldErrorIfSearchFilterInvalid() throws InterruptedException {
config.setBindDn("uid=admin,ou=system");
config.setBindPassword("secret");
connect((connection, context) -> {
Async async = context.async();
connection.search("ou=people,o=apiman", "!!!!", LdapSearchScope.SUBTREE)
.setLdapErrorHandler(error -> {
context.assertTrue(error.getResultCode().equals(LdapResultCode.FILTER_ERROR));
async.complete();
})
.search(searchResult -> {
context.assertFalse(true); // Should not be executed
});
});
}
private void connect(DoubleHandler<ILdapClientConnection, TestContext> handler) {
TestCompletion completion = TestSuite.create("").test("", context -> {
Async async = context.async();
ldapClientComponent.connect(config, connectionResult -> {
context.assertTrue(connectionResult.isSuccess());
connection = connectionResult.getResult();
handler.handle(connection, context);
async.complete();
});
async.awaitSuccess();
}).run();
completion.awaitSuccess();
}
interface DoubleHandler<X, Y> {
void handle(X x, Y y);
}
}