diff --git a/services/commtest/Dockerfile b/services/commtest/Dockerfile new file mode 100644 --- /dev/null +++ b/services/commtest/Dockerfile @@ -0,0 +1,42 @@ +FROM rust:1.70-bullseye + +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \ + build-essential cmake git libgtest-dev libssl-dev zlib1g-dev \ + gnupg software-properties-common + +# These steps are required to install terraform +RUN wget -O- https://apt.releases.hashicorp.com/gpg | \ + gpg --dearmor | \ + tee /usr/share/keyrings/hashicorp-archive-keyring.gpg \ + && echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \ + https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \ + tee /etc/apt/sources.list.d/hashicorp.list \ + && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \ + terraform && rm -rf /var/lib/apt/lists/* + +# install aws-cli v2, we must do this manually and per-platform +ARG TARGETPLATFORM +RUN if [ $(echo $TARGETPLATFORM | cut -d / -f2) = "arm64" ]; then \ + curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"; \ + else \ + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"; \ + fi +RUN unzip -q awscliv2.zip && ./aws/install \ + && rm -rf awscliv2.zip aws + +WORKDIR /home/root/app/commtest + +# Install more recent version of protobuf, must be ran as root +COPY scripts/install_protobuf.sh ../../scripts/install_protobuf.sh +RUN ../../scripts/install_protobuf.sh + +ENV CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse + +# Copy actual application sources +COPY shared ../../shared/ +COPY services/comm-services-lib ../comm-services-lib +COPY services/terraform/dev ../terraform/dev +COPY services/terraform/modules ../terraform/modules +COPY services/commtest ./ + +CMD ["bash", "./run-tests-ci.sh"] diff --git a/services/commtest/run-tests-ci.sh b/services/commtest/run-tests-ci.sh new file mode 100755 --- /dev/null +++ b/services/commtest/run-tests-ci.sh @@ -0,0 +1,66 @@ +#!/bin/env bash + +set -euo pipefail + +NUM_FAILURES=0 + +awscli() { + aws --endpoint-url="$LOCALSTACK_ENDPOINT" "$@" +} + +# Set up Localstack using Terraform +reset_localstack() { + echo "Resetting Localstack..." + pushd ../terraform/dev >/dev/null + terraform init + + # Force delete secrets due to bug in Localstack where Terraform can't delete them + echo "Deleting secrets..." + secret_arns=$(awscli secretsmanager list-secrets --query "SecretList[].ARN" --output text) + for arn in $secret_arns; do + awscli secretsmanager delete-secret --secret-id "$arn" --force-delete-without-recovery + done + + # Reset terraform state + echo "Resetting terraform state..." + terraform apply -destroy -auto-approve + terraform apply -auto-approve + + popd >/dev/null +} + +run_test() { + local exit_code + echo "COMMTEST: Running test: $1" + + set +e + RUSTFLAGS=-Awarnings cargo test --test "$1" -- --show-output "${@:2}" + exit_code=$? + set -e + + if [ $exit_code -ne 0 ]; then + ((NUM_FAILURES += 1)) + fi +} + +# Reset localstack and then run tests +reset_localstack + +run_test "blob_*" +run_test "backup*" +run_test "tunnelbroker_*" --test-threads=1 +run_test grpc_client_test +# below tests are flaky and need to be run in order +run_test identity_keyserver_tests +run_test identity_access_tokens_tests +run_test identity_one_time_key_tests +run_test identity_prekey_tests +run_test identity_tunnelbroker_tests + +if [ $NUM_FAILURES -eq 0 ]; then + echo "COMMTEST: ALL TESTS PASSED" + exit 0 +else + echo "COMMTEST: $NUM_FAILURES TEST SUITES FAILED" + exit 1 +fi