/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.testutils; import static org.junit.Assert.assertEquals; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import de.rcenvironment.core.communication.connection.api.ConnectionSetup; import de.rcenvironment.core.communication.connection.api.ConnectionSetupListener; import de.rcenvironment.core.communication.connection.api.ConnectionSetupListenerAdapter; import de.rcenvironment.core.communication.connection.api.ConnectionSetupState; /** * A simple {@link ConnectionSetupListener} for unit/integration tests. It stores all state changes that match the given * {@link ConnectionSetup} in a queue, which can then be queried for the expected sequence. * * @author Robert Mischke */ public class ConnectionSetupStateTracker extends ConnectionSetupListenerAdapter { private final ConnectionSetup relevantSetup; private BlockingQueue<ConnectionSetupState> queue = new LinkedBlockingDeque<ConnectionSetupState>(); public ConnectionSetupStateTracker(ConnectionSetup cs) { this.relevantSetup = cs; } @Override public void onStateChanged(ConnectionSetup setup, ConnectionSetupState oldState, ConnectionSetupState newState) { if (setup != relevantSetup) { return; } queue.add(newState); } /** * Verifies the next received state change, with a timeout. * * @param expectedState the next state change that should have been received * @param timeoutMsec the maximum timeout to wait for the state change * @throws InterruptedException on interruption * @throws AssertionError on a state expectation failure * @throws TimeoutException on a timeout */ public void awaitAndExpect(ConnectionSetupState expectedState, int timeoutMsec) throws InterruptedException, AssertionError, TimeoutException { ConnectionSetupState result = queue.poll(timeoutMsec, TimeUnit.MILLISECONDS); if (result == null) { throw new TimeoutException("Queue returned 'null'"); } assertEquals(relevantSetup.getDisplayName(), expectedState, result); } }