Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
da1f27a
chore: Add simple storage contract
LuisUrrutia Nov 17, 2025
d68ad87
chore: Create client for integration tests
LuisUrrutia Nov 17, 2025
0b007d9
chore: Add registry parsing
LuisUrrutia Nov 17, 2025
9987204
chore: Add registry
LuisUrrutia Nov 17, 2025
757ef86
chore: Add mod file
LuisUrrutia Nov 17, 2025
c82989e
chore: Add integration mod
LuisUrrutia Nov 17, 2025
eb8ad44
feat: Add network tags and readiness validation
LuisUrrutia Nov 18, 2025
6d3fa8b
chore: Apply fmt
LuisUrrutia Nov 18, 2025
f3a7b8d
feat: Add network selection utils for integration tests
LuisUrrutia Nov 18, 2025
8b22582
chore: Use openzeppelin_relayer package
LuisUrrutia Nov 18, 2025
6f92615
feat: Create confirmation receipt helper
LuisUrrutia Nov 18, 2025
03c2056
feat: Implement basic transfer
LuisUrrutia Nov 18, 2025
05b0b17
feat: Implement common api tests
LuisUrrutia Nov 18, 2025
6f1f0aa
fix: Resolve relayer test race conditions with cleanup and serialization
LuisUrrutia Nov 24, 2025
5ac6973
refactor: Clean up integration tests and extract EVM helpers
LuisUrrutia Nov 24, 2025
dae27ae
feat: Add integration testing Docker setup and reorganize contracts
LuisUrrutia Nov 26, 2025
b9d16ac
chore: clean up broadcast logs and vendor dependencies in test fixtures
LuisUrrutia Nov 26, 2025
75c2cea
chore: remove git submodules for vendor dependencies
LuisUrrutia Nov 26, 2025
914f3c5
chore: Add integration test key
LuisUrrutia Dec 5, 2025
97063f7
fix: Update .env.integration.example with defaults
LuisUrrutia Dec 5, 2025
1b5ee5b
chore: Moving TESTING.md file to README
NicoMolinaOZ Dec 9, 2025
b9e60c2
fix: Ignoring signer files
NicoMolinaOZ Dec 9, 2025
810fb60
fix: CodeRabbit suggestion
NicoMolinaOZ Dec 9, 2025
a211905
fix: CodeRabbit suggestion
NicoMolinaOZ Dec 9, 2025
8b0ad1e
chore: Merge main
NicoMolinaOZ Dec 9, 2025
7fe37ed
fix: Improving logs for test cases
NicoMolinaOZ Dec 10, 2025
92398d5
fix: Docker fixes
NicoMolinaOZ Dec 10, 2025
20cecd3
chore: Adding base sepolia
NicoMolinaOZ Dec 10, 2025
2877c39
fix: Fixing CI
NicoMolinaOZ Dec 10, 2025
3f290f6
fix: Fixing test case
NicoMolinaOZ Dec 10, 2025
9098948
fix: Splitting tests in different jobs
NicoMolinaOZ Dec 11, 2025
1b7f0fb
fix: Fixing tests
NicoMolinaOZ Dec 11, 2025
1391b6a
fix: Fixing CI report
NicoMolinaOZ Dec 11, 2025
bd0d858
fix: Applying review suggestions
NicoMolinaOZ Dec 11, 2025
319f6c5
chore: Adding feature flags for running tests
NicoMolinaOZ Dec 11, 2025
ab36560
chore: Adding job for integration tests
NicoMolinaOZ Dec 11, 2025
a0d737a
chore: Adding aws kms key logic
NicoMolinaOZ Dec 11, 2025
255b218
fix: Removing unnecessary test files
NicoMolinaOZ Dec 12, 2025
d90ea71
fix: Improvements
NicoMolinaOZ Dec 12, 2025
062de0c
chore: Config files and readme improvements
NicoMolinaOZ Dec 12, 2025
425bda3
chore: Fix integration test workflow
NicoMolinaOZ Dec 12, 2025
840e829
fix: Removing unused code
NicoMolinaOZ Dec 12, 2025
a697487
fix: Settings for connecting to aws from actions
NicoMolinaOZ Dec 12, 2025
f2e93bb
fix: Fixing account id
NicoMolinaOZ Dec 12, 2025
211aaad
fix: Fixing actions
NicoMolinaOZ Dec 12, 2025
269c08e
fix: Fixing GH actions
NicoMolinaOZ Dec 12, 2025
7588344
fix: Fixing actions
NicoMolinaOZ Dec 12, 2025
7051010
fix: Fixing secrets
NicoMolinaOZ Dec 12, 2025
f48e1fd
fix: Fixing GH secrets
NicoMolinaOZ Dec 12, 2025
d86eb40
fix: Fixing actions
NicoMolinaOZ Dec 12, 2025
00c128d
fix: Fixing error
NicoMolinaOZ Dec 12, 2025
04e0282
fix: Fixing docker compose
NicoMolinaOZ Dec 12, 2025
ffb4f24
fix: API_KEY improvements
NicoMolinaOZ Dec 15, 2025
c54455d
chore: Codecov fix
NicoMolinaOZ Dec 15, 2025
55f3634
chore: Fix integratio test yaml file
NicoMolinaOZ Dec 15, 2025
abb788d
fix: Improving registry logic to be branch agnostic
NicoMolinaOZ Dec 15, 2025
34729c6
fix: Creating configs files
NicoMolinaOZ Dec 15, 2025
f702eb8
fix: Fixing workflow
NicoMolinaOZ Dec 15, 2025
3432043
fix: Fixing config example
NicoMolinaOZ Dec 15, 2025
fd62d85
fix: Re-organizing folder structure
NicoMolinaOZ Dec 15, 2025
76bff59
fix: Fixing config files
NicoMolinaOZ Dec 15, 2025
7450f72
fix: Removing tags and fixing workflow
NicoMolinaOZ Dec 15, 2025
2b8ac7a
feat: Adding basic tests for apis
NicoMolinaOZ Dec 15, 2025
5685ac9
fix: Trigger tests manually
NicoMolinaOZ Dec 15, 2025
a226ce9
feat: Adding local node with Anvil
NicoMolinaOZ Dec 17, 2025
4ba39a0
fix: Improvements
NicoMolinaOZ Dec 17, 2025
9d61a6b
chore: Merge main
NicoMolinaOZ Dec 17, 2025
0aab7a1
chore: Renaming file
NicoMolinaOZ Dec 17, 2025
4acb583
chore: Merge from parent
NicoMolinaOZ Dec 17, 2025
1b44e5e
fix: Fixing integration test workflow
NicoMolinaOZ Dec 17, 2025
a095dea
fix: Fix CI workflow
NicoMolinaOZ Dec 17, 2025
73d77f7
fix: Coderabbit suggestions
NicoMolinaOZ Dec 17, 2025
a010c99
fix: Improvements
NicoMolinaOZ Dec 17, 2025
99ba00d
fix: Fix workflow
NicoMolinaOZ Dec 17, 2025
ef9df12
fix: Fix codecov
NicoMolinaOZ Dec 17, 2025
b7f85f9
chore: Merge main
NicoMolinaOZ Dec 18, 2025
95d5fe1
chore: Improving anvil local script
NicoMolinaOZ Dec 18, 2025
1893244
chore: README improvements
NicoMolinaOZ Dec 18, 2025
d4d13ef
chore: README fix
NicoMolinaOZ Dec 18, 2025
d00d6de
chore: README fix
NicoMolinaOZ Dec 18, 2025
f81e172
chore: Fix gitignore file
NicoMolinaOZ Dec 18, 2025
82e7afa
refactor: Reading active relayers from API
NicoMolinaOZ Dec 18, 2025
57e8ea6
fix: Config files
NicoMolinaOZ Dec 18, 2025
02d65a9
fix: Docker optimisation
NicoMolinaOZ Dec 18, 2025
73000cb
chore: Removing contract no longer needed
NicoMolinaOZ Dec 22, 2025
9e2e766
fix: Applying suggestions
NicoMolinaOZ Dec 22, 2025
4372c78
fix: Fix workflow
NicoMolinaOZ Dec 22, 2025
42f4a60
fix: Fix readme about anvil pk
NicoMolinaOZ Dec 22, 2025
746564b
fix: Fix readme
NicoMolinaOZ Dec 22, 2025
7a48e4b
fix: Improvements
NicoMolinaOZ Dec 22, 2025
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
17 changes: 16 additions & 1 deletion .env.integration.example
Original file line number Diff line number Diff line change
@@ -1,23 +1,38 @@
# Integration Test Environment Variables
# Copy this file to .env.integration and fill in your values

