/** * Copyright (c) 2009 - 2012 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package org.candlepin.controller; import org.candlepin.audit.QpidConnection; import org.candlepin.audit.QpidConnection.STATUS; import org.candlepin.audit.QpidQmf; import org.candlepin.audit.QpidQmf.QpidStatus; import org.candlepin.cache.CandlepinCache; import org.candlepin.cache.StatusCache; import org.candlepin.config.CandlepinCommonTestConfig; import org.candlepin.model.CandlepinModeChange; import org.candlepin.model.CandlepinModeChange.Mode; import org.candlepin.model.CandlepinModeChange.Reason; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import java.util.Date; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @RunWith(MockitoJUnitRunner.class) public class SuspendModeTransitionerTest { private SuspendModeTransitioner transitioner; @Mock private ModeManager modeManager; @Mock private QpidQmf qmf; @Mock private QpidConnection qpidConnection; @Mock private ScheduledExecutorService execService; private CandlepinModeChange startupModeChange; private CandlepinModeChange downModeChange; private CandlepinModeChange normalModeChange; @Mock private CandlepinCache candlepinCache; @Mock private StatusCache cache; @Before public void setUp() { Mockito.when(candlepinCache.getStatusCache()) .thenReturn(cache); CandlepinCommonTestConfig testConfig = new CandlepinCommonTestConfig(); transitioner = new SuspendModeTransitioner(testConfig, execService, candlepinCache); transitioner.setModeManager(modeManager); transitioner.setQmf(qmf); transitioner.setQpidConnection(qpidConnection); startupModeChange = new CandlepinModeChange(new Date(), Mode.NORMAL, Reason.STARTUP); downModeChange = new CandlepinModeChange(new Date(), Mode.SUSPEND, Reason.QPID_DOWN); normalModeChange = new CandlepinModeChange(new Date(), Mode.NORMAL, Reason.QPID_UP); } @Test public void normalConnected() { Mockito.when(qmf.getStatus()).thenReturn(QpidStatus.CONNECTED); Mockito.when(modeManager.getLastCandlepinModeChange()) .thenReturn(startupModeChange); transitioner.transitionAppropriately(); Mockito.verify(qmf, Mockito.times(1)).getStatus(); Mockito.verify(modeManager, Mockito.times(1)).getLastCandlepinModeChange(); Mockito.verifyNoMoreInteractions(execService, modeManager, qmf); } @Test public void stillDisconnected() { Mockito.when(qmf.getStatus()).thenReturn(QpidStatus.DOWN); Mockito.when(modeManager.getLastCandlepinModeChange()) .thenReturn(downModeChange); transitioner.transitionAppropriately(); Mockito.verify(qpidConnection, Mockito.times(1)) .setConnectionStatus(STATUS.JMS_OBJECTS_STALE); Mockito.verify(qmf, Mockito.times(1)).getStatus(); Mockito.verify(modeManager, Mockito.times(1)).getLastCandlepinModeChange(); Mockito.verifyNoMoreInteractions(execService, qpidConnection, modeManager, qmf); } @Test public void transitionFromDownToConnected() throws Exception { Mockito.when(qmf.getStatus()).thenReturn(QpidStatus.CONNECTED); Mockito.when(modeManager.getLastCandlepinModeChange()) .thenReturn(downModeChange); transitioner.transitionAppropriately(); Mockito.verify(qmf, Mockito.times(1)).getStatus(); Mockito.verify(modeManager, Mockito.times(1)).getLastCandlepinModeChange(); Mockito.verify(modeManager, Mockito.times(1)).enterMode(Mode.NORMAL, Reason.QPID_UP); Mockito.verifyNoMoreInteractions(execService, qpidConnection, qmf, modeManager); } @Test public void transitionFromConnectedToDown() throws Exception { Mockito.when(qmf.getStatus()).thenReturn(QpidStatus.DOWN); Mockito.when(modeManager.getLastCandlepinModeChange()) .thenReturn(normalModeChange); transitioner.transitionAppropriately(); Mockito.verify(qpidConnection, Mockito.times(1)) .setConnectionStatus(STATUS.JMS_OBJECTS_STALE); Mockito.verify(qmf, Mockito.times(1)).getStatus(); Mockito.verify(modeManager, Mockito.times(1)).getLastCandlepinModeChange(); Mockito.verify(modeManager, Mockito.times(1)) .enterMode(Mode.SUSPEND, Reason.QPID_DOWN); Mockito.verifyNoMoreInteractions(execService, qpidConnection, qmf, modeManager); } @Test public void transitionFromConnectedToFlowStopped() throws Exception { Mockito.when(qmf.getStatus()).thenReturn(QpidStatus.FLOW_STOPPED); Mockito.when(modeManager.getLastCandlepinModeChange()) .thenReturn(normalModeChange); transitioner.transitionAppropriately(); Mockito.verify(qpidConnection, Mockito.times(1)) .setConnectionStatus(STATUS.JMS_OBJECTS_STALE); Mockito.verify(qmf, Mockito.times(1)).getStatus(); Mockito.verify(modeManager, Mockito.times(1)).getLastCandlepinModeChange(); Mockito.verify(modeManager, Mockito.times(1)) .enterMode(Mode.SUSPEND, Reason.QPID_FLOW_STOPPED); Mockito.verifyNoMoreInteractions(execService, qpidConnection, qmf, modeManager); } @Test public void backOff() throws Exception { Mockito.when(qmf.getStatus()) .thenReturn(QpidStatus.CONNECTED) .thenReturn(QpidStatus.DOWN) .thenReturn(QpidStatus.DOWN) .thenReturn(QpidStatus.CONNECTED); Mockito.when(modeManager.getLastCandlepinModeChange()) .thenReturn(downModeChange) .thenReturn(normalModeChange) .thenReturn(downModeChange) .thenReturn(downModeChange); transitioner.run(); Mockito.verify(execService, Mockito.times(1)) .schedule(transitioner, 10L, TimeUnit.SECONDS); Mockito.verifyNoMoreInteractions(execService); Mockito.reset(execService); transitioner.run(); Mockito.verify(execService, Mockito.times(1)) .schedule(transitioner, 10L, TimeUnit.SECONDS); Mockito.verifyNoMoreInteractions(execService); Mockito.reset(execService); transitioner.run(); Mockito.verify(execService, Mockito.times(1)) .schedule(transitioner, 20L, TimeUnit.SECONDS); Mockito.verifyNoMoreInteractions(execService); Mockito.reset(execService); transitioner.run(); Mockito.verify(execService, Mockito.times(1)) .schedule(transitioner, 10L, TimeUnit.SECONDS); Mockito.verifyNoMoreInteractions(execService); } @Test public void backOffMaximum() throws Exception { Mockito.when(qmf.getStatus()) .thenReturn(QpidStatus.CONNECTED) .thenReturn(QpidStatus.DOWN); Mockito.when(modeManager.getLastCandlepinModeChange()) .thenReturn(downModeChange) .thenReturn(normalModeChange) .thenReturn(downModeChange); for (int i = 0; i < 10; i++) { transitioner.run(); } Mockito.reset(execService); transitioner.run(); Mockito.verify(execService, Mockito.times(1)) .schedule(transitioner, 100L, TimeUnit.SECONDS); Mockito.verifyNoMoreInteractions(execService); } }