/ client_test.go
client_test.go
  1  package rendezvous
  2  
  3  /*
  4  import (
  5  	"context"
  6  	"testing"
  7  	"time"
  8  
  9  	"github.com/libp2p/go-libp2p-core/host"
 10  	"github.com/libp2p/go-libp2p-core/peer"
 11  )
 12  
 13  func getRendezvousClients(t *testing.T, hosts []host.Host) []RendezvousClient {
 14  	clients := make([]RendezvousClient, len(hosts)-1)
 15  	for i, host := range hosts[1:] {
 16  		clients[i] = NewRendezvousClient(host, hosts[0].ID())
 17  	}
 18  	return clients
 19  }
 20  
 21  func TestClientRegistrationAndDiscovery(t *testing.T) {
 22  	ctx, cancel := context.WithCancel(context.Background())
 23  	defer cancel()
 24  
 25  	hosts := getRendezvousHosts(t, ctx, 5)
 26  
 27  	svc, err := makeRendezvousService(ctx, hosts[0], ":memory:")
 28  	if err != nil {
 29  		t.Fatal(err)
 30  	}
 31  	defer svc.DB.Close()
 32  
 33  	clients := getRendezvousClients(t, hosts)
 34  
 35  	recordTTL, err := clients[0].Register(ctx, "foo1", DefaultTTL)
 36  	if err != nil {
 37  		t.Fatal(err)
 38  	}
 39  	if recordTTL != DefaultTTL*time.Second {
 40  		t.Fatalf("Expected record TTL to be %d seconds", DefaultTTL)
 41  	}
 42  
 43  	pi, cookie, err := clients[0].Discover(ctx, "foo1", 0, nil)
 44  	if err != nil {
 45  		t.Fatal(err)
 46  	}
 47  	if len(pi) != 1 {
 48  		t.Fatal("Expected 1 peer")
 49  	}
 50  	checkPeerInfo(t, pi[0], hosts[1])
 51  
 52  	for i, client := range clients[1:] {
 53  		recordTTL, err = client.Register(ctx, "foo1", DefaultTTL)
 54  		if err != nil {
 55  			t.Fatal(err)
 56  		}
 57  		if recordTTL != DefaultTTL*time.Second {
 58  			t.Fatalf("Expected record TTL to be %d seconds", DefaultTTL)
 59  		}
 60  
 61  		pi, cookie, err = clients[0].Discover(ctx, "foo1", 10, cookie)
 62  		if err != nil {
 63  			t.Fatal(err)
 64  		}
 65  		if len(pi) != 1 {
 66  			t.Fatal("Expected 1 peer")
 67  		}
 68  		checkPeerInfo(t, pi[0], hosts[2+i])
 69  	}
 70  
 71  	for _, client := range clients[1:] {
 72  		pi, _, err = client.Discover(ctx, "foo1", 10, nil)
 73  		if err != nil {
 74  			t.Fatal(err)
 75  		}
 76  		if len(pi) != 4 {
 77  			t.Fatal("Expected 4 registrations")
 78  		}
 79  
 80  		for j, p := range pi {
 81  			checkPeerInfo(t, p, hosts[1+j])
 82  		}
 83  	}
 84  }
 85  
 86  func TestClientRegistrationAndDiscoveryAsync(t *testing.T) {
 87  	ctx, cancel := context.WithCancel(context.Background())
 88  	defer cancel()
 89  
 90  	hosts := getRendezvousHosts(t, ctx, 5)
 91  
 92  	svc, err := makeRendezvousService(ctx, hosts[0], ":memory:")
 93  	if err != nil {
 94  		t.Fatal(err)
 95  	}
 96  	defer svc.DB.Close()
 97  
 98  	clients := getRendezvousClients(t, hosts)
 99  
100  	DiscoverAsyncInterval = 1 * time.Second
101  
102  	ch, err := clients[0].DiscoverAsync(ctx, "foo1")
103  	if err != nil {
104  		t.Fatal(err)
105  	}
106  
107  	for i, client := range clients[0:] {
108  		recordTTL, err := client.Register(ctx, "foo1", DefaultTTL)
109  		if err != nil {
110  			t.Fatal(err)
111  		}
112  		if recordTTL != DefaultTTL*time.Second {
113  			t.Fatalf("Expected record TTL to be %d seconds", DefaultTTL)
114  		}
115  
116  		pi := <-ch
117  		checkPeerInfo(t, pi, hosts[1+i])
118  	}
119  
120  	DiscoverAsyncInterval = 2 * time.Minute
121  }
122  
123  func checkPeerInfo(t *testing.T, pi peer.AddrInfo, host host.Host) {
124  	if pi.ID != host.ID() {
125  		t.Fatal("bad registration: peer ID doesn't match host ID")
126  	}
127  	addrs := host.Addrs()
128  	raddrs := pi.Addrs
129  	if len(addrs) != len(raddrs) {
130  		t.Fatal("bad registration: peer address length mismatch")
131  	}
132  	for i, addr := range addrs {
133  		raddr := raddrs[i]
134  		if !addr.Equal(raddr) {
135  			t.Fatal("bad registration: peer address mismatch")
136  		}
137  	}
138  }
139  */