Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions .github/workflows/pr-functional-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Functional tests

on:
pull_request:
paths-ignore:
- 'docs/**'
- '.github/**'
branches:
- master
release:
types:
- created

jobs:
build:
runs-on: ubuntu-latest

strategy:
matrix:
java: [ 11 ]

steps:
- uses: actions/checkout@v2

- name: Set up JDK
uses: actions/setup-java@v1
with:
java-version: ${{ matrix.java }}

- name: Cache Maven dependendcies
uses: actions/cache@v1
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-

- name: Build with Maven
run: mvn -B verify -DskipUnitTests=true --file pom.xml
10 changes: 10 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM openjdk:11-jre-slim

WORKDIR /app/prebid-cache

COPY src/main/docker/run.sh ./
COPY target/prebid-cache.jar ./prebid-cache.jar

EXPOSE 8080

ENTRYPOINT [ "/app/prebid-cache/run.sh" ]
165 changes: 162 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.prebid.cache</groupId>
Expand All @@ -22,10 +23,14 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath />
<relativePath/>
</parent>

<properties>
<skipUnitTests>false</skipUnitTests>
<skipFunctionalTests>false</skipFunctionalTests>
<useFixedContainerPorts>false</useFixedContainerPorts>

<project.build.resources.directory>src/main/resources</project.build.resources.directory>
<main.class>org.prebid.cache.PBCacheApplication</main.class>
<junit-jupiter.version>5.3.1</junit-jupiter.version>
Expand All @@ -42,7 +47,7 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven-source-plugin.version>3.0.1</maven-source-plugin.version>
<maven-clean-plugin.version>3.0.0</maven-clean-plugin.version>
<maven-surefire-plugin.version>2.22.1</maven-surefire-plugin.version>
<maven-surefire-plugin.version>3.0.0-M6</maven-surefire-plugin.version>
<maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
<spring-boot-maven-plugin.version>2.1.2.RELEASE</spring-boot-maven-plugin.version>
<lettuce-core.version>6.0.1.RELEASE</lettuce-core.version>
Expand All @@ -66,6 +71,15 @@
<resilience4j.version>0.13.2</resilience4j.version>
<log4j2.version>2.17.1</log4j2.version> <!-- Workaround for CVE-2021-44832-->
<maven-release-plugin.version>2.5.3</maven-release-plugin.version>

<!-- Functional Tests -->
<kotest.version>5.3.0</kotest.version>
<kotlin.version>1.6.21</kotlin.version>
<testcontainers.version>1.17.1</testcontainers.version>
<mockserver-client.version>5.13.2</mockserver-client.version>
<ktor.version>2.0.1</ktor.version>
<jackson-kotlin-module.version>2.13.2</jackson-kotlin-module.version>
<docker-maven-plugin.version>0.39.1</docker-maven-plugin.version>
</properties>

<dependencies>
Expand Down Expand Up @@ -213,6 +227,69 @@
<version>${awaitility.version}</version>
<scope>test</scope>
</dependency>

