OSDN Git Service

419b3cd886215040c878e464c7b8448b7af19bf2
[bytom/vapor.git] / protocol / bc / types / txinput_test.go
1 package types
2
3 import (
4         "bytes"
5         "encoding/hex"
6         "strings"
7         "testing"
8
9         "github.com/davecgh/go-spew/spew"
10
11         "github.com/vapor/encoding/blockchain"
12         "github.com/vapor/testutil"
13 )
14
15 func TestSerializationSpend(t *testing.T) {
16         arguments := [][]byte{
17                 []byte("arguments1"),
18                 []byte("arguments2"),
19         }
20         spend := NewSpendInput(arguments, testutil.MustDecodeHash("fad5195a0c8e3b590b86a3c0a95e7529565888508aecca96e9aeda633002f409"), testutil.MustDecodeAsset("fe9791d71b67ee62515e08723c061b5ccb952a80d804417c8aeedf7f633c524a"), 254354, 3, []byte("spendProgram"))
21
22         wantHex := strings.Join([]string{
23                 "01", // asset version
24                 "54", // input commitment length
25                 "01", // spend type flag
26                 "52", // spend commitment length
27                 "fad5195a0c8e3b590b86a3c0a95e7529565888508aecca96e9aeda633002f409", // source id
28                 "fe9791d71b67ee62515e08723c061b5ccb952a80d804417c8aeedf7f633c524a", // assetID
29                 "92c30f",                   // amount
30                 "03",                       // source position
31                 "01",                       // vm version
32                 "0c",                       // spend program length
33                 "7370656e6450726f6772616d", // spend program
34                 "17",                       // witness length
35                 "02",                       // argument array length
36                 "0a",                       // first argument length
37                 "617267756d656e747331",     // first argument data
38                 "0a",                       // second argument length
39                 "617267756d656e747332",     // second argument data
40         }, "")
41
42         // Test convert struct to hex
43         var buffer bytes.Buffer
44         if err := spend.writeTo(&buffer); err != nil {
45                 t.Fatal(err)
46         }
47
48         gotHex := hex.EncodeToString(buffer.Bytes())
49         if gotHex != wantHex {
50                 t.Errorf("serialization bytes = %s want %s", gotHex, wantHex)
51         }
52
53         // Test convert hex to struct
54         var gotSpend TxInput
55         decodeHex, err := hex.DecodeString(wantHex)
56         if err != nil {
57                 t.Fatal(err)
58         }
59
60         if err := gotSpend.readFrom(blockchain.NewReader(decodeHex)); err != nil {
61                 t.Fatal(err)
62         }
63
64         if !testutil.DeepEqual(*spend, gotSpend) {
65                 t.Errorf("expected marshaled/unmarshaled txinput to be:\n%sgot:\n%s", spew.Sdump(*spend), spew.Sdump(gotSpend))
66         }
67 }
68
69 func TestSerializationCrossIn(t *testing.T) {
70         arguments := [][]byte{
71                 []byte("arguments1"),
72                 []byte("arguments2"),
73         }
74
75         crossIn := NewCrossChainInput(arguments, testutil.MustDecodeHash("fad5195a0c8e3b590b86a3c0a95e7529565888508aecca96e9aeda633002f409"), testutil.MustDecodeAsset("fe9791d71b67ee62515e08723c061b5ccb952a80d804417c8aeedf7f633c524a"), 254354, 3, 1, []byte("whatever"), []byte("IssuanceProgram"))
76
77         wantHex := strings.Join([]string{
78                 "01", // asset version
79                 "48", // input commitment length
80                 "00", // cross-chain input type flag
81                 "46", // cross-chain input commitment length
82                 "fad5195a0c8e3b590b86a3c0a95e7529565888508aecca96e9aeda633002f409", // source id
83                 "fe9791d71b67ee62515e08723c061b5ccb952a80d804417c8aeedf7f633c524a", // assetID
84                 "92c30f",                         // amount
85                 "03",                             // source position
86                 "01",                             // vm version
87                 "00",                             // spend program length
88                 "31",                             // witness length
89                 "02",                             // argument array length
90                 "0a",                             // first argument length
91                 "617267756d656e747331",           // first argument data
92                 "0a",                             // second argument length
93                 "617267756d656e747332",           // second argument data
94                 "01",                             // VmVersion
95                 "08",                             // asset definition length
96                 "7768617465766572",               // asset definition data
97                 "0f",                             // IssuanceProgram length
98                 "49737375616e636550726f6772616d", // IssuanceProgram
99         }, "")
100
101         // Test convert struct to hex
102         var buffer bytes.Buffer
103         if err := crossIn.writeTo(&buffer); err != nil {
104                 t.Fatal(err)
105         }
106
107         gotHex := hex.EncodeToString(buffer.Bytes())
108         if gotHex != wantHex {
109                 t.Errorf("serialization bytes = %s want %s", gotHex, wantHex)
110         }
111
112         // Test convert hex to struct
113         var gotCrossIn TxInput
114         decodeHex, err := hex.DecodeString(wantHex)
115         if err != nil {
116                 t.Fatal(err)
117         }
118
119         if err := gotCrossIn.readFrom(blockchain.NewReader(decodeHex)); err != nil {
120                 t.Fatal(err)
121         }
122
123         if !testutil.DeepEqual(*crossIn, gotCrossIn) {
124                 t.Errorf("expected marshaled/unmarshaled txinput to be:\n%sgot:\n%s", spew.Sdump(*crossIn), spew.Sdump(gotCrossIn))
125         }
126 }
127
128 func TestSerializationUnvote(t *testing.T) {
129         arguments := [][]byte{
130                 []byte("arguments1"),
131                 []byte("arguments2"),
132         }
133
134         vetoInput := NewVetoInput(arguments, testutil.MustDecodeHash("fad5195a0c8e3b590b86a3c0a95e7529565888508aecca96e9aeda633002f409"), testutil.MustDecodeAsset("fe9791d71b67ee62515e08723c061b5ccb952a80d804417c8aeedf7f633c524a"), 254354, 3, []byte("spendProgram"), []byte("af594006a40837d9f028daabb6d589df0b9138daefad5683e5233c2646279217294a8d532e60863bcf196625a35fb8ceeffa3c09610eb92dcfb655a947f13269"))
135
136         wantHex := strings.Join([]string{
137                 "01", // asset version
138                 "54", // input commitment length
139                 "03", // unvote type flag
140                 "52", // unvote commitment length
141                 "fad5195a0c8e3b590b86a3c0a95e7529565888508aecca96e9aeda633002f409", // source id
142                 "fe9791d71b67ee62515e08723c061b5ccb952a80d804417c8aeedf7f633c524a", // assetID
143                 "92c30f",                   // amount
144                 "03",                       // source position
145                 "01",                       // vm version
146                 "0c",                       // unvote program length
147                 "7370656e6450726f6772616d", // unvote program
148                 "9901",                     // witness length
149                 "02",                       // argument array length
150                 "0a",                       // first argument length
151                 "617267756d656e747331",     // first argument data
152                 "0a",                       // second argument length
153                 "617267756d656e747332",     // second argument data
154                 "8001",                     //xpub length
155                 "6166353934303036613430383337643966303238646161626236643538396466306239313338646165666164353638336535323333633236343632373932313732393461386435333265363038363362636631393636323561333566623863656566666133633039363130656239326463666236353561393437663133323639", //voter xpub
156         }, "")
157
158         // Test convert struct to hex
159         var buffer bytes.Buffer
160         if err := vetoInput.writeTo(&buffer); err != nil {
161                 t.Fatal(err)
162         }
163
164         gotHex := hex.EncodeToString(buffer.Bytes())
165         if gotHex != wantHex {
166                 t.Errorf("serialization bytes = %s want %s", gotHex, wantHex)
167         }
168
169         // Test convert hex to struct
170         var gotVeto TxInput
171         decodeHex, err := hex.DecodeString(wantHex)
172         if err != nil {
173                 t.Fatal(err)
174         }
175
176         if err := gotVeto.readFrom(blockchain.NewReader(decodeHex)); err != nil {
177                 t.Fatal(err)
178         }
179
180         if !testutil.DeepEqual(*vetoInput, gotVeto) {
181                 t.Errorf("expected marshaled/unmarshaled txinput to be:\n%sgot:\n%s", spew.Sdump(*vetoInput), spew.Sdump(gotVeto))
182         }
183 }
184
185 func TestSerializationCoinbase(t *testing.T) {
186         coinbase := NewCoinbaseInput([]byte("arbitrary"))
187         wantHex := strings.Join([]string{
188                 "01",                 // asset version
189                 "0b",                 // input commitment length
190                 "02",                 // coinbase type flag
191                 "09",                 // arbitrary length
192                 "617262697472617279", // arbitrary data
193                 "00",                 // witness length
194         }, "")
195
196         // Test convert struct to hex
197         var buffer bytes.Buffer
198         if err := coinbase.writeTo(&buffer); err != nil {
199                 t.Fatal(err)
200         }
201
202         gotHex := hex.EncodeToString(buffer.Bytes())
203         if gotHex != wantHex {
204                 t.Errorf("serialization bytes = %s want %s", gotHex, wantHex)
205         }
206
207         // Test convert hex to struct
208         var gotCoinbase TxInput
209         decodeHex, err := hex.DecodeString(wantHex)
210         if err != nil {
211                 t.Fatal(err)
212         }
213
214         if err := gotCoinbase.readFrom(blockchain.NewReader(decodeHex)); err != nil {
215                 t.Fatal(err)
216         }
217
218         if !testutil.DeepEqual(*coinbase, gotCoinbase) {
219                 t.Errorf("expected marshaled/unmarshaled txinput to be:\n%sgot:\n%s", spew.Sdump(*coinbase), spew.Sdump(gotCoinbase))
220         }
221 }