func testStorage(t *testing.T, bucketDir string) { if *accountID == "" && *appKey == "" { t.Skip("Skipping test without --account-id or --application-key flag") } rn := rand.New(rand.NewSource(time.Now().UnixNano())).Intn(1000000) bucket := fmt.Sprintf("camli-test-%d", rn) bucketWithDir := path.Join(bucket, bucketDir) storagetest.TestOpt(t, storagetest.Opts{ New: func(t *testing.T) (sto blobserver.Storage, cleanup func()) { sto, err := newFromConfig(nil, jsonconfig.Obj{ "bucket": bucketWithDir, "auth": map[string]interface{}{ "account_id": *accountID, "application_key": *appKey, }, }) if err != nil { t.Fatal(err) } if !testing.Short() { log.Printf("Warning: this test does many serial operations. Without the go test -short flag, this test will be very slow.") } if bucketWithDir != bucket { // Adding "a", and "c" objects in the bucket to make sure objects out of the // "directory" are not touched and have no influence. for _, key := range []string{"a", "c"} { if _, err := sto.(*Storage).b.Upload(strings.NewReader(key), key, ""); err != nil { t.Fatalf("could not insert object %s in bucket %v: %v", key, sto.(*Storage).b.Name, err) } } } clearBucket := func(beforeTests bool) func() { return func() { var all []blob.Ref blobserver.EnumerateAll(context.TODO(), sto, func(sb blob.SizedRef) error { t.Logf("Deleting: %v", sb.Ref) all = append(all, sb.Ref) return nil }) if err := sto.RemoveBlobs(all); err != nil { t.Fatalf("Error removing blobs during cleanup: %v", err) } if beforeTests { return } if bucketWithDir != bucket { // checking that "a" and "c" at the root were left untouched. for _, key := range []string{"a", "c"} { fi, err := sto.(*Storage).b.GetFileInfoByName(key) if err != nil { t.Fatalf("could not remove object %s after tests: %v", key, err) } if err := sto.(*Storage).cl.DeleteFile(fi.ID, fi.Name); err != nil { t.Fatalf("could not remove object %s after tests: %v", key, err) } } } if err := sto.(*Storage).b.Delete(); err != nil { t.Fatalf("could not remove bucket %s after tests: %v", sto.(*Storage).b.Name, err) } } } clearBucket(true)() return sto, clearBucket(false) }, }) }
func testStorage(t *testing.T, bucketDir string) { if *bucket == "" && *configFile == "" { t.Skip("Skipping test without --bucket or --config flag") } var refreshToken string if *configFile != "" { data, err := ioutil.ReadFile(*configFile) if err != nil { t.Fatalf("Error reading config file %v: %v", *configFile, err) } var conf Config if err := json.Unmarshal(data, &conf); err != nil { t.Fatalf("Error decoding config file %v: %v", *configFile, err) } *clientID = conf.Auth.ClientID *clientSecret = conf.Auth.ClientSecret refreshToken = conf.Auth.RefreshToken *bucket = conf.Bucket } if *bucket == "" { t.Fatal("bucket not provided in config file or as a flag.") } if *clientID == "" { if !metadata.OnGCE() { if *clientSecret == "" { t.Fatal("client ID and client secret required. Obtain from https://console.developers.google.com/ > Project > APIs & Auth > Credentials. Should be a 'native' or 'Installed application'") } } else { *clientID = "auto" } } if *configFile == "" { config := &oauth2.Config{ Scopes: []string{storage.ScopeReadWrite}, Endpoint: google.Endpoint, ClientID: *clientID, ClientSecret: *clientSecret, RedirectURL: oauthutil.TitleBarRedirectURL, } if !metadata.OnGCE() { token, err := oauth2.ReuseTokenSource(nil, &oauthutil.TokenSource{ Config: config, CacheFile: *tokenCache, AuthCode: func() string { if *authCode == "" { t.Skipf("Re-run using --auth_code= with the value obtained from %s", config.AuthCodeURL("", oauth2.AccessTypeOffline, oauth2.ApprovalForce)) return "" } return *authCode }, }).Token() if err != nil { t.Fatalf("could not acquire token: %v", err) } refreshToken = token.RefreshToken } } bucketWithDir := path.Join(*bucket, bucketDir) storagetest.TestOpt(t, storagetest.Opts{ New: func(t *testing.T) (sto blobserver.Storage, cleanup func()) { sto, err := newFromConfig(nil, jsonconfig.Obj{ "bucket": bucketWithDir, "auth": map[string]interface{}{ "client_id": *clientID, "client_secret": *clientSecret, "refresh_token": refreshToken, }, }) if err != nil { t.Fatal(err) } if !testing.Short() { log.Printf("Warning: this test does many serial operations. Without the go test -short flag, this test will be very slow.") } // Bail if bucket is not empty ctx := context.Background() stor := sto.(*Storage) objs, err := stor.client.Bucket(stor.bucket).List(ctx, nil) if err != nil { t.Fatalf("Error checking if bucket is empty: %v", err) } if len(objs.Results) != 0 { t.Fatalf("Refusing to run test: bucket %v is not empty", *bucket) } if bucketWithDir != *bucket { // Adding "a", and "c" objects in the bucket to make sure objects out of the // "directory" are not touched and have no influence. for _, key := range []string{"a", "c"} { w := stor.client.Bucket(stor.bucket).Object(key).NewWriter(ctx) if _, err := io.Copy(w, strings.NewReader(key)); err != nil { t.Fatalf("could not insert object %s in bucket %v: %v", key, sto.(*Storage).bucket, err) } if err := w.Close(); err != nil { t.Fatalf("could not insert object %s in bucket %v: %v", key, sto.(*Storage).bucket, err) } } } clearBucket := func(beforeTests bool) func() { return func() { var all []blob.Ref blobserver.EnumerateAll(context.TODO(), sto, func(sb blob.SizedRef) error { t.Logf("Deleting: %v", sb.Ref) all = append(all, sb.Ref) return nil }) if err := sto.RemoveBlobs(all); err != nil { t.Fatalf("Error removing blobs during cleanup: %v", err) } if beforeTests { return } if bucketWithDir != *bucket { // checking that "a" and "c" at the root were left untouched. for _, key := range []string{"a", "c"} { rc, err := stor.client.Bucket(stor.bucket).Object(key).NewReader(ctx) if err != nil { t.Fatalf("could not find object %s after tests: %v", key, err) } if _, err := io.Copy(ioutil.Discard, rc); err != nil { t.Fatalf("could not find object %s after tests: %v", key, err) } if err := stor.client.Bucket(stor.bucket).Object(key).Delete(ctx); err != nil { t.Fatalf("could not remove object %s after tests: %v", key, err) } } } } } clearBucket(true)() return sto, clearBucket(false) }, }) }
func TestStorage(t *testing.T) { if (*parentId == "" || *parentId == "root") && *configFile == "" { t.Skip("Skipping test, refusing to use goodle drive's root directory. (you need to specify --parentDir or --config).") } var refreshToken string if *configFile != "" { data, err := ioutil.ReadFile(*configFile) if err != nil { t.Fatalf("Error reading config file %v: %v", *configFile, err) } var conf Config if err := json.Unmarshal(data, &conf); err != nil { t.Fatalf("Error decoding config file %v: %v", *configFile, err) } *clientID = conf.Auth.ClientID *clientSecret = conf.Auth.ClientSecret refreshToken = conf.Auth.RefreshToken *parentId = conf.ParentDir } if *parentId == "" || *parentId == "root" { t.Fatal("ParentDir must be specified, and not \"root\"") } if *clientID == "" || *clientSecret == "" { t.Fatal("--client_id and --client_secret required. Obtain from https://console.developers.google.com/ > Project > APIs & Auth > Credentials. Should be a 'native' or 'Installed application'") } if *configFile == "" { config := &oauth2.Config{ Scopes: []string{Scope}, Endpoint: google.Endpoint, ClientID: *clientID, ClientSecret: *clientSecret, RedirectURL: oauthutil.TitleBarRedirectURL, } token, err := oauth2.ReuseTokenSource(nil, &oauthutil.TokenSource{ Config: config, CacheFile: *tokenCache, AuthCode: func() string { if *authCode == "" { t.Skipf("Re-run using --auth_code= with the value obtained from %s", config.AuthCodeURL("", oauth2.AccessTypeOffline, oauth2.ApprovalForce)) return "" } return *authCode }, }).Token() if err != nil { t.Fatalf("could not acquire token: %v", err) } refreshToken = token.RefreshToken } storagetest.TestOpt(t, storagetest.Opts{ New: func(t *testing.T) (sto blobserver.Storage, cleanup func()) { sto, err := newFromConfig(nil, jsonconfig.Obj{ "parent_id": *parentId, "auth": map[string]interface{}{ "client_id": *clientID, "client_secret": *clientSecret, "refresh_token": refreshToken, }, }) if err != nil { t.Fatal(err) } if !testing.Short() { log.Printf("Warning: this test does many serial operations. Without the go test -short flag, this test will be very slow.") } clearDirectory := func() { log.Printf("WARNING: no cleanup in %v directory was done.", *parentId) } return sto, clearDirectory }, SkipEnum: true, }) }