/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.communication.testutils;
import de.rcenvironment.core.communication.channel.MessageChannelLifecycleListener;
import de.rcenvironment.core.communication.channel.MessageChannelTrafficListener;
import de.rcenvironment.core.communication.model.NetworkContactPoint;
import de.rcenvironment.core.communication.transport.spi.NetworkTransportProvider;
/**
* Interface for operations on virtual instances/nodes that can be used as batch operations as well, in the sense that a single method call
* can affect any number of nodes.
*
* @see VirtualInstance
* @see VirtualInstanceGroup
*
* @author Robert Mischke
*/
public interface CommonVirtualInstanceControl {
/**
* Sets the given target state for all nodes. Setting a target state causes the receiving instance to modify its state so that it will
* eventually (and usually, asynchronously) reach the given state, unless this is prevented by an internal error.
*
* In the current {@link VirtualInstance} and {@link VirtualInstanceGroup} implementations, calling this method with "STARTED" may cause
* receivers to enter the "STARTING" state, and calling it with "STOPPED" may cause them to enter the "STOPPING" state.
*
* @param state the target that should be reached
* @throws InterruptedException on interruption while waiting for a required lock/monitor
*
*/
void setTargetState(VirtualInstanceState state) throws InterruptedException;
/**
* Waits until all nodes have reached a "stable" state, in the sense that they will not change their state without further method calls.
*
* In the current {@link VirtualInstance} and {@link VirtualInstanceGroup} implementations, the INITIAL, STARTED and STOPPED states are
* considered stable; STARTING and STOPPING are considered unstable.
*
* @throws InterruptedException on interruption while waiting for the target state
*/
void waitForStateChangesToFinish() throws InterruptedException;
/**
* Convenience method; equivalent to "setTargetState(STARTED); waitForStateChangesToFinish()".
*
* @throws InterruptedException on interruption while waiting for the target state
*/
void start() throws InterruptedException;
/**
* Convenience method; equivalent to "setTargetState(SIMULATED_CRASHING); waitForStateChangesToFinish()".
*
* @throws InterruptedException on interruption while waiting for the target state
*/
void simulateCrash() throws InterruptedException;
/**
* Convenience method; equivalent to "getService(MessageChannelService.class).overrideProtocolVersion(...)".
*
* @param version the new protocol version string to use
*/
void simulateCustomProtocolVersion(String version);
/**
* Convenience method; equivalent to "setTargetState(STOPPED); waitForStateChangesToFinish()".
*
* @throws InterruptedException on interruption while waiting for the target state
*/
void shutDown() throws InterruptedException;
/**
* Registers the given network transport for all nodes.
*
* @param provider the new network transport provider
*/
void registerNetworkTransportProvider(NetworkTransportProvider provider);
/**
* Registers a {@link MessageChannelLifecycleListener}.
*
* @param listener the new listener
*/
void addNetworkConnectionListener(MessageChannelLifecycleListener listener);
/**
* Registers a {@link MessageChannelTrafficListener}.
*
* @param listener the new listener
*/
void addNetworkTrafficListener(MessageChannelTrafficListener listener);
/**
* Registers the given network contact point as an initial peer for all nodes. Initial peers are contacted on startup, and possibly
* later during refresh operations.
*
* @param contactPoint the contact point to register
*/
void addInitialNetworkPeer(NetworkContactPoint contactPoint);
}