terraform/state/remote/gcs_test.go

70 lines
1.9 KiB
Go

package remote
import (
"fmt"
"os"
"testing"
"time"
storage "google.golang.org/api/storage/v1"
)
func TestGCSClient_impl(t *testing.T) {
var _ Client = new(GCSClient)
}
func TestGCSClient(t *testing.T) {
// This test creates a bucket in GCS and populates it.
// It may incur costs, so it will only run if GCS credential environment
// variables are present.
projectID := os.Getenv("GOOGLE_PROJECT")
if projectID == "" {
t.Skipf("skipping; GOOGLE_PROJECT must be set")
}
bucketName := fmt.Sprintf("terraform-remote-gcs-test-%x", time.Now().Unix())
keyName := "testState"
testData := []byte(`testing data`)
config := make(map[string]string)
config["bucket"] = bucketName
config["path"] = keyName
client, err := gcsFactory(config)
if err != nil {
t.Fatalf("Error for valid config: %v", err)
}
gcsClient := client.(*GCSClient)
nativeClient := gcsClient.clientStorage
// Be clear about what we're doing in case the user needs to clean
// this up later.
if _, err := nativeClient.Buckets.Get(bucketName).Do(); err == nil {
fmt.Printf("Bucket %s already exists - skipping buckets.insert call.", bucketName)
} else {
// Create a bucket.
if res, err := nativeClient.Buckets.Insert(projectID, &storage.Bucket{Name: bucketName}).Do(); err == nil {
fmt.Printf("Created bucket %v at location %v\n\n", res.Name, res.SelfLink)
} else {
t.Skipf("Failed to create test GCS bucket, so skipping")
}
}
// Ensure we can perform a PUT request with the encryption header
err = gcsClient.Put(testData)
if err != nil {
t.Logf("WARNING: Failed to send test data to GCS bucket. (error was %s)", err)
}
defer func() {
// Delete the test bucket in the project
if err := gcsClient.clientStorage.Buckets.Delete(bucketName).Do(); err != nil {
t.Logf("WARNING: Failed to delete the test GCS bucket. It has been left in your GCE account and may incur storage charges. (error was %s)", err)
}
}()
testClient(t, client)
}