Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ci: e2e testing #3

Merged
merged 1 commit into from Mar 12, 2024
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
117 changes: 113 additions & 4 deletions .github/workflows/main.yml
Expand Up @@ -2,7 +2,6 @@ name: Application CI
on:
push:
branches:
- '!main'
concurrency:
group: application-ci-${{ github.ref }}
cancel-in-progress: true
Expand All @@ -26,15 +25,125 @@ jobs:
distribution: 'temurin'
java-version: 21
- name: Build & Test
run: ./gradlew :apps:k6-report-ingress:build
run: ./gradlew --no-daemon :apps:k6-report-ingress:build
- uses: actions/upload-artifact@v4
with:
name: k6-report-ingress
path: apps/k6-report-ingress/build/libs/*.jar
cli:
name: 'cli'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: 21
- name: Generate Client
run: ./gradlew --no-daemon :cli:openApiGenerateClient
- name: Build
working-directory: cli
run: cargo build --verbose
- name: Run tests
- name: Test
working-directory: cli
run: cargo test --verbose
- uses: actions/upload-artifact@v4
with:
name: cli
path: cli/target/debug/cli
integration-test:
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
needs:
- k6-report-ingress
- cli
env:
POSTGRES_PASSWORD: KrPPCHdYSXz6wMct5tUK
POSTGRES_USER: k6_dashboard
POSTGRES_DB: k6_dashboard
services:
timescaledb:
image: timescale/timescaledb:latest-pg16
ports:
- 5432:5432
env:
POSTGRES_PASSWORD: ${{ env.POSTGRES_PASSWORD }}
POSTGRES_USER: ${{ env.POSTGRES_USER }}
POSTGRES_DB: ${{ env.POSTGRES_DB }}
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
path: build/artifacts
- name: Create additional database
run: |
PGPASSWORD=${{ env.POSTGRES_PASSWORD }} psql -h localhost -U ${{ env.POSTGRES_USER }} -d ${{ env.POSTGRES_DB }} -c "CREATE DATABASE k6_output;"
- name: Run K6 Tests and Post Report
run: |
docker run --network host -e TIMESCALEDB_JDBC_URL=postgresql://${{ env.POSTGRES_USER }}:${{ env.POSTGRES_PASSWORD }}@localhost:5432/k6_output --name k6 -v ${{ github.workspace }}/src/test/k6:/scripts -v ${{ github.workspace }}/dev/k6:/mountpoint golang:alpine3.19 /mountpoint/entrypoint.sh
docker cp k6:/go/report.json ${{ github.workspace }}/src/test/k6/report.json
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- name: Migrate Database
run: ./gradlew :apps:k6-report-ingress:flywayMigrate
- name: Start Application and Upload JSON Report
timeout-minutes: 5
run: |
# Start the application in the background
java -jar "$(find build/artifacts -type f -name '*.jar' -not -name '*-plain.jar')" &
APP_PID=$!

# Wait for the application to be ready
echo "Waiting for application to start..."
while ! nc -z localhost 8080; do
sleep 1 # wait for 1 second before check again
done

echo "Application started. Uploading JSON Report..."

# Upload the JSON report
chmod 755 build/artifacts/cli/cli
build/artifacts/cli/cli upload -u http://localhost:8080 ${{ github.workspace }}/src/test/k6/report.json || exit 1

echo "Uploading done. Waiting for processing to finish..."

# Wait until processing finished
count=1
while [ $count -ne 0 ]; do
sleep 5
echo "Processing not done yet. Retrying..."
output=$(docker run --rm --network host -e PGPASSWORD=${{ env.POSTGRES_PASSWORD }} postgres:16.2-alpine psql -h localhost -U ${{ env.POSTGRES_USER }} -d ${{ env.POSTGRES_DB }} -c "select count(*) from report_processing where processing_status != 1;")
count=$(echo "$output" | grep -Eo '[0-9]+' | head -n 1)
done

echo "Done."

# Optionally, you might want to gracefully shut down your application
kill $APP_PID
env:
SPRING_DATASOURCE_URL: jdbc:postgresql://localhost:5432/${{ env.POSTGRES_DB }}
SPRING_DATASOURCE_USERNAME: ${{ env.POSTGRES_USER }}
SPRING_DATASOURCE_PASSWORD: ${{ env.POSTGRES_PASSWORD }}
SPRING_SERVLET_MULTIPART_MAX_FILE_SIZE: 1GB
- name: Create Database Dumps
run: |
mkdir -p build/artifacts/database

docker run --rm --network host -e PGPASSWORD=${{ env.POSTGRES_PASSWORD }} postgres:16.2-alpine psql -h localhost -U ${{ env.POSTGRES_USER }} -d k6_output -c "COPY (SELECT date_trunc('milliseconds', ts), metric, tags, value FROM samples ORDER BY metric, ts) TO STDOUT WITH CSV HEADER;" > build/artifacts/database/k6_output.csv
cat build/artifacts/database/k6_output.csv | sort > build/artifacts/database/k6_output.csv

docker run --rm --network host -e PGPASSWORD=${{ env.POSTGRES_PASSWORD }} postgres:16.2-alpine psql -h localhost -U ${{ env.POSTGRES_USER }} -d ${{ env.POSTGRES_DB }} -c "COPY (SELECT date_trunc('milliseconds', ts), metric, tags, value FROM samples ORDER BY metric, ts) TO STDOUT WITH CSV HEADER;" > build/artifacts/database/${{ env.POSTGRES_DB }}.csv
cat build/artifacts/database/${{ env.POSTGRES_DB }}.csv | sort > build/artifacts/database/${{ env.POSTGRES_DB }}.csv
- uses: actions/upload-artifact@v4
with:
name: data
path: build/artifacts/database/*.csv
- name: Compare Tables
run: diff build/artifacts/database/k6_output.csv build/artifacts/database/${{ env.POSTGRES_DB }}.csv
Expand Up @@ -48,7 +48,7 @@ void generateProcessingIdShouldReturnId() {
var result = reportProcessingService.generateProcessingId();

assertThat(result)
.isEqualTo(PROCESSING_UUID);
.isEqualTo(reportProcessing);
}

@Test
Expand Down
Expand Up @@ -9,11 +9,10 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import java.util.concurrent.CompletableFuture;
import java.util.UUID;

import static io.github.bbortt.k6.report.ingress.web.rest.K6ReportIngressApiResource.PROCESSING_ID_HEADER_NAME;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.mockito.Mockito.doReturn;
import static org.springframework.http.HttpStatus.ACCEPTED;

Expand All @@ -35,10 +34,9 @@ void setUp() {

@Test
void uploadJSONReportRespondsDespiteBeingProcessedAsynchronously() {
var mockProcessingId = "mockId";
var mockProcessingId = UUID.fromString("20c8fc34-934e-47ee-9f33-c6325e479d58");

var processingFuture = new CompletableFuture<>();
doReturn(processingFuture).when(k6ReportServiceMock).processFileAsync(reportFileMock);
doReturn(mockProcessingId).when(k6ReportServiceMock).processFileAsync(reportFileMock);

ResponseEntity<Void> responseEntity = k6ReportIngressApiResource.uploadJSONReport(reportFileMock);

Expand All @@ -50,10 +48,7 @@ void uploadJSONReportRespondsDespiteBeingProcessedAsynchronously() {
r -> assertThat(r)
.extracting(ResponseEntity::getHeaders)
.extracting(header -> header.getFirst(PROCESSING_ID_HEADER_NAME))
.isEqualTo(mockProcessingId)
.isEqualTo(mockProcessingId.toString())
);

assertFalse(processingFuture.isDone());
processingFuture.complete(mockProcessingId);
}
}
1 change: 0 additions & 1 deletion cli/src/main.rs
@@ -1,7 +1,6 @@
use std::path::PathBuf;

use clap::{Arg, Command};
use futures::stream::TryStreamExt;
use futures::TryFutureExt;
use openapi::apis::{configuration, configuration::Configuration, Error, ResponseContent};
use openapi::apis::k6_report_ingress_api::UploadJsonReportError;
Expand Down
3 changes: 1 addition & 2 deletions settings.gradle
Expand Up @@ -2,6 +2,7 @@ pluginManagement {
repositories {
gradlePluginPortal()
maven { url "https://repo.spring.io/release" }
maven { url 'https://repo.spring.io/milestone' }
}

plugins {
Expand All @@ -27,5 +28,3 @@ rootProject.name = "${rootProject.name}"


include 'apps:k6-report-ingress', 'cli'
findProject(':apps:k6-report-ingress')?.name = 'k6-report-ingress'
findProject(':cli')?.name = 'k6-report-cli'
1 change: 1 addition & 0 deletions src/test/k6/.gitignore
@@ -0,0 +1 @@
report.json
2 changes: 1 addition & 1 deletion src/test/k6/script.js
Expand Up @@ -11,5 +11,5 @@ export const options = {
};

export default function() {
http.get('https://test.k6.io');
http.get('https://httpbin.test.k6.io/get');
}