Skip to content
Closed
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
222 changes: 222 additions & 0 deletions .github/workflows/test-submodules.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
name: Test Submodules for Breaking Changes

on:
workflow_dispatch:
inputs:
submodule_name:
description: 'Submodule to test (leave empty to test all)'
required: false
type: choice
options:
- 'all'
- 'ruby-v2-server/local-ruby-sdk'
- 'ruby-v3-server/local-ruby-sdk'
- 'php-v2-server/local-php-sdk'
- 'php-v3-server/local-php-sdk'
- 'java-v3-transition-server/s3ec-staging'
- 'java-v4-server/s3ec-staging'
default: 'all'
ruby_v2_branch:
description: 'Branch for ruby-v2-server/local-ruby-sdk (default: main)'
required: false
type: string
default: ''
ruby_v3_branch:
description: 'Branch for ruby-v3-server/local-ruby-sdk (default: main)'
required: false
type: string
default: ''
php_v2_branch:
description: 'Branch for php-v2-server/local-php-sdk (default: s3ec/transitional)'
required: false
type: string
default: ''
php_v3_branch:
description: 'Branch for php-v3-server/local-php-sdk (default: s3ec/improved)'
required: false
type: string
default: ''
java_v3_transition_branch:
description: 'Branch for java-v3-transition-server/s3ec-staging (default: s3ec/transitional)'
required: false
type: string
default: ''
java_v4_branch:
description: 'Branch for java-v4-server/s3ec-staging (default: s3ec/improved)'
required: false
type: string
default: ''

jobs:
test-submodules:
runs-on: macos-13
permissions:
id-token: write
contents: read

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: true
token: ${{ secrets.PAT_FOR_PRIVATE_RUBY }}

- name: Update submodules to target branches
run: |
echo "## Submodule Update Summary" >> $GITHUB_STEP_SUMMARY
echo "Updating submodules to target branches..." >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY

# Determine target branches for each submodule (use input or default from .gitmodules)
ruby_v2_target="${{ inputs.ruby_v2_branch }}"
if [ -z "$ruby_v2_target" ]; then
ruby_v2_target="main" # Default branch for ruby submodules (no branch specified in .gitmodules)
fi

ruby_v3_target="${{ inputs.ruby_v3_branch }}"
if [ -z "$ruby_v3_target" ]; then
ruby_v3_target="main" # Default branch for ruby submodules (no branch specified in .gitmodules)
fi

php_v2_target="${{ inputs.php_v2_branch }}"
if [ -z "$php_v2_target" ]; then
php_v2_target="s3ec/transitional" # Default from .gitmodules
fi

php_v3_target="${{ inputs.php_v3_branch }}"
if [ -z "$php_v3_target" ]; then
php_v3_target="s3ec/improved" # Default from .gitmodules
fi

java_v3_transition_target="${{ inputs.java_v3_transition_branch }}"
if [ -z "$java_v3_transition_target" ]; then
java_v3_transition_target="s3ec/transitional" # Default from .gitmodules
fi

java_v4_target="${{ inputs.java_v4_branch }}"
if [ -z "$java_v4_target" ]; then
java_v4_target="s3ec/improved" # Default from .gitmodules
fi

# Function to update a submodule if it should be tested
update_submodule() {
local submodule_name="$1"
local submodule_path="$2"
local target_branch="$3"

if [ "${{ inputs.submodule_name }}" = "all" ] || [ "${{ inputs.submodule_name }}" = "$submodule_name" ]; then
echo "Updating $submodule_name to branch: $target_branch"
echo "- **$submodule_name**: $target_branch" >> $GITHUB_STEP_SUMMARY

cd "$submodule_path"
current_commit=$(git rev-parse HEAD)
echo " Current commit: $current_commit"

git fetch origin "$target_branch"
git checkout "$target_branch"
git pull origin "$target_branch"
new_commit=$(git rev-parse HEAD)
echo " Updated to commit: $new_commit"

cd - > /dev/null
fi
}

