@@ -1121,3 +1121,120 @@ func addCapabilityToDON(registry *registrysyncer.LocalRegistry, donID uint32, ca
11211121 CapabilityType : capabilityType ,
11221122 }
11231123}
1124+
1125+ func TestLauncher_OnNewRegistry_CallsLocalCapabilityManagerReconcile (t * testing.T ) {
1126+ lggr := logger .Test (t )
1127+ registry := NewRegistry (lggr )
1128+ dispatcher := remoteMocks .NewDispatcher (t )
1129+
1130+ capabilityDonNodes := newNodes (4 )
1131+ peer := mocks .NewPeer (t )
1132+ peer .On ("UpdateConnections" , mock .Anything ).Return (nil )
1133+ peer .On ("ID" ).Return (capabilityDonNodes [0 ])
1134+ peer .On ("IsBootstrap" ).Return (false )
1135+ wrapper := mocks .NewPeerWrapper (t )
1136+ wrapper .On ("GetPeer" ).Return (peer )
1137+
1138+ fullTriggerCapID := "streams-trigger@1.0.0"
1139+ mt := newMockTrigger (capabilities .MustNewCapabilityInfo (
1140+ fullTriggerCapID ,
1141+ capabilities .CapabilityTypeTrigger ,
1142+ "streams trigger" ,
1143+ ))
1144+ require .NoError (t , registry .Add (t .Context (), mt ))
1145+
1146+ triggerCapIDHash := RandomUTF8BytesWord ()
1147+ capDonID := uint32 (1 )
1148+
1149+ localRegistry := buildLocalRegistry ()
1150+ addDON (localRegistry , capDonID , uint32 (0 ), uint8 (1 ), true , false , capabilityDonNodes , []string {"zone-a" }, 1 , [][32 ]byte {triggerCapIDHash })
1151+ addCapabilityToDON (localRegistry , capDonID , fullTriggerCapID , capabilities .CapabilityTypeTrigger , nil )
1152+
1153+ reconcileCalled := make (chan struct {}, 1 )
1154+ mockLCM := & mockLocalCapabilityManager {
1155+ reconcileFn : func (ctx context.Context , dons []registrysyncer.DON ) error {
1156+ assert .Len (t , dons , 1 , "should pass all DONs" )
1157+ assert .Equal (t , capDonID , dons [0 ].ID )
1158+ reconcileCalled <- struct {}{}
1159+ return nil
1160+ },
1161+ }
1162+
1163+ dispatcher .On ("SetReceiver" , fullTriggerCapID , capDonID , mock .Anything ).Return (nil )
1164+
1165+ launcher , err := NewLauncher (
1166+ lggr ,
1167+ wrapper ,
1168+ nil ,
1169+ nil ,
1170+ dispatcher ,
1171+ registry ,
1172+ & mockDonNotifier {},
1173+ )
1174+ require .NoError (t , err )
1175+ launcher .SetLocalCapabilityManager (mockLCM )
1176+ require .NoError (t , launcher .Start (t .Context ()))
1177+ defer launcher .Close ()
1178+
1179+ err = launcher .OnNewRegistry (t .Context (), localRegistry )
1180+ require .NoError (t , err )
1181+
1182+ select {
1183+ case <- reconcileCalled :
1184+ // success
1185+ default :
1186+ t .Fatal ("Reconcile was not called on LocalCapabilityManager" )
1187+ }
1188+ }
1189+
1190+ func TestLauncher_OnNewRegistry_NilLocalCapabilityManager (t * testing.T ) {
1191+ lggr := logger .Test (t )
1192+ registry := NewRegistry (lggr )
1193+ dispatcher := remoteMocks .NewDispatcher (t )
1194+
1195+ nodes := newNodes (4 )
1196+ peer := mocks .NewPeer (t )
1197+ peer .On ("UpdateConnections" , mock .Anything ).Return (nil )
1198+ peer .On ("ID" ).Return (nodes [0 ])
1199+ peer .On ("IsBootstrap" ).Return (false )
1200+ wrapper := mocks .NewPeerWrapper (t )
1201+ wrapper .On ("GetPeer" ).Return (peer )
1202+
1203+ localRegistry := buildLocalRegistry ()
1204+ dID := uint32 (1 )
1205+ addDON (localRegistry , dID , uint32 (0 ), uint8 (1 ), true , true , nodes , []string {"zone-a" }, 1 , nil )
1206+
1207+ // Don't set localCapMgr - should not panic.
1208+ launcher , err := NewLauncher (
1209+ lggr ,
1210+ wrapper ,
1211+ nil ,
1212+ nil ,
1213+ dispatcher ,
1214+ registry ,
1215+ & mockDonNotifier {},
1216+ )
1217+ require .NoError (t , err )
1218+ require .NoError (t , launcher .Start (t .Context ()))
1219+ defer launcher .Close ()
1220+
1221+ err = launcher .OnNewRegistry (t .Context (), localRegistry )
1222+ require .NoError (t , err )
1223+ }
1224+
1225+ // mockLocalCapabilityManager is a test mock that records calls to Reconcile.
1226+ type mockLocalCapabilityManager struct {
1227+ reconcileFn func (ctx context.Context , dons []registrysyncer.DON ) error
1228+ }
1229+
1230+ func (m * mockLocalCapabilityManager ) Start (context.Context ) error { return nil }
1231+ func (m * mockLocalCapabilityManager ) Close () error { return nil }
1232+ func (m * mockLocalCapabilityManager ) Ready () error { return nil }
1233+ func (m * mockLocalCapabilityManager ) HealthReport () map [string ]error { return nil }
1234+ func (m * mockLocalCapabilityManager ) Name () string { return "mockLocalCapMgr" }
1235+ func (m * mockLocalCapabilityManager ) Reconcile (ctx context.Context , dons []registrysyncer.DON ) error {
1236+ if m .reconcileFn != nil {
1237+ return m .reconcileFn (ctx , dons )
1238+ }
1239+ return nil
1240+ }
0 commit comments