decred.org/dcrwallet/v3@v3.1.0/internal/rpc/jsonrpc/rpcserver_test.go (about)

     1  // Copyright (c) 2013-2014 The btcsuite developers
     2  // Copyright (c) 2015 The Decred developers
     3  // Use of this source code is governed by an ISC
     4  // license that can be found in the LICENSE file.
     5  
     6  package jsonrpc
     7  
     8  import (
     9  	"net/http"
    10  	"net/http/httptest"
    11  	"reflect"
    12  	"testing"
    13  )
    14  
    15  func TestThrottle(t *testing.T) {
    16  	const threshold = 1
    17  	busy := make(chan struct{})
    18  
    19  	srv := httptest.NewServer(throttledFn(threshold,
    20  		func(w http.ResponseWriter, r *http.Request) {
    21  			<-busy
    22  		}),
    23  	)
    24  
    25  	type resp struct {
    26  		resp *http.Response
    27  		err  error
    28  	}
    29  	responses := make(chan resp, 2)
    30  	for i := 0; i < cap(responses); i++ {
    31  		go func() {
    32  			r, err := http.Get(srv.URL)
    33  			responses <- resp{r, err}
    34  		}()
    35  	}
    36  
    37  	got := make(map[int]int, cap(responses))
    38  	for i := 0; i < cap(responses); i++ {
    39  		r := <-responses
    40  		if r.err != nil {
    41  			t.Fatal(r.err)
    42  		}
    43  		got[r.resp.StatusCode]++
    44  
    45  		if i == 0 {
    46  			close(busy)
    47  		}
    48  	}
    49  
    50  	want := map[int]int{200: 1, 429: 1}
    51  	if !reflect.DeepEqual(want, got) {
    52  		t.Fatalf("status codes: want: %v, got: %v", want, got)
    53  	}
    54  }