21644: Fix unreliable test.
[arvados.git] / services / keep-web / handler_test.go
index c14789889d6d6631b6a7734bccea719e0020e6a0..07c7016d3a8e485e8b1267d73fd0b547b14662bc 100644 (file)
@@ -60,6 +60,7 @@ func (s *UnitSuite) SetUpTest(c *check.C) {
                        logger:   logger,
                        registry: prometheus.NewRegistry(),
                },
+               metrics: newMetrics(prometheus.NewRegistry()),
        }
 }
 
@@ -209,6 +210,10 @@ func (s *UnitSuite) TestWebdavPrefixAndSource(c *check.C) {
 }
 
 func (s *UnitSuite) TestEmptyResponse(c *check.C) {
+       // Ensure we start with an empty cache
+       defer os.Setenv("HOME", os.Getenv("HOME"))
+       os.Setenv("HOME", c.MkDir())
+
        for _, trial := range []struct {
                dataExists    bool
                sendIMSHeader bool
@@ -1105,6 +1110,17 @@ func (s *IntegrationSuite) TestDirectoryListingWithNoAnonymousToken(c *check.C)
 }
 
 func (s *IntegrationSuite) testDirectoryListing(c *check.C) {
+       // The "ownership cycle" test fixtures are reachable from the
+       // "filter group without filters" group, causing webdav's
+       // walkfs to recurse indefinitely. Avoid that by deleting one
+       // of the bogus fixtures.
+       arv := arvados.NewClientFromEnv()
+       err := arv.RequestAndDecode(nil, "DELETE", "arvados/v1/groups/zzzzz-j7d0g-cx2al9cqkmsf1hs", nil, nil)
+       if err != nil {
+               c.Assert(err, check.FitsTypeOf, &arvados.TransactionError{})
+               c.Check(err.(*arvados.TransactionError).StatusCode, check.Equals, 404)
+       }
+
        s.handler.Cluster.Services.WebDAVDownload.ExternalURL.Host = "download.example.com"
        authHeader := http.Header{
                "Authorization": {"OAuth2 " + arvadostest.ActiveToken},
@@ -1241,8 +1257,32 @@ func (s *IntegrationSuite) testDirectoryListing(c *check.C) {
                        expect:  []string{"waz"},
                        cutDirs: 2,
                },
+               {
+                       uri:     "download.example.com/users/active/This filter group/",
+                       header:  authHeader,
+                       expect:  []string{"A Subproject/"},
+                       cutDirs: 3,
+               },
+               {
+                       uri:     "download.example.com/users/active/This filter group/A Subproject",
+                       header:  authHeader,
+                       expect:  []string{"baz_file/"},
+                       cutDirs: 4,
+               },
+               {
+                       uri:     "download.example.com/by_id/" + arvadostest.AFilterGroupUUID,
+                       header:  authHeader,
+                       expect:  []string{"A Subproject/"},
+                       cutDirs: 2,
+               },
+               {
+                       uri:     "download.example.com/by_id/" + arvadostest.AFilterGroupUUID + "/A Subproject",
+                       header:  authHeader,
+                       expect:  []string{"baz_file/"},
+                       cutDirs: 3,
+               },
        } {
-               comment := check.Commentf("HTML: %q => %q", trial.uri, trial.expect)
+               comment := check.Commentf("HTML: %q redir %q => %q", trial.uri, trial.redirect, trial.expect)
                resp := httptest.NewRecorder()
                u := mustParseURL("//" + trial.uri)
                req := &http.Request{
@@ -1278,6 +1318,7 @@ func (s *IntegrationSuite) testDirectoryListing(c *check.C) {
                } else {
                        c.Check(resp.Code, check.Equals, http.StatusOK, comment)
                        for _, e := range trial.expect {
+                               e = strings.Replace(e, " ", "%20", -1)
                                c.Check(resp.Body.String(), check.Matches, `(?ms).*href="./`+e+`".*`, comment)
                        }
                        c.Check(resp.Body.String(), check.Matches, `(?ms).*--cut-dirs=`+fmt.Sprintf("%d", trial.cutDirs)+` .*`, comment)
@@ -1310,6 +1351,12 @@ func (s *IntegrationSuite) testDirectoryListing(c *check.C) {
                }
                resp = httptest.NewRecorder()
                s.handler.ServeHTTP(resp, req)
+               // This check avoids logging a big XML document in the
+               // event webdav throws a 500 error after sending
+               // headers for a 207.
+               if !c.Check(strings.HasSuffix(resp.Body.String(), "Internal Server Error"), check.Equals, false) {
+                       continue
+               }
                if trial.expect == nil {
                        c.Check(resp.Code, check.Equals, http.StatusUnauthorized, comment)
                } else {
@@ -1320,6 +1367,7 @@ func (s *IntegrationSuite) testDirectoryListing(c *check.C) {
                                } else {
                                        e = filepath.Join(u.Path, e)
                                }
+                               e = strings.Replace(e, " ", "%20", -1)
                                c.Check(resp.Body.String(), check.Matches, `(?ms).*<D:href>`+e+`</D:href>.*`, comment)
                        }
                }
@@ -1426,20 +1474,14 @@ func (s *IntegrationSuite) TestFileContentType(c *check.C) {
        }
 }
 
-func (s *IntegrationSuite) TestKeepClientBlockCache(c *check.C) {
-       s.handler.Cluster.Collections.WebDAVCache.MaxBlockEntries = 42
-       c.Check(keepclient.DefaultBlockCache.MaxBlocks, check.Not(check.Equals), 42)
-       u := mustParseURL("http://keep-web.example/c=" + arvadostest.FooCollection + "/t=" + arvadostest.ActiveToken + "/foo")
-       req := &http.Request{
-               Method:     "GET",
-               Host:       u.Host,
-               URL:        u,
-               RequestURI: u.RequestURI(),
-       }
+func (s *IntegrationSuite) TestCacheSize(c *check.C) {
+       req, err := http.NewRequest("GET", "http://"+arvadostest.FooCollection+".example.com/foo", nil)
+       req.Header.Set("Authorization", "Bearer "+arvadostest.ActiveTokenV2)
+       c.Assert(err, check.IsNil)
        resp := httptest.NewRecorder()
        s.handler.ServeHTTP(resp, req)
-       c.Check(resp.Code, check.Equals, http.StatusOK)
-       c.Check(keepclient.DefaultBlockCache.MaxBlocks, check.Equals, 42)
+       c.Assert(resp.Code, check.Equals, http.StatusOK)
+       c.Check(s.handler.Cache.sessions[arvadostest.ActiveTokenV2].client.DiskCacheSize.Percent(), check.Equals, int64(10))
 }
 
 // Writing to a collection shouldn't affect its entry in the