/*
* Copyright 2017 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.rf.ide.core.execution.server;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.Test;
import org.rf.ide.core.execution.RobotAgentEventListener.RobotAgentEventsListenerException;
import org.rf.ide.core.execution.TestsMode;
import org.rf.ide.core.execution.server.response.ServerResponse.ResponseException;
import org.rf.ide.core.execution.server.response.StartExecution;
public class AgentServerTestsStarterTest {
@Test
public void agentServerStarterNeverSendsStartResponseToClient_itIsNotAllowedAndInterrupted() throws Exception {
final AtomicBoolean interruptedCaught = new AtomicBoolean(false);
final AgentClient client = mock(AgentClient.class);
final AgentServerTestsStarter starter = spy(new AgentServerTestsStarter(TestsMode.RUN));
starter.setClient(client);
final Thread serverThread = new Thread(() -> {
try {
starter.handleAgentIsReadyToStart();
} catch (final RobotAgentEventsListenerException e) {
interruptedCaught.set(true);
}
});
serverThread.start();
// wait a while, so that starter will acquire semaphore
Thread.sleep(300);
serverThread.interrupt();
serverThread.join();
assertThat(interruptedCaught.get()).isTrue();
verify(starter).handleAgentIsReadyToStart();
verifyZeroInteractions(client);
}
@Test
public void exceptionIsThrown_whenAgentServerHasProblemCreatingResponse() throws Exception {
final AtomicBoolean responseExceptionCaught = new AtomicBoolean(false);
final AgentClient client = mock(AgentClient.class);
doThrow(ResponseException.class).when(client).send(any(StartExecution.class));
final AgentServerTestsStarter starter = spy(new AgentServerTestsStarter(TestsMode.RUN));
starter.setClient(client);
final Thread serverThread = new Thread(() -> {
try {
starter.handleAgentIsReadyToStart();
} catch (final RobotAgentEventsListenerException e) {
responseExceptionCaught.set(true);
}
});
serverThread.start();
starter.allowClientTestsStart();
serverThread.join();
assertThat(responseExceptionCaught.get()).isTrue();
}
@Test
public void exceptionIsThrown_whenAgentServerHasProblemSendingResponse() throws Exception {
final AtomicBoolean responseExceptionCaught = new AtomicBoolean(false);
final AgentClient client = mock(AgentClient.class);
doThrow(IOException.class).when(client).send(any(StartExecution.class));
final AgentServerTestsStarter starter = spy(new AgentServerTestsStarter(TestsMode.RUN));
starter.setClient(client);
final Thread serverThread = new Thread(() -> {
try {
starter.handleAgentIsReadyToStart();
} catch (final RobotAgentEventsListenerException e) {
responseExceptionCaught.set(true);
}
});
serverThread.start();
starter.allowClientTestsStart();
serverThread.join();
assertThat(responseExceptionCaught.get()).isTrue();
}
@Test
public void agentServerStarterSendsStartResponseToClient_whenItIsAllowedToStartTests() throws Exception {
final AgentClient client = mock(AgentClient.class);
final AgentServerTestsStarter starter = spy(new AgentServerTestsStarter(TestsMode.RUN));
starter.setClient(client);
final Thread serverThread = new Thread(() -> starter.handleAgentIsReadyToStart());
serverThread.start();
starter.allowClientTestsStart();
serverThread.join();
verify(client).send(any(StartExecution.class));
}
}