github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/les/execqueue_test.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:38</date>
    10  //</624450093512134656>
    11  
    12  
    13  package les
    14  
    15  import (
    16  	"testing"
    17  )
    18  
    19  func TestExecQueue(t *testing.T) {
    20  	var (
    21  		N        = 10000
    22  		q        = newExecQueue(N)
    23  		counter  int
    24  		execd    = make(chan int)
    25  		testexit = make(chan struct{})
    26  	)
    27  	defer q.quit()
    28  	defer close(testexit)
    29  
    30  	check := func(state string, wantOK bool) {
    31  		c := counter
    32  		counter++
    33  		qf := func() {
    34  			select {
    35  			case execd <- c:
    36  			case <-testexit:
    37  			}
    38  		}
    39  		if q.canQueue() != wantOK {
    40  			t.Fatalf("canQueue() == %t for %s", !wantOK, state)
    41  		}
    42  		if q.queue(qf) != wantOK {
    43  			t.Fatalf("canQueue() == %t for %s", !wantOK, state)
    44  		}
    45  	}
    46  
    47  	for i := 0; i < N; i++ {
    48  		check("queue below cap", true)
    49  	}
    50  	check("full queue", false)
    51  	for i := 0; i < N; i++ {
    52  		if c := <-execd; c != i {
    53  			t.Fatal("execution out of order")
    54  		}
    55  	}
    56  	q.quit()
    57  	check("closed queue", false)
    58  }
    59