(t *testing.T)
| 12 | ) |
| 13 | |
| 14 | func TestStringLock(t *testing.T) { |
| 15 | var wg sync.WaitGroup |
| 16 | counter := [3]int{} |
| 17 | lock := newStringLock() |
| 18 | const ( |
| 19 | outer = 10 |
| 20 | inner = 100 |
| 21 | total = outer * inner |
| 22 | ) |
| 23 | for range outer { |
| 24 | for j := range counter { |
| 25 | wg.Add(1) |
| 26 | go func(j int) { |
| 27 | defer wg.Done() |
| 28 | ID := fmt.Sprintf("%d", j) |
| 29 | for range inner { |
| 30 | lock.Lock(ID) |
| 31 | n := counter[j] |
| 32 | time.Sleep(1 * time.Millisecond) |
| 33 | counter[j] = n + 1 |
| 34 | lock.Unlock(ID) |
| 35 | } |
| 36 | |
| 37 | }(j) |
| 38 | } |
| 39 | } |
| 40 | wg.Wait() |
| 41 | assert.Equal(t, [3]int{total, total, total}, counter) |
| 42 | } |