You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

217 lines
5.6 KiB

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