tx_test.go raw
1 package btcwire
2
3 import (
4 "bytes"
5 "testing"
6
7 "git.smesh.lol/nostrino/pkg/crypto/chainhash"
8 )
9
10 func TestTxRoundTrip(t *testing.T) {
11 raw := []byte{
12 0x01, 0x00, 0x00, 0x00, // version
13 0x01, // input count
14 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
15 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
16 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
18 0xff, 0xff, 0xff, 0xff, // sequence
19 }
20 want := &Tx{Raw: raw}
21 payload, err := want.EncodePayload()
22 if err != nil {
23 t.Fatalf("EncodePayload: %v", err)
24 }
25 if !bytes.Equal(payload, raw) {
26 t.Fatalf("payload = %x, want %x", payload, raw)
27 }
28 var got Tx
29 if err := got.DecodePayload(payload); err != nil {
30 t.Fatalf("DecodePayload: %v", err)
31 }
32 if !bytes.Equal(got.Raw, raw) {
33 t.Fatalf("decoded = %x, want %x", got.Raw, raw)
34 }
35 wantID := chainhash.DoubleHashH(raw)
36 if got.TxID() != wantID {
37 t.Fatalf("TxID = %s, want %s", got.TxID(), wantID)
38 }
39 // Any change to the raw transaction changes the txid.
40 mutated := &Tx{Raw: append([]byte(nil), raw...)}
41 mutated.Raw[0] ^= 0x01
42 if mutated.TxID() == wantID {
43 t.Fatal("mutated transaction kept the same txid")
44 }
45 }
46
47 func TestTxEmpty(t *testing.T) {
48 var tx Tx
49 payload, err := tx.EncodePayload()
50 if err != nil {
51 t.Fatalf("EncodePayload: %v", err)
52 }
53 if len(payload) != 0 {
54 t.Fatalf("payload = %x, want empty", payload)
55 }
56 var got Tx
57 if err := got.DecodePayload(nil); err != nil {
58 t.Fatalf("DecodePayload: %v", err)
59 }
60 if len(got.Raw) != 0 {
61 t.Fatalf("raw = %x, want empty", got.Raw)
62 }
63 if got.TxID() != chainhash.DoubleHashH(nil) {
64 t.Fatal("empty transaction txid mismatch")
65 }
66 }
67
68 func TestTxFrameRoundTrip(t *testing.T) {
69 raw := bytes.Repeat([]byte{0x42}, 500)
70 frame, err := EncodeMessagePayload(TestNet3, CmdTx, &Tx{Raw: raw})
71 if err != nil {
72 t.Fatalf("EncodeMessagePayload: %v", err)
73 }
74 msg, err := DecodeMessage(TestNet3, bytes.NewReader(frame))
75 if err != nil {
76 t.Fatalf("DecodeMessage: %v", err)
77 }
78 var got Tx
79 if err := msg.Decode(&got); err != nil {
80 t.Fatalf("Decode: %v", err)
81 }
82 if !bytes.Equal(got.Raw, raw) {
83 t.Fatalf("raw = %x, want %x", got.Raw, raw)
84 }
85 }
86