github.com/tri-stone/burrow@v0.25.0/consensus/abci/peers_filter_test.go (about)

     1  package abci
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/hyperledger/burrow/logging"
     8  
     9  	"github.com/hyperledger/burrow/consensus/tendermint/codes"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/tendermint/tendermint/abci/types"
    12  	abciTypes "github.com/tendermint/tendermint/abci/types"
    13  )
    14  
    15  const (
    16  	aNodeId      = "836AB8674A33416718E5A19557A25ED826B2BDD3"
    17  	aNodeAddress = "127.0.0.1:26656"
    18  )
    19  
    20  func TestApp_QueryAuthorizedPeers(t *testing.T) {
    21  	var panicked bool
    22  	app := &App{
    23  		panicFunc: func(e error) {
    24  			panicked = true
    25  		},
    26  		// Given no authorized node defined
    27  		authorizedPeersProvider: func() ([]string, []string) {
    28  			return []string{}, []string{}
    29  		},
    30  		logger: logging.NewNoopLogger(),
    31  	}
    32  
    33  	// When authorized node query is raised with any node id
    34  	resp := app.Query(*makeTestFilterQuery("id", aNodeId))
    35  
    36  	// Then we should authorized any node
    37  	assert.NotNil(t, resp)
    38  	assert.Equal(t, codes.PeerFilterAuthorizedCode, resp.Code)
    39  
    40  	// Given authorized nodes defined
    41  	app.authorizedPeersProvider = func() ([]string, []string) {
    42  		return []string{aNodeId}, []string{aNodeAddress}
    43  	}
    44  
    45  	// When authorized node query is raised for an authorized node by id
    46  	resp = app.Query(*makeTestFilterQuery("id", aNodeId))
    47  
    48  	// Then we should authorize it
    49  	assert.NotNil(t, resp)
    50  	assert.Equal(t, codes.PeerFilterAuthorizedCode, resp.Code)
    51  
    52  	// When authorized node query is raised for another node by id
    53  	resp = app.Query(*makeTestFilterQuery("id", "forbiddenId"))
    54  
    55  	// Then we should forbid this node to sync
    56  	assert.NotNil(t, resp)
    57  	assert.Equal(t, codes.PeerFilterForbiddenCode, resp.Code)
    58  
    59  	// When authorized node query is raised for an authorized node by address
    60  	resp = app.Query(*makeTestFilterQuery("addr", aNodeAddress))
    61  
    62  	// Then we should authorize it
    63  	assert.NotNil(t, resp)
    64  	assert.Equal(t, codes.PeerFilterAuthorizedCode, resp.Code)
    65  
    66  	// When authorized node query is raised for another node
    67  	resp = app.Query(*makeTestFilterQuery("addr", "forbiddenAddress"))
    68  
    69  	// Then we should forbid this node to sync
    70  	assert.NotNil(t, resp)
    71  	assert.Equal(t, codes.PeerFilterForbiddenCode, resp.Code)
    72  
    73  	// Given a provider which panics
    74  	assert.False(t, panicked)
    75  	app.authorizedPeersProvider = func() ([]string, []string) {
    76  		panic("ouch")
    77  	}
    78  
    79  	// When authorized node query is raised
    80  	resp = app.Query(*makeTestFilterQuery("addr", "hackMe"))
    81  
    82  	// The we should recover and mark the query as unsupported, so the node cannot sync
    83  	assert.True(t, panicked)
    84  	assert.NotNil(t, resp)
    85  	assert.Equal(t, codes.UnsupportedRequestCode, resp.Code)
    86  }
    87  
    88  func TestIsPeersFilterQuery(t *testing.T) {
    89  	assert.True(t, isPeersFilterQuery(makeTestFilterQuery("id", aNodeId)))
    90  	assert.True(t, isPeersFilterQuery(makeTestFilterQuery("addr", aNodeAddress)))
    91  	assert.False(t, isPeersFilterQuery(makeTestQuery("/another/query")))
    92  }
    93  
    94  func makeTestFilterQuery(filterType string, peer string) *abciTypes.RequestQuery {
    95  	return makeTestQuery(fmt.Sprintf("%v%v/%v", peersFilterQueryPath, filterType, peer))
    96  }
    97  
    98  func makeTestQuery(path string) *types.RequestQuery {
    99  	return &abciTypes.RequestQuery{
   100  		Path: path,
   101  	}
   102  }