blob: e3380160f0a0c6425e9531ab01fad6477451c8da [file] [log] [blame]
package gcsuploader
import (
"context"
"io/ioutil"
"math/rand"
"path"
"strconv"
"testing"
"time"
"cloud.google.com/go/storage"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/testutils/unittest"
"go.skia.org/infra/go/util"
)
const (
testBucket = "skia-temp"
)
func TestClientImpl(t *testing.T) {
unittest.ManualTest(t)
ctx := context.Background()
gc, err := storage.NewClient(ctx)
require.NoError(t, err)
c := &clientImpl{
client: gc,
}
randomSubfolder := setup(ctx, t, c.client)
t.Run("UploadToGCS_FileDoesNotExist_Success", testUploadToGCS_FileDoesNotExist_Success(c, randomSubfolder))
t.Run("UploadToGCS_FileDoesExist_Success", testUploadToGCS_FileDoesExist_DataOverwritten(c, randomSubfolder))
t.Run("UploadToGCS_PermanentError_RetriesAndThenErrors", testUploadToGCS_PermanentError_RetriesAndThenErrors(c))
}
// setup creates a randomly named subfolder in our test bucket. It creates a file with a sentinel
// value.
func setup(ctx context.Context, t *testing.T, c *storage.Client) string {
rand.Seed(time.Now().UnixNano())
subfolder := "gold_manual_tests/" + strconv.Itoa(rand.Int())
ctx, cancel := context.WithCancel(ctx)
defer cancel()
w := c.Bucket(testBucket).Object(subfolder + "/already_exists.json").NewWriter(ctx)
_, err := w.Write([]byte(`{"hello":"world"}`))
require.NoError(t, err)
return subfolder
}
func testUploadToGCS_FileDoesNotExist_Success(c *clientImpl, testPath string) func(t *testing.T) {
return func(t *testing.T) {
ctx := context.Background()
f := path.Join(testBucket, testPath, "my_file.json")
require.NoError(t, c.uploadToGCS(ctx, []byte("some data"), f))
actual := readGCSFile(ctx, t, c.client, path.Join(testPath, "my_file.json"))
assert.Equal(t, []byte("some data"), actual)
}
}
func testUploadToGCS_FileDoesExist_DataOverwritten(c *clientImpl, testPath string) func(t *testing.T) {
return func(t *testing.T) {
ctx := context.Background()
f := path.Join(testBucket, testPath, "already_exists.json")
require.NoError(t, c.uploadToGCS(ctx, []byte("overwrite the data!"), f))
actual := readGCSFile(ctx, t, c.client, path.Join(testPath, "already_exists.json"))
assert.Equal(t, []byte("overwrite the data!"), actual)
}
}
func testUploadToGCS_PermanentError_RetriesAndThenErrors(c *clientImpl) func(t *testing.T) {
return func(t *testing.T) {
require.Error(t, c.uploadToGCS(context.Background(), []byte("overwrite the data!"), "skia-this-will-permanently-fail/file.json"))
}
}
// readGCSFile returns the file contents of the given file in the test bucket.
func readGCSFile(ctx context.Context, t *testing.T, c *storage.Client, file string) []byte {
r, err := c.Bucket(testBucket).Object(file).NewReader(ctx)
require.NoError(t, err)
defer util.Close(r)
b, err := ioutil.ReadAll(r)
require.NoError(t, err)
return b
}