<!-- Functional Test Dependencies -->
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>${kotlin.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.kotest</groupId>
<artifactId>kotest-runner-junit5-jvm</artifactId>
<version>${kotest.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>${testcontainers.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mockserver</artifactId>
<version>${testcontainers.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-client-java</artifactId>
<version>${mockserver-client.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ktor</groupId>
<artifactId>ktor-client-core-jvm</artifactId>
<version>${ktor.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ktor</groupId>
<artifactId>ktor-client-apache-jvm</artifactId>
<version>${ktor.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ktor</groupId>
<artifactId>ktor-client-content-negotiation-jvm</artifactId>
<version>${ktor.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ktor</groupId>
<artifactId>ktor-serialization-jackson-jvm</artifactId>
<version>${ktor.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<version>${jackson-kotlin-module.version}</version>
<scope>test</scope>
</dependency>

</dependencies>

<build>
Expand Down Expand Up @@ -266,6 +343,9 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<skipTests>${skipUnitTests}</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
Expand All @@ -292,6 +372,84 @@
<embeddedLaunchScript>src/scripts/custom_launch.script</embeddedLaunchScript>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<skipITs>${skipFunctionalTests}</skipITs>
<includes>
<include>**/*Spec.java</include>
</includes>
<systemPropertyVariables>
<useFixedContainerPorts>${useFixedContainerPorts}</useFixedContainerPorts>
</systemPropertyVariables>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>test-compile</id>
<phase>process-test-sources</phase>
<goals>
<goal>test-compile</goal>
</goals>
<configuration>
<sourceDirs>
<source>src/test/kotlin</source>
</sourceDirs>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker-maven-plugin.version}</version>
<configuration>
<skip>${skipFunctionalTests}</skip>
<images>
<image>
<name>${project.artifactId}</name>
<build>
<dockerFile>${project.basedir}/Dockerfile</dockerFile>
<tags>
<tag>latest</tag>
</tags>
</build>
</image>
</images>
</configuration>
<executions>
<execution>
<id>build-containers</id>
<phase>pre-integration-test</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>remove-containers</id>
<phase>post-integration-test</phase>
<goals>
<goal>remove</goal>
</goals>
</execution>
</executions>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
Expand All @@ -309,6 +467,7 @@
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco-plugin.version}</version>
<configuration>
<skip>${skipUnitTests}</skip>
<excludes>
<exclude>**/listeners/**</exclude>
<exclude>**/repository/**</exclude>
Expand Down
5 changes: 5 additions & 0 deletions src/main/docker/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/sh

exec java \
-jar \
/app/prebid-cache/prebid-cache.jar
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,13 @@

import java.util.Collections;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Supplier;

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static org.awaitility.Awaitility.await;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.BDDMockito.given;
import static org.prebid.cache.util.AwaitilityUtil.awaitAndVerify;
import static org.springframework.http.HttpHeaders.CONTENT_TYPE;

@ExtendWith(SpringExtension.class)
Expand Down Expand Up @@ -154,19 +153,19 @@ void testSecondaryCacheSuccess() {

final var responseMono = handler.save(requestMono);

Consumer<ServerResponse> consumer =
final Consumer<ServerResponse> consumer =
serverResponse -> assertEquals(200, serverResponse.statusCode().value());

StepVerifier.create(responseMono)
.consumeNextWith(consumer)
.expectComplete()
.verify();

await().atLeast(10, TimeUnit.MILLISECONDS);

verify(postRequestedFor(urlPathEqualTo("/cache"))
final var requestPatternBuilder = postRequestedFor(urlPathEqualTo("/cache"))
.withQueryParam("secondaryCache", equalTo("yes"))
.withHeader(HttpHeaders.CONTENT_TYPE, equalToIgnoreCase("application/json")));
.withHeader(HttpHeaders.CONTENT_TYPE, equalToIgnoreCase("application/json"));

awaitAndVerify(requestPatternBuilder, 5000);
}

@Test
Expand Down
24 changes: 24 additions & 0 deletions src/test/java/org/prebid/cache/util/AwaitilityUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.prebid.cache.util;

import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder;

import java.util.concurrent.TimeUnit;

import static com.github.tomakehurst.wiremock.client.WireMock.findAll;
import static com.github.tomakehurst.wiremock.client.WireMock.verify;
import static org.awaitility.Awaitility.await;

public class AwaitilityUtil {

public static void awaitAndVerify(RequestPatternBuilder requestPatternBuilder, long timeoutMillis) {
awaitAndVerify(1, requestPatternBuilder, timeoutMillis);
}

public static void awaitAndVerify(int count, RequestPatternBuilder requestPatternBuilder, long timeoutMillis) {
await()
.atMost(timeoutMillis, TimeUnit.MILLISECONDS)
.until(() -> findAll(requestPatternBuilder).size() >= count);

verify(requestPatternBuilder);
}
}
Loading