# Update submodules based on selection
update_submodule "ruby-v2-server/local-ruby-sdk" "test-server/ruby-v2-server/local-ruby-sdk" "$ruby_v2_target"
update_submodule "ruby-v3-server/local-ruby-sdk" "test-server/ruby-v3-server/local-ruby-sdk" "$ruby_v3_target"
update_submodule "php-v2-server/local-php-sdk" "test-server/php-v2-server/local-php-sdk" "$php_v2_target"
update_submodule "php-v3-server/local-php-sdk" "test-server/php-v3-server/local-php-sdk" "$php_v3_target"
update_submodule "java-v3-transition-server/s3ec-staging" "test-server/java-v3-transition-server/s3ec-staging" "$java_v3_transition_target"
update_submodule "java-v4-server/s3ec-staging" "test-server/java-v4-server/s3ec-staging" "$java_v4_target"

echo "" >> $GITHUB_STEP_SUMMARY
echo "All specified submodules have been updated." >> $GITHUB_STEP_SUMMARY

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.4'

- name: Set up PHP with Composer
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'

- name: Install PHP V2 dependencies
working-directory: ./test-server/php-v2-server
shell: bash
run: composer install

- name: Install PHP V3 dependencies
working-directory: ./test-server/php-v3-server
shell: bash
run: composer install

- name: Install Go
uses: actions/setup-go@v5
with:
go-version: 1.25

# Cache uv dependencies
- name: Cache uv dependencies
uses: actions/cache@v3
with:
path: ~/.cache/uv
key: ${{ runner.os }}-uv-${{ hashFiles('**/pyproject.toml') }}
restore-keys: |
${{ runner.os }}-uv-

- name: Install Uv
run: pip install uv

# Cache Gradle dependencies and build outputs
- name: Cache Gradle packages
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
test-server/java-v3-server/.gradle
test-server/java-tests/.gradle
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: Install dependencies
run: make install

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::370957321024:role/S3EC-Python-Github-test-role
aws-region: us-west-2

- name: Run unit tests
run: make test-unit

- name: Run integration tests
run: make test-integration
env:
CI_S3_BUCKET: ${{ vars.CI_S3_BUCKET }}
CI_KMS_KEY_ALIAS: ${{ vars.CI_KMS_KEY_ALIAS }}

- name: Run test-server tests
run: cd test-server && make ci
env:
AWS_REGION: us-west-2
TEST_SERVER_S3_BUCKET: ${{ vars.TEST_SERVER_S3_BUCKET }}
TEST_SERVER_KMS_KEY_ARN: ${{ vars.TEST_SERVER_KMS_KEY_ARN }}
GRADLE_OPTS: "-Dorg.gradle.daemon=true -Dorg.gradle.parallel=true -Dorg.gradle.caching=true"

- name: Upload results
if: always()
uses: actions/upload-artifact@v4
with:
name: submodule-test-results
path: test-server/java-tests/build/reports/tests/integ
8 changes: 8 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,11 @@
path = test-server/php-v3-server/local-php-sdk
url = git@github.com:aws/private-aws-sdk-php-staging.git
branch = s3ec/improved
[submodule "test-server/java-v3-transition-server/s3ec-staging"]
path = test-server/java-v3-transition-server/s3ec-staging
url = git@github.com:aws/private-amazon-s3-encryption-client-java-staging.git
branch = s3ec/transitional
[submodule "test-server/java-v4-server/s3ec-staging"]
path = test-server/java-v4-server/s3ec-staging
url = git@github.com:aws/private-amazon-s3-encryption-client-java-staging.git
branch = s3ec/improved
Original file line number Diff line number Diff line change
Expand Up @@ -124,13 +124,13 @@ public class TestUtils {
servers.put(RUBY_V3, new LanguageServerTarget(RUBY_V3, "8092"));
servers.put(PHP_V3, new LanguageServerTarget(PHP_V3, "8093"));
// TODO: Create and add transition servers
// servers.put(JAVA_V3_TRANSITION, new LanguageServerTarget(JAVA_V3_TRANSITION, "8094"));
servers.put(JAVA_V3_TRANSITION, new LanguageServerTarget(JAVA_V3_TRANSITION, "8094"));
// servers.put(GO_V3_TRANSITION, new LanguageServerTarget(GO_V3_TRANSITION, "8095"));
// servers.put(NET_V2_TRANSITION, new LanguageServerTarget(NET_V2_TRANSITION, "8096"));
// servers.put(CPP_V2_TRANSITION, new LanguageServerTarget(CPP_V2_TRANSITION, "8097"));
// servers.put(RUBY_V2_TRANSITION, new LanguageServerTarget(RUBY_V2_TRANSITION, "8098"));
// servers.put(PHP_V2_TRANSITION, new LanguageServerTarget(PHP_V2_TRANSITION, "8099"));

servers.put(JAVA_V4, new LanguageServerTarget(JAVA_V4, "8090"));
serverMap = filterServers(servers);
}

