Skip to content

Commit

Permalink
fix(tests): refactored existing containerized integration test and ad…
Browse files Browse the repository at this point in the history
…ded new test for postgres
  • Loading branch information
kirangodishala committed May 30, 2024
1 parent 06c5dac commit 6b5d089
Show file tree
Hide file tree
Showing 6 changed files with 289 additions and 133 deletions.
1 change: 1 addition & 0 deletions clouddriver-integration/clouddriver-integration.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ dependencies {
testImplementation "org.junit.jupiter:junit-jupiter-api"
testImplementation "org.slf4j:slf4j-api"
testImplementation "org.testcontainers:testcontainers"
testImplementation "org.testcontainers:postgresql"
testImplementation "org.testcontainers:junit-jupiter"
testRuntimeOnly "ch.qos.logback:logback-classic"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
/*
* Copyright 2024 Salesforce, Inc.
*
* 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.netflix.spinnaker.clouddriver;

import org.junit.jupiter.api.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.Network;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.Map;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assumptions.assumeTrue;

@Testcontainers
public class BaseContainerTest {

private static final Logger logger = LoggerFactory.getLogger(BaseContainerTest.class);

protected static final Network network = Network.newNetwork();

protected static GenericContainer clouddriverContainer;

@BeforeAll
static void setupInit() throws Exception {
String fullDockerImageName = System.getenv("FULL_DOCKER_IMAGE_NAME");

// Skip the tests if there's no docker image. This allows gradlew build to work.
assumeTrue(fullDockerImageName != null);

DockerImageName dockerImageName = DockerImageName.parse(fullDockerImageName);

clouddriverContainer =
new GenericContainer(dockerImageName)
.withNetwork(network)
.withExposedPorts(7002)
.waitingFor(Wait.forHealthcheck().withStartupTimeout(Duration.ofSeconds(90)));

}

@BeforeEach
void init(TestInfo testInfo) {
System.out.println("--------------- Test " + testInfo.getDisplayName());
}

void testHealthCheck() throws Exception {
// hit an arbitrary endpoint
HttpRequest request =
HttpRequest.newBuilder()
.uri(
new URI(
"http://"
+ clouddriverContainer.getHost()
+ ":"
+ clouddriverContainer.getFirstMappedPort()
+ "/health"))
.GET()
.build();

HttpClient client = HttpClient.newHttpClient();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
assertThat(response).isNotNull();
logger.info("response: {}, {}", response.statusCode(), response.body());
assertThat(response.statusCode()).isEqualTo(200);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/*
* Copyright 2024 Salesforce, Inc.
*
* 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.netflix.spinnaker.clouddriver;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.junit.jupiter.Testcontainers;

import java.util.Map;

@Testcontainers
public class PostgresContainerTest extends BaseContainerTest {
private static final String POSTGRES_NETWORK_ALIAS = "postgresHost";

private static final int POSTGRES_PORT = 5432;

private static final Logger logger = LoggerFactory.getLogger(PostgresContainerTest.class);

private static final PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>("postgres:15")
.withDatabaseName("clouddriver")
.withUsername("postgres")
.withPassword("postgres")
.withNetwork(network)
.withNetworkAliases(POSTGRES_NETWORK_ALIAS)
.withInitScript("postgres_init.sql");

private static String jdbcUrl = "";

@BeforeAll
static void setup() throws Exception {
postgres.start();
jdbcUrl = String.format("jdbc:postgresql://%s:%d/clouddriver", POSTGRES_NETWORK_ALIAS, POSTGRES_PORT);
clouddriverContainer
.dependsOn(postgres)
.withEnv("SPRING_APPLICATION_JSON", getSpringApplicationJson())
.start();

Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(logger);
clouddriverContainer.start();
clouddriverContainer.followOutput(logConsumer);
}

private static String getSpringApplicationJson() throws JsonProcessingException {
logger.info("***** jdbcUrl: '{}'", jdbcUrl);
Map<String, String> connectionPool =
Map.of("jdbcUrl", jdbcUrl, "user", "clouddriver_service", "password", "c10uddriver");
Map<String, String> migration =
Map.of("jdbcUrl", jdbcUrl, "user", "clouddriver_migrate", "password", "c10uddriver");

Map<String, Object> properties =
Map.of(
"sql.enabled",
"true",
"services.fiat.baseUrl",
"http://nowhere",
"sql.connectionPool",
connectionPool,
"redis.enabled",
"false",
"sql.migration",
migration);
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(properties);
}

@AfterAll
static void cleanupOnce() {
if (clouddriverContainer != null) {
clouddriverContainer.stop();
}

if (postgres != null) {
postgres.stop();
}
}

@Test
void testHealthCheckWithPostgres() throws Exception {
super.testHealthCheck();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*
* Copyright 2024 Salesforce, Inc.
*
* 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.netflix.spinnaker.clouddriver;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;

import java.util.Map;

@Testcontainers
public class RedisContainerTest extends BaseContainerTest {
private static final Logger logger = LoggerFactory.getLogger(RedisContainerTest.class);

private static final String REDIS_NETWORK_ALIAS = "redisHost";

private static final int REDIS_PORT = 6379;

private static final GenericContainer redis =
new GenericContainer(DockerImageName.parse("library/redis:5-alpine"))
.withNetwork(network)
.withNetworkAliases(REDIS_NETWORK_ALIAS)
.withExposedPorts(REDIS_PORT);

@BeforeAll
static void setup() throws Exception {
redis.start();
clouddriverContainer
.dependsOn(redis)
.withEnv("SPRING_APPLICATION_JSON", getSpringApplicationJson())
.start();

Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(logger);
clouddriverContainer.start();
clouddriverContainer.followOutput(logConsumer);
}

private static String getSpringApplicationJson() throws JsonProcessingException {
String redisUrl = "redis://" + REDIS_NETWORK_ALIAS + ":" + REDIS_PORT;
logger.info("redisUrl: '{}'", redisUrl);
Map<String, String> properties =
Map.of("redis.connection", redisUrl, "services.fiat.baseUrl", "http://nowhere");
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(properties);
}

@AfterAll
static void cleanupOnce() {
if (clouddriverContainer != null) {
clouddriverContainer.stop();
}

if (redis != null) {
redis.stop();
}
}

@Test
void testHealthCheckWithRedis() throws Exception {
super.testHealthCheck();
}
}
Loading

0 comments on commit 6b5d089

Please sign in to comment.