Merge branch 'master' into 7179-test-mocks
[arvados.git] / services / keepstore / volume_test.go
index cbf6fb881679f92a4e25dd9cfa08bd26c1ae3df2..290722557598fd64118feac5eb567192cdbc08c2 100644 (file)
@@ -12,18 +12,39 @@ import (
        "time"
 )
 
+// A TestableVolume allows test suites to manipulate the state of an
+// underlying Volume, in order to test behavior in cases that are
+// impractical to achieve with a sequence of normal Volume operations.
+type TestableVolume interface {
+       Volume
+       // [Over]write content for a locator with the given data,
+       // bypassing all constraints like readonly and serialize.
+       PutRaw(locator string, data []byte)
+
+       // Specify the value Mtime() should return, until the next
+       // call to Touch, TouchWithDate, or Put.
+       TouchWithDate(locator string, lastPut time.Time)
+
+       // Clean up, delete temporary files.
+       Teardown()
+}
+
 // MockVolumes are test doubles for Volumes, used to test handlers.
 type MockVolume struct {
        Store      map[string][]byte
        Timestamps map[string]time.Time
+
        // Bad volumes return an error for every operation.
        Bad bool
+
        // Touchable volumes' Touch() method succeeds for a locator
        // that has been Put().
        Touchable bool
+
        // Readonly volumes return an error for Put, Delete, and
        // Touch.
        Readonly bool
+
        // Gate is a "starting gate", allowing test cases to pause
        // volume operations long enough to inspect state. Every
        // operation (except Status) starts by receiving from
@@ -32,6 +53,7 @@ type MockVolume struct {
        // closed channel, so all operations proceed without
        // blocking. See trash_worker_test.go for an example.
        Gate   chan struct{}
+
        called map[string]int
        mutex  sync.Mutex
 }