/** * 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.internal.cluster; import com.liferay.portal.kernel.cluster.ClusterEvent; import com.liferay.portal.kernel.test.CaptureHandler; import com.liferay.portal.kernel.test.JDKLoggerTestUtil; import com.liferay.portal.kernel.test.util.RandomTestUtil; import java.util.List; import java.util.logging.Level; import java.util.logging.LogRecord; 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 ReplicasClusterListenerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); setEmbeddedCluster(true); setMasterExecutor(true); Mockito.when( _replicasClusterContext.getClusterSize() ).thenReturn( _REPLICAS + 1 ); Mockito.when( _replicasClusterContext.getReplicasManager() ).thenReturn( _replicasManager ); Mockito.when( _replicasClusterContext.getTargetIndexNames() ).thenReturn( _INDICES ); _replicasClusterListener = new ReplicasClusterListener( _replicasClusterContext); } @Test public void testAHappyDay() { processClusterEvent(); assertReplicasChanged(); } @Test public void testLiferayClusterReportsEmpty() { Mockito.when( _replicasClusterContext.getClusterSize() ).thenReturn( 0 ); processClusterEvent(); Mockito.verify( _replicasManager ).updateNumberOfReplicas( 0, _INDICES ); } @Test public void testMasterTokenAcquired() { masterTokenAcquired(); assertReplicasChanged(); } @Test public void testMasterTokenReleased() { masterTokenReleased(); assertReplicasUnchanged(); } @Test public void testNonMasterLiferayNodeDoesNothing() { setMasterExecutor(false); processClusterEvent(); assertReplicasUnchanged(); } @Test public void testRemoteElasticsearchClusterIsLeftAlone() { setEmbeddedCluster(false); processClusterEvent(); assertReplicasUnchanged(); } @Test public void testResilientToUpdateFailures() { Throwable throwable = new RuntimeException(); Mockito.doThrow( throwable ).when( _replicasManager ).updateNumberOfReplicas( Mockito.anyInt(), (String[])Mockito.anyVararg() ); try (CaptureHandler captureHandler = JDKLoggerTestUtil.configureJDKLogger( ReplicasClusterListener.class.getName(), Level.WARNING)) { masterTokenAcquired(); List<LogRecord> logRecords = captureHandler.getLogRecords(); Assert.assertEquals(logRecords.toString(), 1, logRecords.size()); LogRecord logRecord = logRecords.get(0); Assert.assertEquals( "Unable to update number of replicas", logRecord.getMessage()); Assert.assertSame(throwable, logRecord.getThrown()); } } protected void assertReplicasChanged() { Mockito.verify( _replicasManager ).updateNumberOfReplicas( _REPLICAS, _INDICES ); } protected void assertReplicasUnchanged() { Mockito.verify( _replicasManager, Mockito.never() ).updateNumberOfReplicas( Mockito.anyInt(), (String[])Mockito.anyVararg() ); } protected void masterTokenAcquired() { _replicasClusterListener.masterTokenAcquired(); } protected void masterTokenReleased() { _replicasClusterListener.masterTokenReleased(); } protected void processClusterEvent() { _replicasClusterListener.processClusterEvent(ClusterEvent.join()); } protected void setEmbeddedCluster(boolean value) { Mockito.when( _replicasClusterContext.isEmbeddedOperationMode() ).thenReturn( value ); } protected void setMasterExecutor(boolean value) { Mockito.when( _replicasClusterContext.isMaster() ).thenReturn( value ); } private static final String[] _INDICES = new String[] { RandomTestUtil.randomString(), RandomTestUtil.randomString() }; private static final int _REPLICAS = RandomTestUtil.randomInt() - 1; @Mock private ReplicasClusterContext _replicasClusterContext; private ReplicasClusterListener _replicasClusterListener; @Mock private ReplicasManager _replicasManager; }