From 54b7d03e0ff0adee3b18ea65af9ac8f849accf47 Mon Sep 17 00:00:00 2001 From: Zach Reyes <39203661+zasweq@users.noreply.github.com> Date: Fri, 16 Dec 2022 20:02:04 -0500 Subject: [PATCH] grpc: Add join Dial Option (#5861) --- default_dial_option_server_option_test.go | 36 +++++++++++++++++++++++ dialoptions.go | 15 ++++++++++ internal/internal.go | 3 ++ 3 files changed, 54 insertions(+) diff --git a/default_dial_option_server_option_test.go b/default_dial_option_server_option_test.go index eecd6b846f28..c6cdd7c84838 100644 --- a/default_dial_option_server_option_test.go +++ b/default_dial_option_server_option_test.go @@ -80,3 +80,39 @@ func (s) TestAddExtraServerOptions(t *testing.T) { t.Fatalf("Unexpected len of extraServerOptions: %d != 0", len(extraServerOptions)) } } + +// TestJoinDialOption tests the join dial option. It configures a joined dial +// option with three individual dial options, and verifies that all three are +// successfully applied. +func (s) TestJoinDialOption(t *testing.T) { + const maxRecvSize = 998765 + const initialWindowSize = 100 + jdo := newJoinDialOption(WithTransportCredentials(insecure.NewCredentials()), WithReadBufferSize(maxRecvSize), WithInitialWindowSize(initialWindowSize)) + cc, err := Dial("fake", jdo) + if err != nil { + t.Fatalf("Dialing with insecure credentials failed: %v", err) + } + defer cc.Close() + if cc.dopts.copts.ReadBufferSize != maxRecvSize { + t.Fatalf("Unexpected cc.dopts.copts.ReadBufferSize: %d != %d", cc.dopts.copts.ReadBufferSize, maxRecvSize) + } + if cc.dopts.copts.InitialWindowSize != initialWindowSize { + t.Fatalf("Unexpected cc.dopts.copts.InitialWindowSize: %d != %d", cc.dopts.copts.InitialWindowSize, initialWindowSize) + } +} + +// TestJoinDialOption tests the join server option. It configures a joined +// server option with three individual server options, and verifies that all +// three are successfully applied. +func (s) TestJoinServerOption(t *testing.T) { + const maxRecvSize = 998765 + const initialWindowSize = 100 + jso := newJoinServerOption(Creds(insecure.NewCredentials()), MaxRecvMsgSize(maxRecvSize), InitialWindowSize(initialWindowSize)) + s := NewServer(jso) + if s.opts.maxReceiveMessageSize != maxRecvSize { + t.Fatalf("Unexpected s.opts.maxReceiveMessageSize: %d != %d", s.opts.maxReceiveMessageSize, maxRecvSize) + } + if s.opts.initialWindowSize != initialWindowSize { + t.Fatalf("Unexpected s.opts.initialWindowSize: %d != %d", s.opts.initialWindowSize, initialWindowSize) + } +} diff --git a/dialoptions.go b/dialoptions.go index 8f5b536f11eb..4866da101c60 100644 --- a/dialoptions.go +++ b/dialoptions.go @@ -44,6 +44,7 @@ func init() { extraDialOptions = nil } internal.WithBinaryLogger = withBinaryLogger + internal.JoinDialOptions = newJoinDialOption } // dialOptions configure a Dial call. dialOptions are set by the DialOption @@ -111,6 +112,20 @@ func newFuncDialOption(f func(*dialOptions)) *funcDialOption { } } +type joinDialOption struct { + opts []DialOption +} + +func (jdo *joinDialOption) apply(do *dialOptions) { + for _, opt := range jdo.opts { + opt.apply(do) + } +} + +func newJoinDialOption(opts ...DialOption) DialOption { + return &joinDialOption{opts: opts} +} + // WithWriteBufferSize determines how much data can be batched before doing a // write on the wire. The corresponding memory allocation for this buffer will // be twice the size to keep syscalls low. The default value for this buffer is diff --git a/internal/internal.go b/internal/internal.go index fd0ee3dcaf1e..0a76d9de6e02 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -77,6 +77,9 @@ var ( // ClearGlobalDialOptions clears the array of extra DialOption. This // method is useful in testing and benchmarking. ClearGlobalDialOptions func() + // JoinDialOptions combines the dial options passed as arguments into a + // single dial option. + JoinDialOptions interface{} // func(...grpc.DialOption) grpc.DialOption // JoinServerOptions combines the server options passed as arguments into a // single server option. JoinServerOptions interface{} // func(...grpc.ServerOption) grpc.ServerOption