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 }