From 59f74115906f254f4ff03e4fc190e44f262b9c53 Mon Sep 17 00:00:00 2001 From: sundowndev Date: Fri, 17 Dec 2021 11:31:50 +0400 Subject: [PATCH] test: GCS backend Improve testing of the GCS backend: never use the non-mocked storage client to avoid IO/network operations. --- pkg/iac/terraform/state/backend/gs_reader.go | 18 +++++----- .../terraform/state/backend/gs_reader_test.go | 35 +++++++++++++------ .../gcp_application_default_credentials.json | 7 ---- 3 files changed, 34 insertions(+), 26 deletions(-) delete mode 100644 pkg/iac/terraform/state/backend/testdata/gcp_application_default_credentials.json diff --git a/pkg/iac/terraform/state/backend/gs_reader.go b/pkg/iac/terraform/state/backend/gs_reader.go index b911b0c4..0ab851a2 100644 --- a/pkg/iac/terraform/state/backend/gs_reader.go +++ b/pkg/iac/terraform/state/backend/gs_reader.go @@ -19,11 +19,6 @@ type GSBackend struct { } func NewGSReader(path string) (*GSBackend, error) { - storageClient, err := storage.NewClient(context.Background()) - if err != nil { - return nil, err - } - bucketPath := strings.Split(path, "/") if len(bucketPath) < 2 { return nil, errors.Errorf("Unable to parse Google Storage path: %s. Must be BUCKET_NAME/PATH/TO/OBJECT", path) @@ -32,14 +27,21 @@ func NewGSReader(path string) (*GSBackend, error) { key := strings.Join(bucketPath[1:], "/") return &GSBackend{ - bucketName: bucketName, - path: key, - storageClient: storageClient, + bucketName: bucketName, + path: key, }, nil } func (s *GSBackend) Read(p []byte) (int, error) { if s.reader == nil { + if s.storageClient == nil { + client, err := storage.NewClient(context.Background()) + if err != nil { + return 0, err + } + s.storageClient = client + } + ctx := context.Background() rc, err := s.storageClient.Bucket(s.bucketName).Object(s.path).NewReader(ctx) if err != nil { diff --git a/pkg/iac/terraform/state/backend/gs_reader_test.go b/pkg/iac/terraform/state/backend/gs_reader_test.go index ff5ccf44..b87676c4 100644 --- a/pkg/iac/terraform/state/backend/gs_reader_test.go +++ b/pkg/iac/terraform/state/backend/gs_reader_test.go @@ -5,7 +5,6 @@ import ( "fmt" "io" "net/http" - "os" "reflect" "testing" @@ -14,7 +13,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestGSBackendInvalid(t *testing.T) { +func TestGSBackend_NewGSReader(t *testing.T) { type args struct { path string } @@ -24,6 +23,16 @@ func TestGSBackendInvalid(t *testing.T) { want *GSBackend wantErr error }{ + { + name: "valid path", + args: args{ + path: "bucket-1/path/to/terraform.tfstate", + }, + want: &GSBackend{ + bucketName: "bucket-1", + path: "path/to/terraform.tfstate", + }, + }, { name: "invalid path", args: args{ @@ -35,12 +44,12 @@ func TestGSBackendInvalid(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - _ = os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", "testdata/gcp_application_default_credentials.json") - got, err := NewGSReader(tt.args.path) - if err.Error() != tt.wantErr.Error() { - t.Errorf("NewGSReader() error = '%s', wantErr '%s'", err, tt.wantErr) + if tt.wantErr != nil { + assert.EqualError(t, err, tt.wantErr.Error()) return + } else { + assert.NoError(t, err) } if !reflect.DeepEqual(got, tt.want) { t.Errorf("NewGSReader() got = %v, want %v", got, tt.want) @@ -122,21 +131,23 @@ func TestGSBackend_Read(t *testing.T) { func TestGSBackend_Close(t *testing.T) { tests := []struct { name string - reader io.ReadCloser + reader *MockReaderMock client *storage.Client wantErr error }{ { name: "should fail to close reader", - reader: func() io.ReadCloser { - return nil + reader: func() *MockReaderMock { + m := &MockReaderMock{} + m.On("Close").Return(errors.New("dummy error")) + return m }(), client: &storage.Client{}, - wantErr: errors.New("Unable to close reader as nothing was opened"), + wantErr: errors.New("dummy error"), }, { name: "should close reader", - reader: func() io.ReadCloser { + reader: func() *MockReaderMock { m := &MockReaderMock{} m.On("Close").Return(nil) return m @@ -156,6 +167,8 @@ func TestGSBackend_Close(t *testing.T) { } else { assert.EqualError(t, err, tt.wantErr.Error()) } + + tt.reader.AssertExpectations(t) }) } } diff --git a/pkg/iac/terraform/state/backend/testdata/gcp_application_default_credentials.json b/pkg/iac/terraform/state/backend/testdata/gcp_application_default_credentials.json deleted file mode 100644 index a66562e0..00000000 --- a/pkg/iac/terraform/state/backend/testdata/gcp_application_default_credentials.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "client_id": "testdata.driftctl.apps.googleusercontent.com", - "client_secret": "fake-secret", - "quota_project_id": "fake-project-id", - "refresh_token": "fake-token", - "type": "authorized_user" -} \ No newline at end of file