Merge branch '7167-keep-rsync-test-setup' into 7167-keep-rsync
[arvados.git] / tools / keep-rsync / keep-rsync_test.go
index c2a8112dc5c9d93a5489dd82df48a0d451fa8367..5cfd30a0328dec845dd3026718bdf13f98fa52f8 100644 (file)
@@ -226,3 +226,86 @@ func (s *ServerRequiredSuite) TestRsyncWithBlobSigning_PutInOne_GetFromOtherShou
        _, _, _, err = kcSrc.Get(locatorInDst)
        c.Assert(err.Error(), Equals, "Block not found")
 }
+
+// Put 5 blocks in src. Put 2 of those blocks in dst
+// Hence there are 3 additional blocks in src
+// Also, put 2 extra blocks in dts; they are hence only in dst
+// Run rsync and verify that those 7 blocks are now available in dst
+func (s *ServerRequiredSuite) TestKeepRsync(c *C) {
+       setupRsync(c, false)
+
+       // Put a few blocks in src using kcSrc
+       var srcLocators []string
+       for i := 0; i < 5; i++ {
+               data := []byte(fmt.Sprintf("test-data-%d", i))
+               hash := fmt.Sprintf("%x", md5.Sum(data))
+
+               hash2, rep, err := kcSrc.PutB(data)
+               c.Check(hash2, Matches, fmt.Sprintf(`^%s\+11(\+.+)?$`, hash))
+               c.Check(rep, Equals, 2)
+               c.Check(err, Equals, nil)
+
+               reader, blocklen, _, err := kcSrc.Get(hash)
+               c.Assert(err, Equals, nil)
+               c.Check(blocklen, Equals, int64(11))
+               all, err := ioutil.ReadAll(reader)
+               c.Check(all, DeepEquals, data)
+
+               srcLocators = append(srcLocators, fmt.Sprintf("%s+%d", hash, blocklen))
+       }
+
+       // Put just two of those blocks in dst using kcDst
+       var dstLocators []string
+       for i := 0; i < 2; i++ {
+               data := []byte(fmt.Sprintf("test-data-%d", i))
+               hash := fmt.Sprintf("%x", md5.Sum(data))
+
+               hash2, rep, err := kcDst.PutB(data)
+               c.Check(hash2, Matches, fmt.Sprintf(`^%s\+11(\+.+)?$`, hash))
+               c.Check(rep, Equals, 1)
+               c.Check(err, Equals, nil)
+
+               reader, blocklen, _, err := kcDst.Get(hash)
+               c.Assert(err, Equals, nil)
+               c.Check(blocklen, Equals, int64(11))
+               all, err := ioutil.ReadAll(reader)
+               c.Check(all, DeepEquals, data)
+
+               dstLocators = append(dstLocators, fmt.Sprintf("%s+%d", hash, blocklen))
+       }
+
+       // Put two more blocks in dst; they are not in src at all
+       var extraDstLocators []string
+       for i := 0; i < 2; i++ {
+               data := []byte(fmt.Sprintf("other-data-%d", i))
+               hash := fmt.Sprintf("%x", md5.Sum(data))
+
+               hash2, rep, err := kcDst.PutB(data)
+               c.Check(hash2, Matches, fmt.Sprintf(`^%s\+12(\+.+)?$`, hash))
+               c.Check(rep, Equals, 1)
+               c.Check(err, Equals, nil)
+
+               reader, blocklen, _, err := kcDst.Get(hash)
+               c.Assert(err, Equals, nil)
+               c.Check(blocklen, Equals, int64(12))
+               all, err := ioutil.ReadAll(reader)
+               c.Check(all, DeepEquals, data)
+
+               extraDstLocators = append(extraDstLocators, fmt.Sprintf("%s+%d", hash, blocklen))
+       }
+
+       err := performKeepRsync()
+       c.Check(err, Equals, nil)
+
+       // Now GetIndex from dst and verify that all 5 from src and the 2 extra blocks are found
+       dstIndex, err := getUniqueLocators(kcDst, "")
+       c.Check(err, Equals, nil)
+       for _, locator := range srcLocators {
+               _, ok := dstIndex[locator]
+               c.Assert(ok, Equals, true)
+       }
+       for _, locator := range extraDstLocators {
+               _, ok := dstIndex[locator]
+               c.Assert(ok, Equals, true)
+       }
+}