/ 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 */