From 6c5d1ea6c01f28b2fa104350d0a6fa7d8492db7d Mon Sep 17 00:00:00 2001 From: Konrad `ktoso` Malawski Date: Thu, 9 Jul 2020 19:41:57 +0900 Subject: [PATCH 1/2] +test actorable call during shutdown should not crash --- .gitignore | 1 + .../DistributedActors/GenActors/Actorable.swift | 14 +++++++------- .../ActorableOwnedMembershipTests.swift | 16 ++++++++++++++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index eee918ebf..589d5caae 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ *.app Instruments/ActorInstruments/ActorInstruments.xcodeproj/xcuserdata +Instruments/ActorInstruments/build/ Instruments/ActorInstruments/ActorInstruments.xcodeproj/project.xcworkspace/xcuserdata Samples/swift-distributed-actors-samples.xcodeproj diff --git a/Sources/DistributedActors/GenActors/Actorable.swift b/Sources/DistributedActors/GenActors/Actorable.swift index 0c997635e..bc8ff1a3c 100644 --- a/Sources/DistributedActors/GenActors/Actorable.swift +++ b/Sources/DistributedActors/GenActors/Actorable.swift @@ -125,13 +125,13 @@ public enum Reply { extension Reply { public static func from(askResponse: AskResponse) -> Reply { switch askResponse { - case .completed(let result as Result): - switch result { - case .success(let value): - return .completed(.success(value)) - case .failure(let error): - return .completed(.failure(ErrorEnvelope(error))) - } + case .completed(.success(let value as Value)): + return .completed(.success(value)) + case .completed(.success(let value)): + return .completed(.failure(ErrorEnvelope(description: "Received unexpected reply value \(reflecting: type(of: value as Any)), expected: \(Value.self), message: \(value)"))) + + case .completed(.failure(let error)): + return .completed(.failure(ErrorEnvelope(error))) case .nioFuture(let nioFuture as EventLoopFuture): return .nioFuture(nioFuture) diff --git a/Tests/DistributedActorsTests/Actorable/ActorableOwnedMembershipTests.swift b/Tests/DistributedActorsTests/Actorable/ActorableOwnedMembershipTests.swift index 223cafe60..13a55ee53 100644 --- a/Tests/DistributedActorsTests/Actorable/ActorableOwnedMembershipTests.swift +++ b/Tests/DistributedActorsTests/Actorable/ActorableOwnedMembershipTests.swift @@ -40,6 +40,22 @@ final class ActorableOwnedMembershipTests: ClusteredActorSystemsXCTestCase { } } } + + func test_notCrashHard_whenCall_onShutDownSystem() throws { + let p = self.testKit.spawnTestProbe(expecting: Reception.Listing>.self) + let owner: Actor = try self.system.spawn("owner") { + OwnerOfThings(context: $0, probe: p.ref) + } + + try self.system.shutdown().wait() + let x = owner.readLastObservedValue() + do { + let reply = try x.wait() + XCTFail("Expected call to throw, but got: \(reply)") + } catch { + "\(error)".shouldContain("DistributedActors.AskError") + } + } } struct TestMembershipOwner: Actorable { From 13dfc6acff43576f2ab24ae2e0efbdd70c784414 Mon Sep 17 00:00:00 2001 From: Konrad `ktoso` Malawski Date: Thu, 9 Jul 2020 19:57:48 +0900 Subject: [PATCH 2/2] cleanup, something wrong was comitted --- .../Actorable/ActorableOwnedMembershipTests.swift | 10 ++++++---- Tests/DistributedActorsTests/SerializationTests.swift | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Tests/DistributedActorsTests/Actorable/ActorableOwnedMembershipTests.swift b/Tests/DistributedActorsTests/Actorable/ActorableOwnedMembershipTests.swift index 13a55ee53..ab168b60a 100644 --- a/Tests/DistributedActorsTests/Actorable/ActorableOwnedMembershipTests.swift +++ b/Tests/DistributedActorsTests/Actorable/ActorableOwnedMembershipTests.swift @@ -42,16 +42,18 @@ final class ActorableOwnedMembershipTests: ClusteredActorSystemsXCTestCase { } func test_notCrashHard_whenCall_onShutDownSystem() throws { - let p = self.testKit.spawnTestProbe(expecting: Reception.Listing>.self) - let owner: Actor = try self.system.spawn("owner") { + let first = self.setUpNode("first") + + let p = self.testKit(first).spawnTestProbe(expecting: Reception.Listing>.self) + let owner: Actor = try first.spawn("owner") { OwnerOfThings(context: $0, probe: p.ref) } - try self.system.shutdown().wait() + try first.shutdown().wait() let x = owner.readLastObservedValue() do { let reply = try x.wait() - XCTFail("Expected call to throw, but got: \(reply)") + XCTFail("Expected call to throw, but got: \(optional: reply)") } catch { "\(error)".shouldContain("DistributedActors.AskError") } diff --git a/Tests/DistributedActorsTests/SerializationTests.swift b/Tests/DistributedActorsTests/SerializationTests.swift index 943c98a86..40c06fdf4 100644 --- a/Tests/DistributedActorsTests/SerializationTests.swift +++ b/Tests/DistributedActorsTests/SerializationTests.swift @@ -435,7 +435,7 @@ class SerializationTests: ActorSystemXCTestCase { #else if #available(macOS 10.16, *) { () // ok, it's available on these platforms - } else if ok { + } else { ok = false } #endif @@ -466,7 +466,7 @@ class SerializationTests: ActorSystemXCTestCase { #else if #available(macOS 10.16, *) { () // ok, it's available on these platforms - } else if ok { + } else { ok = false } #endif