diff --git a/integration_test/credetial_plugin_test.go b/integration_test/credetial_plugin_test.go index f7038898..12f5d70a 100644 --- a/integration_test/credetial_plugin_test.go +++ b/integration_test/credetial_plugin_test.go @@ -62,7 +62,6 @@ func TestCredentialPlugin(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) var stdout bytes.Buffer runGetToken(t, ctx, getTokenConfig{ tokenCacheDir: tokenCacheDir, @@ -90,7 +89,6 @@ func TestCredentialPlugin(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) var stdout bytes.Buffer runGetToken(t, ctx, getTokenConfig{ tokenCacheDir: tokenCacheDir, @@ -111,7 +109,6 @@ func TestCredentialPlugin(t *testing.T) { ctx, cancel := context.WithTimeout(context.TODO(), timeout) defer cancel() sv := oidcserver.New(t, tc.keyPair, oidcserver.Config{}) - defer sv.Shutdown(t, ctx) t.Run("NoCache", func(t *testing.T) { sv.SetConfig(oidcserver.Config{ @@ -212,7 +209,6 @@ func TestCredentialPlugin(t *testing.T) { CodeChallengeMethodsSupported: []string{"plain", "S256"}, }, }) - defer sv.Shutdown(t, ctx) var stdout bytes.Buffer runGetToken(t, ctx, getTokenConfig{ tokenCacheDir: tokenCacheDir, @@ -237,7 +233,6 @@ func TestCredentialPlugin(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) var stdout bytes.Buffer runGetToken(t, ctx, getTokenConfig{ tokenCacheDir: tokenCacheDir, @@ -263,7 +258,6 @@ func TestCredentialPlugin(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) var stdout bytes.Buffer runGetToken(t, ctx, getTokenConfig{ tokenCacheDir: tokenCacheDir, @@ -292,7 +286,6 @@ func TestCredentialPlugin(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) var stdout bytes.Buffer runGetToken(t, ctx, getTokenConfig{ tokenCacheDir: tokenCacheDir, @@ -318,7 +311,6 @@ func TestCredentialPlugin(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) var stdout bytes.Buffer runGetToken(t, ctx, getTokenConfig{ tokenCacheDir: tokenCacheDir, @@ -344,7 +336,6 @@ func TestCredentialPlugin(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) var stdout bytes.Buffer runGetToken(t, ctx, getTokenConfig{ tokenCacheDir: tokenCacheDir, @@ -380,7 +371,6 @@ func TestCredentialPlugin(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) var stdout bytes.Buffer runGetToken(t, ctx, getTokenConfig{ tokenCacheDir: tokenCacheDir, diff --git a/integration_test/kubeconfig/kubeconfig.go b/integration_test/kubeconfig/kubeconfig.go index 5f03dea6..7c675481 100644 --- a/integration_test/kubeconfig/kubeconfig.go +++ b/integration_test/kubeconfig/kubeconfig.go @@ -22,7 +22,8 @@ type Values struct { // Create creates a kubeconfig file and returns path to it. func Create(t *testing.T, v *Values) string { t.Helper() - f, err := os.Create(filepath.Join(t.TempDir(), "kubeconfig")) + name := filepath.Join(t.TempDir(), "kubeconfig") + f, err := os.Create(name) if err != nil { t.Fatal(err) } @@ -34,7 +35,7 @@ func Create(t *testing.T, v *Values) string { if err := tpl.Execute(f, v); err != nil { t.Fatal(err) } - return f.Name() + return name } type AuthProviderConfig struct { diff --git a/integration_test/oidcserver/http/http.go b/integration_test/oidcserver/http/http.go index 60d4a6d0..eb751ba8 100644 --- a/integration_test/oidcserver/http/http.go +++ b/integration_test/oidcserver/http/http.go @@ -10,28 +10,14 @@ import ( "github.com/int128/kubelogin/integration_test/keypair" ) -type Shutdowner interface { - Shutdown(t *testing.T, ctx context.Context) -} - -type shutdowner struct { - s *http.Server -} - -func (s *shutdowner) Shutdown(t *testing.T, ctx context.Context) { - if err := s.s.Shutdown(ctx); err != nil { - t.Errorf("could not shutdown the server: %s", err) - } -} - -func Start(t *testing.T, h http.Handler, k keypair.KeyPair) (string, Shutdowner) { +func Start(t *testing.T, h http.Handler, k keypair.KeyPair) string { if k == keypair.None { return startNoTLS(t, h) } return startTLS(t, h, k) } -func startNoTLS(t *testing.T, h http.Handler) (string, *shutdowner) { +func startNoTLS(t *testing.T, h http.Handler) string { t.Helper() l, port := newLocalhostListener(t) url := "http://localhost:" + port @@ -44,10 +30,15 @@ func startNoTLS(t *testing.T, h http.Handler) (string, *shutdowner) { t.Error(err) } }() - return url, &shutdowner{s} + t.Cleanup(func() { + if err := s.Shutdown(context.TODO()); err != nil { + t.Errorf("could not shutdown the server: %s", err) + } + }) + return url } -func startTLS(t *testing.T, h http.Handler, k keypair.KeyPair) (string, *shutdowner) { +func startTLS(t *testing.T, h http.Handler, k keypair.KeyPair) string { t.Helper() l, port := newLocalhostListener(t) url := "https://localhost:" + port @@ -60,7 +51,12 @@ func startTLS(t *testing.T, h http.Handler, k keypair.KeyPair) (string, *shutdow t.Error(err) } }() - return url, &shutdowner{s} + t.Cleanup(func() { + if err := s.Shutdown(context.TODO()); err != nil { + t.Errorf("could not shutdown the server: %s", err) + } + }) + return url } func newLocalhostListener(t *testing.T) (net.Listener, string) { diff --git a/integration_test/oidcserver/server.go b/integration_test/oidcserver/server.go index de4cc761..7ba87714 100644 --- a/integration_test/oidcserver/server.go +++ b/integration_test/oidcserver/server.go @@ -17,7 +17,6 @@ import ( ) type Server interface { - http.Shutdowner IssuerURL() string SetConfig(Config) LastTokenResponse() *handler.TokenResponse @@ -51,13 +50,12 @@ type Config struct { // New starts a HTTP server for the OpenID Connect provider. func New(t *testing.T, k keypair.KeyPair, c Config) Server { sv := server{Config: c, t: t} - sv.issuerURL, sv.Shutdowner = http.Start(t, handler.New(t, &sv), k) + sv.issuerURL = http.Start(t, handler.New(t, &sv), k) return &sv } type server struct { Config - http.Shutdowner t *testing.T issuerURL string lastAuthenticationRequest *handler.AuthenticationRequest diff --git a/integration_test/standalone_test.go b/integration_test/standalone_test.go index 59185b1a..419616ff 100644 --- a/integration_test/standalone_test.go +++ b/integration_test/standalone_test.go @@ -55,12 +55,10 @@ func TestStandalone(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) kubeConfigFilename := kubeconfig.Create(t, &kubeconfig.Values{ Issuer: sv.IssuerURL(), IDPCertificateAuthority: tc.keyPair.CACertPath, }) - defer os.Remove(kubeConfigFilename) runStandalone(t, ctx, standaloneConfig{ issuerURL: sv.IssuerURL(), kubeConfigFilename: kubeConfigFilename, @@ -88,12 +86,10 @@ func TestStandalone(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) kubeConfigFilename := kubeconfig.Create(t, &kubeconfig.Values{ Issuer: sv.IssuerURL(), IDPCertificateAuthority: tc.keyPair.CACertPath, }) - defer os.Remove(kubeConfigFilename) runStandalone(t, ctx, standaloneConfig{ issuerURL: sv.IssuerURL(), kubeConfigFilename: kubeConfigFilename, @@ -115,12 +111,10 @@ func TestStandalone(t *testing.T) { ctx, cancel := context.WithTimeout(context.TODO(), timeout) defer cancel() sv := oidcserver.New(t, tc.keyPair, oidcserver.Config{}) - defer sv.Shutdown(t, ctx) kubeConfigFilename := kubeconfig.Create(t, &kubeconfig.Values{ Issuer: sv.IssuerURL(), IDPCertificateAuthority: tc.keyPair.CACertPath, }) - defer os.Remove(kubeConfigFilename) t.Run("NoToken", func(t *testing.T) { sv.SetConfig(oidcserver.Config{ @@ -219,12 +213,10 @@ func TestStandalone(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) kubeConfigFilename := kubeconfig.Create(t, &kubeconfig.Values{ Issuer: sv.IssuerURL(), IDPCertificateAuthorityData: keypair.Server.CACertBase64, }) - defer os.Remove(kubeConfigFilename) runStandalone(t, ctx, standaloneConfig{ issuerURL: sv.IssuerURL(), kubeConfigFilename: kubeConfigFilename, @@ -249,13 +241,10 @@ func TestStandalone(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) kubeConfigFilename := kubeconfig.Create(t, &kubeconfig.Values{ Issuer: sv.IssuerURL(), }) - defer os.Remove(kubeConfigFilename) - setenv(t, "KUBECONFIG", kubeConfigFilename+string(os.PathListSeparator)+"kubeconfig/testdata/dummy.yaml") - defer unsetenv(t, "KUBECONFIG") + t.Setenv("KUBECONFIG", kubeConfigFilename+string(os.PathListSeparator)+"kubeconfig/testdata/dummy.yaml") runStandalone(t, ctx, standaloneConfig{ issuerURL: sv.IssuerURL(), httpDriver: httpdriver.New(ctx, t, httpdriver.Option{}), @@ -280,12 +269,10 @@ func TestStandalone(t *testing.T) { IDTokenExpiry: now.Add(time.Hour), }, }) - defer sv.Shutdown(t, ctx) kubeConfigFilename := kubeconfig.Create(t, &kubeconfig.Values{ Issuer: sv.IssuerURL(), ExtraScopes: "profile,groups", }) - defer os.Remove(kubeConfigFilename) runStandalone(t, ctx, standaloneConfig{ issuerURL: sv.IssuerURL(), kubeConfigFilename: kubeConfigFilename, @@ -318,17 +305,3 @@ func runStandalone(t *testing.T, ctx context.Context, cfg standaloneConfig) { t.Errorf("exit status wants 0 but %d", exitCode) } } - -func setenv(t *testing.T, key, value string) { - t.Helper() - if err := os.Setenv(key, value); err != nil { - t.Fatalf("Could not set the env var %s=%s: %s", key, value, err) - } -} - -func unsetenv(t *testing.T, key string) { - t.Helper() - if err := os.Unsetenv(key); err != nil { - t.Fatalf("Could not unset the env var %s: %s", key, err) - } -} diff --git a/pkg/kubeconfig/loader/load_test.go b/pkg/kubeconfig/loader/load_test.go index a37f4bc3..e0bd15fe 100644 --- a/pkg/kubeconfig/loader/load_test.go +++ b/pkg/kubeconfig/loader/load_test.go @@ -11,8 +11,7 @@ import ( func Test_loadByDefaultRules(t *testing.T) { t.Run("google.yaml>keycloak.yaml", func(t *testing.T) { - setenv(t, "KUBECONFIG", "testdata/kubeconfig.google.yaml"+string(os.PathListSeparator)+"testdata/kubeconfig.keycloak.yaml") - defer unsetenv(t, "KUBECONFIG") + t.Setenv("KUBECONFIG", "testdata/kubeconfig.google.yaml"+string(os.PathListSeparator)+"testdata/kubeconfig.keycloak.yaml") config, err := loadByDefaultRules("") if err != nil { @@ -36,8 +35,7 @@ func Test_loadByDefaultRules(t *testing.T) { }) t.Run("keycloak.yaml>google.yaml", func(t *testing.T) { - setenv(t, "KUBECONFIG", "testdata/kubeconfig.keycloak.yaml"+string(os.PathListSeparator)+"testdata/kubeconfig.google.yaml") - defer unsetenv(t, "KUBECONFIG") + t.Setenv("KUBECONFIG", "testdata/kubeconfig.keycloak.yaml"+string(os.PathListSeparator)+"testdata/kubeconfig.google.yaml") config, err := loadByDefaultRules("") if err != nil { @@ -61,20 +59,6 @@ func Test_loadByDefaultRules(t *testing.T) { }) } -func setenv(t *testing.T, key, value string) { - t.Helper() - if err := os.Setenv(key, value); err != nil { - t.Fatalf("Could not set the env var %s=%s: %s", key, value, err) - } -} - -func unsetenv(t *testing.T, key string) { - t.Helper() - if err := os.Unsetenv(key); err != nil { - t.Fatalf("Could not unset the env var %s: %s", key, err) - } -} - func Test_findCurrentAuthProvider(t *testing.T) { t.Run("CurrentContext", func(t *testing.T) { got, err := findCurrentAuthProvider(&api.Config{ diff --git a/pkg/kubeconfig/writer/write_test.go b/pkg/kubeconfig/writer/write_test.go index 3f2587df..1f1ca9e3 100644 --- a/pkg/kubeconfig/writer/write_test.go +++ b/pkg/kubeconfig/writer/write_test.go @@ -3,6 +3,7 @@ package writer import ( "io/ioutil" "os" + "path/filepath" "testing" "github.com/google/go-cmp/cmp" @@ -14,13 +15,8 @@ func TestKubeconfig_UpdateAuth(t *testing.T) { t.Run("MinimumKeys", func(t *testing.T) { f := newKubeconfigFile(t) - defer func() { - if err := os.Remove(f.Name()); err != nil { - t.Errorf("Could not remove the temp file: %s", err) - } - }() if err := w.UpdateAuthProvider(kubeconfig.AuthProvider{ - LocationOfOrigin: f.Name(), + LocationOfOrigin: f, UserName: "google", IDPIssuerURL: "https://accounts.google.com", ClientID: "GOOGLE_CLIENT_ID", @@ -30,7 +26,7 @@ func TestKubeconfig_UpdateAuth(t *testing.T) { }); err != nil { t.Fatalf("Could not update auth: %s", err) } - b, err := ioutil.ReadFile(f.Name()) + b, err := ioutil.ReadFile(f) if err != nil { t.Fatalf("Could not read kubeconfig: %s", err) } @@ -61,13 +57,8 @@ users: t.Run("FullKeys", func(t *testing.T) { f := newKubeconfigFile(t) - defer func() { - if err := os.Remove(f.Name()); err != nil { - t.Errorf("Could not remove the temp file: %s", err) - } - }() if err := w.UpdateAuthProvider(kubeconfig.AuthProvider{ - LocationOfOrigin: f.Name(), + LocationOfOrigin: f, UserName: "google", IDPIssuerURL: "https://accounts.google.com", ClientID: "GOOGLE_CLIENT_ID", @@ -80,7 +71,7 @@ users: }); err != nil { t.Fatalf("Could not update auth: %s", err) } - b, err := ioutil.ReadFile(f.Name()) + b, err := ioutil.ReadFile(f) if err != nil { t.Fatalf("Could not read kubeconfig: %s", err) } @@ -113,8 +104,8 @@ users: }) } -func newKubeconfigFile(t *testing.T) *os.File { - content := `apiVersion: v1 +const kubeconfigContent = ` +apiVersion: v1 clusters: [] kind: Config preferences: {} @@ -124,13 +115,12 @@ users: auth-provider: config: idp-issuer-url: https://accounts.google.com - name: oidc` - f, err := ioutil.TempFile("", "kubeconfig") - if err != nil { - t.Fatalf("Could not create a file: %s", err) - } - defer f.Close() - if _, err := f.Write([]byte(content)); err != nil { + name: oidc +` + +func newKubeconfigFile(t *testing.T) string { + f := filepath.Join(t.TempDir(), "kubeconfig") + if err := os.WriteFile(f, []byte(kubeconfigContent), 0644); err != nil { t.Fatalf("Could not write kubeconfig: %s", err) } return f