Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/ws-manager-mk2/pkg/proxy/servicename-prefixer_test.go
2500 views
1
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package proxy
6
7
import (
8
"testing"
9
)
10
11
func TestServiceNamePrefixerInterceptor_prefixServiceName(t *testing.T) {
12
tests := []struct {
13
name string
14
prefix string
15
fullMethod string
16
expected string
17
}{
18
// Normal cases
19
{
20
name: "basic service with single dot",
21
prefix: "proxied",
22
fullMethod: "/builder.ImageBuilder/Build",
23
expected: "/proxied.builder.ImageBuilder/Build",
24
},
25
{
26
name: "service with multiple dots",
27
prefix: "proxied",
28
fullMethod: "/service.Package.SubService/Method",
29
expected: "/proxied.service.Package.SubService/Method",
30
},
31
{
32
name: "complex service name",
33
prefix: "proxied",
34
fullMethod: "/gitpod.v1.WorkspaceService/CreateWorkspace",
35
expected: "/proxied.gitpod.v1.WorkspaceService/CreateWorkspace",
36
},
37
{
38
name: "prefix with slashes gets cleaned",
39
prefix: "/proxied/",
40
fullMethod: "/builder.ImageBuilder/Build",
41
expected: "/proxied.builder.ImageBuilder/Build",
42
},
43
{
44
name: "different prefix",
45
prefix: "intercepted",
46
fullMethod: "/auth.AuthService/Login",
47
expected: "/intercepted.auth.AuthService/Login",
48
},
49
50
// Edge cases - empty/invalid inputs
51
{
52
name: "empty prefix",
53
prefix: "",
54
fullMethod: "/builder.ImageBuilder/Build",
55
expected: "/builder.ImageBuilder/Build",
56
},
57
{
58
name: "empty fullMethod",
59
prefix: "proxied",
60
fullMethod: "",
61
expected: "",
62
},
63
{
64
name: "both empty",
65
prefix: "",
66
fullMethod: "",
67
expected: "",
68
},
69
70
// Edge cases - malformed inputs
71
{
72
name: "no leading slash",
73
prefix: "proxied",
74
fullMethod: "builder.ImageBuilder/Build",
75
expected: "builder.ImageBuilder/Build",
76
},
77
{
78
name: "no dots in method",
79
prefix: "proxied",
80
fullMethod: "/service/Method",
81
expected: "/service/Method",
82
},
83
{
84
name: "just slash",
85
prefix: "proxied",
86
fullMethod: "/",
87
expected: "/",
88
},
89
{
90
name: "slash with no content",
91
prefix: "proxied",
92
fullMethod: "/Method",
93
expected: "/Method",
94
},
95
96
// Edge cases - dots in unusual positions
97
{
98
name: "dot at beginning after slash",
99
prefix: "proxied",
100
fullMethod: "/.service/Method",
101
expected: "/proxied..service/Method",
102
},
103
{
104
name: "multiple consecutive dots",
105
prefix: "proxied",
106
fullMethod: "/service..Package/Method",
107
expected: "/proxied.service..Package/Method",
108
},
109
{
110
name: "dot at end before slash",
111
prefix: "proxied",
112
fullMethod: "/service./Method",
113
expected: "/proxied.service./Method",
114
},
115
116
// Edge cases - no method part
117
{
118
name: "no method part",
119
prefix: "proxied",
120
fullMethod: "/service.Package",
121
expected: "/proxied.service.Package",
122
},
123
{
124
name: "service with dot but no slash separator",
125
prefix: "proxied",
126
fullMethod: "/service.Package.Method",
127
expected: "/proxied.service.Package.Method",
128
},
129
130
// Edge cases - special characters
131
{
132
name: "service with underscores",
133
prefix: "proxied",
134
fullMethod: "/image_builder.BuildService/CreateImage",
135
expected: "/proxied.image_builder.BuildService/CreateImage",
136
},
137
{
138
name: "service with hyphens",
139
prefix: "proxied",
140
fullMethod: "/image-builder.BuildService/CreateImage",
141
expected: "/proxied.image-builder.BuildService/CreateImage",
142
},
143
{
144
name: "service with numbers",
145
prefix: "proxied",
146
fullMethod: "/v1.ImageBuilder/Build",
147
expected: "/proxied.v1.ImageBuilder/Build",
148
},
149
150
// Edge cases - prefix variations
151
{
152
name: "prefix with dots",
153
prefix: "proxy.intercepted",
154
fullMethod: "/builder.ImageBuilder/Build",
155
expected: "/proxy.intercepted.builder.ImageBuilder/Build",
156
},
157
{
158
name: "prefix with underscores",
159
prefix: "proxy_intercepted",
160
fullMethod: "/builder.ImageBuilder/Build",
161
expected: "/proxy_intercepted.builder.ImageBuilder/Build",
162
},
163
}
164
165
for _, tt := range tests {
166
t.Run(tt.name, func(t *testing.T) {
167
s := &ServiceNamePrefixerInterceptor{
168
Prefix: tt.prefix,
169
}
170
result := s.prefixServiceName(tt.fullMethod)
171
if result != tt.expected {
172
t.Errorf("prefixServiceName() = %q, expected %q", result, tt.expected)
173
}
174
})
175
}
176
}
177
178
func TestServiceNamePrefixerInterceptor_prefixServiceName_Examples(t *testing.T) {
179
// Additional focused tests for the specific example mentioned in the task
180
s := &ServiceNamePrefixerInterceptor{
181
Prefix: "proxied",
182
}
183
184
// Test the exact transformation mentioned in the task
185
input := "/builder.ImageBuilder/Build"
186
expected := "/proxied.builder.ImageBuilder/Build"
187
result := s.prefixServiceName(input)
188
189
if result != expected {
190
t.Errorf("Expected transformation %q -> %q, but got %q", input, expected, result)
191
}
192
193
// Test that the first dot is used as anchor
194
input2 := "/first.second.third/Method"
195
expected2 := "/proxied.first.second.third/Method"
196
result2 := s.prefixServiceName(input2)
197
198
if result2 != expected2 {
199
t.Errorf("Expected first dot as anchor %q -> %q, but got %q", input2, expected2, result2)
200
}
201
}
202
203