Skip to content

Commit

Permalink
Use JSON (de)serializers instead of custom ones for tests (#2162)
Browse files Browse the repository at this point in the history
In some tests, we were using a custom serializer/deserializer to deal
with the `PeerInfo` type. We can just reuse the JSON (de)serialiser we
have. Had to copy it over as it was in a different target.
  • Loading branch information
gjcairo authored Jan 17, 2025
1 parent ebcac53 commit a1dbd15
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 18 deletions.
1 change: 1 addition & 0 deletions Tests/GRPCCoreTests/Test Utilities/Coding+JSON.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import GRPCCore

import struct Foundation.Data
Expand Down
20 changes: 2 additions & 18 deletions Tests/GRPCInProcessTransportTests/InProcessTransportTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ struct InProcessTransportTests {
request: ClientRequest(message: ()),
descriptor: .peerInfo,
serializer: VoidSerializer(),
deserializer: PeerInfoDeserializer(),
deserializer: JSONDeserializer<PeerInfo>(),
options: .defaults
) {
try $0.message
Expand Down Expand Up @@ -142,7 +142,7 @@ private struct TestService: RegistrableRPCService {
router.registerHandler(
forMethod: .peerInfo,
deserializer: VoidDeserializer(),
serializer: PeerInfoSerializer(),
serializer: JSONSerializer<PeerInfo>(),
handler: {
let response = try await self.peerInfo(
request: ServerRequest<Void>(stream: $0),
Expand Down Expand Up @@ -171,22 +171,6 @@ private struct PeerInfo: Codable {
var remote: String
}

private struct PeerInfoSerializer: MessageSerializer {
func serialize<Bytes: GRPCContiguousBytes>(_ message: PeerInfo) throws -> Bytes {
Bytes("\(message.local) \(message.remote)".utf8)
}
}

private struct PeerInfoDeserializer: MessageDeserializer {
func deserialize<Bytes: GRPCContiguousBytes>(_ serializedMessageBytes: Bytes) throws -> PeerInfo {
let stringPeerInfo = serializedMessageBytes.withUnsafeBytes {
String(decoding: $0, as: UTF8.self)
}
let peerInfoComponents = stringPeerInfo.split(separator: " ")
return PeerInfo(local: String(peerInfoComponents[0]), remote: String(peerInfoComponents[1]))
}
}

private struct UTF8Serializer: MessageSerializer {
func serialize<Bytes: GRPCContiguousBytes>(_ message: String) throws -> Bytes {
Bytes(message.utf8)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright 2025, gRPC Authors All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import GRPCCore

import struct Foundation.Data
import class Foundation.JSONDecoder
import class Foundation.JSONEncoder

struct JSONSerializer<Message: Codable>: MessageSerializer {
func serialize<Bytes: GRPCContiguousBytes>(_ message: Message) throws -> Bytes {
do {
let jsonEncoder = JSONEncoder()
let data = try jsonEncoder.encode(message)
return Bytes(data)
} catch {
throw RPCError(code: .internalError, message: "Can't serialize message to JSON. \(error)")
}
}
}

struct JSONDeserializer<Message: Codable>: MessageDeserializer {
func deserialize<Bytes: GRPCContiguousBytes>(_ serializedMessageBytes: Bytes) throws -> Message {
do {
let jsonDecoder = JSONDecoder()
let data = serializedMessageBytes.withUnsafeBytes { Data($0) }
return try jsonDecoder.decode(Message.self, from: data)
} catch {
throw RPCError(code: .internalError, message: "Can't deserialze message from JSON. \(error)")
}
}
}

0 comments on commit a1dbd15

Please sign in to comment.