github.com/okex/exchain@v1.8.0/libs/tendermint/lite/proxy/validate_test.go (about)

     1  package proxy_test
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  
     9  	"github.com/okex/exchain/libs/tendermint/lite/proxy"
    10  	"github.com/okex/exchain/libs/tendermint/types"
    11  )
    12  
    13  var (
    14  	deadBeefTxs  = types.Txs{[]byte("DE"), []byte("AD"), []byte("BE"), []byte("EF")}
    15  	deadBeefHash = deadBeefTxs.Hash(0)
    16  	testTime1    = time.Date(2018, 1, 1, 1, 1, 1, 1, time.UTC)
    17  	testTime2    = time.Date(2017, 1, 2, 1, 1, 1, 1, time.UTC)
    18  )
    19  
    20  var hdrHeight11 = types.Header{
    21  	Height:         11,
    22  	Time:           testTime1,
    23  	ValidatorsHash: []byte("Tendermint"),
    24  }
    25  
    26  func TestValidateBlock(t *testing.T) {
    27  	tests := []struct {
    28  		block        *types.Block
    29  		signedHeader types.SignedHeader
    30  		wantErr      string
    31  	}{
    32  		{
    33  			block: nil, wantErr: "non-nil Block",
    34  		},
    35  		{
    36  			block: &types.Block{}, wantErr: "unexpected empty SignedHeader",
    37  		},
    38  
    39  		// Start Header.Height mismatch test
    40  		{
    41  			block:        &types.Block{Header: types.Header{Height: 10}},
    42  			signedHeader: types.SignedHeader{Header: &types.Header{Height: 11}},
    43  			wantErr:      "header heights mismatched",
    44  		},
    45  
    46  		{
    47  			block:        &types.Block{Header: types.Header{Height: 11}},
    48  			signedHeader: types.SignedHeader{Header: &types.Header{Height: 11}},
    49  		},
    50  		// End Header.Height mismatch test
    51  
    52  		// Start Header.Hash mismatch test
    53  		{
    54  			block:        &types.Block{Header: hdrHeight11},
    55  			signedHeader: types.SignedHeader{Header: &types.Header{Height: 11}},
    56  			wantErr:      "headers don't match",
    57  		},
    58  
    59  		{
    60  			block:        &types.Block{Header: hdrHeight11},
    61  			signedHeader: types.SignedHeader{Header: &hdrHeight11},
    62  		},
    63  		// End Header.Hash mismatch test
    64  
    65  		// Start Header.Data hash mismatch test
    66  		{
    67  			block: &types.Block{
    68  				Header: types.Header{Height: 11},
    69  				Data:   types.Data{Txs: []types.Tx{[]byte("0xDE"), []byte("AD")}},
    70  			},
    71  			signedHeader: types.SignedHeader{
    72  				Header: &types.Header{Height: 11},
    73  				Commit: types.NewCommit(11, 0, types.BlockID{Hash: []byte("0xDEADBEEF")}, nil),
    74  			},
    75  			wantErr: "data hash doesn't match header",
    76  		},
    77  		{
    78  			block: &types.Block{
    79  				Header: types.Header{Height: 11, DataHash: deadBeefHash},
    80  				Data:   types.Data{Txs: deadBeefTxs},
    81  			},
    82  			signedHeader: types.SignedHeader{
    83  				Header: &types.Header{Height: 11},
    84  				Commit: types.NewCommit(11, 0, types.BlockID{Hash: []byte("DEADBEEF")}, nil),
    85  			},
    86  		},
    87  		// End Header.Data hash mismatch test
    88  	}
    89  
    90  	for i, tt := range tests {
    91  		err := proxy.ValidateBlock(tt.block, tt.signedHeader)
    92  		if tt.wantErr != "" {
    93  			if err == nil {
    94  				assert.FailNowf(t, "Unexpectedly passed", "#%d", i)
    95  			} else {
    96  				assert.Contains(t, err.Error(), tt.wantErr, "#%d should contain the substring\n\n", i)
    97  			}
    98  			continue
    99  		}
   100  
   101  		assert.Nil(t, err, "#%d: expecting a nil error", i)
   102  	}
   103  }
   104  
   105  func TestValidateBlockMeta(t *testing.T) {
   106  	tests := []struct {
   107  		meta         *types.BlockMeta
   108  		signedHeader types.SignedHeader
   109  		wantErr      string
   110  	}{
   111  		{
   112  			meta: nil, wantErr: "non-nil BlockMeta",
   113  		},
   114  		{
   115  			meta: &types.BlockMeta{}, wantErr: "unexpected empty SignedHeader",
   116  		},
   117  
   118  		// Start Header.Height mismatch test
   119  		{
   120  			meta:         &types.BlockMeta{Header: types.Header{Height: 10}},
   121  			signedHeader: types.SignedHeader{Header: &types.Header{Height: 11}},
   122  			wantErr:      "header heights mismatched",
   123  		},
   124  
   125  		{
   126  			meta:         &types.BlockMeta{Header: types.Header{Height: 11}},
   127  			signedHeader: types.SignedHeader{Header: &types.Header{Height: 11}},
   128  		},
   129  		// End Header.Height mismatch test
   130  
   131  		// Start Headers don't match test
   132  		{
   133  			meta:         &types.BlockMeta{Header: hdrHeight11},
   134  			signedHeader: types.SignedHeader{Header: &types.Header{Height: 11}},
   135  			wantErr:      "headers don't match",
   136  		},
   137  
   138  		{
   139  			meta:         &types.BlockMeta{Header: hdrHeight11},
   140  			signedHeader: types.SignedHeader{Header: &hdrHeight11},
   141  		},
   142  
   143  		{
   144  			meta: &types.BlockMeta{
   145  				Header: types.Header{
   146  					Height:         11,
   147  					ValidatorsHash: []byte("lite-test"),
   148  					// TODO: should be able to use empty time after Amino upgrade
   149  					Time: testTime1,
   150  				},
   151  			},
   152  			signedHeader: types.SignedHeader{
   153  				Header: &types.Header{Height: 11, DataHash: deadBeefHash},
   154  			},
   155  			wantErr: "headers don't match",
   156  		},
   157  
   158  		{
   159  			meta: &types.BlockMeta{
   160  				Header: types.Header{
   161  					Height: 11, DataHash: deadBeefHash,
   162  					ValidatorsHash: []byte("Tendermint"),
   163  					Time:           testTime1,
   164  				},
   165  			},
   166  			signedHeader: types.SignedHeader{
   167  				Header: &types.Header{
   168  					Height: 11, DataHash: deadBeefHash,
   169  					ValidatorsHash: []byte("Tendermint"),
   170  					Time:           testTime2,
   171  				},
   172  				Commit: types.NewCommit(11, 0, types.BlockID{Hash: []byte("DEADBEEF")}, nil),
   173  			},
   174  			wantErr: "headers don't match",
   175  		},
   176  
   177  		{
   178  			meta: &types.BlockMeta{
   179  				Header: types.Header{
   180  					Height: 11, DataHash: deadBeefHash,
   181  					ValidatorsHash: []byte("Tendermint"),
   182  					Time:           testTime2,
   183  				},
   184  			},
   185  			signedHeader: types.SignedHeader{
   186  				Header: &types.Header{
   187  					Height: 11, DataHash: deadBeefHash,
   188  					ValidatorsHash: []byte("Tendermint-x"),
   189  					Time:           testTime2,
   190  				},
   191  				Commit: types.NewCommit(11, 0, types.BlockID{Hash: []byte("DEADBEEF")}, nil),
   192  			},
   193  			wantErr: "headers don't match",
   194  		},
   195  		// End Headers don't match test
   196  	}
   197  
   198  	for i, tt := range tests {
   199  		err := proxy.ValidateBlockMeta(tt.meta, tt.signedHeader)
   200  		if tt.wantErr != "" {
   201  			if err == nil {
   202  				assert.FailNowf(t, "Unexpectedly passed", "#%d: wanted error %q", i, tt.wantErr)
   203  			} else {
   204  				assert.Contains(t, err.Error(), tt.wantErr, "#%d should contain the substring\n\n", i)
   205  			}
   206  			continue
   207  		}
   208  
   209  		assert.Nil(t, err, "#%d: expecting a nil error", i)
   210  	}
   211  }