77 ../../../../ libp2p/ [
88 crypto/ crypto,
99 peerid,
10- protocols/ kademlia/ routing_table,
1110 protocols/ kademlia/ types,
1211 protocols/ service_discovery/ advertiser,
1312 protocols/ service_discovery/ discoverer,
@@ -19,56 +18,6 @@ import ../../../../libp2p/protocols/kademlia/protobuf as kad_protobuf
1918import ../../../ tools/ [lifecycle, unittest]
2019import ../ utils
2120
22- const MaxRegistrarSetupAttempts = 1000
23-
24- proc bucketOf (r: ServiceDiscovery , serviceId: ServiceId ): int =
25- bucketIndex (
26- serviceId,
27- r.switch.peerInfo.peerId.toKey (),
28- Opt .none (XorDHasher ),
29- selfIdPreHashed = true ,
30- )
31-
32- proc setupRegistrarsInDistinctBuckets (
33- conf: ServiceDiscoveryConfig , serviceId: ServiceId
34- ): tuple [queriedFirst, queriedSecond: ServiceDiscovery ] =
35- # # Two registrars in distinct buckets of the routing table rooted at `serviceId`.
36- # # Returned in the order `lookup()` would visit them (lower bucket index first).
37- var a = setupServiceDiscoveryNode (discoConfig = conf)
38- var b = setupServiceDiscoveryNode (discoConfig = conf)
39- for _ in 0 ..< MaxRegistrarSetupAttempts :
40- if bucketOf (a, serviceId) != bucketOf (b, serviceId):
41- if bucketOf (a, serviceId) < bucketOf (b, serviceId):
42- return (a, b)
43- else :
44- return (b, a)
45-
46- b = setupServiceDiscoveryNode (discoConfig = conf)
47-
48- raiseAssert " could not find registrars in distinct buckets"
49-
50- proc setupRegistrarsInSameBucket (
51- conf: ServiceDiscoveryConfig , serviceId: ServiceId , count: int
52- ): seq [ServiceDiscovery ] =
53- # # Registrars that land in one service routing table bucket.
54- doAssert count > 0 , " count must be > 0"
55-
56- var registrarsByBucket = initTable [int , seq [ServiceDiscovery ]]()
57- for _ in 0 ..< MaxRegistrarSetupAttempts :
58- let registrar = setupServiceDiscoveryNode (discoConfig = conf)
59- let bucket = bucketOf (registrar, serviceId)
60- if bucket >= conf.bucketsCount:
61- continue
62-
63- if not registrarsByBucket.hasKey (bucket):
64- registrarsByBucket[bucket] = @ []
65- registrarsByBucket[bucket].add (registrar)
66-
67- if registrarsByBucket[bucket].len == count:
68- return registrarsByBucket[bucket]
69-
70- raiseAssert " could not find enough registrars in one bucket"
71-
7221suite " Service Discovery Component - Lookup Get Ads" :
7322 teardown:
7423 checkTrackers ()
@@ -155,27 +104,25 @@ suite "Service Discovery Component - Lookup Get Ads":
155104 )
156105 let discovererNode = setupServiceDiscoveryNode (discoConfig = conf)
157106
158- let serviceName = " service"
107+ let (queriedFirst, queriedSecond, serviceName) =
108+ setupRegistrarsInDistinctBuckets (conf)
159109 let serviceId = serviceName.hashServiceId ()
160- let registrars = setupRegistrarsInDistinctBuckets (conf, serviceId)
161110
162- startAndDeferStop (
163- @ [discovererNode, registrars.queriedFirst, registrars.queriedSecond]
164- )
165- await connect (discovererNode, registrars.queriedFirst)
166- await connect (discovererNode, registrars.queriedSecond)
111+ startAndDeferStop (@ [discovererNode, queriedFirst, queriedSecond])
112+ await connect (discovererNode, queriedFirst)
113+ await connect (discovererNode, queriedSecond)
167114
168115 # The first-queried registrar fills the result on its own.
169116 var firstBucketAds: seq [Advertisement ]
170117 for _ in 0 ..< fLookup:
171118 firstBucketAds.add (makeAdvertisement (serviceName))
172- registrars. queriedFirst.registrar.cache[serviceId] = firstBucketAds
119+ queriedFirst.registrar.cache[serviceId] = firstBucketAds
173120
174121 # The other should never be queried, so should not appear in the result.
175122 let otherKey = randomKey ()
176123 let otherAd = makeAdvertisement (serviceName, privateKey = otherKey)
177124 let otherPeerId = PeerId .init (otherKey).get ()
178- registrars. queriedSecond.registrar.cache[serviceId] = @ [otherAd]
125+ queriedSecond.registrar.cache[serviceId] = @ [otherAd]
179126
180127 let found = await discovererNode.lookup (serviceId)
181128 check:
@@ -189,9 +136,8 @@ suite "Service Discovery Component - Lookup Get Ads":
189136 )
190137 let discovererNode = setupServiceDiscoveryNode (discoConfig = conf)
191138
192- let serviceName = " service "
139+ let (registrars, serviceName) = setupRegistrarsInSameBucket (conf, kLookup + 2 )
193140 let serviceId = serviceName.hashServiceId ()
194- let registrars = setupRegistrarsInSameBucket (conf, serviceId, kLookup + 2 )
195141
196142 startAndDeferStop (@ [discovererNode] & registrars)
197143 for registrar in registrars:
@@ -208,21 +154,19 @@ suite "Service Discovery Component - Lookup Get Ads":
208154 let conf = ServiceDiscoveryConfig .new (safetyParam = 0.0 , fLookup = 1 )
209155 let discovererNode = setupServiceDiscoveryNode (discoConfig = conf)
210156
211- let serviceName = " service"
157+ let (queriedFirst, queriedSecond, serviceName) =
158+ setupRegistrarsInDistinctBuckets (conf)
212159 let serviceId = serviceName.hashServiceId ()
213- let registrars = setupRegistrarsInDistinctBuckets (conf, serviceId)
214160
215- startAndDeferStop (
216- @ [discovererNode, registrars.queriedFirst, registrars.queriedSecond]
217- )
218- await connect (discovererNode, registrars.queriedFirst)
219- await connect (discovererNode, registrars.queriedSecond)
161+ startAndDeferStop (@ [discovererNode, queriedFirst, queriedSecond])
162+ await connect (discovererNode, queriedFirst)
163+ await connect (discovererNode, queriedSecond)
220164
221165 let firstBucketKey = randomKey ()
222166 let firstBucketAd = makeAdvertisement (serviceName, privateKey = firstBucketKey)
223167 let secondBucketAd = makeAdvertisement (serviceName)
224- registrars. queriedFirst.registrar.cache[serviceId] = @ [firstBucketAd]
225- registrars. queriedSecond.registrar.cache[serviceId] = @ [secondBucketAd]
168+ queriedFirst.registrar.cache[serviceId] = @ [firstBucketAd]
169+ queriedSecond.registrar.cache[serviceId] = @ [secondBucketAd]
226170
227171 let found = await discovererNode.lookup (serviceId)
228172 check:
0 commit comments