aboutsummaryrefslogtreecommitdiffstats
path: root/les/execqueue_test.go
blob: cd45b03f221d09eb924371cbeb75658b0a867c27 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Copyright 2017 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.

package les

import (
    "testing"
)

func TestExecQueue(t *testing.T) {
    var (
        N        = 10000
        q        = newExecQueue(N)
        counter  int
        execd    = make(chan int)
        testexit = make(chan struct{})
    )
    defer q.quit()
    defer close(testexit)

    check := func(state string, wantOK bool) {
        c := counter
        counter++
        qf := func() {
            select {
            case execd <- c:
            case <-testexit:
            }
        }
        if q.canQueue() != wantOK {
            t.Fatalf("canQueue() == %t for %s", !wantOK, state)
        }
        if q.queue(qf) != wantOK {
            t.Fatalf("canQueue() == %t for %s", !wantOK, state)
        }
    }

    for i := 0; i < N; i++ {
        check("queue below cap", true)
    }
    check("full queue", false)
    for i := 0; i < N; i++ {
        if c := <-execd; c != i {
            t.Fatal("execution out of order")
        }
    }
    q.quit()
    check("closed queue", false)
}