Merge branch '7179-test-mocks' refs #7179
[arvados.git] / services / keepstore / volume_generic_test.go
1 package main
2
3 import (
4         "bytes"
5         "os"
6         "testing"
7         "time"
8 )
9
10 // A TestableVolumeFactory returns a new TestableVolume. The factory
11 // function, and the TestableVolume it returns, can use t to write
12 // logs, fail the current test, etc.
13 type TestableVolumeFactory func(t *testing.T) TestableVolume
14
15 // DoGenericVolumeTests runs a set of tests that every TestableVolume
16 // is expected to pass. It calls factory to create a new
17 // TestableVolume for each test case, to avoid leaking state between
18 // tests.
19 func DoGenericVolumeTests(t *testing.T, factory TestableVolumeFactory) {
20         testDeleteNewBlock(t, factory)
21         testDeleteOldBlock(t, factory)
22 }
23
24 // Calling Delete() for a block immediately after writing it should
25 // neither delete the data nor return an error.
26 func testDeleteNewBlock(t *testing.T, factory TestableVolumeFactory) {
27         v := factory(t)
28         defer v.Teardown()
29         v.Put(TEST_HASH, TEST_BLOCK)
30
31         if err := v.Delete(TEST_HASH); err != nil {
32                 t.Error(err)
33         }
34         if data, err := v.Get(TEST_HASH); err != nil {
35                 t.Error(err)
36         } else if bytes.Compare(data, TEST_BLOCK) != 0 {
37                 t.Error("Block still present, but content is incorrect: %+v != %+v", data, TEST_BLOCK)
38         }
39 }
40
41 // Calling Delete() for a block with a timestamp older than
42 // blob_signature_ttl seconds in the past should delete the data.
43 func testDeleteOldBlock(t *testing.T, factory TestableVolumeFactory) {
44         v := factory(t)
45         defer v.Teardown()
46         v.Put(TEST_HASH, TEST_BLOCK)
47         v.TouchWithDate(TEST_HASH, time.Now().Add(-2*blob_signature_ttl*time.Second))
48
49         if err := v.Delete(TEST_HASH); err != nil {
50                 t.Error(err)
51         }
52         if _, err := v.Get(TEST_HASH); err == nil || !os.IsNotExist(err) {
53                 t.Errorf("os.IsNotExist(%v) should have been true", err.Error())
54         }
55 }