7200: Use if statement instead of switch to check http method in keepclient; strip...
[arvados.git] / services / keepproxy / keepproxy_test.go
index e3b4e36b63de23dee806a35a9c9d55958cbc3afd..c6234544cd15ab09e2646240b480e722623ab21f 100644 (file)
@@ -115,12 +115,16 @@ func runProxy(c *C, args []string, port int, bogusClientToken bool) keepclient.K
                Using_proxy:   true,
                Client:        &http.Client{},
        }
-       kc.SetServiceRoots(map[string]string{
+       locals := map[string]string{
                "proxy": fmt.Sprintf("http://localhost:%v", port),
-       })
+       }
+       writableLocals := map[string]string{
+               "proxy": fmt.Sprintf("http://localhost:%v", port),
+       }
+       kc.SetServiceRoots(locals, writableLocals, nil)
        c.Check(kc.Using_proxy, Equals, true)
-       c.Check(len(kc.ServiceRoots()), Equals, 1)
-       for _, root := range kc.ServiceRoots() {
+       c.Check(len(kc.LocalRoots()), Equals, 1)
+       for _, root := range kc.LocalRoots() {
                c.Check(root, Equals, fmt.Sprintf("http://localhost:%v", port))
        }
        log.Print("keepclient created")
@@ -154,8 +158,8 @@ func (s *ServerRequiredSuite) TestPutAskGet(c *C) {
        c.Assert(err, Equals, nil)
        c.Check(kc.Arvados.External, Equals, true)
        c.Check(kc.Using_proxy, Equals, true)
-       c.Check(len(kc.ServiceRoots()), Equals, 1)
-       for _, root := range kc.ServiceRoots() {
+       c.Check(len(kc.LocalRoots()), Equals, 1)
+       for _, root := range kc.LocalRoots() {
                c.Check(root, Equals, "http://localhost:29950")
        }
        os.Setenv("ARVADOS_EXTERNAL_CLIENT", "")
@@ -382,7 +386,101 @@ func (s *ServerRequiredSuite) TestPostWithoutHash(c *C) {
                c.Check(err, Equals, nil)
                body, err := ioutil.ReadAll(resp.Body)
                c.Check(err, Equals, nil)
-               c.Check(string(body), Equals,
-                       fmt.Sprintf("%x+%d", md5.Sum([]byte("qux")), 3))
+               c.Check(string(body), Matches,
+                       fmt.Sprintf(`^%x\+3(\+.+)?$`, md5.Sum([]byte("qux"))))
+       }
+}
+
+func (s *ServerRequiredSuite) TestStripHint(c *C) {
+       c.Check(removeHint.ReplaceAllString("http://keep.zzzzz.arvadosapi.com:25107/2228819a18d3727630fa30c81853d23f+67108864+A37b6ab198qqqq28d903b975266b23ee711e1852c@55635f73+K@zzzzz", "$1"),
+               Equals,
+               "http://keep.zzzzz.arvadosapi.com:25107/2228819a18d3727630fa30c81853d23f+67108864+A37b6ab198qqqq28d903b975266b23ee711e1852c@55635f73")
+       c.Check(removeHint.ReplaceAllString("http://keep.zzzzz.arvadosapi.com:25107/2228819a18d3727630fa30c81853d23f+67108864+K@zzzzz+A37b6ab198qqqq28d903b975266b23ee711e1852c@55635f73", "$1"),
+               Equals,
+               "http://keep.zzzzz.arvadosapi.com:25107/2228819a18d3727630fa30c81853d23f+67108864+A37b6ab198qqqq28d903b975266b23ee711e1852c@55635f73")
+       c.Check(removeHint.ReplaceAllString("http://keep.zzzzz.arvadosapi.com:25107/2228819a18d3727630fa30c81853d23f+67108864+A37b6ab198qqqq28d903b975266b23ee711e1852c@55635f73+K@zzzzz-zzzzz-zzzzzzzzzzzzzzz", "$1"),
+               Equals,
+               "http://keep.zzzzz.arvadosapi.com:25107/2228819a18d3727630fa30c81853d23f+67108864+A37b6ab198qqqq28d903b975266b23ee711e1852c@55635f73+K@zzzzz-zzzzz-zzzzzzzzzzzzzzz")
+       c.Check(removeHint.ReplaceAllString("http://keep.zzzzz.arvadosapi.com:25107/2228819a18d3727630fa30c81853d23f+67108864+K@zzzzz-zzzzz-zzzzzzzzzzzzzzz+A37b6ab198qqqq28d903b975266b23ee711e1852c@55635f73", "$1"),
+               Equals,
+               "http://keep.zzzzz.arvadosapi.com:25107/2228819a18d3727630fa30c81853d23f+67108864+K@zzzzz-zzzzz-zzzzzzzzzzzzzzz+A37b6ab198qqqq28d903b975266b23ee711e1852c@55635f73")
+
+}
+
+// Test GetIndex
+//   Put one block, with 2 replicas
+//   With no prefix (expect the block locator, twice)
+//   With an existing prefix (expect the block locator, twice)
+//   With a valid but non-existing prefix (expect "\n")
+//   With an invalid prefix (expect error)
+func (s *ServerRequiredSuite) TestGetIndex(c *C) {
+       kc := runProxy(c, []string{"keepproxy"}, 28852, false)
+       waitForListener()
+       defer closeListener()
+
+       // Write "index-data" blocks
+       data := []byte("index-data")
+       hash := fmt.Sprintf("%x", md5.Sum(data))
+
+       hash2, rep, err := kc.PutB(data)
+       c.Check(hash2, Matches, fmt.Sprintf(`^%s\+10(\+.+)?$`, hash))
+       c.Check(rep, Equals, 2)
+       c.Check(err, Equals, nil)
+
+       reader, blocklen, _, err := kc.Get(hash)
+       c.Assert(err, Equals, nil)
+       c.Check(blocklen, Equals, int64(10))
+       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)
+       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++
+               }
        }
+       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++
+               }
+       }
+       c.Assert(2, Equals, matchingLocators)
+       c.Assert(totalLocators, Equals, matchingLocators)
+
+       // GetIndex with valid but no such prefix
+       indexReader, err = kc.GetIndex("proxy", "abcd")
+       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)
 }