(db database.Database, t *testing.T)
| 104 | } |
| 105 | |
| 106 | func testParallelDBFuncs(db database.Database, t *testing.T) { |
| 107 | const n = 8 |
| 108 | var pending sync.WaitGroup |
| 109 | |
| 110 | // put |
| 111 | pending.Add(n) |
| 112 | for i := 0; i < n; i++ { |
| 113 | go func(key string) { |
| 114 | defer pending.Done() |
| 115 | err := db.Put([]byte(key), []byte("v"+key)) |
| 116 | if err != nil { |
| 117 | t.Fatal("put failed: " + err.Error()) |
| 118 | } |
| 119 | }(strconv.Itoa(i)) |
| 120 | } |
| 121 | pending.Wait() |
| 122 | |
| 123 | // get |
| 124 | pending.Add(n) |
| 125 | for i := 0; i < n; i++ { |
| 126 | go func(key string) { |
| 127 | defer pending.Done() |
| 128 | data, err := db.Get([]byte(key)) |
| 129 | if err != nil { |
| 130 | t.Fatal("get failed: " + err.Error()) |
| 131 | } |
| 132 | if !bytes.Equal(data, []byte("v"+key)) { |
| 133 | t.Fatal(fmt.Sprintf("get failed, got %q expected %q", []byte(data), []byte("v"+key))) |
| 134 | } |
| 135 | }(strconv.Itoa(i)) |
| 136 | } |
| 137 | pending.Wait() |
| 138 | |
| 139 | // delete |
| 140 | pending.Add(n) |
| 141 | for i := 0; i < n; i++ { |
| 142 | go func(key string) { |
| 143 | defer pending.Done() |
| 144 | err := db.Delete([]byte(key)) |
| 145 | if err != nil { |
| 146 | t.Fatal("delete failed: " + err.Error()) |
| 147 | } |
| 148 | }(strconv.Itoa(i)) |
| 149 | } |
| 150 | pending.Wait() |
| 151 | |
| 152 | // check deletion |
| 153 | pending.Add(n) |
| 154 | for i := 0; i < n; i++ { |
| 155 | go func(key string) { |
| 156 | defer pending.Done() |
| 157 | _, err := db.Get([]byte(key)) |
| 158 | if err == nil { |
| 159 | t.Fatal("get succeeded") |
| 160 | } |
| 161 | }(strconv.Itoa(i)) |
| 162 | } |
| 163 | pending.Wait() |
no test coverage detected