X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/0ad35b5c3002910ea60d2ac7685af5936079a46f..98db65de63c9e2acfeae6636ccc619171635bda0:/services/keep-web/s3_test.go diff --git a/services/keep-web/s3_test.go b/services/keep-web/s3_test.go index c76768a14a..c6d53238e8 100644 --- a/services/keep-web/s3_test.go +++ b/services/keep-web/s3_test.go @@ -220,6 +220,83 @@ func (s *IntegrationSuite) testS3PutObjectSuccess(c *check.C, bucket *s3.Bucket, } } +func (s *IntegrationSuite) TestS3ProjectPutObjectNotSupported(c *check.C) { + stage := s.s3setup(c) + defer stage.teardown(c) + bucket := stage.projbucket + + for _, trial := range []struct { + path string + size int + contentType string + }{ + { + path: "newfile", + size: 1234, + contentType: "application/octet-stream", + }, { + path: "newdir/newfile", + size: 1234, + contentType: "application/octet-stream", + }, { + path: "newdir2/", + size: 0, + contentType: "application/x-directory", + }, + } { + c.Logf("=== %v", trial) + + _, err := bucket.GetReader(trial.path) + c.Assert(err, check.ErrorMatches, `404 Not Found`) + + buf := make([]byte, trial.size) + rand.Read(buf) + + err = bucket.PutReader(trial.path, bytes.NewReader(buf), int64(len(buf)), trial.contentType, s3.Private, s3.Options{}) + c.Check(err, check.ErrorMatches, `400 Bad Request`) + + _, err = bucket.GetReader(trial.path) + c.Assert(err, check.ErrorMatches, `404 Not Found`) + } +} + +func (s *IntegrationSuite) TestS3CollectionDeleteObject(c *check.C) { + stage := s.s3setup(c) + defer stage.teardown(c) + s.testS3DeleteObject(c, stage.collbucket, "") +} +func (s *IntegrationSuite) TestS3ProjectDeleteObject(c *check.C) { + stage := s.s3setup(c) + defer stage.teardown(c) + s.testS3DeleteObject(c, stage.projbucket, stage.coll.Name+"/") +} +func (s *IntegrationSuite) testS3DeleteObject(c *check.C, bucket *s3.Bucket, prefix string) { + s.testServer.Config.cluster.Collections.S3FolderObjects = true + for _, trial := range []struct { + path string + }{ + {"/"}, + {"nonexistentfile"}, + {"emptyfile"}, + {"sailboat.txt"}, + {"sailboat.txt/"}, + {"emptydir"}, + {"emptydir/"}, + } { + objname := prefix + trial.path + comment := check.Commentf("objname %q", objname) + + err := bucket.Del(objname) + if trial.path == "/" { + c.Check(err, check.NotNil) + continue + } + c.Check(err, check.IsNil, comment) + _, err = bucket.GetReader(objname) + c.Check(err, check.NotNil, comment) + } +} + func (s *IntegrationSuite) TestS3CollectionPutObjectFailure(c *check.C) { stage := s.s3setup(c) defer stage.teardown(c) @@ -305,6 +382,7 @@ func (s *IntegrationSuite) TestS3GetBucketVersioning(c *check.C) { defer stage.teardown(c) for _, bucket := range []*s3.Bucket{stage.collbucket, stage.projbucket} { req, err := http.NewRequest("GET", bucket.URL("/"), nil) + c.Check(err, check.IsNil) req.Header.Set("Authorization", "AWS "+arvadostest.ActiveTokenV2+":none") req.URL.RawQuery = "versioning" resp, err := http.DefaultClient.Do(req) @@ -316,6 +394,23 @@ func (s *IntegrationSuite) TestS3GetBucketVersioning(c *check.C) { } } +// If there are no CommonPrefixes entries, the CommonPrefixes XML tag +// should not appear at all. +func (s *IntegrationSuite) TestS3ListNoCommonPrefixes(c *check.C) { + stage := s.s3setup(c) + defer stage.teardown(c) + + req, err := http.NewRequest("GET", stage.collbucket.URL("/"), nil) + c.Assert(err, check.IsNil) + req.Header.Set("Authorization", "AWS "+arvadostest.ActiveTokenV2+":none") + req.URL.RawQuery = "prefix=asdfasdfasdf&delimiter=/" + resp, err := http.DefaultClient.Do(req) + c.Assert(err, check.IsNil) + buf, err := ioutil.ReadAll(resp.Body) + c.Assert(err, check.IsNil) + c.Check(string(buf), check.Not(check.Matches), `(?ms).*CommonPrefixes.*`) +} + func (s *IntegrationSuite) TestS3CollectionList(c *check.C) { stage := s.s3setup(c) defer stage.teardown(c)