package org.mockserver.maven;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.repository.RepositorySystem;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutionException;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
/**
* @author jamesdbloom
*/
public class MockServerRunForkedMojoTest {
public final String level = "LEVEL";
private final String jarWithDependenciesPath = new File("jarWithDependenciesPath.jar").getAbsolutePath();
private String javaBinaryPath = "java";
@Mock
protected RepositorySystem mockRepositorySystem;
@Mock
protected ArtifactResolver mockArtifactResolver;
@Mock
private InstanceHolder mockEmbeddedJettyHolder;
@Mock
private ProcessBuildFactory mockProcessBuildFactory;
@InjectMocks
private MockServerRunForkedMojo mockServerRunForkedMojo;
private ProcessBuilder processBuilder;
@Mock
private Artifact mockArtifact;
@Before
public void setupMocks() {
processBuilder = new ProcessBuilder("echo", "");
mockServerRunForkedMojo = new MockServerRunForkedMojo();
javaBinaryPath = mockServerRunForkedMojo.getJavaBin();
initMocks(this);
when(mockRepositorySystem.createArtifactWithClassifier("org.mock-server", "mockserver-netty", mockServerRunForkedMojo.getVersion(), "jar", "jar-with-dependencies")).thenReturn(mockArtifact);
when(mockArtifact.getFile()).thenReturn(new File(jarWithDependenciesPath));
mockServerRunForkedMojo.logLevel = level;
}
@Test
public void shouldRunMockServerAndProxyForkedBothPortsSpecified() throws MojoExecutionException, ExecutionException, InterruptedException {
// given
mockServerRunForkedMojo.serverPort = 1;
mockServerRunForkedMojo.proxyPort = 3;
mockServerRunForkedMojo.pipeLogToConsole = true;
when(mockProcessBuildFactory.create(anyListOf(String.class))).thenReturn(processBuilder);
// when
mockServerRunForkedMojo.execute();
// then
verify(mockRepositorySystem).createArtifactWithClassifier("org.mock-server", "mockserver-netty", mockServerRunForkedMojo.getVersion(), "jar", "jar-with-dependencies");
verify(mockProcessBuildFactory).create(Arrays.asList(
javaBinaryPath,
"-Dfile.encoding=UTF-8",
"-Dmockserver.logLevel=" + level,
"-cp", jarWithDependenciesPath, "org.mockserver.cli.Main", "-serverPort", "1", "-proxyPort", "3"
));
assertEquals(true, processBuilder.redirectErrorStream());
}
@Test
public void shouldRunMockServerAndProxyForkedOnlyPort() throws MojoExecutionException, ExecutionException, InterruptedException {
// given
mockServerRunForkedMojo.serverPort = 1;
mockServerRunForkedMojo.proxyPort = 3;
mockServerRunForkedMojo.pipeLogToConsole = true;
when(mockProcessBuildFactory.create(anyListOf(String.class))).thenReturn(processBuilder);
// when
mockServerRunForkedMojo.execute();
// then
verify(mockRepositorySystem).createArtifactWithClassifier("org.mock-server", "mockserver-netty", mockServerRunForkedMojo.getVersion(), "jar", "jar-with-dependencies");
verify(mockProcessBuildFactory).create(Arrays.asList(
javaBinaryPath,
"-Dfile.encoding=UTF-8",
"-Dmockserver.logLevel=" + level,
"-cp", jarWithDependenciesPath, "org.mockserver.cli.Main", "-serverPort", "1", "-proxyPort", "3"
));
assertEquals(true, processBuilder.redirectErrorStream());
}
@Test
public void shouldRunMockServerOnlyForkedBothPortsSpecified() throws MojoExecutionException, ExecutionException, InterruptedException {
// given
ExampleInitializationClass.mockServerClient = null;
mockServerRunForkedMojo.serverPort = 1;
mockServerRunForkedMojo.pipeLogToConsole = true;
mockServerRunForkedMojo.initializationClass = "org.mockserver.maven.ExampleInitializationClass";
String classLocation = "org/mockserver/maven/ExampleInitializationClass.class";
mockServerRunForkedMojo.compileClasspath = Arrays.asList(ExampleInitializationClass.class.getClassLoader().getResource(classLocation).getFile().replaceAll(classLocation, ""));
mockServerRunForkedMojo.testClasspath = Arrays.asList();
when(mockProcessBuildFactory.create(anyListOf(String.class))).thenReturn(processBuilder);
// when
mockServerRunForkedMojo.execute();
// then
verify(mockProcessBuildFactory).create(Arrays.asList(
javaBinaryPath,
"-Dfile.encoding=UTF-8",
"-Dmockserver.logLevel=" + level,
"-cp", jarWithDependenciesPath, "org.mockserver.cli.Main", "-serverPort", "1"
));
assertEquals(true, processBuilder.redirectErrorStream());
assertNotNull(ExampleInitializationClass.mockServerClient);
}
@Test
public void shouldRunMockServerOnlyForkedOnlyPort() throws MojoExecutionException, ExecutionException, InterruptedException {
// given
ExampleInitializationClass.mockServerClient = null;
mockServerRunForkedMojo.serverPort = 1;
mockServerRunForkedMojo.pipeLogToConsole = true;
mockServerRunForkedMojo.initializationClass = "org.mockserver.maven.ExampleInitializationClass";
String classLocation = "org/mockserver/maven/ExampleInitializationClass.class";
mockServerRunForkedMojo.compileClasspath = Arrays.asList(ExampleInitializationClass.class.getClassLoader().getResource(classLocation).getFile().replaceAll(classLocation, ""));
mockServerRunForkedMojo.testClasspath = Arrays.asList();
when(mockProcessBuildFactory.create(anyListOf(String.class))).thenReturn(processBuilder);
// when
mockServerRunForkedMojo.execute();
// then
verify(mockRepositorySystem).createArtifactWithClassifier("org.mock-server", "mockserver-netty", mockServerRunForkedMojo.getVersion(), "jar", "jar-with-dependencies");
verify(mockProcessBuildFactory).create(Arrays.asList(
javaBinaryPath,
"-Dfile.encoding=UTF-8",
"-Dmockserver.logLevel=" + level,
"-cp", jarWithDependenciesPath, "org.mockserver.cli.Main", "-serverPort", "1"
));
assertEquals(true, processBuilder.redirectErrorStream());
assertNotNull(ExampleInitializationClass.mockServerClient);
}
@Test
public void shouldRunProxyOnlyForkedBothPortsSpecified() throws MojoExecutionException, ExecutionException, InterruptedException {
// given
ExampleInitializationClass.mockServerClient = null;
mockServerRunForkedMojo.proxyPort = 1;
mockServerRunForkedMojo.pipeLogToConsole = true;
mockServerRunForkedMojo.initializationClass = "org.mockserver.maven.ExampleInitializationClass";
when(mockProcessBuildFactory.create(anyListOf(String.class))).thenReturn(processBuilder);
// when
mockServerRunForkedMojo.execute();
// then
verify(mockRepositorySystem).createArtifactWithClassifier("org.mock-server", "mockserver-netty", mockServerRunForkedMojo.getVersion(), "jar", "jar-with-dependencies");
verify(mockProcessBuildFactory).create(Arrays.asList(
javaBinaryPath,
"-Dfile.encoding=UTF-8",
"-Dmockserver.logLevel=" + level,
"-cp", jarWithDependenciesPath, "org.mockserver.cli.Main", "-proxyPort", "1"
));
assertEquals(true, processBuilder.redirectErrorStream());
assertNull(ExampleInitializationClass.mockServerClient);
}
@Test
public void shouldRunProxyOnlyForkedOnlyPort() throws MojoExecutionException, ExecutionException, InterruptedException {
// given
mockServerRunForkedMojo.proxyPort = 1;
mockServerRunForkedMojo.pipeLogToConsole = true;
when(mockProcessBuildFactory.create(anyListOf(String.class))).thenReturn(processBuilder);
// when
mockServerRunForkedMojo.execute();
// then
verify(mockRepositorySystem).createArtifactWithClassifier("org.mock-server", "mockserver-netty", mockServerRunForkedMojo.getVersion(), "jar", "jar-with-dependencies");
verify(mockProcessBuildFactory).create(Arrays.asList(
javaBinaryPath,
"-Dfile.encoding=UTF-8",
"-Dmockserver.logLevel=" + level,
"-cp", jarWithDependenciesPath, "org.mockserver.cli.Main", "-proxyPort", "1"
));
assertEquals(true, processBuilder.redirectErrorStream());
}
@Test
public void shouldHandleProcessException() throws IOException {
// given
when(mockProcessBuildFactory.create(anyListOf(String.class))).thenReturn(new ProcessBuilder("TEST FAIL"));
// when
try {
mockServerRunForkedMojo.execute();
} catch (Throwable t) {
// then
fail();
}
}
@Test
public void shouldRunMockServerForkedAndNotPipeToConsole() throws MojoExecutionException, ExecutionException, InterruptedException {
// given
mockServerRunForkedMojo.pipeLogToConsole = false;
when(mockProcessBuildFactory.create(anyListOf(String.class))).thenReturn(processBuilder);
// when
mockServerRunForkedMojo.execute();
// then
verify(mockRepositorySystem).createArtifactWithClassifier("org.mock-server", "mockserver-netty", mockServerRunForkedMojo.getVersion(), "jar", "jar-with-dependencies");
assertEquals(false, processBuilder.redirectErrorStream());
}
@Test
public void shouldHandleIncorrectInitializationClassName() throws MojoExecutionException {
// given
ExampleInitializationClass.mockServerClient = null;
mockServerRunForkedMojo.serverPort = 1;
mockServerRunForkedMojo.pipeLogToConsole = true;
mockServerRunForkedMojo.initializationClass = "org.mockserver.maven.InvalidClassName";
when(mockProcessBuildFactory.create(anyListOf(String.class))).thenReturn(processBuilder);
// when
mockServerRunForkedMojo.execute();
assertNull(ExampleInitializationClass.mockServerClient);
}
@Test
public void shouldSkipStoppingMockServer() throws MojoExecutionException {
// given
mockServerRunForkedMojo.skip = true;
// when
mockServerRunForkedMojo.execute();
// then
verify(mockProcessBuildFactory, times(0)).create(anyListOf(String.class));
}
}