func TestValueGetSet(t *testing.T) { // t.Skip("skipping test to debug another") ctx := context.Background() u.Debug = false addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/11235") if err != nil { t.Fatal(err) } addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/15679") if err != nil { t.Fatal(err) } peerA := makePeer(addrA) peerB := makePeer(addrB) dhtA := setupDHT(ctx, t, peerA) dhtB := setupDHT(ctx, t, peerB) vf := func(u.Key, []byte) error { return nil } dhtA.Validators["v"] = vf dhtB.Validators["v"] = vf defer dhtA.Close() defer dhtB.Close() defer dhtA.dialer.(inet.Network).Close() defer dhtB.dialer.(inet.Network).Close() _, err = dhtA.Connect(ctx, peerB) if err != nil { t.Fatal(err) } ctxT, _ := context.WithTimeout(ctx, time.Second) dhtA.PutValue(ctxT, "/v/hello", []byte("world")) ctxT, _ = context.WithTimeout(ctx, time.Second*2) val, err := dhtA.GetValue(ctxT, "/v/hello") if err != nil { t.Fatal(err) } if string(val) != "world" { t.Fatalf("Expected 'world' got '%s'", string(val)) } ctxT, _ = context.WithTimeout(ctx, time.Second*2) val, err = dhtB.GetValue(ctxT, "/v/hello") if err != nil { t.Fatal(err) } if string(val) != "world" { t.Fatalf("Expected 'world' got '%s'", string(val)) } }
// FromIP converts a net.IP type to a Multiaddr. func FromIP(ip net.IP) (ma.Multiaddr, error) { switch { case ip.To4() != nil: return ma.NewMultiaddr("/ip4/" + ip.String()) case ip.To16() != nil: return ma.NewMultiaddr("/ip6/" + ip.String()) default: return nil, errIncorrectNetAddr } }
func newMultiaddr(t *testing.T, m string) ma.Multiaddr { maddr, err := ma.NewMultiaddr(m) if err != nil { t.Fatal("failed to construct multiaddr:", m, err) } return maddr }
func initConnections(ctx context.Context, cfg *config.Config, pstore peer.Peerstore, route *dht.IpfsDHT) { // TODO consider stricter error handling // TODO consider Criticalf error logging for _, p := range cfg.Bootstrap { if p.PeerID == "" { log.Criticalf("error: peer does not include PeerID. %v", p) } maddr, err := ma.NewMultiaddr(p.Address) if err != nil { log.Error(err) continue } // setup peer npeer, err := pstore.Get(peer.DecodePrettyID(p.PeerID)) if err != nil { log.Criticalf("Bootstrapping error: %v", err) continue } npeer.AddAddress(maddr) if _, err = route.Connect(ctx, npeer); err != nil { log.Criticalf("Bootstrapping error: %v", err) continue } log.Event(ctx, "bootstrap", npeer) } }
func TestThinWaist(t *testing.T) { addrs := map[string]bool{ "/ip4/127.0.0.1/udp/1234": true, "/ip4/127.0.0.1/tcp/1234": true, "/ip4/127.0.0.1/udp/1234/utp": true, "/ip4/127.0.0.1/udp/1234/tcp/1234": true, "/ip4/127.0.0.1/tcp/12345/ip4/1.2.3.4": true, "/ip6/::1/tcp/80": true, "/ip6/::1/udp/80": true, "/ip6/::1": true, "/ip6/::1/utp": false, "/tcp/1234/ip4/1.2.3.4": false, "/tcp/1234": false, "/tcp/1234/utp": false, "/tcp/1234/udp/1234": false, "/ip4/1.2.3.4/ip4/2.3.4.5": true, "/ip6/::1/ip4/2.3.4.5": true, } for a, res := range addrs { m, err := ma.NewMultiaddr(a) if err != nil { t.Fatalf("failed to construct Multiaddr: %s", a) } if IsThinWaist(m) != res { t.Fatalf("IsThinWaist(%s) != %v", a, res) } } }
func TestDialArgs(t *testing.T) { test := func(e_maddr, e_nw, e_host string) { m, err := ma.NewMultiaddr(e_maddr) if err != nil { t.Fatal("failed to construct", "/ip4/127.0.0.1/udp/1234", e_maddr) } nw, host, err := DialArgs(m) if err != nil { t.Fatal("failed to get dial args", e_maddr, m, err) } if nw != e_nw { t.Error("failed to get udp network Dial Arg", e_nw, nw) } if host != e_host { t.Error("failed to get host:port Dial Arg", e_host, host) } } test("/ip4/127.0.0.1/udp/1234", "udp", "127.0.0.1:1234") test("/ip4/127.0.0.1/tcp/4321", "tcp", "127.0.0.1:4321") test("/ip4/127.0.0.1/udp/1234/utp", "utp", "127.0.0.1:1234") }
func tcpAddr(t *testing.T, port int) ma.Multiaddr { tcp, err := ma.NewMultiaddr(tcpAddrString(port)) if err != nil { t.Fatal(err) } return tcp }
func address(addr string) ma.Multiaddr { m, err := ma.NewMultiaddr(addr) if err != nil { die(err) } return m }
func setupPeer(id string, addr string) (Peer, error) { tcp, err := ma.NewMultiaddr(addr) if err != nil { return nil, err } p := WithIDString(id) p.AddAddress(tcp) return p, nil }
func TestPing(t *testing.T) { // t.Skip("skipping test to debug another") ctx := context.Background() u.Debug = false addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") if err != nil { t.Fatal(err) } addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678") if err != nil { t.Fatal(err) } peerA := makePeer(addrA) peerB := makePeer(addrB) dhtA := setupDHT(ctx, t, peerA) dhtB := setupDHT(ctx, t, peerB) defer dhtA.Close() defer dhtB.Close() defer dhtA.dialer.(inet.Network).Close() defer dhtB.dialer.(inet.Network).Close() _, err = dhtA.Connect(ctx, peerB) if err != nil { t.Fatal(err) } //Test that we can ping the node ctxT, _ := context.WithTimeout(ctx, 100*time.Millisecond) err = dhtA.Ping(ctxT, peerB) if err != nil { t.Fatal(err) } ctxT, _ = context.WithTimeout(ctx, 100*time.Millisecond) err = dhtB.Ping(ctxT, peerA) if err != nil { t.Fatal(err) } }
func TestNetAddress(t *testing.T) { tcp, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") if err != nil { t.Error(err) return } udp, err := ma.NewMultiaddr("/ip4/127.0.0.1/udp/2345") if err != nil { t.Error(err) return } mh, err := mh.FromHexString("11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33") if err != nil { t.Error(err) return } p := WithID(ID(mh)) p.AddAddress(tcp) p.AddAddress(udp) p.AddAddress(tcp) if len(p.Addresses()) == 3 { t.Error("added same address twice") } tcp2 := p.NetAddress("tcp") if tcp2 != tcp { t.Error("NetAddress lookup failed", tcp, tcp2) } udp2 := p.NetAddress("udp") if udp2 != udp { t.Error("NetAddress lookup failed", udp, udp2) } }
// splitAddresses is a function that takes in a slice of string peer addresses // (multiaddr + peerid) and returns slices of multiaddrs and peerids. func splitAddresses(addrs []string) (maddrs []ma.Multiaddr, pids []peer.ID, err error) { maddrs = make([]ma.Multiaddr, len(addrs)) pids = make([]peer.ID, len(addrs)) for i, addr := range addrs { a, err := ma.NewMultiaddr(path.Dir(addr)) if err != nil { return nil, nil, cmds.ClientError("invalid peer address: " + err.Error()) } maddrs[i] = a pids[i] = peer.DecodePrettyID(path.Base(addr)) } return }
func listenAddresses(cfg *config.Config) ([]ma.Multiaddr, error) { var err error listen := make([]ma.Multiaddr, len(cfg.Addresses.Swarm)) for i, addr := range cfg.Addresses.Swarm { listen[i], err = ma.NewMultiaddr(addr) if err != nil { return nil, fmt.Errorf("Failure to parse config.Addresses.Swarm[%d]: %s", i, cfg.Addresses.Swarm) } } return listen, nil }
func NewClient(addr string) (Client, error) { // TODO test returns nil if addr is not a multiaddr // TODO allow to connect with either multiaddr or other through configuration option maddr, err := ma.NewMultiaddr(addr) if err != nil { return nil, err } _, host, err := ma_net.DialArgs(maddr) if err != nil { return nil, err } return &client{ httpClient: cmds_http.NewClient(host), }, nil }
func setupPeer(t *testing.T, addr string) peer.Peer { tcp, err := ma.NewMultiaddr(addr) if err != nil { t.Fatal(err) } sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) if err != nil { t.Fatal(err) } p, err := peer.WithKeyPair(sk, pk) if err != nil { t.Fatal(err) } p.AddAddress(tcp) return p }
func setupPeer(addr string) (peer.Peer, error) { tcp, err := ma.NewMultiaddr(addr) if err != nil { return nil, err } sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) if err != nil { return nil, err } p, err := peer.WithKeyPair(sk, pk) if err != nil { return nil, err } p.AddAddress(tcp) return p, nil }
func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer.Peer, []*IpfsDHT) { var addrs []ma.Multiaddr for i := 0; i < n; i++ { a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) if err != nil { t.Fatal(err) } addrs = append(addrs, a) } var peers []peer.Peer for i := 0; i < n; i++ { p := makePeer(addrs[i]) peers = append(peers, p) } dhts := make([]*IpfsDHT, n) for i := 0; i < n; i++ { dhts[i] = setupDHT(ctx, t, peers[i]) } return addrs, peers, dhts }
func testToNetAddr(t *testing.T, maddr, ntwk, addr string) { m, err := ma.NewMultiaddr(maddr) if err != nil { t.Fatal("failed to generate.") } naddr, err := ToNetAddr(m) if addr == "" { // should fail if err == nil { t.Fatalf("failed to error: %s", m) } return } // shouldn't fail if err != nil { t.Fatalf("failed to convert to net addr: %s", m) } if naddr.String() != addr { t.Fatalf("naddr.Address() == %s != %s", naddr, addr) } if naddr.Network() != ntwk { t.Fatalf("naddr.Network() == %s != %s", naddr.Network(), ntwk) } // should convert properly switch ntwk { case "tcp": _ = naddr.(*net.TCPAddr) case "udp": _ = naddr.(*net.UDPAddr) case "ip": _ = naddr.(*net.IPAddr) } }
func bootstrapInputToPeers(input []string) ([]*config.BootstrapPeer, error) { split := func(addr string) (string, string) { idx := strings.LastIndex(addr, "/") if idx == -1 { return "", addr } return addr[:idx], addr[idx+1:] } peers := []*config.BootstrapPeer{} for _, addr := range input { addrS, peeridS := split(addr) // make sure addrS parses as a multiaddr. if len(addrS) > 0 { maddr, err := ma.NewMultiaddr(addrS) if err != nil { return nil, err } addrS = maddr.String() } // make sure idS parses as a peer.ID _, err := mh.FromB58String(peeridS) if err != nil { return nil, err } // construct config entry peers = append(peers, &config.BootstrapPeer{ Address: addrS, PeerID: peeridS, }) } return peers, nil }
func TestConnectCollision(t *testing.T) { if testing.Short() { t.SkipNow() } runTimes := 10 for rtime := 0; rtime < runTimes; rtime++ { log.Notice("Running Time: ", rtime) ctx := context.Background() u.Debug = false addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/11235") if err != nil { t.Fatal(err) } addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/15679") if err != nil { t.Fatal(err) } peerA := makePeer(addrA) peerB := makePeer(addrB) dhtA := setupDHT(ctx, t, peerA) dhtB := setupDHT(ctx, t, peerB) done := make(chan struct{}) go func() { _, err := dhtA.Connect(ctx, peerB) if err != nil { t.Fatal(err) } done <- struct{}{} }() go func() { _, err := dhtB.Connect(ctx, peerA) if err != nil { t.Fatal(err) } done <- struct{}{} }() timeout := time.After(time.Second) select { case <-done: case <-timeout: t.Fatal("Timeout received!") } select { case <-done: case <-timeout: t.Fatal("Timeout received!") } dhtA.Close() dhtB.Close() dhtA.dialer.(inet.Network).Close() dhtB.dialer.(inet.Network).Close() <-time.After(200 * time.Millisecond) } }
// FromNetAddr converts a net.Addr type to a Multiaddr. func FromNetAddr(a net.Addr) (ma.Multiaddr, error) { switch a.Network() { case "tcp", "tcp4", "tcp6": ac, ok := a.(*net.TCPAddr) if !ok { return nil, errIncorrectNetAddr } // Get IP Addr ipm, err := FromIP(ac.IP) if err != nil { return nil, errIncorrectNetAddr } // Get TCP Addr tcpm, err := ma.NewMultiaddr(fmt.Sprintf("/tcp/%d", ac.Port)) if err != nil { return nil, errIncorrectNetAddr } // Encapsulate return ipm.Encapsulate(tcpm), nil case "udp", "upd4", "udp6": ac, ok := a.(*net.UDPAddr) if !ok { return nil, errIncorrectNetAddr } // Get IP Addr ipm, err := FromIP(ac.IP) if err != nil { return nil, errIncorrectNetAddr } // Get UDP Addr udpm, err := ma.NewMultiaddr(fmt.Sprintf("/udp/%d", ac.Port)) if err != nil { return nil, errIncorrectNetAddr } // Encapsulate return ipm.Encapsulate(udpm), nil case "utp", "utp4", "utp6": acc, ok := a.(*utp.UTPAddr) if !ok { return nil, errIncorrectNetAddr } // Get UDP Addr ac, ok := acc.Addr.(*net.UDPAddr) if !ok { return nil, errIncorrectNetAddr } // Get IP Addr ipm, err := FromIP(ac.IP) if err != nil { return nil, errIncorrectNetAddr } // Get UDP Addr utpm, err := ma.NewMultiaddr(fmt.Sprintf("/udp/%d/utp", ac.Port)) if err != nil { return nil, errIncorrectNetAddr } // Encapsulate return ipm.Encapsulate(utpm), nil case "ip", "ip4", "ip6": ac, ok := a.(*net.IPAddr) if !ok { return nil, errIncorrectNetAddr } return FromIP(ac.IP) case "ip+net": ac, ok := a.(*net.IPNet) if !ok { return nil, errIncorrectNetAddr } return FromIP(ac.IP) default: return nil, fmt.Errorf("unknown network %v", a.Network()) } }
// Address returns a multiaddr associated with the Message_Peer entry func (m *Message_Peer) Address() (ma.Multiaddr, error) { if m == nil { return nil, errors.New("MessagePeer is nil") } return ma.NewMultiaddr(*m.Addr) }