Example #1
0
func TestDiscardReplica(t *testing.T) {
	for i := 0; i < 10; i++ {
		r := New(0, discard{}, memory.New())
		storagetest.StorageTest(t, r)
		r = New(0, memory.New(), discard{})
		storagetest.StorageTest(t, r)
	}
}
Example #2
0
func TestErrorReplica(t *testing.T) {

	for i := 0; i < 10; i++ {
		r := New(2, storagetest.Errstore{}, memory.New())
		storagetest.StorageTest(t, r)
		r = New(2, memory.New(), storagetest.Errstore{})
		storagetest.StorageTest(t, r)
	}
}
Example #3
0
func TestShardedkv(t *testing.T) {
	var shards []Shard
	nElements := 1000
	nShards := 10

	for i := 0; i < nShards; i++ {
		label := "test_shard" + strconv.Itoa(i)
		shards = append(shards, Shard{Name: label, Backend: st.New()})
	}

	chooser := ch.New()

	kv := New(chooser, shards)

	for i := 0; i < nElements; i++ {
		kv.Set("test"+strconv.Itoa(i), []byte("value"+strconv.Itoa(i)))
	}

	for i := 0; i < nElements; i++ {
		k := "test" + strconv.Itoa(i)

		v, ok, err := kv.Get(k)
		if ok != true {
			t.Errorf("failed  to get key: %s\n", err)
		}

		if string(v) != "value"+strconv.Itoa(i) {
			t.Errorf("failed to get a valid value: %s != \"value%d\"\n", v, i)
		}
	}

	var migrationBuckets []string

	for i := nShards; i < nShards*2; i++ {
		label := "test_shard" + strconv.Itoa(i)
		migrationBuckets = append(migrationBuckets, label)
		backend := st.New()
		shards = append(shards, Shard{Name: label, Backend: backend})
		kv.AddShard(label, backend)
	}

	migration := ch.New()
	migration.SetBuckets(migrationBuckets)

	kv.BeginMigration(migration)

	// make sure requesting still works
	for i := 0; i < nElements; i++ {
		k := "test" + strconv.Itoa(i)

		v, ok, err := kv.Get(k)
		if ok != true {
			t.Errorf("failed  to get key: %s\n", err)
		}

		if string(v) != "value"+strconv.Itoa(i) {
			t.Errorf("failed to get a valid value: %s != \"value%d\"\n", v, i)
		}
	}

	// make sure setting still works
	for i := 0; i < nElements; i++ {
		kv.Set("test"+strconv.Itoa(i), []byte("value"+strconv.Itoa(i)))
	}

	for i := 0; i < nElements; i++ {
		k := "test" + strconv.Itoa(i)

		v, ok, err := kv.Get(k)
		if ok != true {
			t.Errorf("failed  to get key: %s\n", err)
		}

		if string(v) != "value"+strconv.Itoa(i) {
			t.Errorf("failed to get a valid value: %s != \"value%d\"\n", v, i)
		}
	}

	// and that deleting removes from both during a migration
	for i := 0; i < nElements; i++ {
		kv.Delete("test" + strconv.Itoa(i))
	}

	for i := 0; i < nElements; i++ {
		k := "test" + strconv.Itoa(i)

		_, ok, _ := kv.Get(k)
		if ok {
			t.Errorf("got a key that shouldn't have been there")
		}
	}

	// set the keys again
	for i := 0; i < nElements; i++ {
		kv.Set("test"+strconv.Itoa(i), []byte("value"+strconv.Itoa(i)))
	}

	// end the migration
	kv.EndMigration()

	// delete the old shards
	for i := 0; i < nShards; i++ {
		label := "test_shard" + strconv.Itoa(i)
		kv.DeleteShard(label)
	}

	// and make sure we can still get to the keys
	for i := 0; i < nElements; i++ {
		k := "test" + strconv.Itoa(i)

		v, ok, err := kv.Get(k)
		if ok != true {
			t.Errorf("failed  to get key: %s\n", err)
		}

		if string(v) != "value"+strconv.Itoa(i) {
			t.Errorf("failed to get a valid value: %s != \"value%d\"\n", v, i)
		}
	}
}
Example #4
0
func TestBackoff(t *testing.T) {
	m := memory.New()
	b := &Storage{Store: m}
	storagetest.StorageTest(t, b)
}