github.com/mika/distribution@v2.2.2-0.20160108133430-a75790e3d8e0+incompatible/registry/storage/driver/gcs/gcs_test.go (about)

     1  // +build include_gcs
     2  
     3  package gcs
     4  
     5  import (
     6  	"fmt"
     7  	"io/ioutil"
     8  	"os"
     9  	"testing"
    10  
    11  	"google.golang.org/api/googleapi"
    12  
    13  	ctx "github.com/docker/distribution/context"
    14  	storagedriver "github.com/docker/distribution/registry/storage/driver"
    15  	"github.com/docker/distribution/registry/storage/driver/testsuites"
    16  
    17  	"gopkg.in/check.v1"
    18  )
    19  
    20  // Hook up gocheck into the "go test" runner.
    21  func Test(t *testing.T) { check.TestingT(t) }
    22  
    23  var gcsDriverConstructor func(rootDirectory string) (storagedriver.StorageDriver, error)
    24  var skipGCS func() string
    25  
    26  func init() {
    27  	bucket := os.Getenv("REGISTRY_STORAGE_GCS_BUCKET")
    28  	keyfile := os.Getenv("REGISTRY_STORAGE_GCS_KEYFILE")
    29  	credentials := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")
    30  
    31  	root, err := ioutil.TempDir("", "driver-")
    32  	if err != nil {
    33  		panic(err)
    34  	}
    35  	defer os.Remove(root)
    36  
    37  	gcsDriverConstructor = func(rootDirectory string) (storagedriver.StorageDriver, error) {
    38  
    39  		parameters := driverParameters{
    40  			bucket,
    41  			keyfile,
    42  			rootDirectory,
    43  		}
    44  
    45  		return New(parameters)
    46  	}
    47  
    48  	// Skip GCS storage driver tests if environment variable parameters are not provided
    49  	skipGCS = func() string {
    50  		if bucket == "" || (credentials == "" && keyfile == "") {
    51  			return "Must set REGISTRY_STORAGE_GCS_BUCKET and (GOOGLE_APPLICATION_CREDENTIALS or REGISTRY_STORAGE_GCS_KEYFILE) to run GCS tests"
    52  		}
    53  		return ""
    54  	}
    55  
    56  	testsuites.RegisterSuite(func() (storagedriver.StorageDriver, error) {
    57  		return gcsDriverConstructor(root)
    58  	}, skipGCS)
    59  }
    60  
    61  func TestRetry(t *testing.T) {
    62  	if skipGCS() != "" {
    63  		t.Skip(skipGCS())
    64  	}
    65  
    66  	assertError := func(expected string, observed error) {
    67  		observedMsg := "<nil>"
    68  		if observed != nil {
    69  			observedMsg = observed.Error()
    70  		}
    71  		if observedMsg != expected {
    72  			t.Fatalf("expected %v, observed %v\n", expected, observedMsg)
    73  		}
    74  	}
    75  
    76  	err := retry(2, func() error {
    77  		return &googleapi.Error{
    78  			Code:    503,
    79  			Message: "google api error",
    80  		}
    81  	})
    82  	assertError("googleapi: Error 503: google api error", err)
    83  
    84  	err = retry(2, func() error {
    85  		return &googleapi.Error{
    86  			Code:    404,
    87  			Message: "google api error",
    88  		}
    89  	})
    90  	assertError("googleapi: Error 404: google api error", err)
    91  
    92  	err = retry(2, func() error {
    93  		return fmt.Errorf("error")
    94  	})
    95  	assertError("error", err)
    96  }
    97  
    98  func TestEmptyRootList(t *testing.T) {
    99  	if skipGCS() != "" {
   100  		t.Skip(skipGCS())
   101  	}
   102  
   103  	validRoot, err := ioutil.TempDir("", "driver-")
   104  	if err != nil {
   105  		t.Fatalf("unexpected error creating temporary directory: %v", err)
   106  	}
   107  	defer os.Remove(validRoot)
   108  
   109  	rootedDriver, err := gcsDriverConstructor(validRoot)
   110  	if err != nil {
   111  		t.Fatalf("unexpected error creating rooted driver: %v", err)
   112  	}
   113  
   114  	emptyRootDriver, err := gcsDriverConstructor("")
   115  	if err != nil {
   116  		t.Fatalf("unexpected error creating empty root driver: %v", err)
   117  	}
   118  
   119  	slashRootDriver, err := gcsDriverConstructor("/")
   120  	if err != nil {
   121  		t.Fatalf("unexpected error creating slash root driver: %v", err)
   122  	}
   123  
   124  	filename := "/test"
   125  	contents := []byte("contents")
   126  	ctx := ctx.Background()
   127  	err = rootedDriver.PutContent(ctx, filename, contents)
   128  	if err != nil {
   129  		t.Fatalf("unexpected error creating content: %v", err)
   130  	}
   131  	defer rootedDriver.Delete(ctx, filename)
   132  
   133  	keys, err := emptyRootDriver.List(ctx, "/")
   134  	for _, path := range keys {
   135  		if !storagedriver.PathRegexp.MatchString(path) {
   136  			t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp)
   137  		}
   138  	}
   139  
   140  	keys, err = slashRootDriver.List(ctx, "/")
   141  	for _, path := range keys {
   142  		if !storagedriver.PathRegexp.MatchString(path) {
   143  			t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp)
   144  		}
   145  	}
   146  }