#!/usr/bin/env bash # Run Complement against a freshly built Warp image. # # server/test/complement/run.sh # the C-S test set, federation off # COMPLEMENT_PROFILE=federation server/test/complement/run.sh # the federation test set # server/test/complement/run.sh TestLogin # one test # COMPLEMENT_TESTS='Test.*' server/test/complement/run.sh # # Complement is a separate Go module, so it has to be checked out and run on # its own. This script keeps that checkout in a cache directory rather than # vendoring it: it is a test harness we track, not a dependency we pin. set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" : "${COMPLEMENT_REPO:=https://github.com/matrix-org/complement.git}" : "${COMPLEMENT_REF:=main}" : "${COMPLEMENT_DIR:=${REPO_ROOT}/.complement}" : "${COMPLEMENT_IMAGE:=complement-warp}" : "${COMPLEMENT_PROFILE:=csapi}" # The target sets for the phases that are done, from PLAN.md section 7. Add # to them as phases land rather than switching to the whole suite: a pass # count that goes down because a later phase is missing is noise. # # csapi: the Client-Server tests, with federation off. Phase 4 added the # stream tests: /sync in all its forms, /messages, /context, filters, # typing, receipts and to-device messaging. What is still out is anything # needing a later phase — the notification counts of the push rules # (Phase 8). Phase 6 added the media tests: uploads, async uploads, # downloads with their file names and thumbnails. The remote-media tests # are in the federation set, which TestRemote.* already covers. Phase 7 # added the keyserver's: key uploads, claims, changes, device lists, # fallback keys, cross-signing and key backup. CSAPI_TESTS='TestUploadKey.*|TestKeyClaimOrdering|TestKeyChanges.*|TestDeviceListUpdates.*|TestE2EKeyBackup.*|TestFallbackKeys.*|TestCrossSigning.*|TestMedia.*|TestContent.*|TestLocalPngThumbnail|TestAsyncUpload.*|TestUploadLimit|TestRegistration|TestLogin|TestDeviceManagement|TestRoomCreate|TestRoomState|TestRoomAlias|TestRoomForget|TestMembership.*|TestRedaction.*|TestJoinRoom.*|TestLeaveRoom.*|TestKickRoom.*|TestBanRoom.*|TestPublicRoom.*|TestSync.*|TestMessages.*|TestContext.*|TestFilter.*|TestTyping.*|TestReceipt.*|TestToDevice.*|TestRoomCreationReportsEventsToMyself|TestLazyLoading.*|TestWriteMDirectAccountData' # federation: Phase 5. Joins, leaves and invites across servers, keys, # transactions, missing events, server ACLs and the queries. Partial-state # joins (MSC3706, TestPartialStateJoin*) are not implemented and are left # out; so is anything needing an application service (Phase 9). Phase 7 # added device lists across servers. FEDERATION_TESTS='TestDeviceListUpdates.*|TestDeviceListsUpdateOverFederation.*|TestFederation.*|TestJoinViaRoomIDAndServerName|TestJoinFederatedRoom.*|TestBannedUserCannotSendJoin|TestCannotSendNon.*Via.*|TestCannotSendKnockViaSend.*|TestOutboundFederation.*|TestInboundFederation.*|TestInboundCanReturnMissingEvents|TestRemoteAliasRequestsUnderstandUnicode|TestNetworkPartitionOrdering|TestACLs|TestGetMissingEventsGapFilling|TestEventAuth|TestUnbanViaInvite|TestJoinRoomWithFederation.*|TestRemote.*' case "$COMPLEMENT_PROFILE" in csapi) : "${COMPLEMENT_TESTS:=$CSAPI_TESTS}" PACKAGES=(./tests/csapi/...) FEDERATION_ENABLED=false ;; federation) : "${COMPLEMENT_TESTS:=$FEDERATION_TESTS}" PACKAGES=(./tests/... ) FEDERATION_ENABLED=true ;; *) echo "complement: unknown COMPLEMENT_PROFILE '$COMPLEMENT_PROFILE' (want csapi or federation)" >&2 exit 2 ;; esac if [[ $# -gt 0 ]]; then COMPLEMENT_TESTS="$(IFS='|'; echo "$*")" fi docker="${DOCKER:-docker}" if ! command -v "$docker" >/dev/null 2>&1; then echo "complement: $docker is not installed; Complement needs a container runtime" >&2 exit 1 fi echo "complement: building $COMPLEMENT_IMAGE" "$docker" build -t "$COMPLEMENT_IMAGE" -f "${REPO_ROOT}/server/test/complement/Dockerfile" "$REPO_ROOT" if [[ ! -d "$COMPLEMENT_DIR" ]]; then echo "complement: cloning $COMPLEMENT_REPO into $COMPLEMENT_DIR" git clone --depth 1 --branch "$COMPLEMENT_REF" "$COMPLEMENT_REPO" "$COMPLEMENT_DIR" else git -C "$COMPLEMENT_DIR" fetch --depth 1 origin "$COMPLEMENT_REF" git -C "$COMPLEMENT_DIR" checkout -q FETCH_HEAD fi echo "complement: running '${COMPLEMENT_TESTS}' (profile ${COMPLEMENT_PROFILE}, federation ${FEDERATION_ENABLED})" cd "$COMPLEMENT_DIR" # COMPLEMENT_SPAWN_HS_TIMEOUT_SECS is generous because the first container # of a run has to apply the migrations on a cold SQLite file. # # COMPLEMENT_SHARE_ENV_PREFIX hands every host variable starting with # PASS_ to the homeserver containers, prefix removed: it is how the profile # reaches the entrypoint's federation switch. COMPLEMENT_BASE_IMAGE="$COMPLEMENT_IMAGE" \ COMPLEMENT_SPAWN_HS_TIMEOUT_SECS="${COMPLEMENT_SPAWN_HS_TIMEOUT_SECS:-60}" \ COMPLEMENT_DEBUG="${COMPLEMENT_DEBUG:-0}" \ COMPLEMENT_SHARE_ENV_PREFIX=PASS_ \ PASS_WARP_FEDERATION_ENABLED="$FEDERATION_ENABLED" \ go test -count=1 -v -timeout 30m -run "^(${COMPLEMENT_TESTS})$" "${PACKAGES[@]}"