/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.search.elasticsearch.connection; import java.util.HashMap; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; /** * @author André de Oliveira */ public class ElasticsearchConnectionManagerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); resetMockConnections(); _elasticsearchConnectionManager = new ElasticsearchConnectionManager(); _elasticsearchConnectionManager.setEmbeddedElasticsearchConnection( _embeddedElasticsearchConnection); _elasticsearchConnectionManager.setRemoteElasticsearchConnection( _remoteElasticsearchConnection); } @Test public void testActivateMustNotOpenAnyConnection() { HashMap<String, Object> properties = new HashMap<>(); properties.put("operationMode", OperationMode.EMBEDDED.name()); _elasticsearchConnectionManager.activate(properties); verifyNeverCloseNeverConnect(_embeddedElasticsearchConnection); verifyNeverCloseNeverConnect(_remoteElasticsearchConnection); } @Test public void testActivateThenConnect() { HashMap<String, Object> properties = new HashMap<>(); properties.put("operationMode", OperationMode.EMBEDDED.name()); _elasticsearchConnectionManager.activate(properties); _elasticsearchConnectionManager.connect(); verifyConnectNeverClose(_embeddedElasticsearchConnection); verifyNeverCloseNeverConnect(_remoteElasticsearchConnection); } @Test public void testGetClient() { modify(OperationMode.EMBEDDED); _elasticsearchConnectionManager.getClient(); Mockito.verify(_embeddedElasticsearchConnection).getClient(); modify(OperationMode.REMOTE); _elasticsearchConnectionManager.getClient(); Mockito.verify(_remoteElasticsearchConnection).getClient(); } @Test public void testGetClientWhenOperationModeNotSet() { try { _elasticsearchConnectionManager.getClient(); Assert.fail(); } catch (ElasticsearchConnectionNotInitializedException ecnie) { } } @Test public void testSetModifiedOperationModeResetsConnection() { HashMap<String, Object> properties = new HashMap<>(); properties.put("operationMode", OperationMode.EMBEDDED.name()); _elasticsearchConnectionManager.activate(properties); resetMockConnections(); properties.put("operationMode", OperationMode.REMOTE.name()); _elasticsearchConnectionManager.modified(properties); verifyCloseNeverConnect(_embeddedElasticsearchConnection); verifyConnectNeverClose(_remoteElasticsearchConnection); } @Test public void testSetOperationModeToUnavailable() { _elasticsearchConnectionManager.unsetElasticsearchConnection( _remoteElasticsearchConnection); verifyCloseNeverConnect(_remoteElasticsearchConnection); verifyNeverCloseNeverConnect(_embeddedElasticsearchConnection); resetMockConnections(); try { modify(OperationMode.REMOTE); Assert.fail(); } catch (MissingOperationModeException mome) { String message = mome.getMessage(); Assert.assertTrue( message.contains(String.valueOf(OperationMode.REMOTE))); } verifyNeverCloseNeverConnect(_embeddedElasticsearchConnection); verifyNeverCloseNeverConnect(_remoteElasticsearchConnection); } @Test public void testSetSameOperationModeMustNotResetConnection() { modify(OperationMode.REMOTE); resetMockConnections(); modify(OperationMode.REMOTE); verifyNeverCloseNeverConnect(_embeddedElasticsearchConnection); verifyNeverCloseNeverConnect(_remoteElasticsearchConnection); } @Test public void testToggleOperationMode() { modify(OperationMode.EMBEDDED); verifyConnectNeverClose(_embeddedElasticsearchConnection); verifyNeverCloseNeverConnect(_remoteElasticsearchConnection); resetMockConnections(); modify(OperationMode.REMOTE); verifyCloseNeverConnect(_embeddedElasticsearchConnection); verifyConnectNeverClose(_remoteElasticsearchConnection); resetMockConnections(); modify(OperationMode.EMBEDDED); verifyCloseNeverConnect(_remoteElasticsearchConnection); verifyConnectNeverClose(_embeddedElasticsearchConnection); } @Test public void testUnableToCloseOldConnectionUseNewConnectionAnyway() { modify(OperationMode.EMBEDDED); resetMockConnections(); Mockito.doThrow( IllegalStateException.class ).when( _embeddedElasticsearchConnection ).close(); modify(OperationMode.REMOTE); Assert.assertSame( _remoteElasticsearchConnection, _elasticsearchConnectionManager.getElasticsearchConnection()); verifyCloseNeverConnect(_embeddedElasticsearchConnection); verifyConnectNeverClose(_remoteElasticsearchConnection); } @Test public void testUnableToOpenNewConnectionStayWithOldConnection() { modify(OperationMode.EMBEDDED); resetMockConnections(); Mockito.doThrow( IllegalStateException.class ).when( _remoteElasticsearchConnection ).connect(); try { modify(OperationMode.REMOTE); Assert.fail(); } catch (IllegalStateException ise) { } Assert.assertSame( _embeddedElasticsearchConnection, _elasticsearchConnectionManager.getElasticsearchConnection()); verifyConnectNeverClose(_remoteElasticsearchConnection); verifyNeverCloseNeverConnect(_embeddedElasticsearchConnection); } protected void modify(OperationMode operationMode) { _elasticsearchConnectionManager.modify(operationMode); } protected void resetMockConnections() { Mockito.reset( _embeddedElasticsearchConnection, _remoteElasticsearchConnection); Mockito.when( _embeddedElasticsearchConnection.getOperationMode() ).thenReturn( OperationMode.EMBEDDED ); Mockito.when( _remoteElasticsearchConnection.getOperationMode() ).thenReturn( OperationMode.REMOTE ); } protected void verifyCloseNeverConnect( ElasticsearchConnection elasticsearchConnection) { Mockito.verify( elasticsearchConnection ).close(); Mockito.verify( elasticsearchConnection, Mockito.never() ).connect(); } protected void verifyConnectNeverClose( ElasticsearchConnection elasticsearchConnection) { Mockito.verify( elasticsearchConnection, Mockito.never() ).close(); Mockito.verify( elasticsearchConnection ).connect(); } protected void verifyNeverCloseNeverConnect( ElasticsearchConnection elasticsearchConnection) { Mockito.verify( elasticsearchConnection, Mockito.never() ).close(); Mockito.verify( elasticsearchConnection, Mockito.never() ).connect(); } private ElasticsearchConnectionManager _elasticsearchConnectionManager; @Mock private ElasticsearchConnection _embeddedElasticsearchConnection; @Mock private ElasticsearchConnection _remoteElasticsearchConnection; }