Merge branch 'patch-1' of https://github.com/mr-c/arvados into mr-c-patch-1
[arvados.git] / services / keepstore / handler_test.go
index 251ad0a1df2e355a5079bdd6db7b5e56419243bd..17ed6402ce0d79ab4dc1bddf30e6b0315df7fa16 100644 (file)
@@ -25,10 +25,10 @@ import (
        "strings"
        "time"
 
-       "git.curoverse.com/arvados.git/lib/config"
-       "git.curoverse.com/arvados.git/sdk/go/arvados"
-       "git.curoverse.com/arvados.git/sdk/go/arvadostest"
-       "git.curoverse.com/arvados.git/sdk/go/ctxlog"
+       "git.arvados.org/arvados.git/lib/config"
+       "git.arvados.org/arvados.git/sdk/go/arvados"
+       "git.arvados.org/arvados.git/sdk/go/arvadostest"
+       "git.arvados.org/arvados.git/sdk/go/ctxlog"
        "github.com/prometheus/client_golang/prometheus"
        check "gopkg.in/check.v1"
 )
@@ -46,7 +46,7 @@ func testCluster(t TB) *arvados.Cluster {
        if err != nil {
                t.Fatal(err)
        }
-       cluster.SystemRootToken = arvadostest.DataManagerToken
+       cluster.SystemRootToken = arvadostest.SystemRootToken
        cluster.ManagementToken = arvadostest.ManagementToken
        cluster.Collections.BlobSigning = false
        return cluster
@@ -318,6 +318,57 @@ func (s *HandlerSuite) TestPutAndDeleteSkipReadonlyVolumes(c *check.C) {
        }
 }
 
+// Test TOUCH requests.
+func (s *HandlerSuite) TestTouchHandler(c *check.C) {
+       c.Assert(s.handler.setup(context.Background(), s.cluster, "", prometheus.NewRegistry(), testServiceURL), check.IsNil)
+       vols := s.handler.volmgr.AllWritable()
+       vols[0].Put(context.Background(), TestHash, TestBlock)
+       vols[0].Volume.(*MockVolume).TouchWithDate(TestHash, time.Now().Add(-time.Hour))
+       afterPut := time.Now()
+       t, err := vols[0].Mtime(TestHash)
+       c.Assert(err, check.IsNil)
+       c.Assert(t.Before(afterPut), check.Equals, true)
+
+       ExpectStatusCode(c,
+               "touch with no credentials",
+               http.StatusUnauthorized,
+               IssueRequest(s.handler, &RequestTester{
+                       method: "TOUCH",
+                       uri:    "/" + TestHash,
+               }))
+
+       ExpectStatusCode(c,
+               "touch with non-root credentials",
+               http.StatusUnauthorized,
+               IssueRequest(s.handler, &RequestTester{
+                       method:   "TOUCH",
+                       uri:      "/" + TestHash,
+                       apiToken: arvadostest.ActiveTokenV2,
+               }))
+
+       ExpectStatusCode(c,
+               "touch non-existent block",
+               http.StatusNotFound,
+               IssueRequest(s.handler, &RequestTester{
+                       method:   "TOUCH",
+                       uri:      "/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+                       apiToken: s.cluster.SystemRootToken,
+               }))
+
+       beforeTouch := time.Now()
+       ExpectStatusCode(c,
+               "touch block",
+               http.StatusOK,
+               IssueRequest(s.handler, &RequestTester{
+                       method:   "TOUCH",
+                       uri:      "/" + TestHash,
+                       apiToken: s.cluster.SystemRootToken,
+               }))
+       t, err = vols[0].Mtime(TestHash)
+       c.Assert(err, check.IsNil)
+       c.Assert(t.After(beforeTouch), check.Equals, true)
+}
+
 // Test /index requests:
 //   - unauthenticated /index request
 //   - unauthenticated /index/prefix request
