Merge branch 'master' into 7492-keepproxy-upstream-errors
[arvados.git] / services / keepproxy / keepproxy_test.go
index c6234544cd15ab09e2646240b480e722623ab21f..6303122e345414d11b8d75c0ebd5be3eb5c428be 100644 (file)
@@ -53,7 +53,7 @@ func closeListener() {
 
 func (s *ServerRequiredSuite) SetUpSuite(c *C) {
        arvadostest.StartAPI()
-       arvadostest.StartKeep()
+       arvadostest.StartKeep(2, false)
 }
 
 func (s *ServerRequiredSuite) SetUpTest(c *C) {
@@ -61,7 +61,7 @@ func (s *ServerRequiredSuite) SetUpTest(c *C) {
 }
 
 func (s *ServerRequiredSuite) TearDownSuite(c *C) {
-       arvadostest.StopKeep()
+       arvadostest.StopKeep(2)
        arvadostest.StopAPI()
 }
 
@@ -251,7 +251,9 @@ func (s *ServerRequiredSuite) TestPutAskGetForbidden(c *C) {
 
        {
                _, _, err := kc.Ask(hash)
-               c.Check(err, Equals, keepclient.BlockNotFound)
+               errNotFound, _ := err.(keepclient.ErrNotFound)
+               c.Check(errNotFound, NotNil)
+               c.Assert(strings.Contains(err.Error(), "HTTP 403"), Equals, true)
                log.Print("Ask 1")
        }
 
@@ -265,14 +267,18 @@ func (s *ServerRequiredSuite) TestPutAskGetForbidden(c *C) {
 
        {
                blocklen, _, err := kc.Ask(hash)
-               c.Assert(err, Equals, keepclient.BlockNotFound)
+               errNotFound, _ := err.(keepclient.ErrNotFound)
+               c.Check(errNotFound, NotNil)
+               c.Assert(strings.Contains(err.Error(), "HTTP 403"), Equals, true)
                c.Check(blocklen, Equals, int64(0))
                log.Print("Ask 2")
        }
 
        {
                _, blocklen, _, err := kc.Get(hash)
-               c.Assert(err, Equals, keepclient.BlockNotFound)
+               errNotFound, _ := err.(keepclient.ErrNotFound)
+               c.Check(errNotFound, NotNil)
+               c.Assert(strings.Contains(err.Error(), "HTTP 403"), Equals, true)
                c.Check(blocklen, Equals, int64(0))
                log.Print("Get")
        }
@@ -291,7 +297,9 @@ func (s *ServerRequiredSuite) TestGetDisabled(c *C) {
 
        {
                _, _, err := kc.Ask(hash)
-               c.Check(err, Equals, keepclient.BlockNotFound)
+               errNotFound, _ := err.(keepclient.ErrNotFound)
+               c.Check(errNotFound, NotNil)
+               c.Assert(strings.Contains(err.Error(), "HTTP 400"), Equals, true)
                log.Print("Ask 1")
        }
 
@@ -305,14 +313,18 @@ func (s *ServerRequiredSuite) TestGetDisabled(c *C) {
 
        {
                blocklen, _, err := kc.Ask(hash)
-               c.Assert(err, Equals, keepclient.BlockNotFound)
+               errNotFound, _ := err.(keepclient.ErrNotFound)
+               c.Check(errNotFound, NotNil)
+               c.Assert(strings.Contains(err.Error(), "HTTP 400"), Equals, true)
                c.Check(blocklen, Equals, int64(0))
                log.Print("Ask 2")
        }
 
        {
                _, blocklen, _, err := kc.Get(hash)
-               c.Assert(err, Equals, keepclient.BlockNotFound)
+               errNotFound, _ := err.(keepclient.ErrNotFound)
+               c.Check(errNotFound, NotNil)
+               c.Assert(strings.Contains(err.Error(), "HTTP 400"), Equals, true)
                c.Check(blocklen, Equals, int64(0))
                log.Print("Get")
        }
@@ -418,7 +430,7 @@ func (s *ServerRequiredSuite) TestGetIndex(c *C) {
        waitForListener()
        defer closeListener()
 
-       // Write "index-data" blocks
+       // Put "index-data" blocks
        data := []byte("index-data")
        hash := fmt.Sprintf("%x", md5.Sum(data))
 
@@ -433,54 +445,103 @@ func (s *ServerRequiredSuite) TestGetIndex(c *C) {
        all, err := ioutil.ReadAll(reader)
        c.Check(all, DeepEquals, data)
 
-       // Write some more blocks
-       otherData := []byte("some-more-index-data")
-       otherHash := fmt.Sprintf("%x", md5.Sum(otherData))
-       _, rep, err = kc.PutB(otherData)
+       // Put some more blocks
+       _, rep, err = kc.PutB([]byte("some-more-index-data"))
        c.Check(err, Equals, nil)
 
-       // GetIndex with no prefix; expect both data and otherData blocks
-       indexReader, err := kc.GetIndex("proxy", "")
-       c.Assert(err, Equals, nil)
-       indexResp, err := ioutil.ReadAll(indexReader)
-       locators := strings.Split(string(indexResp), "\n")
-       matchingLocators := 0
-       otherLocators := 0
-       for _, locator := range locators {
-               if strings.HasPrefix(locator, hash) {
-                       matchingLocators++
-               } else if strings.HasPrefix(locator, otherHash) {
-                       otherLocators++
+       // Invoke GetIndex
+       for _, spec := range []struct {
+               prefix         string
+               expectTestHash bool
+               expectOther    bool
+       }{
+               {"", true, true},         // with no prefix
+               {hash[:3], true, false},  // with matching prefix
+               {"abcdef", false, false}, // with no such prefix
+       } {
+               indexReader, err := kc.GetIndex("proxy", spec.prefix)
+               c.Assert(err, Equals, nil)
+               indexResp, err := ioutil.ReadAll(indexReader)
+               c.Assert(err, Equals, nil)
+               locators := strings.Split(string(indexResp), "\n")
+               gotTestHash := 0
+               gotOther := 0
+               for _, locator := range locators {
+                       if locator == "" {
+                               continue
+                       }
+                       c.Check(locator[:len(spec.prefix)], Equals, spec.prefix)
+                       if locator[:32] == hash {
+                               gotTestHash++
+                       } else {
+                               gotOther++
+                       }
                }
+               c.Check(gotTestHash == 2, Equals, spec.expectTestHash)
+               c.Check(gotOther > 0, Equals, spec.expectOther)
        }
-       c.Assert(2, Equals, matchingLocators)
-       c.Assert(2, Equals, otherLocators)
 
-       // GetIndex with prefix
-       indexReader, err = kc.GetIndex("proxy", hash[0:3])
-       c.Assert(err, Equals, nil)
-       indexResp, err = ioutil.ReadAll(indexReader)
-       locators = strings.Split(string(indexResp), "\n")
-       totalLocators := 0
-       matchingLocators = 0
-       for _, locator := range locators {
-               if locator != "" {
-                       totalLocators++
-               }
-               if strings.HasPrefix(locator, hash[0:3]) {
-                       matchingLocators++
-               }
+       // GetIndex with invalid prefix
+       _, err = kc.GetIndex("proxy", "xyz")
+       c.Assert((err != nil), Equals, true)
+}
+
+func (s *ServerRequiredSuite) TestPutAskGetInvalidToken(c *C) {
+       kc := runProxy(c, []string{"keepproxy"}, 28852, false)
+       waitForListener()
+       defer closeListener()
+
+       // Put a test block
+       hash, rep, err := kc.PutB([]byte("foo"))
+       c.Check(err, Equals, nil)
+       c.Check(rep, Equals, 2)
+
+       for _, token := range []string{
+               "nosuchtoken",
+               "2ym314ysp27sk7h943q6vtc378srb06se3pq6ghurylyf3pdmx", // expired
+       } {
+               // Change token to given bad token
+               kc.Arvados.ApiToken = token
+
+               // Ask should result in error
+               _, _, err = kc.Ask(hash)
+               c.Check(err, NotNil)
+               errNotFound, _ := err.(keepclient.ErrNotFound)
+               c.Check(errNotFound.Temporary(), Equals, false)
+               c.Assert(strings.Contains(err.Error(), "HTTP 403"), Equals, true)
+
+               // Get should result in error
+               _, _, _, err = kc.Get(hash)
+               c.Check(err, NotNil)
+               errNotFound, _ = err.(keepclient.ErrNotFound)
+               c.Check(errNotFound.Temporary(), Equals, false)
+               c.Assert(strings.Contains(err.Error(), "HTTP 403 \"Missing or invalid Authorization header\""), Equals, true)
        }
-       c.Assert(2, Equals, matchingLocators)
-       c.Assert(totalLocators, Equals, matchingLocators)
+}
 
-       // GetIndex with valid but no such prefix
-       indexReader, err = kc.GetIndex("proxy", "abcd")
+func (s *ServerRequiredSuite) TestPutAskGetConnectionError(c *C) {
+       arv, err := arvadosclient.MakeArvadosClient()
        c.Assert(err, Equals, nil)
-       indexResp, err = ioutil.ReadAll(indexReader)
-       c.Assert(string(indexResp), Equals, "")
 
-       // GetIndex with invalid prefix
-       indexReader, err = kc.GetIndex("proxy", "xyz")
-       c.Assert((err != nil), Equals, true)
+       // keepclient with no such keep server
+       kc := keepclient.New(&arv)
+       locals := map[string]string{
+               "proxy": "http://localhost:12345",
+       }
+       kc.SetServiceRoots(locals, nil, nil)
+
+       // Ask should result in temporary connection refused error
+       hash := fmt.Sprintf("%x", md5.Sum([]byte("foo")))
+       _, _, err = kc.Ask(hash)
+       c.Check(err, NotNil)
+       errNotFound, _ := err.(*keepclient.ErrNotFound)
+       c.Check(errNotFound.Temporary(), Equals, true)
+       c.Assert(strings.Contains(err.Error(), "connection refused"), Equals, true)
+
+       // Get should result in temporary connection refused error
+       _, _, _, err = kc.Get(hash)
+       c.Check(err, NotNil)
+       errNotFound, _ = err.(*keepclient.ErrNotFound)
+       c.Check(errNotFound.Temporary(), Equals, true)
+       c.Assert(strings.Contains(err.Error(), "connection refused"), Equals, true)
 }