package com.uber.jenkins.phabricator.uberalls; import com.uber.jenkins.phabricator.coverage.CodeCoverageMetrics; import com.uber.jenkins.phabricator.utils.TestUtils; import net.sf.json.JSONObject; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.HttpStatus; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpResponseException; import org.apache.http.localserver.LocalTestServer; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.net.URISyntaxException; import static org.junit.Assert.*; import static org.mockito.Mockito.*; public class UberallsClientTest { private LocalTestServer server; private UberallsClient client; @Before public void setUp() throws Exception { server = new LocalTestServer(null, null); server.start(); client = getDefaultClient(); } @After public void tearDown() throws Exception { server.stop(); } @Test public void testGetCoverageNotFound() { assertNull(client.getCoverage(TestUtils.TEST_SHA)); } @Test public void testGetCoverageFound() { server.register("/*", TestUtils.makeHttpHandler(HttpStatus.SC_OK, "{}")); String coverage = client.getCoverage(TestUtils.TEST_SHA); assertEquals("{}", coverage); } @Test public void testGetCoverageInternalError() { server.register("/*", TestUtils.makeHttpHandler(HttpStatus.SC_INTERNAL_SERVER_ERROR, "")); assertNull(client.getCoverage(TestUtils.TEST_SHA)); } @Test public void testGetParentCoverageNoBackend() { assertNull(client.getParentCoverage(TestUtils.TEST_SHA)); } @Test public void testGetParentCoverageNullSHA() { assertNull(client.getParentCoverage(null)); } @Test public void testGetParentCoverageNull() { server.register("/*", TestUtils.makeHttpHandler(HttpStatus.SC_OK, "null")); assertNull(client.getParentCoverage(TestUtils.TEST_SHA)); } @Test public void testGetCoverageMissingKey() { server.register("/*", TestUtils.makeHttpHandler(HttpStatus.SC_OK, "{}")); assertNull(client.getParentCoverage(TestUtils.TEST_SHA)); } @Test public void testGetCoverageWorkingBackend() throws IOException { JSONObject validJSON = TestUtils.getJSONFromFile(getClass(), "validCoverage"); server.register("/*", TestUtils.makeHttpHandler(HttpStatus.SC_OK, validJSON.toString())); CodeCoverageMetrics metrics = client.getParentCoverage(TestUtils.TEST_SHA); assertEquals(42.0f, metrics.getLineCoveragePercent(), 0.01f); } @Test public void testRecordCoverageNullMetrics() { assertFalse(client.recordCoverage(TestUtils.TEST_SHA, null)); } @Test public void testRecordCoverageInternalError() { server.register("/*", TestUtils.makeHttpHandler(HttpStatus.SC_INTERNAL_SERVER_ERROR, "")); assertFalse(client.recordCoverage(TestUtils.TEST_SHA, TestUtils.getDefaultCodeCoverageMetrics())); } @Test public void testRecordCoverageSuccessful() { server.register("/*", TestUtils.makeHttpHandler(HttpStatus.SC_OK, "{}")); assertTrue(client.recordCoverage(TestUtils.TEST_SHA, TestUtils.getDefaultCodeCoverageMetrics())); } @Test public void testRecordCoverageURISyntaxException() throws Exception { assertRecordCoverageException(URISyntaxException.class); } @Test public void testRecordCoverageHttpResponseException() throws Exception { assertRecordCoverageException(HttpResponseException.class); } @Test public void testRecordCoverageClientProtocolException() throws Exception { assertRecordCoverageException(ClientProtocolException.class); } @Test public void testRecordCoverageIOException() throws Exception { assertRecordCoverageException(IOException.class); } @Test public void testGetCoverageHttpResponseException() throws Exception { assertGetCoverageException(HttpResponseException.class); } @Test public void testGetCoverageRandomException() throws Exception { assertGetCoverageException(IOException.class); } private void assertRecordCoverageException(Class<? extends Exception> exceptionClass) throws Exception { HttpClient mockClient = mockClient(); doThrow(exceptionClass).when(mockClient).executeMethod(any(HttpMethod.class)); assertFalse(client.recordCoverage(TestUtils.TEST_SHA, TestUtils.getDefaultCodeCoverageMetrics())); } private void assertGetCoverageException(Class<? extends Exception> exceptionClass) throws IOException { HttpClient mockClient = mockClient(); doThrow(exceptionClass).when(mockClient).executeMethod(any(HttpMethod.class)); assertNull(client.getCoverage(TestUtils.TEST_SHA)); } private UberallsClient getDefaultClient() { return spy(new UberallsClient( getTestServerAddress(), TestUtils.getDefaultLogger(), TestUtils.TEST_REPOSITORY, TestUtils.TEST_BRANCH )); } private HttpClient getMockHttpClient() { return mock(HttpClient.class); } private HttpClient mockClient() { HttpClient mockClient = getMockHttpClient(); doReturn(mockClient).when(client).getClient(); return mockClient; } private String getTestServerAddress() { return String.format( "http://%s:%s", server.getServiceAddress().getHostName(), server.getServiceAddress().getPort() ); } }