Skip to content

Commit e5a0237

Browse files
authored
encoding: fix duplicate compressor names (#5958)
1 parent 4adb2a7 commit e5a0237

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

encoding/encoding.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ var registeredCompressor = make(map[string]Compressor)
7575
// registered with the same name, the one registered last will take effect.
7676
func RegisterCompressor(c Compressor) {
7777
registeredCompressor[c.Name()] = c
78-
grpcutil.RegisteredCompressorNames = append(grpcutil.RegisteredCompressorNames, c.Name())
78+
if !grpcutil.IsCompressorNameRegistered(c.Name()) {
79+
grpcutil.RegisteredCompressorNames = append(grpcutil.RegisteredCompressorNames, c.Name())
80+
}
7981
}
8082

8183
// GetCompressor returns Compressor for the given compressor name.

encoding/encoding_test.go

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
*
3+
* Copyright 2023 gRPC authors.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*/
18+
19+
package encoding
20+
21+
import (
22+
"testing"
23+
24+
"github.com/google/go-cmp/cmp"
25+
"google.golang.org/grpc/internal/grpcutil"
26+
)
27+
28+
type mockNamedCompressor struct {
29+
Compressor
30+
}
31+
32+
func (mockNamedCompressor) Name() string {
33+
return "mock-compressor"
34+
}
35+
36+
func TestDuplicateCompressorRegister(t *testing.T) {
37+
defer func(m map[string]Compressor) { registeredCompressor = m }(registeredCompressor)
38+
defer func(c []string) { grpcutil.RegisteredCompressorNames = c }(grpcutil.RegisteredCompressorNames)
39+
registeredCompressor = map[string]Compressor{}
40+
grpcutil.RegisteredCompressorNames = []string{}
41+
42+
RegisterCompressor(&mockNamedCompressor{})
43+
44+
// Register another instance of the same compressor.
45+
mc := &mockNamedCompressor{}
46+
RegisterCompressor(mc)
47+
if got := registeredCompressor["mock-compressor"]; got != mc {
48+
t.Fatalf("Unexpected compressor, got: %+v, want:%+v", got, mc)
49+
}
50+
51+
wantNames := []string{"mock-compressor"}
52+
if !cmp.Equal(wantNames, grpcutil.RegisteredCompressorNames) {
53+
t.Fatalf("Unexpected compressor names, got: %+v, want:%+v", grpcutil.RegisteredCompressorNames, wantNames)
54+
}
55+
}

0 commit comments

Comments
 (0)