# ==============================================================================
# Test Mode Configuration
# ==============================================================================

# MODE=local # Use Anvil (default, no testnet funds needed)
# MODE=testnet # Use live testnets

# ==============================================================================
# Required Variables
# ==============================================================================

# API key for the relayer service
# Local mode: any value works (e.g., "local-test-key")
# Testnet mode: valid API key required
API_KEY=your-api-key-here

# Keystore passphrase for local signer
# Local mode: empty (Anvil account has no passphrase)
# Testnet mode: your keystore passphrase (not needed if using KMS)
KEYSTORE_PASSPHRASE=your-keystore-passphrase-here

# Use KMS signers instead of local keystore files
# Set to "true" to skip keystore file checks in testnet mode
# USE_KMS=true

# Webhook signing key (can be any UUID)
WEBHOOK_SIGNING_KEY=your-webhook-signing-key-here

# ==============================================================================
# Network Selection
# ==============================================================================
# Network selection is controlled via tests/integration/registry.json
# Network selection is controlled via tests/integration/config/registry.json
# Enable/disable networks by setting "enabled": true/false in registry.json

# ==============================================================================
Expand Down
19 changes: 9 additions & 10 deletions .github/workflows/integration-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,23 +28,22 @@ jobs:
- name: Create integration test config
run: |
cat > .env.integration << EOF
MODE=testnet
API_KEY=${{ secrets.INTEGRATION_TESTS_API_KEY }}
LOG_LEVEL=info
USE_KMS=true
AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}
AWS_REGION=${{ vars.AWS_REGION_KMS_KEY }}
EOF
- name: Create config files from examples
- name: Inject config files
env:
AWS_KMS_REGION: ${{ vars.AWS_REGION_KMS_KEY }}
AWS_KMS_KEY_ID: ${{ secrets.TESTNET_AWS_KMS_KEY_ID }}
run: |
cp tests/integration/config/config.example.json tests/integration/config/config.json
cp tests/integration/config/registry.example.json tests/integration/config/registry.json
- name: Inject AWS KMS signer config
run: |
jq --arg region "${{ vars.AWS_REGION_KMS_KEY }}" \
--arg key_id "${{ secrets.TESTNET_AWS_KMS_KEY_ID }}" \
'.signers = [{"id": "local-signer", "type": "aws_kms", "config": {"region": $region, "key_id": $key_id}}]' \
tests/integration/config/config.json > tests/integration/config/config.tmp.json && \
mv tests/integration/config/config.tmp.json tests/integration/config/config.json
mkdir -p tests/integration/config/testnet
echo '${{ vars.INTEGRATION_CONFIG_JSON }}' | envsubst > tests/integration/config/testnet/config.json
echo '${{ vars.INTEGRATION_REGISTRY_JSON }}' > tests/integration/config/testnet/registry.json
- name: Run Integration Tests
run: ./scripts/run-integration-docker.sh
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,16 @@ tests/integration/config/keys/*.json
tests/integration/config/config.json
tests/integration/config/registry.json

# Local Anvil keystore
tests/integration/config/local/keys/*.json
!tests/integration/config/local/keys/.gitkeep

# Standalone config (auto-generated)
tests/integration/config/local-standalone/

# Testnet configs
tests/integration/config/testnet/

!examples/**/*.json


