Skip to content

Commit

Permalink
format and review comments
Browse files Browse the repository at this point in the history
  • Loading branch information
jvimal-eg committed Apr 4, 2022
1 parent eb6f7e9 commit a479e45
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 2 deletions.
2 changes: 1 addition & 1 deletion Sources/GRPC/ClientConnection.swift
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ public struct ConnectionTarget {
return address.host
case let .socketAddress(.v6(address)):
return address.host
case .unixDomainSocket, .socketAddress(.unixDomainSocket), .connectedSocket(_):
case .unixDomainSocket, .socketAddress(.unixDomainSocket), .connectedSocket:
return "localhost"
}
}
Expand Down
2 changes: 1 addition & 1 deletion Sources/GRPC/GRPCChannel/GRPCChannelBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ extension ClientConnection {
return ClientConnection(configuration: self.configuration)
}

public func withConnectedSocket(socket: NIOBSDSocket.Handle) -> ClientConnection {
public func withConnectedSocket(_ socket: NIOBSDSocket.Handle) -> ClientConnection {
precondition(
!PlatformSupport.isTransportServicesEventLoopGroup(self.configuration.eventLoopGroup),
"'\(#function)' requires 'group' to not be a 'NIOTransportServices.NIOTSEventLoopGroup' or 'NIOTransportServices.QoSEventLoop' (but was '\(type(of: self.configuration.eventLoopGroup))'"
Expand Down
12 changes: 12 additions & 0 deletions Sources/GRPC/PlatformSupport.swift
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,12 @@ public protocol ClientBootstrapProtocol {
func channelInitializer(_ handler: @escaping (Channel) -> EventLoopFuture<Void>) -> Self
}

extension ClientBootstrapProtocol {
public func withConnectedSocket(_ socket: NIOBSDSocket.Handle) -> EventLoopFuture<Channel> {
preconditionFailure("withConnectedSocket(_:) is not implemented")
}
}

extension ClientBootstrap: ClientBootstrapProtocol {}

#if canImport(Network)
Expand All @@ -150,6 +156,12 @@ public protocol ServerBootstrapProtocol {
func childChannelOption<T>(_ option: T, value: T.Value) -> Self where T: ChannelOption
}

extension ServerBootstrapProtocol {
public func withBoundSocket(_ connectedSocket: NIOBSDSocket.Handle) -> EventLoopFuture<Channel> {
preconditionFailure("withBoundSocket(_:) is not implemented")
}
}

extension ServerBootstrap: ServerBootstrapProtocol {}

#if canImport(Network)
Expand Down
6 changes: 6 additions & 0 deletions Sources/GRPC/ServerBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ extension Server {
self.configuration.tlsConfiguration = self.maybeTLS
return Server.start(configuration: self.configuration)
}

public func bind(unixDomainSocketPath path: String) -> EventLoopFuture<Server> {
self.configuration.target = .unixDomainSocket(path)
self.configuration.tlsConfiguration = self.maybeTLS
return Server.start(configuration: self.configuration)
}
}
}

Expand Down
72 changes: 72 additions & 0 deletions Tests/GRPCTests/WithConnectedSocketTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* Copyright 2020, 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 EchoImplementation
import EchoModel
@testable import GRPC
import NIOCore
@testable import NIOPosix
import XCTest

class WithConnectedSockettests: GRPCTestCase {
func testKeepaliveTimeoutFiresBeforeConnectionIsReady() throws {
let group = NIOPosix.MultiThreadedEventLoopGroup(numberOfThreads: 1)
defer {
XCTAssertNoThrow(try group.syncShutdownGracefully())
}

let path = "/tmp/grpc-\(getpid()).sock"
// Setup a server.
let server = try Server.insecure(group: group)
.withServiceProviders([EchoProvider()])
.withLogger(self.serverLogger)
.bind(unixDomainSocketPath: path)
.wait()
defer {
XCTAssertNoThrow(try server.close().wait())
}

let socket = try Socket(protocolFamily: .unix, type: .stream)
XCTAssert(try socket.connect(to: .init(unixDomainSocketPath: path)))

// Setup a connection. We'll add a handler to drop all reads, this is somewhat equivalent to
// simulating bad network conditions and allows us to setup a connection and have our keepalive
// timeout expire.
let connection = ClientConnection.insecure(group: group)
.withBackgroundActivityLogger(self.clientLogger)
// See above comments for why we need this.
.withCallStartBehavior(.fastFailure)
.withKeepalive(.init(interval: .seconds(1), timeout: .milliseconds(100)))
.withDebugChannelInitializer { channel in
channel.pipeline.addHandler(ReadDroppingHandler(), position: .first)
}
.withConnectedSocket(try socket.takeDescriptorOwnership())
defer {
XCTAssertNoThrow(try connection.close().wait())
}

let client = Echo_EchoClient(channel: connection)
let get = client.get(.with { $0.text = "Hello" })
XCTAssertThrowsError(try get.response.wait())
XCTAssertEqual(try get.status.map { $0.code }.wait(), .unavailable)
}

class ReadDroppingHandler: ChannelDuplexHandler {
typealias InboundIn = Any
typealias OutboundIn = Any

func channelRead(context: ChannelHandlerContext, data: NIOAny) {}
}
}

0 comments on commit a479e45

Please sign in to comment.