11161d3e8SAdam Hornacek /* 21161d3e8SAdam Hornacek * CDDL HEADER START 31161d3e8SAdam Hornacek * 41161d3e8SAdam Hornacek * The contents of this file are subject to the terms of the 51161d3e8SAdam Hornacek * Common Development and Distribution License (the "License"). 61161d3e8SAdam Hornacek * You may not use this file except in compliance with the License. 71161d3e8SAdam Hornacek * 81161d3e8SAdam Hornacek * See LICENSE.txt included in this distribution for the specific 91161d3e8SAdam Hornacek * language governing permissions and limitations under the License. 101161d3e8SAdam Hornacek * 111161d3e8SAdam Hornacek * When distributing Covered Code, include this CDDL HEADER in each 121161d3e8SAdam Hornacek * file and include the License file at LICENSE.txt. 131161d3e8SAdam Hornacek * If applicable, add the following below this CDDL HEADER, with the 141161d3e8SAdam Hornacek * fields enclosed by brackets "[]" replaced with your own identifying 151161d3e8SAdam Hornacek * information: Portions Copyright [yyyy] [name of copyright owner] 161161d3e8SAdam Hornacek * 171161d3e8SAdam Hornacek * CDDL HEADER END 181161d3e8SAdam Hornacek */ 191161d3e8SAdam Hornacek 201161d3e8SAdam Hornacek /* 21c6f0939bSAdam Hornacek * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. 221161d3e8SAdam Hornacek */ 2314c8a3ffSVladimir Kotal package opengrok.auth.plugin.ldap; 2414c8a3ffSVladimir Kotal 2514c8a3ffSVladimir Kotal import opengrok.auth.plugin.configuration.Configuration; 262f7dccc7SAdam Hornacek import org.junit.jupiter.api.Test; 2714c8a3ffSVladimir Kotal import org.mockito.Mockito; 2814c8a3ffSVladimir Kotal 2914c8a3ffSVladimir Kotal import javax.naming.directory.SearchControls; 3014c8a3ffSVladimir Kotal 3114c8a3ffSVladimir Kotal import java.net.InetAddress; 3214c8a3ffSVladimir Kotal import java.net.UnknownHostException; 3314c8a3ffSVladimir Kotal import java.util.Arrays; 3414c8a3ffSVladimir Kotal import java.util.Collections; 35d0624dbbSVladimir Kotal import java.util.stream.Collectors; 3614c8a3ffSVladimir Kotal 372f7dccc7SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertEquals; 3814c8a3ffSVladimir Kotal import static org.junit.jupiter.api.Assertions.assertFalse; 3914c8a3ffSVladimir Kotal import static org.mockito.ArgumentMatchers.any; 40*bd651080SAdam Hornacek import static org.mockito.Mockito.doReturn; 412a43956eSVladimir Kotal import static org.mockito.Mockito.times; 422a43956eSVladimir Kotal import static org.mockito.Mockito.verify; 4314c8a3ffSVladimir Kotal 44*bd651080SAdam Hornacek class LdapFacadeTest { 4514c8a3ffSVladimir Kotal @Test testSearchControlsConfig()46*bd651080SAdam Hornacek void testSearchControlsConfig() { 4714c8a3ffSVladimir Kotal Configuration config = new Configuration(); 4814c8a3ffSVladimir Kotal int searchTimeout = 1234; 4914c8a3ffSVladimir Kotal config.setSearchTimeout(searchTimeout); 5014c8a3ffSVladimir Kotal int countLimit = 32; 5114c8a3ffSVladimir Kotal config.setCountLimit(countLimit); 5214c8a3ffSVladimir Kotal 5314c8a3ffSVladimir Kotal LdapFacade facade = new LdapFacade(config); 5414c8a3ffSVladimir Kotal SearchControls controls = facade.getSearchControls(); 5514c8a3ffSVladimir Kotal assertEquals(searchTimeout, controls.getTimeLimit()); 5614c8a3ffSVladimir Kotal assertEquals(countLimit, controls.getCountLimit()); 5714c8a3ffSVladimir Kotal } 5814c8a3ffSVladimir Kotal getSpyLdapServer(String name)59d0624dbbSVladimir Kotal private LdapServer getSpyLdapServer(String name) throws UnknownHostException { 602a43956eSVladimir Kotal return getSpyLdapServer(name, true); 612a43956eSVladimir Kotal } 622a43956eSVladimir Kotal getSpyLdapServer(String name, boolean working)632a43956eSVladimir Kotal private LdapServer getSpyLdapServer(String name, boolean working) throws UnknownHostException { 642a43956eSVladimir Kotal LdapServer server = new LdapServer(name); 652a43956eSVladimir Kotal LdapServer serverSpy = Mockito.spy(server); 66*bd651080SAdam Hornacek doReturn(new InetAddress[]{InetAddress.getLocalHost()}).when(serverSpy).getAddresses(any()); 67*bd651080SAdam Hornacek doReturn(working).when(serverSpy).isWorking(); 682a43956eSVladimir Kotal return serverSpy; 69d0624dbbSVladimir Kotal } 70d0624dbbSVladimir Kotal 7114c8a3ffSVladimir Kotal @Test testConnectTimeoutInheritance()72*bd651080SAdam Hornacek void testConnectTimeoutInheritance() throws UnknownHostException { 7314c8a3ffSVladimir Kotal Configuration config = new Configuration(); 74d0624dbbSVladimir Kotal 75d0624dbbSVladimir Kotal LdapServer[] servers = {getSpyLdapServer("ldap://foo.com"), getSpyLdapServer("ldap://bar.com")}; 76d0624dbbSVladimir Kotal config.setServers(Arrays.asList(servers)); 77d0624dbbSVladimir Kotal 78d0624dbbSVladimir Kotal int connectTimeoutValue = 42; 79d0624dbbSVladimir Kotal config.setConnectTimeout(connectTimeoutValue); 80d0624dbbSVladimir Kotal int readTimeoutValue = 24; 81d0624dbbSVladimir Kotal config.setReadTimeout(readTimeoutValue); 82d0624dbbSVladimir Kotal 8314c8a3ffSVladimir Kotal LdapFacade facade = new LdapFacade(config); 84d0624dbbSVladimir Kotal assertEquals(Collections.singleton(connectTimeoutValue), 85c6f0939bSAdam Hornacek facade.getServers().stream().map(LdapServer::getConnectTimeout).collect(Collectors.toSet())); 86d0624dbbSVladimir Kotal assertEquals(Collections.singleton(readTimeoutValue), 87c6f0939bSAdam Hornacek facade.getServers().stream().map(LdapServer::getReadTimeout).collect(Collectors.toSet())); 8814c8a3ffSVladimir Kotal } 8914c8a3ffSVladimir Kotal 9014c8a3ffSVladimir Kotal @Test testToStringNegative()91*bd651080SAdam Hornacek void testToStringNegative() throws UnknownHostException { 9214c8a3ffSVladimir Kotal Configuration config = new Configuration(); 93487fa86bSVladimir Kotal LdapServer server1 = new LdapServer("ldap://foo.com"); 94487fa86bSVladimir Kotal LdapServer serverSpy1 = Mockito.spy(server1); 95*bd651080SAdam Hornacek doReturn(new InetAddress[]{InetAddress.getLocalHost()}).when(serverSpy1).getAddresses(any()); 96*bd651080SAdam Hornacek doReturn(false).when(serverSpy1).isReachable(); 97487fa86bSVladimir Kotal 98487fa86bSVladimir Kotal config.setServers(Collections.singletonList(serverSpy1)); 9914c8a3ffSVladimir Kotal config.setSearchBase("dc=foo,dc=com"); 100487fa86bSVladimir Kotal int timeoutValue = 3; 10114c8a3ffSVladimir Kotal config.setConnectTimeout(timeoutValue); 10214c8a3ffSVladimir Kotal LdapFacade facade = new LdapFacade(config); 103cbd2aafbSVladimir Kotal assertEquals("{server=no active server, searchBase=dc=foo,dc=com}", 10414c8a3ffSVladimir Kotal facade.toString()); 10514c8a3ffSVladimir Kotal } 10614c8a3ffSVladimir Kotal 10714c8a3ffSVladimir Kotal @Test testToStringPositive()108*bd651080SAdam Hornacek void testToStringPositive() { 109487fa86bSVladimir Kotal Configuration config = new Configuration(); 110487fa86bSVladimir Kotal LdapServer server1 = new LdapServer("ldap://foo.com"); 111487fa86bSVladimir Kotal LdapServer serverSpy1 = Mockito.spy(server1); 112*bd651080SAdam Hornacek doReturn(true).when(serverSpy1).isWorking(); 113487fa86bSVladimir Kotal 114487fa86bSVladimir Kotal config.setServers(Collections.singletonList(serverSpy1)); 115487fa86bSVladimir Kotal config.setSearchBase("dc=foo,dc=com"); 116487fa86bSVladimir Kotal int timeoutValue = 3; 117487fa86bSVladimir Kotal config.setConnectTimeout(timeoutValue); 118487fa86bSVladimir Kotal LdapFacade facade = new LdapFacade(config); 119d0624dbbSVladimir Kotal assertEquals("{server=ldap://foo.com, connect timeout: 3, searchBase=dc=foo,dc=com}", 120487fa86bSVladimir Kotal facade.toString()); 121487fa86bSVladimir Kotal } 122487fa86bSVladimir Kotal 123487fa86bSVladimir Kotal @Test testPrepareServersNegative()124*bd651080SAdam Hornacek void testPrepareServersNegative() throws UnknownHostException { 12514c8a3ffSVladimir Kotal Configuration config = new Configuration(); 1262a43956eSVladimir Kotal config.setServers(Arrays.asList(getSpyLdapServer("ldap://foo.com", false), 1272a43956eSVladimir Kotal getSpyLdapServer("ldap://bar.com", true))); 12814c8a3ffSVladimir Kotal LdapFacade facade = new LdapFacade(config); 12914c8a3ffSVladimir Kotal assertFalse(facade.isConfigured()); 13014c8a3ffSVladimir Kotal } 1319f00baffSVladimir Kotal 1329f00baffSVladimir Kotal @Test testGetSearchDescription()133*bd651080SAdam Hornacek void testGetSearchDescription() { 1349f00baffSVladimir Kotal assertEquals("DN: foo, filter: bar, attributes: Bilbo,Frodo", 1359f00baffSVladimir Kotal LdapFacade.getSearchDescription("foo", "bar", new String[]{"Bilbo", "Frodo"})); 1369f00baffSVladimir Kotal assertEquals("DN: foo, filter: bar", 1379f00baffSVladimir Kotal LdapFacade.getSearchDescription("foo", "bar", null)); 1389f00baffSVladimir Kotal } 1392a43956eSVladimir Kotal 1402a43956eSVladimir Kotal @Test testPrepareServersCloseUnused()141*bd651080SAdam Hornacek void testPrepareServersCloseUnused() throws UnknownHostException { 1422a43956eSVladimir Kotal Configuration config = new Configuration(); 1432a43956eSVladimir Kotal 1442a43956eSVladimir Kotal LdapServer server1 = getSpyLdapServer("ldap://foo.com"); 1452a43956eSVladimir Kotal LdapServer server2 = getSpyLdapServer("ldap://bar.com"); 1462a43956eSVladimir Kotal LdapServer[] servers = {server1, server2}; 1472a43956eSVladimir Kotal config.setServers(Arrays.asList(servers)); 1482a43956eSVladimir Kotal 1492a43956eSVladimir Kotal LdapFacade facade = new LdapFacade(config); 1502a43956eSVladimir Kotal verify(server1, times(0)).close(); 1512a43956eSVladimir Kotal verify(server2).close(); 1522a43956eSVladimir Kotal } 15314c8a3ffSVladimir Kotal } 154