Expand Down
11 changes: 2 additions & 9 deletions Dockerfile.integration
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,10 @@ WORKDIR /app
# Copy manifests
COPY Cargo.toml Cargo.lock ./

# Create dummy source to cache dependencies
RUN mkdir -p src/bin tests/integration && \
echo "fn main() {}" > src/bin/dummy.rs && \
echo "#[test] fn dummy() {}" > tests/integration.rs

# Build dependencies (this layer will be cached)
# Fetch dependencies (this layer will be cached)
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git \
--mount=type=cache,target=/app/target \
cargo build --features integration-tests --test integration --release 2>/dev/null || true && \
rm -rf src tests
cargo fetch --locked

# Copy actual source
COPY src ./src
Expand Down
43 changes: 43 additions & 0 deletions Makefile.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,46 @@ script = [
"chmod +x ./scripts/docker_compose.sh",
"./scripts/docker_compose.sh down"
]

[tasks.integration-test-local]
description = "Run integration tests against local standalone Anvil"
env = { "TEST_REGISTRY_PATH" = "tests/integration/config/local-standalone/registry.json" }
command = "cargo"
args = ["test", "--features", "integration-tests", "--test", "integration"]

[tasks.integration-test-standalone]
description = "Start Anvil if needed, check relayer, then run integration tests"
script = '''
#!/bin/bash
set -e

# Check if Anvil is running, start if not
if ! docker ps --format '{{.Names}}' | grep -q "^standalone-anvil$"; then
echo "🔧 Anvil not running, starting it..."
./scripts/anvil-local.sh start
echo ""
fi

# Load API_KEY from .env if it exists
if [ -f .env ]; then
export $(grep -v '^#' .env | grep API_KEY | xargs)
fi

# Check if relayer is running (health endpoint)
if ! curl -s -f -H "Authorization: Bearer ${API_KEY}" http://localhost:8080/api/v1/health > /dev/null 2>&1; then
echo "❌ Relayer not running!"
echo ""
echo "Please start the relayer in another terminal:"
echo " cargo run"
echo ""
echo "Then re-run: cargo make integration-test-standalone"
exit 1
fi

echo "✅ Anvil running, relayer healthy. Running tests..."
echo ""

# Run tests
TEST_REGISTRY_PATH=tests/integration/config/local-standalone/registry.json \
cargo test --features integration-tests --test integration
'''
16 changes: 16 additions & 0 deletions config/networks/local-anvil-docker.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"networks": [
{
"type": "evm",
"network": "localhost-anvil-docker",
"chain_id": 31337,
"required_confirmations": 1,
"symbol": "ETH",
"rpc_urls": ["http://anvil:8545"],
"explorer_urls": [],
"average_blocktime_ms": 1000,
"is_testnet": true,
"features": ["eip1559"]
}
]
}
16 changes: 16 additions & 0 deletions config/networks/local-anvil.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"networks": [
{
"type": "evm",
"network": "localhost-anvil",
"chain_id": 31337,
"required_confirmations": 1,
"symbol": "ETH",
"rpc_urls": ["http://localhost:8545"],
"explorer_urls": [],
"average_blocktime_ms": 1000,
"is_testnet": true,
"features": ["eip1559"]
}
]
}
34 changes: 33 additions & 1 deletion docker-compose.integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,33 @@ services:
timeout: 2s
retries: 5
start_period: 5s
anvil:
profiles:
- local
image: ghcr.io/foundry-rs/foundry:stable
container_name: integration-anvil
entrypoint: ''
command:
- sh
- -c
- anvil --host 0.0.0.0 --chain-id 31337 --block-time 1
ports:
- 0.0.0.0:8545:8545
networks:
- integration
volumes:
- ./tests/integration/contracts:/contracts:ro
healthcheck:
test:
- CMD
- cast
- client
- --rpc-url
- http://localhost:8545
interval: 2s
timeout: 2s
retries: 10
start_period: 3s
relayer:
build:
context: .
Expand All @@ -24,6 +51,9 @@ services:
depends_on:
redis:
condition: service_healthy
anvil:
condition: service_healthy
required: false # Only when local profile is active, but we handle startup order in script
ports:
- 8080:8080
networks:
Expand All @@ -37,7 +67,7 @@ services:
# This filters out verbose OpenTelemetry traces
- RUST_LOG=warn,openzeppelin_relayer=warn,actix_web=warn,tracing_actix_web=error
volumes:
- ./tests/integration/config:/app/config:ro
- ${CONFIG_SOURCE:-./tests/integration/config/local}:/app/config:ro
- ./config/networks:/app/networks:ro
healthcheck:
test:
Expand Down Expand Up @@ -66,6 +96,8 @@ services:
# Test logging configuration
# Default to INFO level for clean output, can be overridden with RUST_LOG
- RUST_LOG=${RUST_LOG:-info}
# Test registry path (tests discover relayers via API)
- TEST_REGISTRY_PATH=${TEST_REGISTRY_PATH:-tests/integration/config/registry.json}
volumes:
- ./tests/integration/config:/app/config:ro
- ./config/networks:/app/networks:ro
Expand Down
Loading