github.com/lbryio/lbcd@v0.22.119/rpcclient/chain_test.go (about) 1 package rpcclient 2 3 import "testing" 4 5 // TestUnmarshalGetBlockChainInfoResult ensures that the SoftForks and 6 // UnifiedSoftForks fields of GetBlockChainInfoResult are properly unmarshaled 7 // when using the expected backend version. 8 func TestUnmarshalGetBlockChainInfoResultSoftForks(t *testing.T) { 9 t.Parallel() 10 11 tests := []struct { 12 name string 13 version BackendVersion 14 res []byte 15 compatible bool 16 }{ 17 { 18 name: "bitcoind < 0.19.0 with separate softforks", 19 version: BitcoindPre19, 20 res: []byte(`{"softforks": [{"version": 2}]}`), 21 compatible: true, 22 }, 23 { 24 name: "bitcoind >= 0.19.0 with separate softforks", 25 version: BitcoindPost19, 26 res: []byte(`{"softforks": [{"version": 2}]}`), 27 compatible: false, 28 }, 29 { 30 name: "bitcoind < 0.19.0 with unified softforks", 31 version: BitcoindPre19, 32 res: []byte(`{"softforks": {"segwit": {"type": "bip9"}}}`), 33 compatible: false, 34 }, 35 { 36 name: "bitcoind >= 0.19.0 with unified softforks", 37 version: BitcoindPost19, 38 res: []byte(`{"softforks": {"segwit": {"type": "bip9"}}}`), 39 compatible: true, 40 }, 41 } 42 43 for _, test := range tests { 44 success := t.Run(test.name, func(t *testing.T) { 45 // We'll start by unmarshaling the JSON into a struct. 46 // The SoftForks and UnifiedSoftForks field should not 47 // be set yet, as they are unmarshaled within a 48 // different function. 49 info, err := unmarshalPartialGetBlockChainInfoResult(test.res) 50 if err != nil { 51 t.Fatal(err) 52 } 53 if info.SoftForks != nil { 54 t.Fatal("expected SoftForks to be empty") 55 } 56 if info.UnifiedSoftForks != nil { 57 t.Fatal("expected UnifiedSoftForks to be empty") 58 } 59 60 // Proceed to unmarshal the softforks of the response 61 // with the expected version. If the version is 62 // incompatible with the response, then this should 63 // fail. 64 err = unmarshalGetBlockChainInfoResultSoftForks( 65 info, test.version, test.res, 66 ) 67 if test.compatible && err != nil { 68 t.Fatalf("unable to unmarshal softforks: %v", err) 69 } 70 if !test.compatible && err == nil { 71 t.Fatal("expected to not unmarshal softforks") 72 } 73 if !test.compatible { 74 return 75 } 76 77 // If the version is compatible with the response, we 78 // should expect to see the proper softforks field set. 79 if test.version == BitcoindPost19 && 80 info.SoftForks != nil { 81 t.Fatal("expected SoftForks to be empty") 82 } 83 if test.version == BitcoindPre19 && 84 info.UnifiedSoftForks != nil { 85 t.Fatal("expected UnifiedSoftForks to be empty") 86 } 87 }) 88 if !success { 89 return 90 } 91 } 92 }