diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ab02728..3a420ae 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,12 +14,16 @@ jobs: name: Unit tests uses: apple/swift-nio/.github/workflows/unit_tests.yml@main with: - linux_5_9_arguments_override: "--explicit-target-dependency-import-check error" - linux_5_10_arguments_override: "--explicit-target-dependency-import-check error" linux_6_0_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable" linux_6_1_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable" - linux_nightly_6_0_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable" + linux_6_2_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable" + linux_nightly_next_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable" linux_nightly_main_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable" + windows_6_0_enabled: true + windows_6_1_enabled: true + windows_6_2_enabled: true + windows_nightly_next_enabled: true + windows_nightly_main_enabled: true cxx-interop: name: Cxx interop diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index d3302c2..ceaaae4 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -18,12 +18,16 @@ jobs: name: Unit tests uses: apple/swift-nio/.github/workflows/unit_tests.yml@main with: - linux_5_9_arguments_override: "--explicit-target-dependency-import-check error" - linux_5_10_arguments_override: "--explicit-target-dependency-import-check error" linux_6_0_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable" linux_6_1_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable" - linux_nightly_6_0_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable" + linux_6_2_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable" + linux_nightly_next_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable" linux_nightly_main_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable" + windows_6_0_enabled: true + windows_6_1_enabled: true + windows_6_2_enabled: true + windows_nightly_next_enabled: true + windows_nightly_main_enabled: true cxx-interop: name: Cxx interop diff --git a/Sources/UnixSignals/UnixSignal.swift b/Sources/UnixSignals/UnixSignal.swift index 9a0f9cb..03394a3 100644 --- a/Sources/UnixSignals/UnixSignal.swift +++ b/Sources/UnixSignals/UnixSignal.swift @@ -26,6 +26,8 @@ import Dispatch /// A struct representing a Unix signal. /// /// Signals are standardized messages sent to a running program to trigger specific behavior, such as quitting or error handling +/// +/// - Important: Unix signals are only functional on platforms supporting signals. public struct UnixSignal: Hashable, Sendable, CustomStringConvertible { internal enum Wrapped { case sigabrt @@ -118,6 +120,9 @@ extension UnixSignal.Wrapped: CustomStringConvertible { extension UnixSignal.Wrapped { var rawValue: Int32 { + #if os(Windows) + return -1 + #else switch self { case .sigabrt: return SIGABRT @@ -146,5 +151,6 @@ extension UnixSignal.Wrapped { case .sigpipe: return SIGPIPE } + #endif } } diff --git a/Sources/UnixSignals/UnixSignalsSequence.swift b/Sources/UnixSignals/UnixSignalsSequence.swift index 4627792..4def2a9 100644 --- a/Sources/UnixSignals/UnixSignalsSequence.swift +++ b/Sources/UnixSignals/UnixSignalsSequence.swift @@ -15,14 +15,15 @@ #if canImport(Darwin) import Darwin import Dispatch -#elseif canImport(Glibc) +#else @preconcurrency import Dispatch +#endif + +#if canImport(Glibc) import Glibc #elseif canImport(Musl) -@preconcurrency import Dispatch import Musl #elseif canImport(Android) -@preconcurrency import Dispatch import Android #endif import ConcurrencyHelpers @@ -81,7 +82,8 @@ extension UnixSignalsSequence { private let stateMachine: LockedValueBox init(signals: Set) async { - let sources: [Source] = signals.map { sig in + #if !os(Windows) + let sources: [Source] = signals.compactMap { sig -> Source? in #if canImport(Darwin) // On Darwin platforms Dispatch's signal source uses kqueue and EVFILT_SIGNAL for // delivering signals. This exists alongside but with lower precedence than signal and @@ -163,6 +165,10 @@ extension UnixSignalsSequence { } } } + #else + let stream = AsyncStream { _ in } + self.stateMachine = .init(.init(sources: [], stream: stream)) + #endif } func makeAsyncIterator() -> AsyncStream.AsyncIterator { diff --git a/Tests/ServiceLifecycleTests/ServiceGroupAddServiceTests.swift b/Tests/ServiceLifecycleTests/ServiceGroupAddServiceTests.swift index 9bed364..792feb6 100644 --- a/Tests/ServiceLifecycleTests/ServiceGroupAddServiceTests.swift +++ b/Tests/ServiceLifecycleTests/ServiceGroupAddServiceTests.swift @@ -239,6 +239,7 @@ final class ServiceGroupAddServiceTests: XCTestCase { } } + #if !os(Windows) func testGracefulShutdownOrdering_withAddedServices() async throws { let service1 = MockService(description: "Service1") let service2 = MockService(description: "Service2") @@ -369,6 +370,7 @@ final class ServiceGroupAddServiceTests: XCTestCase { await service2.resumeRunContinuation(with: .success(())) } } + #endif // MARK: - Helpers diff --git a/Tests/ServiceLifecycleTests/ServiceGroupTests.swift b/Tests/ServiceLifecycleTests/ServiceGroupTests.swift index a936e9d..e145638 100644 --- a/Tests/ServiceLifecycleTests/ServiceGroupTests.swift +++ b/Tests/ServiceLifecycleTests/ServiceGroupTests.swift @@ -81,6 +81,7 @@ final class ServiceGroupTests: XCTestCase { } } + #if !os(Windows) func test_whenRun_ShutdownGracefully() async throws { let mockService = MockService(description: "Service1") let serviceGroup = self.makeServiceGroup( @@ -103,6 +104,7 @@ final class ServiceGroupTests: XCTestCase { await mockService.resumeRunContinuation(with: .success(())) } } + #endif func testRun_whenServiceExitsEarly() async throws { let mockService = MockService(description: "Service1") @@ -475,6 +477,7 @@ final class ServiceGroupTests: XCTestCase { } } + #if !os(Windows) func testCancellationSignal() async throws { let service1 = MockService(description: "Service1") let service2 = MockService(description: "Service2") @@ -513,7 +516,9 @@ final class ServiceGroupTests: XCTestCase { await XCTAsyncAssertNoThrow(try await group.next()) } } + #endif + #if !os(Windows) func testCancellationSignal_afterGracefulShutdownSignal() async throws { let service1 = MockService(description: "Service1") let service2 = MockService(description: "Service2") @@ -566,7 +571,9 @@ final class ServiceGroupTests: XCTestCase { await XCTAsyncAssertNoThrow(try await group.next()) } } + #endif + #if !os(Windows) func testGracefulShutdownOrdering() async throws { let service1 = MockService(description: "Service1") let service2 = MockService(description: "Service2") @@ -630,7 +637,9 @@ final class ServiceGroupTests: XCTestCase { await service1.resumeRunContinuation(with: .success(())) } } + #endif + #if !os(Windows) func testGracefulShutdownOrdering_whenServiceThrows() async throws { let service1 = MockService(description: "Service1") let service2 = MockService(description: "Service2") @@ -694,7 +703,9 @@ final class ServiceGroupTests: XCTestCase { } } } + #endif + #if !os(Windows) func testGracefulShutdownOrdering_whenServiceThrows_andServiceGracefullyShutsdown() async throws { let service1 = MockService(description: "Service1") let service2 = MockService(description: "Service2") @@ -762,7 +773,9 @@ final class ServiceGroupTests: XCTestCase { } } } + #endif + #if !os(Windows) func testGracefulShutdownOrdering_whenServiceExits() async throws { let service1 = MockService(description: "Service1") let service2 = MockService(description: "Service2") @@ -822,7 +835,9 @@ final class ServiceGroupTests: XCTestCase { await service2.resumeRunContinuation(with: .success(())) } } + #endif + #if !os(Windows) func testGracefulShutdownOrdering_whenServiceExits_andIgnoringThrows() async throws { let service1 = MockService(description: "Service1") let service2 = MockService(description: "Service2") @@ -892,7 +907,9 @@ final class ServiceGroupTests: XCTestCase { } } } + #endif + #if !os(Windows) func testNestedServiceLifecycle() async throws { struct NestedGroupService: Service { let group: ServiceGroup @@ -1013,6 +1030,7 @@ final class ServiceGroupTests: XCTestCase { await service2.resumeRunContinuation(with: .success(())) } } + #endif func testGracefulShutdownEscalation() async throws { let mockService = MockService(description: "Service1") diff --git a/Tests/UnixSignalsTests/UnixSignalTests.swift b/Tests/UnixSignalsTests/UnixSignalTests.swift index abea2da..39a69ac 100644 --- a/Tests/UnixSignalsTests/UnixSignalTests.swift +++ b/Tests/UnixSignalsTests/UnixSignalTests.swift @@ -12,6 +12,8 @@ // //===----------------------------------------------------------------------===// +#if !os(Windows) + import UnixSignals import XCTest #if canImport(Darwin) @@ -154,3 +156,5 @@ final class UnixSignalTests: XCTestCase { await task.value } } + +#endif