Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
31d6f89
PQC test commit 1
decoder37 May 22, 2026
d3ae62b
Fix canEncrypt bug in Go metadata
decoder37 May 23, 2026
df5bb83
Signed-off-by: notquiteog <flamingmilkman@gmail.com>
decoder37 May 23, 2026
cfe5a64
Add PQC build workflows for all platforms + WASM entry point + PQC tests
decoder37 May 23, 2026
b4aec14
chore: rebuild WASM with PQC support
github-actions[bot] May 23, 2026
0966ebb
chore: rebuild macOS dylib with PQC support (universal)
github-actions[bot] May 23, 2026
bc36f7c
chore: rebuild Linux native libs with PQC support
github-actions[bot] May 23, 2026
1f3b5da
chore: rebuild Android native libs with PQC support (all ABIs)
github-actions[bot] May 23, 2026
4eb29e0
Fix CI push race and iOS xcframework build path
decoder37 May 23, 2026
ce9874c
chore: rebuild Windows DLL with PQC support (MLDSA/MLKEM)
github-actions[bot] May 23, 2026
156132b
Fix commit job push race in build_native_libs.yml
decoder37 May 23, 2026
bb374fa
chore: rebuild all native libs with PQC support (MLDSA/MLKEM)
github-actions[bot] May 23, 2026
68b2f77
chore: rebuild Windows DLL with PQC support (MLDSA/MLKEM)
github-actions[bot] May 23, 2026
dd1238d
Signed-off-by: notquiteog <flamingmilkman@gmail.com>
decoder37 May 23, 2026
81e2d66
chore: rebuild Windows DLL with PQC support (MLDSA/MLKEM)
github-actions[bot] May 23, 2026
00aaa04
chore: rebuild all native libs with PQC support (MLDSA/MLKEM)
github-actions[bot] May 23, 2026
6132f84
fix: copy FFI response buffer before freeing C memory
decoder37 May 23, 2026
ba95713
fix: update deps, fix Linux tests, migrate Android to built-in Kotlin
decoder37 May 23, 2026
76f4624
fix: correct android/build.gradle plugin block order and CI exit-code…
decoder37 May 23, 2026
ca4e51e
fix: capture flutter test output with || true to handle Flutter 3.44 …
decoder37 May 23, 2026
d3f2eec
fix: MLKEM768X25519 V6Keys, Android file-based output, Windows exit 0…
decoder37 May 23, 2026
4640eb4
chore: rebuild Windows DLL with PQC support (MLDSA/MLKEM)
github-actions[bot] May 23, 2026
ef7eb90
chore: rebuild all native libs with PQC support (MLDSA/MLKEM)
github-actions[bot] May 23, 2026
50ea470
fix: map MLKEM algo constants to correct MLDSA composite configs
decoder37 May 23, 2026
b47c438
chore: rebuild Windows DLL with PQC support (MLDSA/MLKEM)
github-actions[bot] May 23, 2026
fc638db
fix: resolve macOS integration test lib path + build verify SIGPIPE
decoder37 May 23, 2026
1c38287
chore: rebuild all native libs with PQC support (MLDSA/MLKEM)
github-actions[bot] May 23, 2026
fa4ba19
fix: Android KGP/JVM + macOS dylib embed + browser build verify
decoder37 May 23, 2026
6d6919b
fix: macOS dylib install name + embed; suppress Node.js 20 warnings
decoder37 May 23, 2026
8993090
chore: rebuild all native libs with PQC support (MLDSA/MLKEM)
github-actions[bot] May 23, 2026
6753a29
fix: ad-hoc codesign embedded libopenpgp_bridge.dylib on macOS
decoder37 May 23, 2026
7dafac0
fix: foreground macOS app in CI so CVDisplayLink pumps frames
decoder37 May 23, 2026
25af3c6
fix: correct macOS window activation order; pin iOS simulator model
decoder37 May 23, 2026
d04d776
ci: switch macOS tests to macos-14 (Sonoma)
decoder37 May 23, 2026
ba29506
chore: upgrade example transitive dependencies
decoder37 May 23, 2026
9bf9536
chore: consolidate Windows DLL build into unified native libs workflo…
decoder37 May 23, 2026
3e71926
chore: bump version to 3.11.0
decoder37 May 23, 2026
15f4e42
chore: rebuild all native libs with PQC support (MLDSA/MLKEM)
github-actions[bot] May 23, 2026
dcdd0c2
chore: add 3.11.0 changelog entry
decoder37 May 23, 2026
9147e56
ci: fix release permissions; remove pub.dev publish workflow
decoder37 May 23, 2026
63762c2
Signed-off-by: notquiteog <flamingmilkman@gmail.com>
decoder37 May 24, 2026
b507778
pubspec
decoder37 May 24, 2026
cbcd081
chore: rebuild all native libs with PQC support (MLDSA/MLKEM)
github-actions[bot] May 24, 2026
8357346
Signed-off-by: notquiteog <flamingmilkman@gmail.com>
decoder37 May 25, 2026
3a41e46
Merge branch 'master' of https://github.com/notquiteog/flutter-openpgp
decoder37 May 25, 2026
bf51e8c
Signed-off-by: notquiteog <flamingmilkman@gmail.com>
decoder37 May 25, 2026
3c7aa13
fix: iOS CI, memory leaks, callAsync timeout, cross-allocator free
decoder37 May 27, 2026
0d32bcf
chore: bump version to 3.11.2
decoder37 May 27, 2026
b8453d2
chore: rebuild all native libs with PQC support (MLDSA/MLKEM)
github-actions[bot] May 27, 2026
306ee9c
feat: add Swift Package Manager support for iOS and macOS
decoder37 May 29, 2026
504e715
fix(spm): check out into openpgp/ for SPM CI to match package identity
decoder37 May 29, 2026
8644180
ci: pin iOS simulator by UDID and stream test output across workflows
decoder37 May 29, 2026
fbd5578
ci(ios): add --verbose to SPM integration test to diagnose post-build…
decoder37 May 29, 2026
07dc281
ci(ios): dump crash reports and device syslog when SPM job fails
decoder37 May 29, 2026
67d2cd2
ci(ios): validate SPM via simulator build instead of integration_test
decoder37 May 29, 2026
a6bf2e1
ci(native): fix iOS xcframework path and commit macOS SPM xcframework
decoder37 May 29, 2026
5673ff1
chore: rebuild all native libs with PQC support (MLDSA/MLKEM)
github-actions[bot] May 29, 2026
d779ce1
ci(ios): restore SPM integration test; retry past VM Service flake
decoder37 May 29, 2026
fe9ac7a
fix(ios/spm): export OpenPGPBridgeCall so DynamicLibrary.process() fi…
decoder37 May 29, 2026
e042cb8
feat(ios/macos)!: distribute via Swift Package Manager only
decoder37 May 29, 2026
bd09068
fix(ios/spm): retain OpenPGPBridgeCall via public static (dlsym still…
decoder37 May 29, 2026
c06a571
ci(ios): ASCII-only test-result matching; drop diagnostic --verbose
decoder37 May 29, 2026
2278938
ci(ios): reduce retry per-attempt timeout to 7 minutes
decoder37 May 29, 2026
87c4441
chore: rebuild all native libs with PQC support (MLDSA/MLKEM)
github-actions[bot] May 29, 2026
73d59e8
chore: release 3.12.1 - update CI runner actions and Flutter to 3.44.0
decoder37 May 29, 2026
b4e176f
ci: bump checkout to v6.0.2, fix iOS sim selection, real web tests, a…
decoder37 May 29, 2026
ee2d6fe
chore(example): remove CocoaPods integration (SPM-only)
github-actions[bot] May 29, 2026
980debe
chore(example): drop dangling Pods.xcodeproj workspace refs
decoder37 May 29, 2026
48011ed
test(example): skip Generate integration test on web
decoder37 May 29, 2026
c1a252c
chore: release 3.12.2
decoder37 May 29, 2026
d5079b7
fix(example): use EdDSA+ECDH keygen; restore web Generate test; drop …
decoder37 May 30, 2026
06540f4
fix(ci): iOS retry on hang, web WASM timeout 120s, browser failure grep
decoder37 May 30, 2026
223ddeb
ci: timeout-minutes: 30 on every job; iOS per-attempt timeout 7 min
decoder37 May 30, 2026
853430b
fix(ci): run browser integration tests in profile mode
decoder37 May 30, 2026
8c62201
fix(ci/web): revert --profile, re-add skip:kIsWeb for Generate
decoder37 May 30, 2026
36481f7
chore: release 3.12.3
decoder37 May 30, 2026
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
428 changes: 428 additions & 0 deletions .github/workflows/build_native_libs.yml

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion .github/workflows/example-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,15 @@ on:
tags:
- 'v*'

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
web:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6.0.2
- uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
Expand Down
12 changes: 0 additions & 12 deletions .github/workflows/pub.yml

This file was deleted.

8 changes: 7 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,17 @@ on:
tags:
- 'v*'

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
build:
runs-on: ubuntu-24.04
timeout-minutes: 30
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6.0.2
- uses: softprops/action-gh-release@v2
if: github.ref_type == 'tag'
with:
Expand Down
18 changes: 14 additions & 4 deletions .github/workflows/tests_android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,23 @@ on:
tags:
- 'v*'

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
e2e:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6.0.2
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '24'
- uses: android-actions/setup-android@v3
- uses: subosito/flutter-action@main
- uses: subosito/flutter-action@v2
with:
flutter-version: '3.x'
flutter-version: '3.44.0'
channel: 'stable'
- run: flutter pub get
- name: Enable KVM
Expand All @@ -32,4 +36,10 @@ jobs:
api-level: 33
arch: x86_64
disable-animations: true
script: "cd example && flutter test integration_test/app_test.dart"
script: |
# Stream output via tee so progress is visible live and a hang is not a
# blind timeout; grep the captured copy to decide pass/fail.
cd example && flutter test integration_test/app_test.dart 2>&1 | tee /tmp/flutter_out.txt || true
grep -qE 'Some tests failed|❌' /tmp/flutter_out.txt && echo 'Integration tests failed' && exit 1 || true
grep -qE 'tests passed|🎉' /tmp/flutter_out.txt || { echo 'No tests ran successfully'; exit 1; }
echo 'All integration tests passed'
57 changes: 42 additions & 15 deletions .github/workflows/tests_browser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,52 @@ name: Integration Tests Browser

on:
workflow_dispatch:
# Web devices are not supported for integration tests yet.
#pull_request:
#push:
# tags:
# - 'v*'
pull_request:
push:
tags:
- 'v*'

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
e2e:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@main
- uses: actions/checkout@v6.0.2
# Provides a chromedriver matching the runner's preinstalled Chrome, which
# flutter drive needs to run integration tests against headless Chrome.
- uses: nanasess/setup-chromedriver@v2.4.0
- uses: subosito/flutter-action@v2
with:
flutter-version: '3.x'
flutter-version: '3.44.0'
channel: 'stable'
- uses: nanasess/setup-chromedriver@master
- run: |
export DISPLAY=:99
chromedriver --port=4444 --url-base=/wd/hub &
sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 & # optional
- run: flutter pub get
- run: "cd example && flutter test -d chrome integration_test/app_test.dart"
- name: install deps
run: |
flutter config --enable-web
flutter pub get
- name: Run integration tests
run: |
cd example
# chromedriver drives a headless Chrome; wait for it to accept requests
# before launching the test so flutter drive does not race startup.
chromedriver --port=4444 &
for i in $(seq 1 15); do curl -sf http://localhost:4444/status >/dev/null && break; sleep 1; done
# Stream output via tee so progress is visible live and a hang is not a
# blind timeout; grep the captured copy to decide pass/fail. Same shape as
# the other platform workflows. -d web-server runs Chrome headless.
flutter drive \
--driver=test_driver/integration_test.dart \
--target=integration_test/app_test.dart \
-d web-server \
--browser-name=chrome 2>&1 | tee /tmp/flutter_out.txt || true
# flutter drive reports failures as "Failure Details:" / "Failure in
# method:" rather than outputting ❌, so check both formats.
if grep -qE 'Some tests failed|❌|Failure Details:|Failure in method:' /tmp/flutter_out.txt; then
echo 'Integration tests failed'; exit 1
fi
if ! grep -qE 'tests passed|🎉' /tmp/flutter_out.txt; then
echo 'No tests ran successfully'; exit 1
fi
echo 'All integration tests passed'
78 changes: 70 additions & 8 deletions .github/workflows/tests_ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,82 @@ on:
tags:
- 'v*'

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
# The plugin is Swift Package Manager only. The repo is checked out into a
# directory named after the plugin ("openpgp") because Flutter's SPM integration
# derives the plugin's SwiftPM package identity from the Dart package root's
# directory basename, which must equal the plugin name (the repo is
# "flutter-openpgp"). Hosted (pub.dev) consumers are unaffected.
e2e:
runs-on: macos-latest
runs-on: macos-14
timeout-minutes: 30
defaults:
run:
working-directory: openpgp
steps:
- uses: futureware-tech/simulator-action@v1
- uses: actions/checkout@v6.0.2
with:
path: openpgp
# The runner ships several iOS runtimes, so "iPhone 16" alone matches more
# than one device and simulator-action just warns and picks an arbitrary one.
# Resolve the newest installed iOS runtime and take its iPhone (preferring
# iPhone 16) so we deterministically test on the latest available iOS.
- name: Select latest iOS simulator
id: simselect
run: |
udid=$(xcrun simctl list devices available --json | jq -r '
.devices
| to_entries
| map(select(.key | test("SimRuntime.iOS-[0-9]")))
| sort_by(.key | capture("iOS-(?<a>[0-9]+)-(?<b>[0-9]+)") | [(.a|tonumber), (.b|tonumber)])
| last.value
| (map(select(.name == "iPhone 16")) + map(select(.name | test("iPhone"))))
| .[0].udid // empty')
if [ -z "$udid" ]; then
echo "No available iOS iPhone simulator found:"; xcrun simctl list devices available; exit 1
fi
echo "Selected simulator:"; xcrun simctl list devices available | grep -i "$udid" || true
echo "udid=$udid" >> "$GITHUB_OUTPUT"
- uses: futureware-tech/simulator-action@v5
with:
os: iOS
- uses: actions/checkout@v4
- uses: subosito/flutter-action@main
udid: ${{ steps.simselect.outputs.udid }}
# Block until the simulator is fully booted so the flutter attach below
# does not race a half-booted device (a known trigger for the VM Service
# hang, flutter/flutter#160930).
wait_for_boot: true
- uses: subosito/flutter-action@v2
with:
flutter-version: '3.x'
flutter-version: '3.44.0'
channel: 'stable'
- name: install deps
run: |
flutter config --enable-swift-package-manager
flutter pub get
cd example/ios && pod install
- run: "cd example && flutter test integration_test/app_test.dart"
- name: Run integration tests
run: |
cd example
# iOS integration tests occasionally hang on the VM-Service connection
# (flutter/flutter#160930). Retry up to 3 times with a 15-minute cap per
# attempt; only retry on a hang (no output patterns matched), never on a
# genuine test failure.
for attempt in 1 2 3; do
rm -f /tmp/flutter_out.txt
timeout 420 flutter test -d "${{ steps.simselect.outputs.udid }}" \
integration_test/app_test.dart 2>&1 | tee /tmp/flutter_out.txt || true
if grep -qE 'tests passed|🎉' /tmp/flutter_out.txt; then
echo 'All integration tests passed'
exit 0
fi
if grep -qE 'Some tests failed|❌' /tmp/flutter_out.txt; then
echo 'Integration tests failed'
exit 1
fi
if [ "$attempt" -lt 3 ]; then
echo "Attempt $attempt: no test output detected (likely VM-Service hang), retrying..."
fi
done
echo 'All 3 attempts produced no test output (persistent VM-Service hang)'
exit 1
27 changes: 21 additions & 6 deletions .github/workflows/tests_linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,35 @@ on:
tags:
- 'v*'

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
e2e:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@main
- uses: actions/checkout@v6.0.2
- uses: subosito/flutter-action@v2
with:
flutter-version: '3.x'
flutter-version: '3.44.0'
channel: 'stable'
- run: sudo apt-get update && sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-dev
- name: install deps
run: |
flutter config --enable-linux-desktop
flutter pub get
- run: sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
- run: "cd example && DISPLAY=:99 flutter test -d linux integration_test/app_test.dart"
- run: "cd example && flutter test test/app_test.dart"
- name: Run integration tests
run: |
cd example
# Stream output via tee so progress is visible live and a hang is not a
# blind timeout; grep the captured copy to decide pass/fail.
xvfb-run flutter test -d linux integration_test/app_test.dart 2>&1 | tee /tmp/flutter_out.txt || true
if grep -qE 'Some tests failed|❌' /tmp/flutter_out.txt; then
echo 'Integration tests failed'; exit 1
fi
if ! grep -qE 'tests passed|🎉' /tmp/flutter_out.txt; then
echo 'No tests ran successfully'; exit 1
fi
echo 'All integration tests passed'
Comment thread
coderabbitai[bot] marked this conversation as resolved.
- run: "cd example && flutter test test/app_test.dart"
38 changes: 32 additions & 6 deletions .github/workflows/tests_macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,45 @@ on:
tags:
- 'v*'

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
# Swift Package Manager only. Checked out into a directory named after the plugin
# ("openpgp") so Flutter's SPM package identity (derived from the Dart package
# root basename) matches the plugin name. Uses the committed
# macos/openpgp/OpenPGPBridge.xcframework (built from the dylib by
# build_native_libs), i.e. exactly what hosted consumers resolve.
e2e:
runs-on: macos-latest
runs-on: macos-14
timeout-minutes: 30
defaults:
run:
working-directory: openpgp
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@main
- uses: actions/checkout@v6.0.2
with:
path: openpgp
- uses: subosito/flutter-action@v2
with:
flutter-version: '3.x'
flutter-version: '3.44.0'
channel: 'stable'
- name: install deps
run: |
flutter config --enable-macos-desktop
flutter config --enable-swift-package-manager
flutter pub get
cd example/macos && pod install
- run: "cd example && flutter test -d macos integration_test/app_test.dart"
- name: Run integration tests
run: |
cd example
# Stream output via tee so progress is visible live and a hang is not a
# blind timeout; grep the captured copy to decide pass/fail.
flutter test -d macos integration_test/app_test.dart 2>&1 | tee /tmp/flutter_out.txt || true
if grep -qE 'Some tests failed|❌' /tmp/flutter_out.txt; then
echo 'Integration tests failed'; exit 1
fi
if ! grep -qE 'tests passed|🎉' /tmp/flutter_out.txt; then
echo 'No tests ran successfully'; exit 1
fi
echo 'All integration tests passed'
- run: "cd example && flutter test test/app_test.dart"
24 changes: 19 additions & 5 deletions .github/workflows/tests_windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,32 @@ on:
tags:
- 'v*'

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
e2e:
runs-on: windows-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@main
- uses: actions/checkout@v6.0.2
- uses: subosito/flutter-action@v2
with:
flutter-version: '3.x'
flutter-version: '3.44.0'
channel: 'stable'
- name: install deps
run: |
flutter config --enable-windows-desktop
flutter pub get
- run: "cd example && flutter test -d windows integration_test/app_test.dart"
- run: "cd example && flutter test test/app_test.dart"
- name: Run integration tests
run: |
cd example
# Stream output via Tee-Object so progress is visible live and a hang is
# not a blind timeout; read the captured copy to decide pass/fail.
flutter test -d windows integration_test/app_test.dart 2>&1 | Tee-Object -FilePath flutter_out.txt
$output = Get-Content flutter_out.txt -Raw
if ($output -match '❌') { Write-Host 'Integration tests failed'; exit 1 }
if ($output -notmatch '🎉|tests passed') { Write-Host 'No tests ran successfully'; exit 1 }
Write-Host 'All integration tests passed'
exit 0
- run: "cd example && flutter test test/app_test.dart"
Loading
Loading