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 }