(t *testing.T)
| 139 | } |
| 140 | |
| 141 | func TestQueuesConsistency(t *testing.T) { |
| 142 | tests := map[string]struct { |
| 143 | forgetDelay time.Duration |
| 144 | }{ |
| 145 | "without forget delay": {}, |
| 146 | "with forget delay": {forgetDelay: time.Minute}, |
| 147 | } |
| 148 | |
| 149 | for testName, testData := range tests { |
| 150 | t.Run(testName, func(t *testing.T) { |
| 151 | uq := newUserQueues(testData.forgetDelay, MockLimits{}, nil) |
| 152 | assert.NotNil(t, uq) |
| 153 | assert.NoError(t, isConsistent(uq)) |
| 154 | |
| 155 | r := rand.New(rand.NewSource(time.Now().Unix())) |
| 156 | |
| 157 | lastUserIndexes := map[string]int{} |
| 158 | |
| 159 | conns := map[string]int{} |
| 160 | |
| 161 | for i := range 10000 { |
| 162 | switch r.Int() % 6 { |
| 163 | case 0: |
| 164 | assert.NotNil(t, uq.getOrAddQueue(generateTenant(r), 3)) |
| 165 | case 1: |
| 166 | qid := generateQuerier(r) |
| 167 | _, _, luid := uq.getNextQueueForQuerier(lastUserIndexes[qid], qid) |
| 168 | lastUserIndexes[qid] = luid |
| 169 | case 2: |
| 170 | uq.deleteQueue(generateTenant(r)) |
| 171 | case 3: |
| 172 | q := generateQuerier(r) |
| 173 | uq.addQuerierConnection(q) |
| 174 | conns[q]++ |
| 175 | case 4: |
| 176 | q := generateQuerier(r) |
| 177 | if conns[q] > 0 { |
| 178 | uq.removeQuerierConnection(q, time.Now()) |
| 179 | conns[q]-- |
| 180 | } |
| 181 | case 5: |
| 182 | q := generateQuerier(r) |
| 183 | uq.notifyQuerierShutdown(q) |
| 184 | } |
| 185 | |
| 186 | assert.NoErrorf(t, isConsistent(uq), "last action %d", i) |
| 187 | } |
| 188 | }) |
| 189 | } |
| 190 | } |
| 191 | |
| 192 | func TestQueues_ForgetDelay(t *testing.T) { |
| 193 | const ( |
nothing calls this directly
no test coverage detected