Path: blob/main/components/ws-manager-mk2/pkg/proxy/servicename-prefixer_test.go
2500 views
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package proxy56import (7"testing"8)910func TestServiceNamePrefixerInterceptor_prefixServiceName(t *testing.T) {11tests := []struct {12name string13prefix string14fullMethod string15expected string16}{17// Normal cases18{19name: "basic service with single dot",20prefix: "proxied",21fullMethod: "/builder.ImageBuilder/Build",22expected: "/proxied.builder.ImageBuilder/Build",23},24{25name: "service with multiple dots",26prefix: "proxied",27fullMethod: "/service.Package.SubService/Method",28expected: "/proxied.service.Package.SubService/Method",29},30{31name: "complex service name",32prefix: "proxied",33fullMethod: "/gitpod.v1.WorkspaceService/CreateWorkspace",34expected: "/proxied.gitpod.v1.WorkspaceService/CreateWorkspace",35},36{37name: "prefix with slashes gets cleaned",38prefix: "/proxied/",39fullMethod: "/builder.ImageBuilder/Build",40expected: "/proxied.builder.ImageBuilder/Build",41},42{43name: "different prefix",44prefix: "intercepted",45fullMethod: "/auth.AuthService/Login",46expected: "/intercepted.auth.AuthService/Login",47},4849// Edge cases - empty/invalid inputs50{51name: "empty prefix",52prefix: "",53fullMethod: "/builder.ImageBuilder/Build",54expected: "/builder.ImageBuilder/Build",55},56{57name: "empty fullMethod",58prefix: "proxied",59fullMethod: "",60expected: "",61},62{63name: "both empty",64prefix: "",65fullMethod: "",66expected: "",67},6869// Edge cases - malformed inputs70{71name: "no leading slash",72prefix: "proxied",73fullMethod: "builder.ImageBuilder/Build",74expected: "builder.ImageBuilder/Build",75},76{77name: "no dots in method",78prefix: "proxied",79fullMethod: "/service/Method",80expected: "/service/Method",81},82{83name: "just slash",84prefix: "proxied",85fullMethod: "/",86expected: "/",87},88{89name: "slash with no content",90prefix: "proxied",91fullMethod: "/Method",92expected: "/Method",93},9495// Edge cases - dots in unusual positions96{97name: "dot at beginning after slash",98prefix: "proxied",99fullMethod: "/.service/Method",100expected: "/proxied..service/Method",101},102{103name: "multiple consecutive dots",104prefix: "proxied",105fullMethod: "/service..Package/Method",106expected: "/proxied.service..Package/Method",107},108{109name: "dot at end before slash",110prefix: "proxied",111fullMethod: "/service./Method",112expected: "/proxied.service./Method",113},114115// Edge cases - no method part116{117name: "no method part",118prefix: "proxied",119fullMethod: "/service.Package",120expected: "/proxied.service.Package",121},122{123name: "service with dot but no slash separator",124prefix: "proxied",125fullMethod: "/service.Package.Method",126expected: "/proxied.service.Package.Method",127},128129// Edge cases - special characters130{131name: "service with underscores",132prefix: "proxied",133fullMethod: "/image_builder.BuildService/CreateImage",134expected: "/proxied.image_builder.BuildService/CreateImage",135},136{137name: "service with hyphens",138prefix: "proxied",139fullMethod: "/image-builder.BuildService/CreateImage",140expected: "/proxied.image-builder.BuildService/CreateImage",141},142{143name: "service with numbers",144prefix: "proxied",145fullMethod: "/v1.ImageBuilder/Build",146expected: "/proxied.v1.ImageBuilder/Build",147},148149// Edge cases - prefix variations150{151name: "prefix with dots",152prefix: "proxy.intercepted",153fullMethod: "/builder.ImageBuilder/Build",154expected: "/proxy.intercepted.builder.ImageBuilder/Build",155},156{157name: "prefix with underscores",158prefix: "proxy_intercepted",159fullMethod: "/builder.ImageBuilder/Build",160expected: "/proxy_intercepted.builder.ImageBuilder/Build",161},162}163164for _, tt := range tests {165t.Run(tt.name, func(t *testing.T) {166s := &ServiceNamePrefixerInterceptor{167Prefix: tt.prefix,168}169result := s.prefixServiceName(tt.fullMethod)170if result != tt.expected {171t.Errorf("prefixServiceName() = %q, expected %q", result, tt.expected)172}173})174}175}176177func TestServiceNamePrefixerInterceptor_prefixServiceName_Examples(t *testing.T) {178// Additional focused tests for the specific example mentioned in the task179s := &ServiceNamePrefixerInterceptor{180Prefix: "proxied",181}182183// Test the exact transformation mentioned in the task184input := "/builder.ImageBuilder/Build"185expected := "/proxied.builder.ImageBuilder/Build"186result := s.prefixServiceName(input)187188if result != expected {189t.Errorf("Expected transformation %q -> %q, but got %q", input, expected, result)190}191192// Test that the first dot is used as anchor193input2 := "/first.second.third/Method"194expected2 := "/proxied.first.second.third/Method"195result2 := s.prefixServiceName(input2)196197if result2 != expected2 {198t.Errorf("Expected first dot as anchor %q -> %q, but got %q", input2, expected2, result2)199}200}201202203