xref: /OpenGrok/plugins/src/test/java/opengrok/auth/plugin/ldap/LdapFacadeTest.java (revision bd65108074ffc6445f3952220ccd887689508578)
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