40df138193
This commit contains the entire btcnet repository along with several changes needed to move all of the files into the chaincfg directory in order to prepare it for merging. This does NOT update btcd or any of the other packages to use the new location as that will be done separately. - All import paths in the old btcnet test files have been changed to the new location - All references to btcnet as the package name have been changed to chaincfg - The coveralls badge has been removed since it unfortunately doesn't support coverage of sub-packages This is ongoing work toward #214.
380 lines
7.7 KiB
Go
380 lines
7.7 KiB
Go
package chaincfg_test
|
|
|
|
import (
|
|
"bytes"
|
|
"reflect"
|
|
"testing"
|
|
|
|
. "github.com/btcsuite/btcd/chaincfg"
|
|
)
|
|
|
|
// Define some of the required parameters for a user-registered
|
|
// network. This is necessary to test the registration of and
|
|
// lookup of encoding magics from the network.
|
|
var mockNetParams = Params{
|
|
Name: "mocknet",
|
|
Net: 1<<32 - 1,
|
|
PubKeyHashAddrID: 0x9f,
|
|
ScriptHashAddrID: 0xf9,
|
|
HDPrivateKeyID: [4]byte{0x01, 0x02, 0x03, 0x04},
|
|
HDPublicKeyID: [4]byte{0x05, 0x06, 0x07, 0x08},
|
|
}
|
|
|
|
func TestRegister(t *testing.T) {
|
|
type registerTest struct {
|
|
name string
|
|
params *Params
|
|
err error
|
|
}
|
|
type magicTest struct {
|
|
magic byte
|
|
valid bool
|
|
}
|
|
type hdTest struct {
|
|
priv []byte
|
|
want []byte
|
|
err error
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
register []registerTest
|
|
p2pkhMagics []magicTest
|
|
p2shMagics []magicTest
|
|
hdMagics []hdTest
|
|
}{
|
|
{
|
|
name: "default networks",
|
|
register: []registerTest{
|
|
{
|
|
name: "duplicate mainnet",
|
|
params: &MainNetParams,
|
|
err: ErrDuplicateNet,
|
|
},
|
|
{
|
|
name: "duplicate regtest",
|
|
params: &RegressionNetParams,
|
|
err: ErrDuplicateNet,
|
|
},
|
|
{
|
|
name: "duplicate testnet3",
|
|
params: &TestNet3Params,
|
|
err: ErrDuplicateNet,
|
|
},
|
|
{
|
|
name: "duplicate simnet",
|
|
params: &SimNetParams,
|
|
err: ErrDuplicateNet,
|
|
},
|
|
},
|
|
p2pkhMagics: []magicTest{
|
|
{
|
|
magic: MainNetParams.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: TestNet3Params.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: RegressionNetParams.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: SimNetParams.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: mockNetParams.PubKeyHashAddrID,
|
|
valid: false,
|
|
},
|
|
{
|
|
magic: 0xFF,
|
|
valid: false,
|
|
},
|
|
},
|
|
p2shMagics: []magicTest{
|
|
{
|
|
magic: MainNetParams.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: TestNet3Params.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: RegressionNetParams.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: SimNetParams.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: mockNetParams.ScriptHashAddrID,
|
|
valid: false,
|
|
},
|
|
{
|
|
magic: 0xFF,
|
|
valid: false,
|
|
},
|
|
},
|
|
hdMagics: []hdTest{
|
|
{
|
|
priv: MainNetParams.HDPrivateKeyID[:],
|
|
want: MainNetParams.HDPublicKeyID[:],
|
|
err: nil,
|
|
},
|
|
{
|
|
priv: TestNet3Params.HDPrivateKeyID[:],
|
|
want: TestNet3Params.HDPublicKeyID[:],
|
|
err: nil,
|
|
},
|
|
{
|
|
priv: RegressionNetParams.HDPrivateKeyID[:],
|
|
want: RegressionNetParams.HDPublicKeyID[:],
|
|
err: nil,
|
|
},
|
|
{
|
|
priv: SimNetParams.HDPrivateKeyID[:],
|
|
want: SimNetParams.HDPublicKeyID[:],
|
|
err: nil,
|
|
},
|
|
{
|
|
priv: mockNetParams.HDPrivateKeyID[:],
|
|
err: ErrUnknownHDKeyID,
|
|
},
|
|
{
|
|
priv: []byte{0xff, 0xff, 0xff, 0xff},
|
|
err: ErrUnknownHDKeyID,
|
|
},
|
|
{
|
|
priv: []byte{0xff},
|
|
err: ErrUnknownHDKeyID,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "register mocknet",
|
|
register: []registerTest{
|
|
{
|
|
name: "mocknet",
|
|
params: &mockNetParams,
|
|
err: nil,
|
|
},
|
|
},
|
|
p2pkhMagics: []magicTest{
|
|
{
|
|
magic: MainNetParams.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: TestNet3Params.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: RegressionNetParams.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: SimNetParams.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: mockNetParams.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: 0xFF,
|
|
valid: false,
|
|
},
|
|
},
|
|
p2shMagics: []magicTest{
|
|
{
|
|
magic: MainNetParams.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: TestNet3Params.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: RegressionNetParams.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: SimNetParams.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: mockNetParams.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: 0xFF,
|
|
valid: false,
|
|
},
|
|
},
|
|
hdMagics: []hdTest{
|
|
{
|
|
priv: mockNetParams.HDPrivateKeyID[:],
|
|
want: mockNetParams.HDPublicKeyID[:],
|
|
err: nil,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "more duplicates",
|
|
register: []registerTest{
|
|
{
|
|
name: "duplicate mainnet",
|
|
params: &MainNetParams,
|
|
err: ErrDuplicateNet,
|
|
},
|
|
{
|
|
name: "duplicate regtest",
|
|
params: &RegressionNetParams,
|
|
err: ErrDuplicateNet,
|
|
},
|
|
{
|
|
name: "duplicate testnet3",
|
|
params: &TestNet3Params,
|
|
err: ErrDuplicateNet,
|
|
},
|
|
{
|
|
name: "duplicate simnet",
|
|
params: &SimNetParams,
|
|
err: ErrDuplicateNet,
|
|
},
|
|
{
|
|
name: "duplicate mocknet",
|
|
params: &mockNetParams,
|
|
err: ErrDuplicateNet,
|
|
},
|
|
},
|
|
p2pkhMagics: []magicTest{
|
|
{
|
|
magic: MainNetParams.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: TestNet3Params.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: RegressionNetParams.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: SimNetParams.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: mockNetParams.PubKeyHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: 0xFF,
|
|
valid: false,
|
|
},
|
|
},
|
|
p2shMagics: []magicTest{
|
|
{
|
|
magic: MainNetParams.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: TestNet3Params.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: RegressionNetParams.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: SimNetParams.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: mockNetParams.ScriptHashAddrID,
|
|
valid: true,
|
|
},
|
|
{
|
|
magic: 0xFF,
|
|
valid: false,
|
|
},
|
|
},
|
|
hdMagics: []hdTest{
|
|
{
|
|
priv: MainNetParams.HDPrivateKeyID[:],
|
|
want: MainNetParams.HDPublicKeyID[:],
|
|
err: nil,
|
|
},
|
|
{
|
|
priv: TestNet3Params.HDPrivateKeyID[:],
|
|
want: TestNet3Params.HDPublicKeyID[:],
|
|
err: nil,
|
|
},
|
|
{
|
|
priv: RegressionNetParams.HDPrivateKeyID[:],
|
|
want: RegressionNetParams.HDPublicKeyID[:],
|
|
err: nil,
|
|
},
|
|
{
|
|
priv: SimNetParams.HDPrivateKeyID[:],
|
|
want: SimNetParams.HDPublicKeyID[:],
|
|
err: nil,
|
|
},
|
|
{
|
|
priv: mockNetParams.HDPrivateKeyID[:],
|
|
want: mockNetParams.HDPublicKeyID[:],
|
|
err: nil,
|
|
},
|
|
{
|
|
priv: []byte{0xff, 0xff, 0xff, 0xff},
|
|
err: ErrUnknownHDKeyID,
|
|
},
|
|
{
|
|
priv: []byte{0xff},
|
|
err: ErrUnknownHDKeyID,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
for _, regTest := range test.register {
|
|
err := Register(regTest.params)
|
|
if err != regTest.err {
|
|
t.Errorf("%s:%s: Registered network with unexpected error: got %v expected %v",
|
|
test.name, regTest.name, err, regTest.err)
|
|
}
|
|
}
|
|
for i, magTest := range test.p2pkhMagics {
|
|
valid := IsPubKeyHashAddrID(magTest.magic)
|
|
if valid != magTest.valid {
|
|
t.Errorf("%s: P2PKH magic %d valid mismatch: got %v expected %v",
|
|
test.name, i, valid, magTest.valid)
|
|
}
|
|
}
|
|
for i, magTest := range test.p2shMagics {
|
|
valid := IsScriptHashAddrID(magTest.magic)
|
|
if valid != magTest.valid {
|
|
t.Errorf("%s: P2SH magic %d valid mismatch: got %v expected %v",
|
|
test.name, i, valid, magTest.valid)
|
|
}
|
|
}
|
|
for i, magTest := range test.hdMagics {
|
|
pubKey, err := HDPrivateKeyToPublicKeyID(magTest.priv[:])
|
|
if !reflect.DeepEqual(err, magTest.err) {
|
|
t.Errorf("%s: HD magic %d mismatched error: got %v expected %v ",
|
|
test.name, i, err, magTest.err)
|
|
continue
|
|
}
|
|
if magTest.err == nil && !bytes.Equal(pubKey, magTest.want[:]) {
|
|
t.Errorf("%s: HD magic %d private and public mismatch: got %v expected %v ",
|
|
test.name, i, pubKey, magTest.want[:])
|
|
}
|
|
}
|
|
}
|
|
}
|