Skip to content

Commit

Permalink
Code review fixes.
Browse files Browse the repository at this point in the history
  • Loading branch information
MrMage committed Jun 18, 2018
1 parent 3130eea commit 5f0531d
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 20 deletions.
4 changes: 2 additions & 2 deletions Tests/SwiftGRPCTests/MetadataTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@ import XCTest
class MetadataTests: XCTestCase {
static var allTests: [(String, (MetadataTests) -> () throws -> Void)] {
return [
("testCopy", testCopy)
("testCopyDoesNotCorruptData", testCopyDoesNotCorruptData)
]
}

func testCopy() {
func testCopyDoesNotCorruptData() {
let metadata = try! Metadata(["foo": "bar"])
XCTAssertEqual(["foo": "bar"], metadata.copy().dictionaryRepresentation)
}
Expand Down
46 changes: 28 additions & 18 deletions Tests/SwiftGRPCTests/ServerThrowingTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class ServerThrowingTests: BasicEchoTestCase {
static var allTests: [(String, (ServerThrowingTests) -> () throws -> Void)] {
return [
("testServerThrowsUnary", testServerThrowsUnary),
("testServerThrowsUnary_noTrailingMetadataCorruption", testServerThrowsUnary_noTrailingMetadataCorruptionAfterOriginalTrailingMetadataGetsReleased),
("testServerThrowsClientStreaming", testServerThrowsClientStreaming),
("testServerThrowsServerStreaming", testServerThrowsServerStreaming),
("testServerThrowsBidirectionalStreaming", testServerThrowsBidirectionalStreaming)
Expand All @@ -54,29 +55,38 @@ class ServerThrowingTests: BasicEchoTestCase {
}

extension ServerThrowingTests {
func testServerThrowsUnary() {
let caughtError: RPCError
func testServerThrowsUnary() throws {
do {
let result = try client.get(Echo_EchoRequest(text: "foo")).text
XCTFail("should have thrown, received \(result) instead")
return
} catch {
caughtError = error as! RPCError
} catch let error as RPCError {
guard case let .callError(callResult) = error
else { XCTFail("unexpected error \(error)"); return }

XCTAssertEqual(.permissionDenied, callResult.statusCode)
XCTAssertEqual("custom status message", callResult.statusMessage)
XCTAssertEqual(["some_long_key": "bar"], callResult.trailingMetadata?.dictionaryRepresentation)
}
}

func testServerThrowsUnary_noTrailingMetadataCorruptionAfterOriginalTrailingMetadataGetsReleased() throws {
do {
let result = try client.get(Echo_EchoRequest(text: "foo")).text
XCTFail("should have thrown, received \(result) instead")
return
} catch let error as RPCError {
guard case let .callError(callResult) = error
else { XCTFail("unexpected error \(error)"); return }

// Send another RPC to cause the original metadata array to be deallocated.
// If we were not copying the metadata array correctly, this would cause the metadata of the call result to become
// corrupted.
_ = try? client.get(Echo_EchoRequest(text: "foo")).text
// It seems like we need this sleep for the memory corruption to occur.
Thread.sleep(forTimeInterval: 0.01)
XCTAssertEqual(["some_long_key": "bar"], callResult.trailingMetadata?.dictionaryRepresentation)
}

guard case let .callError(callResult) = caughtError
else { XCTFail("unexpected error \(caughtError)"); return }

// Send another RPC to cause the original metadata array to be deallocated.
// If we were not copying the metadata array correctly, this would cause the metadata of the call result to become
// corrupted.
_ = try? client.get(Echo_EchoRequest(text: "foo")).text
// It seems like we need this sleep for the memory corruption to occur.
Thread.sleep(forTimeInterval: 0.01)
XCTAssertEqual(["some_long_key": "bar"], callResult.trailingMetadata?.dictionaryRepresentation)

XCTAssertEqual(.permissionDenied, callResult.statusCode)
XCTAssertEqual("custom status message", callResult.statusMessage)
}

func testServerThrowsClientStreaming() {
Expand Down

0 comments on commit 5f0531d

Please sign in to comment.