upgrade_test.go raw
1 package blockchain
2
3 import (
4 "reflect"
5 "testing"
6 )
7
8 // TestDeserializeUtxoEntryV0 ensures deserializing unspent trasaction output
9 // entries from the legacy version 0 format works as expected.
10 func TestDeserializeUtxoEntryV0(t *testing.T) {
11 tests := []struct {
12 name string
13 entries map[uint32]*UtxoEntry
14 serialized []byte
15 }{
16 // From tx in main blockchain:
17 // 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098
18 {
19 name: "Only output 0, coinbase",
20 entries: map[uint32]*UtxoEntry{
21 0: {
22 amount: 5000000000,
23 pkScript: hexToBytes("410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac"),
24 blockHeight: 1,
25 packedFlags: tfCoinBase,
26 },
27 },
28 serialized: hexToBytes("010103320496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52"),
29 },
30 // From tx in main blockchain:
31 // 8131ffb0a2c945ecaf9b9063e59558784f9c3a74741ce6ae2a18d0571dac15bb
32 {
33 name: "Only output 1, not coinbase",
34 entries: map[uint32]*UtxoEntry{
35 1: {
36 amount: 1000000,
37 pkScript: hexToBytes("76a914ee8bd501094a7d5ca318da2506de35e1cb025ddc88ac"),
38 blockHeight: 100001,
39 packedFlags: 0,
40 },
41 },
42 serialized: hexToBytes("01858c21040700ee8bd501094a7d5ca318da2506de35e1cb025ddc"),
43 },
44 // Adapted from tx in main blockchain:
45 // df3f3f442d9699857f7f49de4ff0b5d0f3448bec31cdc7b5bf6d25f2abd637d5
46 {
47 name: "Only output 2, coinbase",
48 entries: map[uint32]*UtxoEntry{
49 2: {
50 amount: 100937281,
51 pkScript: hexToBytes("76a914da33f77cee27c2a975ed5124d7e4f7f97513510188ac"),
52 blockHeight: 99004,
53 packedFlags: tfCoinBase,
54 },
55 },
56 serialized: hexToBytes("0185843c010182b095bf4100da33f77cee27c2a975ed5124d7e4f7f975135101"),
57 },
58 // Adapted from tx in main blockchain:
59 // 4a16969aa4764dd7507fc1de7f0baa4850a246de90c45e59a3207f9a26b5036f
60 {
61 name: "outputs 0 and 2 not coinbase",
62 entries: map[uint32]*UtxoEntry{
63 0: {
64 amount: 20000000,
65 pkScript: hexToBytes("76a914e2ccd6ec7c6e2e581349c77e067385fa8236bf8a88ac"),
66 blockHeight: 113931,
67 packedFlags: 0,
68 },
69 2: {
70 amount: 15000000,
71 pkScript: hexToBytes("76a914b8025be1b3efc63b0ad48e7f9f10e87544528d5888ac"),
72 blockHeight: 113931,
73 packedFlags: 0,
74 },
75 },
76 serialized: hexToBytes("0185f90b0a011200e2ccd6ec7c6e2e581349c77e067385fa8236bf8a800900b8025be1b3efc63b0ad48e7f9f10e87544528d58"),
77 },
78 // Adapted from tx in main blockchain:
79 // 1b02d1c8cfef60a189017b9a420c682cf4a0028175f2f563209e4ff61c8c3620
80 {
81 name: "Only output 22, not coinbase",
82 entries: map[uint32]*UtxoEntry{
83 22: {
84 amount: 366875659,
85 pkScript: hexToBytes("a9141dd46a006572d820e448e12d2bbb38640bc718e687"),
86 blockHeight: 338156,
87 packedFlags: 0,
88 },
89 },
90 serialized: hexToBytes("0193d06c100000108ba5b9e763011dd46a006572d820e448e12d2bbb38640bc718e6"),
91 },
92 }
93 for i, test := range tests {
94 // Deserialize to map of utxos keyed by the output index.
95 entries, e := deserializeUtxoEntryV0(test.serialized)
96 if e != nil {
97 t.Errorf("deserializeUtxoEntryV0 #%d (%s) unexpected "+
98 "error: %v", i, test.name, e,
99 )
100 continue
101 }
102 // Ensure the deserialized entry has the same properties as the
103 // ones in the test entry.
104 if !reflect.DeepEqual(entries, test.entries) {
105 t.Errorf("deserializeUtxoEntryV0 #%d (%s) unexpected "+
106 "entries: got %v, want %v", i, test.name,
107 entries, test.entries,
108 )
109 continue
110 }
111 }
112 }
113