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