@@ -18,6 +18,11 @@ proc makeKey(x: byte): Key =
1818proc makeServiceId (x: byte ): ServiceId =
1919 return makeKey (x)
2020
21+ # Heap-allocated recorder so a closure capturing it stays GC-safe (mirrors how
22+ # the production callback captures the disco ref rather than a stack local).
23+ type HitRecorder = ref object
24+ ids: seq [ServiceId ]
25+
2126proc makeMainTable (selfId: Key , peers: seq [Key ]): RoutingTable =
2227 var rt = RoutingTable .new (selfId)
2328 for p in peers:
@@ -75,6 +80,53 @@ suite "ServiceRoutingTableManager":
7580 upgraded == true
7681 manager.serviceStatus[serviceId] == Both
7782
83+ test " addService fires onServiceTableCreated only for brand-new tables" :
84+ let manager = ServiceRoutingTableManager .new ()
85+ let mainRt = RoutingTable .new (makeKey (0 ))
86+
87+ let hits = HitRecorder ()
88+ manager.onServiceTableCreated = proc (sid: ServiceId ) =
89+ hits.ids.add (sid)
90+
91+ let serviceId = makeServiceId (1 )
92+
93+ check manager.addService (
94+ serviceId, mainRt, DefaultReplication , DefaultMaxBuckets , Interest
95+ )
96+ check:
97+ hits.ids.len == 1
98+ hits.ids[0 ] == serviceId
99+
100+ discard manager.addService (
101+ serviceId, mainRt, DefaultReplication , DefaultMaxBuckets , Interest
102+ )
103+ check hits.ids.len == 1
104+
105+ discard manager.addService (
106+ serviceId, mainRt, DefaultReplication , DefaultMaxBuckets , Provided
107+ )
108+ check:
109+ hits.ids.len == 1
110+ manager.serviceStatus[serviceId] == Both
111+
112+ let otherId = makeServiceId (2 )
113+ check manager.addService (
114+ otherId, mainRt, DefaultReplication , DefaultMaxBuckets , Provided
115+ )
116+ check:
117+ hits.ids.len == 2
118+ otherId in hits.ids
119+
120+ test " addService with no callback set does not crash" :
121+ let manager = ServiceRoutingTableManager .new ()
122+ let serviceId = makeServiceId (1 )
123+ let mainRt = RoutingTable .new (makeKey (0 ))
124+
125+ check manager.addService (
126+ serviceId, mainRt, DefaultReplication , DefaultMaxBuckets , Interest
127+ )
128+ check manager.hasService (serviceId)
129+
78130 test " addService pre-populates table from main routing table" :
79131 let selfId = makeKey (0 )
80132 let peer1 = makeKey (1 )
0 commit comments