github.com/trezor/blockbook@v0.4.1-0.20240328132726-e9a08582ee2c/bchain/coins/polis/polisparser_test.go (about) 1 //go:build unittest 2 3 package polis 4 5 import ( 6 "bytes" 7 "encoding/hex" 8 "fmt" 9 "io/ioutil" 10 "math/big" 11 "os" 12 "path/filepath" 13 "reflect" 14 "testing" 15 16 "github.com/martinboehm/btcutil/chaincfg" 17 "github.com/trezor/blockbook/bchain" 18 "github.com/trezor/blockbook/bchain/coins/btc" 19 ) 20 21 type testBlock struct { 22 size int 23 time int64 24 txs []string 25 } 26 27 var testParseBlockTxs = map[int]testBlock{ 28 // Simple POW block 29 50000: { 30 size: 1393, 31 time: 1520175937, 32 txs: []string{ 33 "b68057244d6ad2df0017bad1cd8a24487e21404b52873c59876a484c93f5a69e", 34 "3d27b82972196ecce604c2923bc9105cd683352fd56f8ba052dee57a296a2d71", 35 "d22704ddad675d652a6b501694d9e026f19b41842946ea285490315cb944c674", 36 "7be2e53414c9480ea1590e40cfa8361ac7594f7435f919a6eeff96367b0dffa9", 37 "e2486a9610698888c4baad7001385e95aca053ab9fc7cc9d15280c9c835c975c", 38 }, 39 }, 40 // Simple POS block 41 280000: { 42 size: 275, 43 time: 1549070495, 44 txs: []string{ 45 "9a820cb226364e852ec5d13bc3ead1ad127bf28ef2808919571200a1262b46b5", 46 "fcca99e281fa0c43085dfe82c24b4367ff21d3a148539e781c061fe29a793ab1", 47 }, 48 }, 49 } 50 51 func TestMain(m *testing.M) { 52 c := m.Run() 53 chaincfg.ResetParams() 54 os.Exit(c) 55 } 56 57 func helperLoadBlock(t *testing.T, height int) []byte { 58 name := fmt.Sprintf("block_dump.%d", height) 59 path := filepath.Join("testdata", name) 60 61 d, err := ioutil.ReadFile(path) 62 if err != nil { 63 t.Fatal(err) 64 } 65 66 d = bytes.TrimSpace(d) 67 68 b := make([]byte, hex.DecodedLen(len(d))) 69 _, err = hex.Decode(b, d) 70 if err != nil { 71 t.Fatal(err) 72 } 73 74 return b 75 } 76 77 func TestParseBlock(t *testing.T) { 78 p := NewPolisParser(GetChainParams("main"), &btc.Configuration{}) 79 80 for height, tb := range testParseBlockTxs { 81 b := helperLoadBlock(t, height) 82 83 blk, err := p.ParseBlock(b) 84 if err != nil { 85 t.Errorf("ParseBlock() error %v", err) 86 } 87 88 if blk.Size != tb.size { 89 t.Errorf("ParseBlock() block size: got %d, want %d", blk.Size, tb.size) 90 } 91 92 if blk.Time != tb.time { 93 t.Errorf("ParseBlock() block time: got %d, want %d", blk.Time, tb.time) 94 } 95 96 if len(blk.Txs) != len(tb.txs) { 97 t.Errorf("ParseBlock() number of transactions: got %d, want %d", len(blk.Txs), len(tb.txs)) 98 } 99 100 for ti, tx := range tb.txs { 101 if blk.Txs[ti].Txid != tx { 102 t.Errorf("ParseBlock() transaction %d: got %s, want %s", ti, blk.Txs[ti].Txid, tx) 103 } 104 } 105 } 106 } 107 108 func Test_GetAddrDescFromAddress_Mainnet(t *testing.T) { 109 type args struct { 110 address string 111 } 112 tests := []struct { 113 name string 114 args args 115 want string 116 wantErr bool 117 }{ 118 { 119 name: "P2PKH1", 120 args: args{address: "P9hRjWq6tMqhroxswc2f5jp2ND2py8YEnu"}, 121 want: "76a9140c26ca7967e6fe946f00bf81bcd3b86f43538edf88ac", 122 wantErr: false, 123 }, 124 } 125 parser := NewPolisParser(GetChainParams("main"), &btc.Configuration{}) 126 127 for _, tt := range tests { 128 t.Run(tt.name, func(t *testing.T) { 129 got, err := parser.GetAddrDescFromAddress(tt.args.address) 130 if (err != nil) != tt.wantErr { 131 t.Errorf("GetAddrDescFromAddress() error = %v, wantErr %v", err, tt.wantErr) 132 return 133 } 134 h := hex.EncodeToString(got) 135 if !reflect.DeepEqual(h, tt.want) { 136 t.Errorf("GetAddrDescFromAddress() = %v, want %v", h, tt.want) 137 } 138 }) 139 } 140 } 141 142 func Test_GetAddressesFromAddrDesc(t *testing.T) { 143 type args struct { 144 script string 145 } 146 tests := []struct { 147 name string 148 args args 149 want []string 150 want2 bool 151 wantErr bool 152 }{ 153 { 154 name: "P2PKH1", 155 args: args{script: "76a9140c26ca7967e6fe946f00bf81bcd3b86f43538edf88ac"}, 156 want: []string{"P9hRjWq6tMqhroxswc2f5jp2ND2py8YEnu"}, 157 want2: true, 158 wantErr: false, 159 }, 160 } 161 162 parser := NewPolisParser(GetChainParams("main"), &btc.Configuration{}) 163 164 for _, tt := range tests { 165 t.Run(tt.name, func(t *testing.T) { 166 b, _ := hex.DecodeString(tt.args.script) 167 got, got2, err := parser.GetAddressesFromAddrDesc(b) 168 if (err != nil) != tt.wantErr { 169 t.Errorf("GetAddressesFromAddrDesc() error = %v, wantErr %v", err, tt.wantErr) 170 return 171 } 172 if !reflect.DeepEqual(got, tt.want) { 173 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got, tt.want) 174 } 175 if !reflect.DeepEqual(got2, tt.want2) { 176 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got2, tt.want2) 177 } 178 }) 179 } 180 } 181 182 var ( 183 testTx1 bchain.Tx 184 testTxPacked1 = "0004e3868bca91b06e020000000198160d0ba0168003897358f1a6d2a2499a8e93dc6d341613b960ed2083de3fe0010000006b483045022100c531bd672ed3cb1a9285191ac168f1627e6075a54f5cf4a22ee8ec717b9a047f0220068241d9cc10adf1ddcc30aef4e62863d663af50371ebc639d11532ddf6e636e012102182bc5cd0a82c43c7ed9c4acc4b735e04e7f3275b43ff2514b8a1beb1feb5493feffffff021e470d8d0e0000001976a914344bf2db193190967d3b8da659a3ce2fde5f44a588acb63dd7a4300000001976a91414c343cae45bbcf7a27b8284b8c328587f6cc45588ac85e30400" 185 ) 186 187 func init() { 188 testTx1 = bchain.Tx{ 189 Hex: "020000000198160d0ba0168003897358f1a6d2a2499a8e93dc6d341613b960ed2083de3fe0010000006b483045022100c531bd672ed3cb1a9285191ac168f1627e6075a54f5cf4a22ee8ec717b9a047f0220068241d9cc10adf1ddcc30aef4e62863d663af50371ebc639d11532ddf6e636e012102182bc5cd0a82c43c7ed9c4acc4b735e04e7f3275b43ff2514b8a1beb1feb5493feffffff021e470d8d0e0000001976a914344bf2db193190967d3b8da659a3ce2fde5f44a588acb63dd7a4300000001976a91414c343cae45bbcf7a27b8284b8c328587f6cc45588ac85e30400", 190 Blocktime: 1554132023, 191 Txid: "6882e77c916c5442d09e295b88fbb8a2fac6dbb988975bb00dbded088e0229a9", 192 LockTime: 320389, 193 Version: 2, 194 Vin: []bchain.Vin{ 195 { 196 ScriptSig: bchain.ScriptSig{ 197 Hex: "483045022100c531bd672ed3cb1a9285191ac168f1627e6075a54f5cf4a22ee8ec717b9a047f0220068241d9cc10adf1ddcc30aef4e62863d663af50371ebc639d11532ddf6e636e012102182bc5cd0a82c43c7ed9c4acc4b735e04e7f3275b43ff2514b8a1beb1feb5493", 198 }, 199 Txid: "e03fde8320ed60b91316346ddc938e9a49a2d2a6f1587389038016a00b0d1698", 200 Vout: 1, 201 Sequence: 4294967294, 202 }, 203 }, 204 Vout: []bchain.Vout{ 205 { 206 ValueSat: *big.NewInt(62495999774), 207 N: 0, 208 ScriptPubKey: bchain.ScriptPubKey{ 209 Hex: "76a914344bf2db193190967d3b8da659a3ce2fde5f44a588ac", 210 Addresses: []string{ 211 "PDMhGxFYTaomhzSqWKHbUzx7smYUZvZVjd", 212 }, 213 }, 214 }, 215 { 216 ValueSat: *big.NewInt(208923999670), 217 N: 1, 218 ScriptPubKey: bchain.ScriptPubKey{ 219 Hex: "76a91414c343cae45bbcf7a27b8284b8c328587f6cc45588ac", 220 Addresses: []string{ 221 "PAUxb3g3DZNrjgbRidZy3NC9TNhVrPRzAR", 222 }, 223 }, 224 }, 225 }, 226 } 227 } 228 229 func Test_PackTx(t *testing.T) { 230 type args struct { 231 tx bchain.Tx 232 height uint32 233 blockTime int64 234 parser *PolisParser 235 } 236 tests := []struct { 237 name string 238 args args 239 want string 240 wantErr bool 241 }{ 242 { 243 name: "polis-1", 244 args: args{ 245 tx: testTx1, 246 height: 320390, 247 blockTime: 1554132023, 248 parser: NewPolisParser(GetChainParams("main"), &btc.Configuration{}), 249 }, 250 want: testTxPacked1, 251 wantErr: false, 252 }, 253 } 254 for _, tt := range tests { 255 t.Run(tt.name, func(t *testing.T) { 256 got, err := tt.args.parser.PackTx(&tt.args.tx, tt.args.height, tt.args.blockTime) 257 if (err != nil) != tt.wantErr { 258 t.Errorf("packTx() error = %v, wantErr %v", err, tt.wantErr) 259 return 260 } 261 h := hex.EncodeToString(got) 262 if !reflect.DeepEqual(h, tt.want) { 263 t.Errorf("packTx() = %v, want %v", h, tt.want) 264 } 265 }) 266 } 267 } 268 269 func Test_UnpackTx(t *testing.T) { 270 type args struct { 271 packedTx string 272 parser *PolisParser 273 } 274 tests := []struct { 275 name string 276 args args 277 want *bchain.Tx 278 want1 uint32 279 wantErr bool 280 }{ 281 { 282 name: "polis-1", 283 args: args{ 284 packedTx: testTxPacked1, 285 parser: NewPolisParser(GetChainParams("main"), &btc.Configuration{}), 286 }, 287 want: &testTx1, 288 want1: 320390, 289 wantErr: false, 290 }, 291 } 292 for _, tt := range tests { 293 t.Run(tt.name, func(t *testing.T) { 294 b, _ := hex.DecodeString(tt.args.packedTx) 295 got, got1, err := tt.args.parser.UnpackTx(b) 296 if (err != nil) != tt.wantErr { 297 t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr) 298 return 299 } 300 if !reflect.DeepEqual(got, tt.want) { 301 t.Errorf("unpackTx() got = %v, want %v", got, tt.want) 302 } 303 if got1 != tt.want1 { 304 t.Errorf("unpackTx() got1 = %v, want %v", got1, tt.want1) 305 } 306 }) 307 } 308 }