Update for code review (refs #2292).
[arvados.git] / services / keep / keep_test.go
index cb5e89cfb919d3bfdfe5f72d15f4717bcce7dfb0..3f09e90da2a1a50f7e3c5089195ce1569cfca3d0 100644 (file)
@@ -1,6 +1,7 @@
 package main
 
 import (
+       "bytes"
        "fmt"
        "io/ioutil"
        "os"
@@ -12,6 +13,17 @@ var TEST_BLOCK = []byte("The quick brown fox jumps over the lazy dog.")
 var TEST_HASH = "e4d909c290d0fb1ca068ffaddf22cbd0"
 var BAD_BLOCK = []byte("The magic words are squeamish ossifrage.")
 
+// TODO(twp): Tests still to be written
+//
+//   * PutBlockCollision
+//       - test that PutBlock(BLOCK, HASH) reports a collision. HASH must
+//         be present in Keep and identify a block which sums to HASH but
+//         which does not match BLOCK. (Requires an interface to mock MD5.)
+//
+//   * PutBlockFull
+//       - test that PutBlock returns 503 Full if the filesystem is full.
+//         (must mock FreeDiskSpace or Statfs? use a tmpfs?)
+
 // ========================================
 // GetBlock tests.
 // ========================================
@@ -49,6 +61,11 @@ func TestGetBlockMissing(t *testing.T) {
        result, err := GetBlock(TEST_HASH)
        if err == nil {
                t.Errorf("GetBlock incorrectly returned success: ", result)
+       } else {
+               ke := err.(*KeepError)
+               if ke.HTTPCode != ErrNotFound {
+                       t.Errorf("GetBlock: %v", ke)
+               }
        }
 }
 
@@ -157,11 +174,11 @@ func TestPutBlockMD5Fail(t *testing.T) {
        }
 }
 
-// TestPutBlockCollision
-//     PutBlock must report a 400 Collision error when asked to store a block
-//     when a different block exists on disk under the same identifier.
+// TestPutBlockCorrupt
+//     PutBlock should overwrite corrupt blocks on disk when given
+//     a PUT request with a good block.
 //
-func TestPutBlockCollision(t *testing.T) {
+func TestPutBlockCorrupt(t *testing.T) {
        defer teardown()
 
        // Create two test Keep volumes.
@@ -169,20 +186,22 @@ func TestPutBlockCollision(t *testing.T) {
 
        // Store a corrupted block under TEST_HASH.
        store(t, KeepVolumes[0], TEST_HASH, BAD_BLOCK)
-
-       // Attempting to put TEST_BLOCK should produce a 400 Collision error.
-       if err := PutBlock(TEST_BLOCK, TEST_HASH); err == nil {
-               t.Error("Expected PutBlock error, but no error returned")
-       } else {
-               ke := err.(*KeepError)
-               if ke.HTTPCode != ErrCollision {
-                       t.Errorf("Expected 400 Collision error, got %v", ke)
-               }
+       if err := PutBlock(TEST_BLOCK, TEST_HASH); err != nil {
+               t.Errorf("PutBlock: %v", err)
        }
 
-       KeepVolumes = nil
+       // The block on disk should now match TEST_BLOCK.
+       if block, err := GetBlock(TEST_HASH); err != nil {
+               t.Errorf("GetBlock: %v", err)
+       } else if bytes.Compare(block, TEST_BLOCK) != 0 {
+               t.Errorf("GetBlock returned: '%s'", string(block))
+       }
 }
 
+// ========================================
+// FindKeepVolumes tests.
+// ========================================
+
 // TestFindKeepVolumes
 //     Confirms that FindKeepVolumes finds tmpfs volumes with "/keep"
 //     directories at the top level.
@@ -272,6 +291,7 @@ func teardown() {
        for _, vol := range KeepVolumes {
                os.RemoveAll(path.Dir(vol))
        }
+       KeepVolumes = nil
 }
 
 // store