package org.mockserver.maven; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockserver.client.proxy.ProxyClient; import org.mockserver.client.server.MockServerClient; import org.mockserver.mockserver.MockServer; import org.mockserver.mockserver.MockServerBuilder; import org.mockserver.proxy.Proxy; import org.mockserver.proxy.ProxyBuilder; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.AnyOf.anyOf; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.Is.isA; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.*; import static org.mockito.MockitoAnnotations.initMocks; /** * @author jamesdbloom */ public class InstanceHolderTest { @Mock private ProxyBuilder mockProxyBuilder; @Mock private MockServerBuilder mockMockServerBuilder; @Mock private Proxy mockProxy; @Mock private MockServer mockMockServer; @Mock private MockServerClient mockMockServerClient; @Mock private ProxyClient mockProxyClient; @InjectMocks private InstanceHolder instanceHolder; @Before public void setupMock() { instanceHolder = new InstanceHolder(); initMocks(this); when(mockMockServerBuilder.withHTTPPort(anyInt())).thenReturn(mockMockServerBuilder); when(mockProxyBuilder.withLocalPort(anyInt())).thenReturn(mockProxyBuilder); when(mockProxy.isRunning()).thenReturn(false); when(mockMockServer.isRunning()).thenReturn(false); } @After public void shutdownProxyAndMockServer() { instanceHolder.stop(); InstanceHolder.proxyClients.clear(); InstanceHolder.mockServerClients.clear(); } @Test public void shouldStartServerAndProxyOnBothPorts() { // when instanceHolder.start(1, 3, null); // then verify(mockMockServerBuilder).withHTTPPort(1); verify(mockProxyBuilder).withLocalPort(3); } @Test public void shouldStartOnlyServerOnBothPorts() { // when instanceHolder.start(1, -1, null); // then verify(mockMockServerBuilder).withHTTPPort(1); verifyNoMoreInteractions(mockProxyBuilder); } @Test public void shouldStartOnlyServerOnHttpPort() { // when ExampleInitializationClass.mockServerClient = null; instanceHolder.start(1, -1, new ExampleInitializationClass()); // then verify(mockMockServerBuilder).withHTTPPort(1); verifyNoMoreInteractions(mockProxyBuilder); assertNotNull(ExampleInitializationClass.mockServerClient); } @Test public void shouldStartOnlyProxyOnBothPorts() { // when ExampleInitializationClass.mockServerClient = null; instanceHolder.start(-1, 3, new ExampleInitializationClass()); // then verifyNoMoreInteractions(mockMockServerBuilder); verify(mockProxyBuilder).withLocalPort(3); assertNull(ExampleInitializationClass.mockServerClient); } @Test public void shouldRunInitializationClass() { // given ExampleInitializationClass.mockServerClient = null; // when instanceHolder.start(1, -1, new ExampleInitializationClass()); // then assertNotNull(ExampleInitializationClass.mockServerClient); } @Test public void shouldNotStartServerOrProxy() { // when ExampleInitializationClass.mockServerClient = null; instanceHolder.start(-1, -1, new ExampleInitializationClass()); // then verifyNoMoreInteractions(mockMockServerBuilder); verifyNoMoreInteractions(mockProxyBuilder); assertNull(ExampleInitializationClass.mockServerClient); } @Test(expected = IllegalStateException.class) public void shouldThrowExceptionIfServerRunning() { // given when(mockMockServer.isRunning()).thenReturn(true); // when instanceHolder.start(1, 3, null); } @Test(expected = IllegalStateException.class) public void shouldThrowExceptionIfProxyRunning() { // given when(mockProxy.isRunning()).thenReturn(true); // when instanceHolder.start(1, 3, null); } @Test public void shouldStopMockServer() { // given when(mockMockServer.isRunning()).thenReturn(true); when(mockProxy.isRunning()).thenReturn(true); // when instanceHolder.stop(); // then verify(mockMockServer).stop(); verify(mockProxy).stop(); } @Test public void shouldStopMockServerAndProxyRemotely() { // given InstanceHolder.mockServerClients.put(1, mockMockServerClient); InstanceHolder.proxyClients.put(2, mockProxyClient); // when instanceHolder.stop(1, 2, false); // then verify(mockMockServerClient).stop(false); verify(mockProxyClient).stop(false); // and - no new clients added assertThat("mockServerClients.size", InstanceHolder.mockServerClients.size(), is(1)); assertThat("proxyClients.size", InstanceHolder.proxyClients.size(), is(1)); } @Test public void shouldStopMockServerAndProxyRemotelyAndIgnoreErrors() { // given InstanceHolder.mockServerClients.put(1, mockMockServerClient); InstanceHolder.proxyClients.put(2, mockProxyClient); // when instanceHolder.stop(1, 2, true); // then verify(mockMockServerClient).stop(true); verify(mockProxyClient).stop(true); // and - no new clients added assertThat("mockServerClients.size", InstanceHolder.mockServerClients.size(), is(1)); assertThat("proxyClients.size", InstanceHolder.proxyClients.size(), is(1)); } @Test public void shouldStopMockServerOnlyRemotely() { // given InstanceHolder.mockServerClients.put(1, mockMockServerClient); InstanceHolder.proxyClients.put(2, mockProxyClient); // when instanceHolder.stop(1, -1, false); // then verify(mockMockServerClient).stop(false); verify(mockProxyClient, times(0)).stop(anyBoolean()); // and - no new clients added assertThat("mockServerClients.size", InstanceHolder.mockServerClients.size(), is(1)); assertThat("proxyClients.size", InstanceHolder.proxyClients.size(), is(1)); } @Test public void shouldStopProxyOnlyRemotely() { // given InstanceHolder.mockServerClients.put(1, mockMockServerClient); InstanceHolder.proxyClients.put(2, mockProxyClient); // when instanceHolder.stop(-1, 2, false); // then verify(mockMockServerClient, times(0)).stop(anyBoolean()); verify(mockProxyClient).stop(false); // and - no new clients added assertThat("mockServerClients.size", InstanceHolder.mockServerClients.size(), is(1)); assertThat("proxyClients.size", InstanceHolder.proxyClients.size(), is(1)); } @Test public void shouldStopSecureProxyOnlyRemotely() { // given InstanceHolder.mockServerClients.put(1, mockMockServerClient); InstanceHolder.proxyClients.put(2, mockProxyClient); // when instanceHolder.stop(-1, -1, false); // then verify(mockMockServerClient, times(0)).stop(anyBoolean()); verify(mockProxyClient, times(0)).stop(anyBoolean()); // and - no new clients added assertThat("mockServerClients.size", InstanceHolder.mockServerClients.size(), is(1)); assertThat("proxyClients.size", InstanceHolder.proxyClients.size(), is(1)); } @Test public void shouldStopMockServerAndProxyWhenNoClientExist() { // when instanceHolder.stop(1, 2, false); // then assertThat(InstanceHolder.mockServerClients.get(1), isA(MockServerClient.class)); assertThat(InstanceHolder.proxyClients.get(2), isA(ProxyClient.class)); } }