@@ -327,7 +378,7 @@ func (s *HandlerSuite) TestPutAndDeleteSkipReadonlyVolumes(c *check.C) {
 //   - authenticated   /index/prefix request | superuser
 //
 // The only /index requests that should succeed are those issued by the
-// superuser. They should pass regardless of the value of RequireSignatures.
+// superuser. They should pass regardless of the value of BlobSigning.
 //
 func (s *HandlerSuite) TestIndexHandler(c *check.C) {
        c.Assert(s.handler.setup(context.Background(), s.cluster, "", prometheus.NewRegistry(), testServiceURL), check.IsNil)
@@ -393,7 +444,7 @@ func (s *HandlerSuite) TestIndexHandler(c *check.C) {
        // => UnauthorizedError
        response := IssueRequest(s.handler, unauthenticatedReq)
        ExpectStatusCode(c,
-               "RequireSignatures on, unauthenticated request",
+               "permissions on, unauthenticated request",
                UnauthorizedError.HTTPCode,
                response)
 
@@ -520,7 +571,7 @@ func (s *HandlerSuite) TestDeleteHandler(c *check.C) {
        vols := s.handler.volmgr.AllWritable()
        vols[0].Put(context.Background(), TestHash, TestBlock)
 
-       // Explicitly set the BlobSignatureTTL to 0 for these
+       // Explicitly set the BlobSigningTTL to 0 for these
        // tests, to ensure the MockVolume deletes the blocks
        // even though they have just been created.
        s.cluster.Collections.BlobSigningTTL = arvados.Duration(0)
@@ -611,7 +662,7 @@ func (s *HandlerSuite) TestDeleteHandler(c *check.C) {
                c.Error("superuserExistingBlockReq: block not deleted")
        }
 
-       // A DELETE request on a block newer than BlobSignatureTTL
+       // A DELETE request on a block newer than BlobSigningTTL
        // should return success but leave the block on the volume.
        vols[0].Put(context.Background(), TestHash, TestBlock)
        s.cluster.Collections.BlobSigningTTL = arvados.Duration(time.Hour)
@@ -892,10 +943,7 @@ func ExpectStatusCode(
        testname string,
        expectedStatus int,
        response *httptest.ResponseRecorder) {
-       if response.Code != expectedStatus {
-               c.Errorf("%s: expected status %d, got %+v",
-                       testname, expectedStatus, response)
-       }
+       c.Check(response.Code, check.Equals, expectedStatus, check.Commentf("%s", testname))
 }
 
 func ExpectBody(
@@ -936,7 +984,7 @@ func (s *HandlerSuite) TestPutNeedsOnlyOneBuffer(c *check.C) {
        select {
        case <-ok:
        case <-time.After(time.Second):
-               c.Fatal("PUT deadlocks with MaxBuffers==1")
+               c.Fatal("PUT deadlocks with MaxKeepBlobBuffers==1")
        }
 }
 
@@ -947,7 +995,7 @@ func (s *HandlerSuite) TestPutHandlerNoBufferleak(c *check.C) {
 
        ok := make(chan bool)
        go func() {
-               for i := 0; i < s.cluster.API.MaxKeepBlockBuffers+1; i++ {
+               for i := 0; i < s.cluster.API.MaxKeepBlobBuffers+1; i++ {
                        // Unauthenticated request, no server key
                        // => OK (unsigned response)
                        unsignedLocator := "/" + TestHash
@@ -1039,7 +1087,7 @@ func (s *HandlerSuite) TestGetHandlerNoBufferLeak(c *check.C) {
 
        ok := make(chan bool)
        go func() {
-               for i := 0; i < s.cluster.API.MaxKeepBlockBuffers+1; i++ {
+               for i := 0; i < s.cluster.API.MaxKeepBlobBuffers+1; i++ {
                        // Unauthenticated request, unsigned locator
                        // => OK
                        unsignedLocator := "/" + TestHash
@@ -1147,12 +1195,7 @@ func (s *HandlerSuite) TestUntrashHandler(c *check.C) {
                "",
                http.StatusOK,
                response)
-       expected := "Successfully untrashed on: [MockVolume],[MockVolume]"
-       if response.Body.String() != expected {
-               c.Errorf(
-                       "Untrash response mismatched: expected %s, got:\n%s",
-                       expected, response.Body.String())
-       }
+       c.Check(response.Body.String(), check.Equals, "Successfully untrashed on: [MockVolume], [MockVolume]\n")
 }
 
 func (s *HandlerSuite) TestUntrashHandlerWithNoWritableVolumes(c *check.C) {