github.com/nu7hatch/persival@v0.0.0-20120207144510-08c3f45e315b/bucket_test.go (about) 1 // Copyright (C) 2011 by Krzysztof Kowalik <chris@nu7hat.ch> 2 // 3 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 4 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 5 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 6 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 7 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 8 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 9 // SOFTWARE. 10 11 package persival 12 13 import "testing" 14 15 type dummy struct { 16 A string 17 } 18 19 func init() { 20 Register(&dummy{}) 21 } 22 23 func TestNewBucket(t *testing.T) { 24 bkt, err := NewBucket("/tmp/foo.bkt", 0) 25 if err != nil { 26 t.Errorf("Expected to create new bucket, error: %v", err) 27 } 28 if err = bkt.Destroy(); err != nil { 29 t.Errorf("Expected to destroy the bucket afterword, error: %v", err) 30 } 31 } 32 33 func TestBucketSet(t *testing.T) { 34 bkt, _ := NewBucket("/tmp/foo.bkt", 0) 35 defer bkt.Destroy() 36 if key, err := bkt.Set(&dummy{"hello"}); err != nil || key != 1 { 37 t.Errorf("Expected to get key of the set value, error: %v", err) 38 } 39 } 40 41 func TestBucketGet(t *testing.T) { 42 bkt, _ := NewBucket("/tmp/foo.bkt", 0) 43 defer bkt.Destroy() 44 key, _ := bkt.Set(&dummy{"hello"}) 45 if val, err := bkt.Get(key); err != nil || val.(*dummy).A != "hello" { 46 t.Errorf("Expected to get proper value from specfied key, error; %v", err) 47 } 48 if _, err := bkt.Get(123); err == nil { 49 t.Errorf("Expected to get nothing from non-existent key") 50 } 51 } 52 53 func TestBucketUpdate(t *testing.T) { 54 bkt, _ := NewBucket("/tmp/foo.bkt", 0) 55 defer bkt.Destroy() 56 key, _ := bkt.Set(&dummy{"hello"}) 57 if err := bkt.Update(key, &dummy{"world"}); err != nil { 58 t.Errorf("Expected to update value of the specified key, error: %v", err) 59 } 60 if val, err := bkt.Get(key); err != nil || val.(*dummy).A != "world" { 61 t.Errorf("Expected to have proper value after update, error: %v", err) 62 } 63 if err := bkt.Update(123, &dummy{"hello"}); err == nil { 64 t.Errorf("Expected to get an error when updating non-existant record") 65 } 66 } 67 68 func TestBucketDelete(t *testing.T) { 69 bkt, _ := NewBucket("/tmp/foo.bkt", 0) 70 defer bkt.Destroy() 71 key, _ := bkt.Set(&dummy{"hello"}) 72 if err := bkt.Delete(key); err != nil { 73 t.Errorf("Expected to delete specified record, error: %v", err) 74 } 75 if _, err := bkt.Get(key); err == nil { 76 t.Errorf("Expected to get an error when retrieving deleted record") 77 } 78 if err := bkt.Delete(123); err == nil { 79 t.Errorf("Expected to get an error when deleting non-existent record") 80 } 81 } 82 83 func TestBucketExists(t *testing.T) { 84 bkt, _ := NewBucket("/tmp/foo.bkt", 0) 85 defer bkt.Destroy() 86 key, _ := bkt.Set(&dummy{"hello"}) 87 if ok := bkt.Exists(key); !ok { 88 t.Errorf("Expected to get true when record exists") 89 } 90 if ok := bkt.Exists(123); ok { 91 t.Errorf("Expected to get false when record does not exist") 92 } 93 } 94 95 func TestBucketLen(t *testing.T) { 96 bkt, _ := NewBucket("/tmp/foo.bkt", 0) 97 defer bkt.Destroy() 98 bkt.Set(&dummy{"hello"}) 99 bkt.Set(&dummy{"world"}) 100 bkt.Set(&dummy{"hurra"}) 101 bkt.Delete(2) 102 if bkt.Len() != 2 { 103 t.Errorf("Expected to get proper bucket size") 104 } 105 } 106 107 func TestBucketSyncAndReopen(t *testing.T) { 108 var bkt *Bucket 109 var err error 110 bkt, _ = NewBucket("/tmp/foo.bkt", 0) 111 bkt.Set(&dummy{"hello"}) 112 bkt.Set(&dummy{"world"}) 113 bkt.Set(&dummy{"hurra"}) 114 bkt.Delete(2) 115 bkt.Close() 116 bkt, err = NewBucket("/tmp/foo.bkt", 0) 117 if err != nil { 118 t.Errorf("Expected to reopen the bucket, error: %v", err) 119 } 120 if bkt.Len() != 2 { 121 t.Errorf("Expected to have 2 records after load, got %d", bkt.Len()) 122 } 123 hello, _ := bkt.Get(1) 124 hurra, _ := bkt.Get(3) 125 if hello.(*dummy).A != "hello" || hurra.(*dummy).A != "hurra" { 126 t.Errorf("Expected to have proper values after load") 127 } 128 bkt.Delete(1) 129 if _, err = bkt.Set(&dummy{"hello"}); err != nil { 130 t.Errorf("Expected to set something new, error: %v", err) 131 } 132 bkt.Close() 133 bkt, err = NewBucket("/tmp/foo.bkt", 0) 134 if err != nil { 135 t.Errorf("Expected to reopen the bucket, error: %v", err) 136 } 137 if bkt.Len() != 2 { 138 t.Errorf("Expected to have 2 records after load, got %d", bkt.Len()) 139 } 140 hurra, _ = bkt.Get(3) 141 hello, _ = bkt.Get(4) 142 if hello.(*dummy).A != "hello" || hurra.(*dummy).A != "hurra" { 143 t.Errorf("Expected to have proper values after load") 144 } 145 bkt.Destroy() 146 } 147 148 const numberOfRecords = 10000 149 150 func BenchmarkBucketWrite(b *testing.B) { 151 b.StopTimer() 152 bkt, _ := NewBucket("/tmp/bench.bkt", 0) 153 defer bkt.Destroy() 154 b.StartTimer() 155 for i := 0; i < numberOfRecords; i += 1 { 156 bkt.Set("hello") 157 } 158 } 159 160 func BenchmarkBucketRead(b *testing.B) { 161 b.StopTimer() 162 bkt, _ := NewBucket("/tmp/bench.bkt", 0) 163 defer bkt.Destroy() 164 for i := 0; i < numberOfRecords; i += 1 { 165 bkt.Set("hello") 166 } 167 b.StartTimer() 168 for i := 0; i < numberOfRecords; i += 1 { 169 bkt.Get(i) 170 } 171 } 172 173 func BenchmarkBucketDelete(b *testing.B) { 174 b.StopTimer() 175 bkt, _ := NewBucket("/tmp/bench.bkt", 0) 176 defer bkt.Destroy() 177 for i := 0; i < numberOfRecords; i += 1 { 178 bkt.Set("hello") 179 } 180 b.StartTimer() 181 for i := 0; i < numberOfRecords; i += 1 { 182 bkt.Delete(i) 183 } 184 } 185 186 func BenchmarkBucketOpen(b *testing.B) { 187 b.StopTimer() 188 bkt, _ := NewBucket("/tmp/bench.bkt", 0) 189 for i := 0; i < numberOfRecords; i += 1 { 190 bkt.Set("hello") 191 } 192 bkt.Close() 193 b.StartTimer() 194 bkt, _ = NewBucket("/tmp/bench.bkt", 0) 195 defer bkt.Destroy() 196 }