Compare commits
19
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7c2282a7dd | ||
|
|
caeafb22be | ||
|
|
aac4f10d23 | ||
|
|
b7ac4f92ed | ||
|
|
3244efd366 | ||
|
|
7a05da3a35 | ||
|
|
5134e82e63 | ||
|
|
7fd93247cb | ||
|
|
a0fcede454 | ||
|
|
97eafd11fb | ||
|
|
ed7487c2b6 | ||
|
|
a2e3f11e70 | ||
|
|
c3c9bbc5ba | ||
|
|
b5683aa36a | ||
|
|
707455dcfb | ||
|
|
17ee5d6717 | ||
|
|
2295bcdbae | ||
|
|
c9bff50a1a | ||
|
|
1b3d3dd821 |
@@ -21,8 +21,14 @@ jobs:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Assert Xcode 14 toolchain
|
||||
run: xcodebuild -version | grep -E "Xcode 14." || (echo "Unexpected Xcode version" && exit 1)
|
||||
- name: Assert Xcode 14+ toolchain
|
||||
run: |
|
||||
line="$(xcodebuild -version | head -1)"
|
||||
major="$(printf '%s' "$line" | sed -n 's/^Xcode \([0-9][0-9]*\)\..*/\1/p')"
|
||||
if [ -z "$major" ] || [ "$major" -lt 14 ]; then
|
||||
echo "Unexpected Xcode version: $line" >&2; exit 1
|
||||
fi
|
||||
echo "$line"
|
||||
|
||||
# Homebrew's xcodegen formula requires Xcode 15.3, which cannot be
|
||||
# installed on macOS 12 (#109). The script installs a pinned
|
||||
@@ -45,6 +51,19 @@ jobs:
|
||||
CODE_SIGNING_ALLOWED=YES \
|
||||
CODE_SIGN_IDENTITY='-'
|
||||
|
||||
# Xcode embeds the shared ICCeryCore package framework into the app
|
||||
# and the test bundle without signing it. Ad-hoc hosts still require
|
||||
# every loaded dylib to carry a cdhash — dyld killed the test host at
|
||||
# launch (run 31992) — so sign every embedded copy once the build is
|
||||
# done (embed steps run after any build script phase) (#119).
|
||||
- name: Sign package product frameworks
|
||||
run: |
|
||||
find "$DERIVED/Build/Products/Debug" -depth -name '*_PackageProduct.framework' -print0 \
|
||||
| while IFS= read -r -d '' fw; do
|
||||
echo "signing $fw"
|
||||
codesign --force --sign - --timestamp=none "$fw"
|
||||
done
|
||||
|
||||
- name: Test unit (ICCeryCoreTests)
|
||||
run: |
|
||||
XCTESTRUN="$(find "$DERIVED" -name 'ICCery*.xctestrun' | head -n 1)"
|
||||
@@ -127,6 +146,30 @@ jobs:
|
||||
echo "warning: skipping UI tests after repeated runner attach/activate failures"
|
||||
exit 0
|
||||
|
||||
# XCTest stores the a11y hierarchy snapshot and screenshots in the
|
||||
# xcresult on failure — upload it so UI failures can be triaged
|
||||
# without access to the runner (#126).
|
||||
- name: Prepare Node CA bundle (failure path)
|
||||
if: failure()
|
||||
run: |
|
||||
NODE_CA_FILE="/tmp/macos-ca-bundle.pem"
|
||||
security find-certificate -a -p \
|
||||
/System/Library/Keychains/SystemRootCertificates.keychain \
|
||||
/Library/Keychains/System.keychain \
|
||||
> "$NODE_CA_FILE" 2>/dev/null || true
|
||||
if [ ! -s "$NODE_CA_FILE" ] && [ -f /etc/ssl/cert.pem ]; then
|
||||
cp /etc/ssl/cert.pem "$NODE_CA_FILE"
|
||||
fi
|
||||
|
||||
- name: Upload UI test xcresult
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v3
|
||||
env:
|
||||
NODE_EXTRA_CA_CERTS: /tmp/macos-ca-bundle.pem
|
||||
with:
|
||||
name: ui-test-xcresult
|
||||
path: build/DerivedData-test/Logs/Test
|
||||
|
||||
package:
|
||||
needs: build-and-test
|
||||
runs-on: macos-12
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<!-- App Sandbox intentionally absent: ICCery must spawn Argyll tools,
|
||||
read/write user-chosen working directories, and talk to lp/CUPS. -->
|
||||
<key>com.apple.security.device.usb</key>
|
||||
<true/>
|
||||
<!-- Debug only: the shared ICCeryCore package framework embedded in the
|
||||
test products is ad-hoc signed with no Team ID, so hardened-runtime
|
||||
library validation kills the test host at launch (run 31992, #119).
|
||||
Release uses ICCery.entitlements and links the package statically. -->
|
||||
<key>com.apple.security.cs.disable-library-validation</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -110,7 +110,8 @@ final class PrintSessionViewModel: ObservableObject {
|
||||
isPrinting = true
|
||||
let task = Task { @MainActor [weak self] in
|
||||
guard let self else { return }
|
||||
defer { self.printTask = nil }
|
||||
// `defer` cannot mutate isolated state under Swift 5.7
|
||||
// (Xcode 14.2 / macOS 12 runner), so clear explicitly (#113).
|
||||
var printed = 0
|
||||
for page in result.pages {
|
||||
do {
|
||||
@@ -123,6 +124,7 @@ final class PrintSessionViewModel: ObservableObject {
|
||||
+ error.localizedDescription
|
||||
)
|
||||
isPrinting = false
|
||||
self.printTask = nil
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -132,6 +134,7 @@ final class PrintSessionViewModel: ObservableObject {
|
||||
autoHideAfter: nil
|
||||
)
|
||||
isPrinting = false
|
||||
self.printTask = nil
|
||||
}
|
||||
printTask = task
|
||||
}
|
||||
@@ -141,7 +144,6 @@ final class PrintSessionViewModel: ObservableObject {
|
||||
isPrinting = true
|
||||
let task = Task { @MainActor [weak self] in
|
||||
guard let self else { return }
|
||||
defer { self.printTask = nil }
|
||||
do {
|
||||
try await spool(page, index: page.index, pageSize: pageSize)
|
||||
printNotice = Notice(
|
||||
@@ -156,6 +158,7 @@ final class PrintSessionViewModel: ObservableObject {
|
||||
)
|
||||
}
|
||||
isPrinting = false
|
||||
self.printTask = nil
|
||||
}
|
||||
printTask = task
|
||||
}
|
||||
|
||||
@@ -129,6 +129,7 @@ struct SidebarView: View {
|
||||
}
|
||||
.frame(width: Theme.Metrics.sidebarWidth)
|
||||
.background(Theme.panel)
|
||||
.accessibilityIdentifier("sidebar")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,9 @@ final class ProcessRunSupportTests: XCTestCase {
|
||||
setRunning: { running.append($0) },
|
||||
resetLog: { resets += 1 },
|
||||
onLog: { batch in
|
||||
MainActor.assertIsolated()
|
||||
// MainActor.assertIsolated() needs Swift 5.9; the runner is
|
||||
// on Xcode 14.2 (Swift 5.7) (#115).
|
||||
XCTAssertTrue(Thread.isMainThread)
|
||||
received.append(contentsOf: batch)
|
||||
}
|
||||
) { onLog in
|
||||
|
||||
@@ -46,7 +46,12 @@ final class AboutHelpUITests: XCTestCase {
|
||||
launchApp()
|
||||
|
||||
let openAbout = app.buttons["openAboutBtn"]
|
||||
XCTAssertTrue(openAbout.waitForExistence(timeout: 10))
|
||||
if !openAbout.waitForExistence(timeout: 10) {
|
||||
// CI triage (#128): print the a11y tree so an empty or
|
||||
// unexpected hierarchy shows up directly in the job log.
|
||||
print("AXTREE-BEGIN windows=\(app.windows.count)\n\(app.debugDescription)\nAXTREE-END")
|
||||
}
|
||||
XCTAssertTrue(openAbout.exists)
|
||||
openAbout.click()
|
||||
|
||||
_ = waitFor("aboutVersion", timeout: 10)
|
||||
@@ -64,7 +69,8 @@ final class AboutHelpUITests: XCTestCase {
|
||||
let toggle = app.buttons["btnToggleAllHelp"]
|
||||
XCTAssertTrue(toggle.waitForExistence(timeout: 10))
|
||||
|
||||
let sidebar = app.groups.containing(.button, identifier: "openSettingsBtn").element
|
||||
let sidebar = app.descendants(matching: .any)["sidebar"]
|
||||
XCTAssertTrue(sidebar.waitForExistence(timeout: 10))
|
||||
let before = sidebar.frame
|
||||
|
||||
toggle.click()
|
||||
|
||||
+10
@@ -19,6 +19,7 @@ targets:
|
||||
- path: Resources
|
||||
excludes:
|
||||
- ICCery.entitlements
|
||||
- ICCery.Debug.entitlements
|
||||
- Argyll
|
||||
- path: Resources/Argyll
|
||||
type: folder
|
||||
@@ -62,6 +63,15 @@ targets:
|
||||
OTHER_SWIFT_FLAGS: ["$(inherited)", "-strict-concurrency=minimal"]
|
||||
MACOSX_DEPLOYMENT_TARGET: "12.0"
|
||||
ARCHS: "$(ARCHS_STANDARD)"
|
||||
# Debug builds sign ad-hoc; hardened-runtime library validation would
|
||||
# reject the embedded ICCeryCore package framework (no Team ID) when
|
||||
# the test host launches (run 31992, #119). DISABLE_LIBRARY_VALIDATION
|
||||
# does not inject the entitlement on Xcode 14.2, so use a dedicated
|
||||
# Debug entitlements file. Release keeps validation and links the
|
||||
# package statically anyway.
|
||||
configs:
|
||||
Debug:
|
||||
CODE_SIGN_ENTITLEMENTS: Resources/ICCery.Debug.entitlements
|
||||
|
||||
ICCeryCoreTests:
|
||||
type: bundle.unit-test
|
||||
|
||||
Reference in New Issue
Block a user