github.com/arieschain/arieschain@v0.0.0-20191023063405-37c074544356/les/execqueue_test.go (about)

     1  package les
     2  
     3  import (
     4  	"testing"
     5  )
     6  
     7  func TestExecQueue(t *testing.T) {
     8  	var (
     9  		N        = 10000
    10  		q        = newExecQueue(N)
    11  		counter  int
    12  		execd    = make(chan int)
    13  		testexit = make(chan struct{})
    14  	)
    15  	defer q.quit()
    16  	defer close(testexit)
    17  
    18  	check := func(state string, wantOK bool) {
    19  		c := counter
    20  		counter++
    21  		qf := func() {
    22  			select {
    23  			case execd <- c:
    24  			case <-testexit:
    25  			}
    26  		}
    27  		if q.canQueue() != wantOK {
    28  			t.Fatalf("canQueue() == %t for %s", !wantOK, state)
    29  		}
    30  		if q.queue(qf) != wantOK {
    31  			t.Fatalf("canQueue() == %t for %s", !wantOK, state)
    32  		}
    33  	}
    34  
    35  	for i := 0; i < N; i++ {
    36  		check("queue below cap", true)
    37  	}
    38  	check("full queue", false)
    39  	for i := 0; i < N; i++ {
    40  		if c := <-execd; c != i {
    41  			t.Fatal("execution out of order")
    42  		}
    43  	}
    44  	q.quit()
    45  	check("closed queue", false)
    46  }