Expand Down
30 changes: 30 additions & 0 deletions test-server/java-v3-transition-server/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Makefile for S3 Encryption Client Testing

.PHONY: start-server stop-server wait-for-server build-s3ec

PID_FILE := server.pid
PORT := 8094

build-s3ec:
@echo "Building S3EC from source..."
cd s3ec-staging && mvn --batch-mode -no-transfer-progress clean compile
cd s3ec-staging && mvn -B -ntp install -DskipTests
@echo "S3EC build completed."

start-server: build-s3ec
@echo "Starting Java V3 server..."
AWS_ACCESS_KEY_ID="$$AWS_ACCESS_KEY_ID" \
AWS_SECRET_ACCESS_KEY="$$AWS_SECRET_ACCESS_KEY" \
AWS_SESSION_TOKEN="$$AWS_SESSION_TOKEN" \
AWS_REGION="us-west-2" \
./gradlew --build-cache --parallel run & echo $$! > $(PID_FILE)
@echo "Java V3 server starting..."

stop-server:
@if [ -f $(PID_FILE) ]; then \
kill $$(cat $(PID_FILE)) 2>/dev/null || true; \
rm $(PID_FILE); \
fi

wait-for-server:
$(MAKE) -C .. wait-for-port PORT=$(PORT)
23 changes: 23 additions & 0 deletions test-server/java-v3-transition-server/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# S3EC Java V3 Test Server

This is the Java implementation of the S3ECTestServer framework for S3EC Java V3. It provides a server implementation for testing Java S3 Encryption Client V3 functionality.

## Overview

The S3ECJavaTestServer implements the S3ECTestServer service defined in the shared Smithy model. It provides endpoints for:

- Creating S3 Encryption Clients
- Putting objects with encryption
- Getting and decrypting objects

## Usage

To run the server:

```console
gradle run
```

This will start the server running on port `8094`.

The server is used as part of the testing framework to verify cross-language compatibility of the S3 Encryption Client implementations.
55 changes: 55 additions & 0 deletions test-server/java-v3-transition-server/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
plugins {
`java-library`
id("software.amazon.smithy.gradle.smithy-base")
application
}

dependencies {
val smithyJavaVersion: String by project

smithyBuild("software.amazon.smithy.java:plugins:$smithyJavaVersion")

implementation("software.amazon.smithy:smithy-rules-engine:1.59.0")
implementation("software.amazon.smithy.java:server-netty:$smithyJavaVersion")
implementation("software.amazon.smithy.java:aws-server-restjson:$smithyJavaVersion")

// S3EC from local Maven repository (installed by mvn install)
implementation("software.amazon.encryption.s3:amazon-s3-encryption-client-java:3.4.0-SNAPSHOT")
}

// Use that application plugin to start the service via the `run` task.
application {
mainClass = "software.amazon.encryption.s3.S3ECJavaTestServer"
}

// Add generated Java files to the main sourceSet
afterEvaluate {
val serverPath = smithy.getPluginProjectionPath(smithy.sourceProjection.get(), "java-server-codegen")
sourceSets {
main {
java {
srcDir(serverPath)
}
}
}
}

tasks {
compileJava {
dependsOn(smithyBuild)
}
}

// Helps Intellij IDE's discover smithy models
sourceSets {
main {
java {
srcDir("../model")
}
}
}

repositories {
mavenLocal()
mavenCentral()
}
11 changes: 11 additions & 0 deletions test-server/java-v3-transition-server/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Smithy versions
smithyJavaVersion=[0,1]
smithyGradleVersion=1.1.0
smithyVersion=[1,2]

# Performance optimization settings
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError
org.gradle.workers.max=4
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading
Loading