Merge branch '19088-s3-properties-tags'
[arvados.git] / services / keep-web / s3_test.go
index a2e61e9b7806679b3d8dec9b0f2d1dcba76fb4e3..a99f3c278f6214b5764f853920c10539f7757ffe 100644 (file)
@@ -11,6 +11,7 @@ import (
        "crypto/sha256"
        "fmt"
        "io/ioutil"
+       "mime"
        "net/http"
        "net/http/httptest"
        "net/url"
@@ -53,6 +54,9 @@ func (s *IntegrationSuite) s3setup(c *check.C) s3stage {
                "group": map[string]interface{}{
                        "group_class": "project",
                        "name":        "keep-web s3 test",
+                       "properties": map[string]interface{}{
+                               "project-properties-key": "project properties value",
+                       },
                },
                "ensure_unique_name": true,
        })
@@ -74,9 +78,10 @@ func (s *IntegrationSuite) s3setup(c *check.C) s3stage {
                "name":          "keep-web s3 test collection",
                "manifest_text": ". d41d8cd98f00b204e9800998ecf8427e+0 0:0:emptyfile\n./emptydir d41d8cd98f00b204e9800998ecf8427e+0 0:0:.\n",
                "properties": map[string]interface{}{
-                       "string": "string value",
-                       "array":  []string{"element1", "element2"},
-                       "object": map[string]interface{}{"key": map[string]interface{}{"key2": "value"}},
+                       "string":   "string value",
+                       "array":    []string{"element1", "element2"},
+                       "object":   map[string]interface{}{"key": map[string]interface{}{"key2": "value⛵"}},
+                       "nonascii": "⛵",
                },
        }})
        c.Assert(err, check.IsNil)
@@ -234,9 +239,9 @@ func (s *IntegrationSuite) testS3GetObject(c *check.C, bucket *s3.Bucket, prefix
        c.Check(exists, check.Equals, true)
 }
 
-func (s *IntegrationSuite) checkMetaEquals(c *check.C, resp *http.Response, expect map[string]string) {
+func (s *IntegrationSuite) checkMetaEquals(c *check.C, hdr http.Header, expect map[string]string) {
        got := map[string]string{}
-       for hk, hv := range resp.Header {
+       for hk, hv := range hdr {
                if k := strings.TrimPrefix(hk, "X-Amz-Meta-"); k != hk && len(hv) == 1 {
                        got[k] = hv[0]
                }
@@ -249,29 +254,56 @@ func (s *IntegrationSuite) TestS3PropertiesAsMetadata(c *check.C) {
        defer stage.teardown(c)
 
        expectCollectionTags := map[string]string{
-               "String": "string value",
-               "Array":  `["element1","element2"]`,
-               "Object": `{"key":{"key2":"value"}}`,
+               "String":   "string value",
+               "Array":    `["element1","element2"]`,
+               "Object":   mime.BEncoding.Encode("UTF-8", `{"key":{"key2":"value⛵"}}`),
+               "Nonascii": "=?UTF-8?b?4pu1?=",
        }
        expectSubprojectTags := map[string]string{
                "Subproject_properties_key": "subproject properties value",
        }
+       expectProjectTags := map[string]string{
+               "Project-Properties-Key": "project properties value",
+       }
 
+       c.Log("HEAD object with metadata from collection")
        resp, err := stage.collbucket.Head("sailboat.txt", nil)
        c.Assert(err, check.IsNil)
-       s.checkMetaEquals(c, resp, expectCollectionTags)
+       s.checkMetaEquals(c, resp.Header, expectCollectionTags)
+
+       c.Log("GET object with metadata from collection")
+       rdr, hdr, err := stage.collbucket.GetReaderWithHeaders("sailboat.txt")
+       c.Assert(err, check.IsNil)
+       content, err := ioutil.ReadAll(rdr)
+       c.Check(err, check.IsNil)
+       rdr.Close()
+       c.Check(content, check.HasLen, 4)
+       s.checkMetaEquals(c, hdr, expectCollectionTags)
+
+       c.Log("HEAD bucket with metadata from collection")
+       resp, err = stage.collbucket.Head("/", nil)
+       c.Assert(err, check.IsNil)
+       s.checkMetaEquals(c, resp.Header, expectCollectionTags)
 
+       c.Log("HEAD directory placeholder with metadata from collection")
        resp, err = stage.projbucket.Head("keep-web s3 test collection/", nil)
        c.Assert(err, check.IsNil)
-       s.checkMetaEquals(c, resp, expectCollectionTags)
+       s.checkMetaEquals(c, resp.Header, expectCollectionTags)
 
+       c.Log("HEAD file with metadata from collection")
        resp, err = stage.projbucket.Head("keep-web s3 test collection/sailboat.txt", nil)
        c.Assert(err, check.IsNil)
-       s.checkMetaEquals(c, resp, expectCollectionTags)
+       s.checkMetaEquals(c, resp.Header, expectCollectionTags)
 
+       c.Log("HEAD directory placeholder with metadata from subproject")
        resp, err = stage.projbucket.Head("keep-web s3 test subproject/", nil)
        c.Assert(err, check.IsNil)
-       s.checkMetaEquals(c, resp, expectSubprojectTags)
+       s.checkMetaEquals(c, resp.Header, expectSubprojectTags)
+
+       c.Log("HEAD bucket with metadata from project")
+       resp, err = stage.projbucket.Head("/", nil)
+       c.Assert(err, check.IsNil)
+       s.checkMetaEquals(c, resp.Header, expectProjectTags)
 }
 
 func (s *IntegrationSuite) TestS3CollectionPutObjectSuccess(c *check.C) {