PPysolate SpineREAD THE CODE · UNDERSTAND THE SYSTEM
课程与章节
源码索引 / CURRENT IMPLEMENTATION

learning/go-patterns/patterns/shared-map/shared_map_test.go

57 行 · 点击行号可定位;函数链接随声明位置更新,不手填行号。

跳到函数 / 声明
package sharedmap

import (
	"fmt"
	"reflect"
	"sync"
	"testing"
)

func TestStoreSetGetAndSnapshot(t *testing.T) {
	store := NewStore()
	store.Set("ready", 1)

	if got, ok := store.Get("ready"); !ok || got != 1 {
		t.Fatalf("Get() = (%d, %t), want (1, true)", got, ok)
	}
	if _, ok := store.Get("missing"); ok {
		t.Fatal("Get() found a missing key")
	}

	snapshot := store.Snapshot()
	snapshot["ready"] = 99
	if got, _ := store.Get("ready"); got != 1 {
		t.Fatalf("Get() after snapshot mutation = %d, want 1", got)
	}
}

func TestStoreSupportsConcurrentIndependentWriters(t *testing.T) {
	var store Store
	const writers = 8
	const writesPerKey = 100

	var wg sync.WaitGroup
	for i := 0; i < writers; i++ {
		i := i
		wg.Add(1)
		go func() {
			defer wg.Done()
			key := fmt.Sprintf("worker-%d", i)
			for value := 0; value < writesPerKey; value++ {
				store.Set(key, value)
			}
		}()
	}
	wg.Wait()

	if got, want := store.Len(), writers; got != want {
		t.Fatalf("Len() = %d, want %d", got, want)
	}
	want := make(map[string]int, writers)
	for i := 0; i < writers; i++ {
		want[fmt.Sprintf("worker-%d", i)] = writesPerKey - 1
	}
	if got := store.Snapshot(); !reflect.DeepEqual(got, want) {
		t.Fatalf("Snapshot() = %#v, want %#v", got, want)
	}
}