You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.1 KiB
149 lines
3.1 KiB
package channeldb |
|
|
|
import ( |
|
"bytes" |
|
"net" |
|
"strings" |
|
"testing" |
|
|
|
"github.com/lightningnetwork/lnd/tor" |
|
) |
|
|
|
type unknownAddrType struct{} |
|
|
|
func (t unknownAddrType) Network() string { return "unknown" } |
|
func (t unknownAddrType) String() string { return "unknown" } |
|
|
|
var testIP4 = net.ParseIP("192.168.1.1") |
|
var testIP6 = net.ParseIP("2001:0db8:0000:0000:0000:ff00:0042:8329") |
|
|
|
var addrTests = []struct { |
|
expAddr net.Addr |
|
serErr string |
|
}{ |
|
// Valid addresses. |
|
{ |
|
expAddr: &net.TCPAddr{ |
|
IP: testIP4, |
|
Port: 12345, |
|
}, |
|
}, |
|
{ |
|
expAddr: &net.TCPAddr{ |
|
IP: testIP6, |
|
Port: 65535, |
|
}, |
|
}, |
|
{ |
|
expAddr: &tor.OnionAddr{ |
|
OnionService: "3g2upl4pq6kufc4m.onion", |
|
Port: 9735, |
|
}, |
|
}, |
|
{ |
|
expAddr: &tor.OnionAddr{ |
|
OnionService: "vww6ybal4bd7szmgncyruucpgfkqahzddi37ktceo3ah7ngmcopnpyyd.onion", |
|
Port: 80, |
|
}, |
|
}, |
|
|
|
// Invalid addresses. |
|
{ |
|
expAddr: unknownAddrType{}, |
|
serErr: ErrUnknownAddressType.Error(), |
|
}, |
|
{ |
|
expAddr: &net.TCPAddr{ |
|
// Remove last byte of IPv4 address. |
|
IP: testIP4[:len(testIP4)-1], |
|
Port: 12345, |
|
}, |
|
serErr: "unable to encode", |
|
}, |
|
{ |
|
expAddr: &net.TCPAddr{ |
|
// Add an extra byte of IPv4 address. |
|
IP: append(testIP4, 0xff), |
|
Port: 12345, |
|
}, |
|
serErr: "unable to encode", |
|
}, |
|
{ |
|
expAddr: &net.TCPAddr{ |
|
// Remove last byte of IPv6 address. |
|
IP: testIP6[:len(testIP6)-1], |
|
Port: 65535, |
|
}, |
|
serErr: "unable to encode", |
|
}, |
|
{ |
|
expAddr: &net.TCPAddr{ |
|
// Add an extra byte to the IPv6 address. |
|
IP: append(testIP6, 0xff), |
|
Port: 65535, |
|
}, |
|
serErr: "unable to encode", |
|
}, |
|
{ |
|
expAddr: &tor.OnionAddr{ |
|
// Invalid suffix. |
|
OnionService: "vww6ybal4bd7szmgncyruucpgfkqahzddi37ktceo3ah7ngmcopnpyyd.inion", |
|
Port: 80, |
|
}, |
|
serErr: "invalid suffix", |
|
}, |
|
{ |
|
expAddr: &tor.OnionAddr{ |
|
// Invalid length. |
|
OnionService: "vww6ybal4bd7szmgncyruucpgfkqahzddi37ktceo3ah7ngmcopnpyy.onion", |
|
Port: 80, |
|
}, |
|
serErr: "unknown onion service length", |
|
}, |
|
{ |
|
expAddr: &tor.OnionAddr{ |
|
// Invalid encoding. |
|
OnionService: "vww6ybal4bd7szmgncyruucpgfkqahzddi37ktceo3ah7ngmcopnpyyA.onion", |
|
Port: 80, |
|
}, |
|
serErr: "illegal base32", |
|
}, |
|
} |
|
|
|
// TestAddrSerialization tests that the serialization method used by channeldb |
|
// for net.Addr's works as intended. |
|
func TestAddrSerialization(t *testing.T) { |
|
t.Parallel() |
|
|
|
var b bytes.Buffer |
|
for _, test := range addrTests { |
|
err := serializeAddr(&b, test.expAddr) |
|
switch { |
|
case err == nil && test.serErr != "": |
|
t.Fatalf("expected serialization err for addr %v", |
|
test.expAddr) |
|
|
|
case err != nil && test.serErr == "": |
|
t.Fatalf("unexpected serialization err for addr %v: %v", |
|
test.expAddr, err) |
|
|
|
case err != nil && !strings.Contains(err.Error(), test.serErr): |
|
t.Fatalf("unexpected serialization err for addr %v, "+ |
|
"want: %v, got %v", test.expAddr, test.serErr, |
|
err) |
|
|
|
case err != nil: |
|
continue |
|
} |
|
|
|
addr, err := deserializeAddr(&b) |
|
if err != nil { |
|
t.Fatalf("unable to deserialize address: %v", err) |
|
} |
|
|
|
if addr.String() != test.expAddr.String() { |
|
t.Fatalf("expected address %v after serialization, "+ |
|
"got %v", addr, test.expAddr) |
|
} |
|
} |
|
}
|
|
|