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  }