From 804e878e56d0102cfe475d4b5a84c999e09a8fe5 Mon Sep 17 00:00:00 2001 From: Ronak Jain Date: Mon, 23 Jan 2023 20:45:01 +0530 Subject: [PATCH] encoding: fix duplicate compressor names --- encoding/encoding.go | 4 +++- encoding/encoding_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 encoding/encoding_test.go diff --git a/encoding/encoding.go b/encoding/encoding.go index 711763d54fb7..07a5861352a6 100644 --- a/encoding/encoding.go +++ b/encoding/encoding.go @@ -75,7 +75,9 @@ var registeredCompressor = make(map[string]Compressor) // registered with the same name, the one registered last will take effect. func RegisterCompressor(c Compressor) { registeredCompressor[c.Name()] = c - grpcutil.RegisteredCompressorNames = append(grpcutil.RegisteredCompressorNames, c.Name()) + if !grpcutil.IsCompressorNameRegistered(c.Name()) { + grpcutil.RegisteredCompressorNames = append(grpcutil.RegisteredCompressorNames, c.Name()) + } } // GetCompressor returns Compressor for the given compressor name. diff --git a/encoding/encoding_test.go b/encoding/encoding_test.go new file mode 100644 index 000000000000..377daf9bb968 --- /dev/null +++ b/encoding/encoding_test.go @@ -0,0 +1,37 @@ +package encoding + +import ( + "reflect" + "testing" + + "google.golang.org/grpc/internal/grpcutil" +) + +type mockNamedCompressor struct { + Compressor +} + +func (mockNamedCompressor) Name() string { + return "mock-compressor" +} + +func TestDuplicateCompressorRegister(t *testing.T) { + defer func(m map[string]Compressor) { registeredCompressor = m }(registeredCompressor) + defer func(c []string) { grpcutil.RegisteredCompressorNames = c }(grpcutil.RegisteredCompressorNames) + registeredCompressor = map[string]Compressor{} + grpcutil.RegisteredCompressorNames = []string{} + + RegisterCompressor(&mockNamedCompressor{}) + + // Register another instance of the same compressor. + mc := &mockNamedCompressor{} + RegisterCompressor(mc) + if got := registeredCompressor["mock-compressor"]; got != mc { + t.Fatalf("Unexpected compressor, got: %+v, want:%+v", got, mc) + } + + wantNames := []string{"mock-compressor"} + if !reflect.DeepEqual(wantNames, grpcutil.RegisteredCompressorNames) { + t.Fatalf("Unexpected compressor names, got: %+v, want:%+v", grpcutil.RegisteredCompressorNames, wantNames) + } +}