Merge branch '20602-controller-qos'
[arvados.git] / services / keep-web / s3_test.go
index a99f3c278f6214b5764f853920c10539f7757ffe..aa91d82ae36ab6c01cb50ef7b7dd944af16b4236 100644 (file)
@@ -82,6 +82,11 @@ func (s *IntegrationSuite) s3setup(c *check.C) s3stage {
                        "array":    []string{"element1", "element2"},
                        "object":   map[string]interface{}{"key": map[string]interface{}{"key2": "value⛵"}},
                        "nonascii": "⛵",
+                       "newline":  "foo\r\nX-Bad: header",
+                       // This key cannot be expressed as a MIME
+                       // header key, so it will be silently skipped
+                       // (see "Inject" in PropertiesAsMetadata test)
+                       "a: a\r\nInject": "bogus",
                },
        }})
        c.Assert(err, check.IsNil)
@@ -258,6 +263,7 @@ func (s *IntegrationSuite) TestS3PropertiesAsMetadata(c *check.C) {
                "Array":    `["element1","element2"]`,
                "Object":   mime.BEncoding.Encode("UTF-8", `{"key":{"key2":"value⛵"}}`),
                "Nonascii": "=?UTF-8?b?4pu1?=",
+               "Newline":  mime.BEncoding.Encode("UTF-8", "foo\r\nX-Bad: header"),
        }
        expectSubprojectTags := map[string]string{
                "Subproject_properties_key": "subproject properties value",
@@ -279,6 +285,7 @@ func (s *IntegrationSuite) TestS3PropertiesAsMetadata(c *check.C) {
        rdr.Close()
        c.Check(content, check.HasLen, 4)
        s.checkMetaEquals(c, hdr, expectCollectionTags)
+       c.Check(hdr["Inject"], check.IsNil)
 
        c.Log("HEAD bucket with metadata from collection")
        resp, err = stage.collbucket.Head("/", nil)
@@ -309,14 +316,14 @@ func (s *IntegrationSuite) TestS3PropertiesAsMetadata(c *check.C) {
 func (s *IntegrationSuite) TestS3CollectionPutObjectSuccess(c *check.C) {
        stage := s.s3setup(c)
        defer stage.teardown(c)
-       s.testS3PutObjectSuccess(c, stage.collbucket, "")
+       s.testS3PutObjectSuccess(c, stage.collbucket, "", stage.coll.UUID)
 }
 func (s *IntegrationSuite) TestS3ProjectPutObjectSuccess(c *check.C) {
        stage := s.s3setup(c)
        defer stage.teardown(c)
-       s.testS3PutObjectSuccess(c, stage.projbucket, stage.coll.Name+"/")
+       s.testS3PutObjectSuccess(c, stage.projbucket, stage.coll.Name+"/", stage.coll.UUID)
 }
-func (s *IntegrationSuite) testS3PutObjectSuccess(c *check.C, bucket *s3.Bucket, prefix string) {
+func (s *IntegrationSuite) testS3PutObjectSuccess(c *check.C, bucket *s3.Bucket, prefix string, collUUID string) {
        for _, trial := range []struct {
                path        string
                size        int
@@ -360,7 +367,7 @@ func (s *IntegrationSuite) testS3PutObjectSuccess(c *check.C, bucket *s3.Bucket,
                if !c.Check(err, check.NotNil) {
                        continue
                }
-               c.Check(err.(*s3.Error).StatusCode, check.Equals, 404)
+               c.Check(err.(*s3.Error).StatusCode, check.Equals, http.StatusNotFound)
                c.Check(err.(*s3.Error).Code, check.Equals, `NoSuchKey`)
                if !c.Check(err, check.ErrorMatches, `The specified key does not exist.`) {
                        continue
@@ -383,6 +390,14 @@ func (s *IntegrationSuite) testS3PutObjectSuccess(c *check.C, bucket *s3.Bucket,
                c.Check(err, check.IsNil)
                c.Check(buf2, check.HasLen, len(buf))
                c.Check(bytes.Equal(buf, buf2), check.Equals, true)
+
+               // Check that the change is immediately visible via
+               // (non-S3) webdav request.
+               _, resp := s.do("GET", "http://"+collUUID+".keep-web.example/"+trial.path, arvadostest.ActiveTokenV2, nil)
+               c.Check(resp.Code, check.Equals, http.StatusOK)
+               if !strings.HasSuffix(trial.path, "/") {
+                       c.Check(resp.Body.Len(), check.Equals, trial.size)
+               }
        }
 }