6 "github.com/bytom/database/storage"
7 "github.com/bytom/protocol/bc"
8 "github.com/bytom/testutil"
11 var defaultEntry = map[bc.Hash]bc.Entry{
12 bc.Hash{V0: 0}: &bc.Output{
13 Source: &bc.ValueSource{
14 Value: &bc.AssetAmount{
15 AssetId: &bc.AssetID{V0: 0},
21 func TestApplyBlock(t *testing.T) {
24 inputView *UtxoViewpoint
25 fetchView *UtxoViewpoint
30 BlockHeader: &bc.BlockHeader{
31 TransactionStatus: bc.NewTransactionStatus(),
33 Transactions: []*bc.Tx{
35 SpentOutputIDs: []bc.Hash{
38 Entries: defaultEntry,
42 inputView: NewUtxoViewpoint(),
43 fetchView: NewUtxoViewpoint(),
48 BlockHeader: &bc.BlockHeader{
49 TransactionStatus: bc.NewTransactionStatus(),
51 Transactions: []*bc.Tx{
53 SpentOutputIDs: []bc.Hash{
56 Entries: defaultEntry,
60 inputView: &UtxoViewpoint{
61 Entries: map[bc.Hash]*storage.UtxoEntry{
62 bc.Hash{V0: 0}: storage.NewUtxoEntry(false, 0, true),
69 BlockHeader: &bc.BlockHeader{
70 TransactionStatus: bc.NewTransactionStatus(),
72 Transactions: []*bc.Tx{
74 TxHeader: &bc.TxHeader{
75 ResultIds: []*bc.Hash{},
77 SpentOutputIDs: []bc.Hash{
80 Entries: defaultEntry,
84 inputView: &UtxoViewpoint{
85 Entries: map[bc.Hash]*storage.UtxoEntry{
86 bc.Hash{V0: 0}: storage.NewUtxoEntry(false, 0, false),
89 fetchView: &UtxoViewpoint{
90 Entries: map[bc.Hash]*storage.UtxoEntry{
91 bc.Hash{V0: 0}: storage.NewUtxoEntry(false, 0, true),
98 BlockHeader: &bc.BlockHeader{
100 TransactionStatus: bc.NewTransactionStatus(),
102 Transactions: []*bc.Tx{
104 TxHeader: &bc.TxHeader{
105 ResultIds: []*bc.Hash{},
107 SpentOutputIDs: []bc.Hash{
110 Entries: defaultEntry,
114 inputView: &UtxoViewpoint{
115 Entries: map[bc.Hash]*storage.UtxoEntry{
116 bc.Hash{V0: 0}: storage.NewUtxoEntry(true, 0, false),
119 fetchView: &UtxoViewpoint{
120 Entries: map[bc.Hash]*storage.UtxoEntry{
121 bc.Hash{V0: 0}: storage.NewUtxoEntry(true, 0, true),
128 BlockHeader: &bc.BlockHeader{
130 TransactionStatus: bc.NewTransactionStatus(),
132 Transactions: []*bc.Tx{
134 TxHeader: &bc.TxHeader{
135 ResultIds: []*bc.Hash{},
137 SpentOutputIDs: []bc.Hash{
140 Entries: defaultEntry,
144 inputView: &UtxoViewpoint{
145 Entries: map[bc.Hash]*storage.UtxoEntry{
146 bc.Hash{V0: 0}: storage.NewUtxoEntry(true, 0, false),
149 fetchView: &UtxoViewpoint{
150 Entries: map[bc.Hash]*storage.UtxoEntry{
151 bc.Hash{V0: 0}: storage.NewUtxoEntry(true, 0, true),
158 for i, c := range cases {
160 if err := c.inputView.ApplyBlock(c.block, c.block.TransactionStatus); c.err != (err != nil) {
161 t.Errorf("want err = %v, get err = %v", c.err, err)
166 if !testutil.DeepEqual(c.inputView, c.fetchView) {
167 t.Errorf("test case %d, want %v, get %v", i, c.fetchView, c.inputView)
172 func TestDetachBlock(t *testing.T) {
175 inputView *UtxoViewpoint
176 fetchView *UtxoViewpoint
181 BlockHeader: &bc.BlockHeader{
182 TransactionStatus: bc.NewTransactionStatus(),
184 Transactions: []*bc.Tx{
186 TxHeader: &bc.TxHeader{
187 ResultIds: []*bc.Hash{},
189 SpentOutputIDs: []bc.Hash{
192 Entries: defaultEntry,
196 inputView: NewUtxoViewpoint(),
197 fetchView: &UtxoViewpoint{
198 Entries: map[bc.Hash]*storage.UtxoEntry{
199 bc.Hash{V0: 0}: storage.NewUtxoEntry(false, 0, false),
206 BlockHeader: &bc.BlockHeader{
207 TransactionStatus: bc.NewTransactionStatus(),
209 Transactions: []*bc.Tx{
211 TxHeader: &bc.TxHeader{
212 ResultIds: []*bc.Hash{},
214 SpentOutputIDs: []bc.Hash{
217 Entries: defaultEntry,
221 inputView: &UtxoViewpoint{
222 Entries: map[bc.Hash]*storage.UtxoEntry{
223 bc.Hash{V0: 0}: storage.NewUtxoEntry(false, 0, false),
230 BlockHeader: &bc.BlockHeader{
231 TransactionStatus: bc.NewTransactionStatus(),
233 Transactions: []*bc.Tx{
235 TxHeader: &bc.TxHeader{
236 ResultIds: []*bc.Hash{},
238 SpentOutputIDs: []bc.Hash{
241 Entries: defaultEntry,
245 inputView: &UtxoViewpoint{
246 Entries: map[bc.Hash]*storage.UtxoEntry{
247 bc.Hash{V0: 0}: storage.NewUtxoEntry(false, 0, true),
250 fetchView: &UtxoViewpoint{
251 Entries: map[bc.Hash]*storage.UtxoEntry{
252 bc.Hash{V0: 0}: storage.NewUtxoEntry(false, 0, false),
259 for i, c := range cases {
260 if err := c.inputView.DetachBlock(c.block, c.block.TransactionStatus); c.err != (err != nil) {
261 t.Errorf("case %d want err = %v, get err = %v", i, c.err, err)
266 if !testutil.DeepEqual(c.inputView, c.fetchView) {
267 t.Errorf("test case %d, want %v, get %v", i, c.fetchView, c.inputView)