/*- * -\-\- * Helios Testing Library * -- * Copyright (C) 2016 Spotify AB * -- * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * -/-/- */ package com.spotify.helios.testing; import static java.util.concurrent.TimeUnit.MINUTES; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; import static org.junit.experimental.results.PrintableResult.testResult; import static org.junit.experimental.results.ResultMatchers.isSuccessful; import com.google.common.base.Optional; import com.spotify.helios.common.descriptors.HealthCheck; import com.spotify.helios.common.descriptors.HttpHealthCheck; import com.spotify.helios.common.descriptors.TcpHealthCheck; import java.net.HttpURLConnection; import java.net.Socket; import java.net.URL; import org.junit.Rule; import org.junit.Test; public class HealthCheckTest extends TemporaryJobsTestBase { private static final String HEALTH_CHECK_PORT = "healthCheck"; private static final String QUERY_PORT = "query"; @Test public void test() throws Exception { assertThat(testResult(TestImpl.class), isSuccessful()); } public static class TestImpl { @Rule public final TemporaryJobs temporaryJobs = temporaryJobsBuilder() .client(client) .jobPrefix(Optional.of(testTag).get()) .deployTimeoutMillis(MINUTES.toMillis(3)) .build(); @Test public void testTcpCheck() throws Exception { // running netcat twice on different ports lets us verify the health check actually executed // because otherwise we wouldn't be able to connect to the second port. final TemporaryJob job = temporaryJobs.job() .image(ALPINE) .command("sh", "-c", "nc -l -p 4711 && nc -kl -p 4712 -e true") .port(HEALTH_CHECK_PORT, 4711) .port(QUERY_PORT, 4712) .tcpHealthCheck(HEALTH_CHECK_PORT) .deploy(testHost1); // verify health check was set correctly in job assertThat(job.job().getHealthCheck(), equalTo((HealthCheck) TcpHealthCheck.of(HEALTH_CHECK_PORT))); // verify we can actually connect to the port // noinspection EmptyTryBlock try (final Socket ignored = new Socket(DOCKER_HOST.address(), job.address(QUERY_PORT).getPort())) { // ignored } } @Test public void testHttpCheck() throws Exception { // Start an HTTP server that listens on ports 4711 and 4712. final TemporaryJob job = temporaryJobs.job() .image(UHTTPD) .command("-p", "4711", "-p", "4712") .port(HEALTH_CHECK_PORT, 4711) .port(QUERY_PORT, 4712) .httpHealthCheck(HEALTH_CHECK_PORT, "/") .deploy(testHost1); // verify health check was set correctly in job assertThat(job.job().getHealthCheck(), equalTo((HealthCheck) HttpHealthCheck.of(HEALTH_CHECK_PORT, "/"))); // verify we can actually make http requests final URL url = new URL("http", DOCKER_HOST.address(), job.address(QUERY_PORT).getPort(), "/"); final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); assertThat(connection.getResponseCode(), equalTo(200)); } @Test public void testHealthCheck() throws Exception { // same as the tcp test above, but uses a HealthCheck // object instead of the tcpHealthCheck convenience method final HealthCheck healthCheck = TcpHealthCheck.of(HEALTH_CHECK_PORT); final TemporaryJob job = temporaryJobs.job() .image(ALPINE) .command("sh", "-c", "nc -l -p 4711 && nc -kl -p 4712 -e true") .port(HEALTH_CHECK_PORT, 4711) .port(QUERY_PORT, 4712) .healthCheck(healthCheck) .deploy(testHost1); // verify health check was set correctly in job assertThat(job.job().getHealthCheck(), equalTo(healthCheck)); // verify we can actually connect to the port // noinspection EmptyTryBlock try (final Socket ignored = new Socket(DOCKER_HOST.address(), job.address(QUERY_PORT).getPort())) { // ignored } } } }