github.com/alpe/etcd@v0.1.2-0.20130915230056-09f31af88aeb/store/store_test.go (about)

     1  package store
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  	"time"
     7  )
     8  
     9  func TestStoreGetDelete(t *testing.T) {
    10  
    11  	s := CreateStore(100)
    12  	s.Set("foo", "bar", time.Unix(0, 0), 1)
    13  	res, err := s.Get("foo")
    14  
    15  	if err != nil {
    16  		t.Fatalf("Unknown error")
    17  	}
    18  
    19  	var result Response
    20  	json.Unmarshal(res, &result)
    21  
    22  	if result.Value != "bar" {
    23  		t.Fatalf("Cannot get stored value")
    24  	}
    25  
    26  	s.Delete("foo", 2)
    27  	_, err = s.Get("foo")
    28  
    29  	if err == nil {
    30  		t.Fatalf("Got deleted value")
    31  	}
    32  }
    33  
    34  func TestTestAndSet(t *testing.T) {
    35  	s := CreateStore(100)
    36  	s.Set("foo", "bar", time.Unix(0, 0), 1)
    37  
    38  	_, err := s.TestAndSet("foo", "barbar", "barbar", time.Unix(0, 0), 2)
    39  
    40  	if err == nil {
    41  		t.Fatalf("test bar == barbar should fail")
    42  	}
    43  
    44  	_, err = s.TestAndSet("foo", "bar", "barbar", time.Unix(0, 0), 3)
    45  
    46  	if err != nil {
    47  		t.Fatalf("test bar == bar should succeed")
    48  	}
    49  
    50  	_, err = s.TestAndSet("foo", "", "barbar", time.Unix(0, 0), 4)
    51  
    52  	if err == nil {
    53  		t.Fatalf("test empty == bar should fail")
    54  	}
    55  
    56  	_, err = s.TestAndSet("fooo", "bar", "barbar", time.Unix(0, 0), 5)
    57  
    58  	if err == nil {
    59  		t.Fatalf("test bar == non-existing key should fail")
    60  	}
    61  
    62  	_, err = s.TestAndSet("fooo", "", "bar", time.Unix(0, 0), 6)
    63  
    64  	if err != nil {
    65  		t.Fatalf("test empty == non-existing key should succeed")
    66  	}
    67  
    68  }
    69  
    70  func TestSaveAndRecovery(t *testing.T) {
    71  
    72  	s := CreateStore(100)
    73  	s.Set("foo", "bar", time.Unix(0, 0), 1)
    74  	s.Set("foo2", "bar2", time.Now().Add(time.Second*5), 2)
    75  	state, err := s.Save()
    76  
    77  	if err != nil {
    78  		t.Fatalf("Cannot Save %s", err)
    79  	}
    80  
    81  	newStore := CreateStore(100)
    82  
    83  	// wait for foo2 expires
    84  	time.Sleep(time.Second * 6)
    85  
    86  	newStore.Recovery(state)
    87  
    88  	res, err := newStore.Get("foo")
    89  
    90  	var result Response
    91  	json.Unmarshal(res, &result)
    92  
    93  	if result.Value != "bar" {
    94  		t.Fatalf("Recovery Fail")
    95  	}
    96  
    97  	res, err = newStore.Get("foo2")
    98  
    99  	if err == nil {
   100  		t.Fatalf("Get expired value")
   101  	}
   102  
   103  	s.Delete("foo", 3)
   104  
   105  }
   106  
   107  func TestExpire(t *testing.T) {
   108  	// test expire
   109  	s := CreateStore(100)
   110  	s.Set("foo", "bar", time.Now().Add(time.Second*1), 0)
   111  	time.Sleep(2 * time.Second)
   112  
   113  	_, err := s.Get("foo")
   114  
   115  	if err == nil {
   116  		t.Fatalf("Got expired value")
   117  	}
   118  
   119  	//test change expire time
   120  	s.Set("foo", "bar", time.Now().Add(time.Second*10), 1)
   121  
   122  	_, err = s.Get("foo")
   123  
   124  	if err != nil {
   125  		t.Fatalf("Cannot get Value")
   126  	}
   127  
   128  	s.Set("foo", "barbar", time.Now().Add(time.Second*1), 2)
   129  
   130  	time.Sleep(2 * time.Second)
   131  
   132  	_, err = s.Get("foo")
   133  
   134  	if err == nil {
   135  		t.Fatalf("Got expired value")
   136  	}
   137  
   138  	// test change expire to stable
   139  	s.Set("foo", "bar", time.Now().Add(time.Second*1), 3)
   140  
   141  	s.Set("foo", "bar", time.Unix(0, 0), 4)
   142  
   143  	time.Sleep(2 * time.Second)
   144  
   145  	_, err = s.Get("foo")
   146  
   147  	if err != nil {
   148  		t.Fatalf("Cannot get Value")
   149  	}
   150  
   151  	// test stable to expire
   152  	s.Set("foo", "bar", time.Now().Add(time.Second*1), 5)
   153  	time.Sleep(2 * time.Second)
   154  	_, err = s.Get("foo")
   155  
   156  	if err == nil {
   157  		t.Fatalf("Got expired value")
   158  	}
   159  
   160  	// test set older node
   161  	s.Set("foo", "bar", time.Now().Add(-time.Second*1), 6)
   162  	_, err = s.Get("foo")
   163  
   164  	if err == nil {
   165  		t.Fatalf("Got expired value")
   166  	}
   167  
   168  }
   169  
   170  func BenchmarkStoreSet(b *testing.B) {
   171  	s := CreateStore(100)
   172  
   173  	keys := GenKeys(10000, 5)
   174  
   175  	b.ResetTimer()
   176  	for i := 0; i < b.N; i++ {
   177  
   178  		for i, key := range keys {
   179  			s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
   180  		}
   181  
   182  		s = CreateStore(100)
   183  	}
   184  }
   185  
   186  func BenchmarkStoreGet(b *testing.B) {
   187  	s := CreateStore(100)
   188  
   189  	keys := GenKeys(10000, 5)
   190  
   191  	for i, key := range keys {
   192  		s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
   193  	}
   194  
   195  	b.ResetTimer()
   196  	for i := 0; i < b.N; i++ {
   197  
   198  		for _, key := range keys {
   199  			s.Get(key)
   200  		}
   201  
   202  	}
   203  }
   204  
   205  func BenchmarkStoreSnapshotCopy(b *testing.B) {
   206  	s := CreateStore(100)
   207  
   208  	keys := GenKeys(10000, 5)
   209  
   210  	for i, key := range keys {
   211  		s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
   212  	}
   213  
   214  	var state []byte
   215  
   216  	b.ResetTimer()
   217  	for i := 0; i < b.N; i++ {
   218  		s.clone()
   219  	}
   220  	b.SetBytes(int64(len(state)))
   221  }
   222  
   223  func BenchmarkSnapshotSaveJson(b *testing.B) {
   224  	s := CreateStore(100)
   225  
   226  	keys := GenKeys(10000, 5)
   227  
   228  	for i, key := range keys {
   229  		s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
   230  	}
   231  
   232  	var state []byte
   233  
   234  	b.ResetTimer()
   235  	for i := 0; i < b.N; i++ {
   236  		state, _ = s.Save()
   237  	}
   238  	b.SetBytes(int64(len(state)))
   239  }
   240  
   241  func BenchmarkSnapshotRecovery(b *testing.B) {
   242  	s := CreateStore(100)
   243  
   244  	keys := GenKeys(10000, 5)
   245  
   246  	for i, key := range keys {
   247  		s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
   248  	}
   249  
   250  	state, _ := s.Save()
   251  
   252  	b.ResetTimer()
   253  	for i := 0; i < b.N; i++ {
   254  		newStore := CreateStore(100)
   255  		newStore.Recovery(state)
   256  	}
   257  	b.SetBytes(int64(len(state)))
   258  }