// Copyright 2024 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package externalaccount import ( "context" "errors" "testing" ) func TestRetrieveSubjectToken_ProgrammaticAuth(t *testing.T) { tfc := testConfig tfc.SubjectTokenSupplier = testSubjectTokenSupplier{ subjectToken: "subjectToken", } base, err := tfc.parse(context.Background()) if err != nil { t.Fatalf("parse() failed %v", err) } out, err := base.subjectToken() if err != nil { t.Fatalf("retrieveSubjectToken() failed: %v", err) } if out != "subjectToken" { t.Errorf("subjectToken = \n%q\n want \nSubjectToken", out) } } func TestRetrieveSubjectToken_ProgrammaticAuthFails(t *testing.T) { tfc := testConfig testError := errors.New("test error") tfc.SubjectTokenSupplier = testSubjectTokenSupplier{ err: testError, } base, err := tfc.parse(context.Background()) if err != nil { t.Fatalf("parse() failed %v", err) } _, err = base.subjectToken() if err == nil { t.Fatalf("subjectToken() should have failed") } if testError != err { t.Errorf("subjectToken = %e, want %e", err, testError) } } func TestRetrieveSubjectToken_ProgrammaticAuthOptions(t *testing.T) { tfc := testConfig expectedOptions := SupplierOptions{Audience: tfc.Audience, SubjectTokenType: tfc.SubjectTokenType} tfc.SubjectTokenSupplier = testSubjectTokenSupplier{ subjectToken: "subjectToken", expectedOptions: &expectedOptions, } base, err := tfc.parse(context.Background()) if err != nil { t.Fatalf("parse() failed %v", err) } _, err = base.subjectToken() if err != nil { t.Fatalf("retrieveSubjectToken() failed: %v", err) } } func TestRetrieveSubjectToken_ProgrammaticAuthContext(t *testing.T) { tfc := testConfig ctx := context.Background() tfc.SubjectTokenSupplier = testSubjectTokenSupplier{ subjectToken: "subjectToken", expectedContext: ctx, } base, err := tfc.parse(ctx) if err != nil { t.Fatalf("parse() failed %v", err) } _, err = base.subjectToken() if err != nil { t.Fatalf("retrieveSubjectToken() failed: %v", err) } } type testSubjectTokenSupplier struct { err error subjectToken string expectedOptions *SupplierOptions expectedContext context.Context } func (supp testSubjectTokenSupplier) SubjectToken(ctx context.Context, options SupplierOptions) (string, error) { if supp.err != nil { return "", supp.err } if supp.expectedOptions != nil { if supp.expectedOptions.Audience != options.Audience { return "", errors.New("Audience does not match") } if supp.expectedOptions.SubjectTokenType != options.SubjectTokenType { return "", errors.New("Audience does not match") } } if supp.expectedContext != nil { if supp.expectedContext != ctx { return "", errors.New("Context does not match") } } return supp.subjectToken, nil }