@@ -41,6 +41,7 @@ import (
41
41
"github.com/google/go-cmp/cmp"
42
42
fuzz "github.com/google/gofuzz"
43
43
"github.com/stretchr/testify/assert"
44
+ "github.com/stretchr/testify/require"
44
45
)
45
46
46
47
func TestIsConfigTransportTLS (t * testing.T ) {
@@ -266,6 +267,19 @@ type fakeWarningHandler struct{}
266
267
267
268
func (f fakeWarningHandler ) HandleWarningHeader (code int , agent string , message string ) {}
268
269
270
+ type fakeWarningHandlerWithLogging struct {
271
+ messages []string
272
+ }
273
+
274
+ func (f * fakeWarningHandlerWithLogging ) HandleWarningHeader (code int , agent string , message string ) {
275
+ f .messages = append (f .messages , message )
276
+ }
277
+
278
+ type fakeWarningHandlerWithContext struct {}
279
+
280
+ func (f fakeWarningHandlerWithContext ) HandleWarningHeaderWithContext (ctx context.Context , code int , agent string , message string ) {
281
+ }
282
+
269
283
type fakeNegotiatedSerializer struct {}
270
284
271
285
func (n * fakeNegotiatedSerializer ) SupportedMediaTypes () []runtime.SerializerInfo {
@@ -330,6 +344,9 @@ func TestAnonymousAuthConfig(t *testing.T) {
330
344
func (h * WarningHandler , f fuzz.Continue ) {
331
345
* h = & fakeWarningHandler {}
332
346
},
347
+ func (h * WarningHandlerWithContext , f fuzz.Continue ) {
348
+ * h = & fakeWarningHandlerWithContext {}
349
+ },
333
350
// Authentication does not require fuzzer
334
351
func (r * AuthProviderConfigPersister , f fuzz.Continue ) {},
335
352
func (r * clientcmdapi.AuthProviderConfig , f fuzz.Continue ) {
@@ -428,6 +445,9 @@ func TestCopyConfig(t *testing.T) {
428
445
func (h * WarningHandler , f fuzz.Continue ) {
429
446
* h = & fakeWarningHandler {}
430
447
},
448
+ func (h * WarningHandlerWithContext , f fuzz.Continue ) {
449
+ * h = & fakeWarningHandlerWithContext {}
450
+ },
431
451
func (r * AuthProviderConfigPersister , f fuzz.Continue ) {
432
452
* r = fakeAuthProviderConfigPersister {}
433
453
},
@@ -619,25 +639,69 @@ func TestConfigSprint(t *testing.T) {
619
639
KeyData : []byte ("fake key" ),
620
640
NextProtos : []string {"h2" , "http/1.1" },
621
641
},
622
- UserAgent : "gobot" ,
623
- Transport : & fakeRoundTripper {},
624
- WrapTransport : fakeWrapperFunc ,
625
- QPS : 1 ,
626
- Burst : 2 ,
627
- RateLimiter : & fakeLimiter {},
628
- WarningHandler : fakeWarningHandler {},
629
- Timeout : 3 * time .Second ,
630
- Dial : fakeDialFunc ,
631
- Proxy : fakeProxyFunc ,
642
+ UserAgent : "gobot" ,
643
+ Transport : & fakeRoundTripper {},
644
+ WrapTransport : fakeWrapperFunc ,
645
+ QPS : 1 ,
646
+ Burst : 2 ,
647
+ RateLimiter : & fakeLimiter {},
648
+ WarningHandler : fakeWarningHandler {},
649
+ WarningHandlerWithContext : fakeWarningHandlerWithContext {},
650
+ Timeout : 3 * time .Second ,
651
+ Dial : fakeDialFunc ,
652
+ Proxy : fakeProxyFunc ,
632
653
}
633
654
want := fmt .Sprintf (
634
- `&rest.Config{Host:"localhost:8080", APIPath:"v1", ContentConfig:rest.ContentConfig{AcceptContentTypes:"application/json", ContentType:"application/json", GroupVersion:(*schema.GroupVersion)(nil), NegotiatedSerializer:runtime.NegotiatedSerializer(nil)}, Username:"gopher", Password:"--- REDACTED ---", BearerToken:"--- REDACTED ---", BearerTokenFile:"", Impersonate:rest.ImpersonationConfig{UserName:"gopher2", UID:"uid123", Groups:[]string(nil), Extra:map[string][]string(nil)}, AuthProvider:api.AuthProviderConfig{Name: "gopher", Config: map[string]string{--- REDACTED ---}}, AuthConfigPersister:rest.AuthProviderConfigPersister(--- REDACTED ---), ExecProvider:api.ExecConfig{Command: "sudo", Args: []string{"--- REDACTED ---"}, Env: []ExecEnvVar{--- REDACTED ---}, APIVersion: "", ProvideClusterInfo: true, Config: runtime.Object(--- REDACTED ---), StdinUnavailable: false}, TLSClientConfig:rest.sanitizedTLSClientConfig{Insecure:false, ServerName:"", CertFile:"a.crt", KeyFile:"a.key", CAFile:"", CertData:[]uint8{0x2d, 0x2d, 0x2d, 0x20, 0x54, 0x52, 0x55, 0x4e, 0x43, 0x41, 0x54, 0x45, 0x44, 0x20, 0x2d, 0x2d, 0x2d}, KeyData:[]uint8{0x2d, 0x2d, 0x2d, 0x20, 0x52, 0x45, 0x44, 0x41, 0x43, 0x54, 0x45, 0x44, 0x20, 0x2d, 0x2d, 0x2d}, CAData:[]uint8(nil), NextProtos:[]string{"h2", "http/1.1"}}, UserAgent:"gobot", DisableCompression:false, Transport:(*rest.fakeRoundTripper)(%p), WrapTransport:(transport.WrapperFunc)(%p), QPS:1, Burst:2, RateLimiter:(*rest.fakeLimiter)(%p), WarningHandler:rest.fakeWarningHandler{}, Timeout:3000000000, Dial:(func(context.Context, string, string) (net.Conn, error))(%p), Proxy:(func(*http.Request) (*url.URL, error))(%p)}` ,
655
+ `&rest.Config{Host:"localhost:8080", APIPath:"v1", ContentConfig:rest.ContentConfig{AcceptContentTypes:"application/json", ContentType:"application/json", GroupVersion:(*schema.GroupVersion)(nil), NegotiatedSerializer:runtime.NegotiatedSerializer(nil)}, Username:"gopher", Password:"--- REDACTED ---", BearerToken:"--- REDACTED ---", BearerTokenFile:"", Impersonate:rest.ImpersonationConfig{UserName:"gopher2", UID:"uid123", Groups:[]string(nil), Extra:map[string][]string(nil)}, AuthProvider:api.AuthProviderConfig{Name: "gopher", Config: map[string]string{--- REDACTED ---}}, AuthConfigPersister:rest.AuthProviderConfigPersister(--- REDACTED ---), ExecProvider:api.ExecConfig{Command: "sudo", Args: []string{"--- REDACTED ---"}, Env: []ExecEnvVar{--- REDACTED ---}, APIVersion: "", ProvideClusterInfo: true, Config: runtime.Object(--- REDACTED ---), StdinUnavailable: false}, TLSClientConfig:rest.sanitizedTLSClientConfig{Insecure:false, ServerName:"", CertFile:"a.crt", KeyFile:"a.key", CAFile:"", CertData:[]uint8{0x2d, 0x2d, 0x2d, 0x20, 0x54, 0x52, 0x55, 0x4e, 0x43, 0x41, 0x54, 0x45, 0x44, 0x20, 0x2d, 0x2d, 0x2d}, KeyData:[]uint8{0x2d, 0x2d, 0x2d, 0x20, 0x52, 0x45, 0x44, 0x41, 0x43, 0x54, 0x45, 0x44, 0x20, 0x2d, 0x2d, 0x2d}, CAData:[]uint8(nil), NextProtos:[]string{"h2", "http/1.1"}}, UserAgent:"gobot", DisableCompression:false, Transport:(*rest.fakeRoundTripper)(%p), WrapTransport:(transport.WrapperFunc)(%p), QPS:1, Burst:2, RateLimiter:(*rest.fakeLimiter)(%p), WarningHandler:rest.fakeWarningHandler{}, WarningHandlerWithContext:rest.fakeWarningHandlerWithContext{}, Timeout:3000000000, Dial:(func(context.Context, string, string) (net.Conn, error))(%p), Proxy:(func(*http.Request) (*url.URL, error))(%p)}` ,
635
656
c .Transport , fakeWrapperFunc , c .RateLimiter , fakeDialFunc , fakeProxyFunc ,
636
657
)
637
658
638
659
for _ , f := range []string {"%s" , "%v" , "%+v" , "%#v" } {
639
660
if got := fmt .Sprintf (f , c ); want != got {
640
- t .Errorf ("fmt.Sprintf(%q, c)\n got: %q\n want: %q" , f , got , want )
661
+ t .Errorf ("fmt.Sprintf(%q, c)\n got: %q\n want: %q\n diff: %s " , f , got , want , cmp . Diff ( want , got ) )
641
662
}
642
663
}
643
664
}
665
+
666
+ func TestConfigWarningHandler (t * testing.T ) {
667
+ config := & Config {}
668
+ config .GroupVersion = & schema.GroupVersion {}
669
+ config .NegotiatedSerializer = & fakeNegotiatedSerializer {}
670
+ handlerNoContext := & fakeWarningHandler {}
671
+ handlerWithContext := & fakeWarningHandlerWithContext {}
672
+
673
+ t .Run ("none" , func (t * testing.T ) {
674
+ client , err := RESTClientForConfigAndClient (config , nil )
675
+ require .NoError (t , err )
676
+ assert .Nil (t , client .warningHandler )
677
+ })
678
+
679
+ t .Run ("no-context" , func (t * testing.T ) {
680
+ config := CopyConfig (config )
681
+ handler := & fakeWarningHandlerWithLogging {}
682
+ config .WarningHandler = handler
683
+ client , err := RESTClientForConfigAndClient (config , nil )
684
+ require .NoError (t , err )
685
+ client .warningHandler .HandleWarningHeaderWithContext (context .Background (), 0 , "" , "message" )
686
+ assert .Equal (t , []string {"message" }, handler .messages )
687
+
688
+ })
689
+
690
+ t .Run ("with-context" , func (t * testing.T ) {
691
+ config := CopyConfig (config )
692
+ config .WarningHandlerWithContext = handlerWithContext
693
+ client , err := RESTClientForConfigAndClient (config , nil )
694
+ require .NoError (t , err )
695
+ assert .Equal (t , handlerWithContext , client .warningHandler )
696
+ })
697
+
698
+ t .Run ("both" , func (t * testing.T ) {
699
+ config := CopyConfig (config )
700
+ config .WarningHandler = handlerNoContext
701
+ config .WarningHandlerWithContext = handlerWithContext
702
+ client , err := RESTClientForConfigAndClient (config , nil )
703
+ require .NoError (t , err )
704
+ assert .NotNil (t , client .warningHandler )
705
+ assert .Equal (t , handlerWithContext , client .warningHandler )
706
+ })
707
+ }
0 commit comments