@@ -19,6 +19,7 @@ package versioning
1919
2020import (
2121 "context"
22+ "fmt"
2223 "reflect"
2324 "testing"
2425 "time"
@@ -238,25 +239,27 @@ func TestMemoryStoreIntentGetListOpenAndFailWithReason(t *testing.T) {
238239
239240func TestSubscriberRecordsBurstsLosslessly (t * testing.T ) {
240241 store := NewMemoryStore ()
241- sub := NewSubscriber ( meshresource . ConditionRouteKind , fakeNoopResourceManager {}, store , 5 )
242- key := "mesh/demo.condition-router"
242+ rm := newFakeInMemoryRM ( )
243+ sub := NewSubscriber ( meshresource . ConditionRouteKind , rm , store , 5 )
243244 first := meshresource .NewConditionRouteResourceWithAttributes ("demo.condition-router" , "mesh" )
244245 first .Spec = & meshproto.ConditionRoute {Key : "demo" , Priority : 1 }
245246 second := meshresource .NewConditionRouteResourceWithAttributes ("demo.condition-router" , "mesh" )
246247 second .Spec = & meshproto.ConditionRoute {Key : "demo" , Priority : 2 }
247248 require .NoError (t , sub .ProcessEvent (events .NewResourceChangedEvent (cache .Updated , nil , first )))
248249 require .NoError (t , sub .ProcessEvent (events .NewResourceChangedEvent (cache .Updated , first , second )))
249- items , err := store .ListVersions (meshresource .ConditionRouteKind , key )
250- require .NoError (t , err )
251- require .Len (t , items , 2 )
252- require .Contains (t , items [0 ].SpecJSON , `"priority":2` )
253- require .Contains (t , items [1 ].SpecJSON , `"priority":1` )
250+
251+ // Query from ResourceManager instead of Store
252+ versions := getRuleVersionsFromRM (t , rm , "mesh" , meshresource .ConditionRouteKind , "demo.condition-router" )
253+ require .Len (t , versions , 2 )
254+ require .Contains (t , versions [1 ].Spec .SpecSnapshot .String (), `"priority":2` )
255+ require .Contains (t , versions [0 ].Spec .SpecSnapshot .String (), `"priority":1` )
254256}
255257
256258func TestSubscriberCommitsIntentAndCapturesUpstreamSource (t * testing.T ) {
257259 store := NewMemoryStore ()
258260 svc := NewService (true , 5 , store )
259- sub := NewSubscriber (meshresource .ConditionRouteKind , fakeNoopResourceManager {}, store , 5 )
261+ rm := newFakeInMemoryRM ()
262+ sub := NewSubscriber (meshresource .ConditionRouteKind , rm , store , 5 )
260263 adminRes := meshresource .NewConditionRouteResourceWithAttributes ("demo.condition-router" , "mesh" )
261264 adminRes .Spec = & meshproto.ConditionRoute {Key : "demo" , Priority : 1 }
262265 _ , err := svc .BeginMutationIntent (adminRes , OperationCreate , SourceAdmin , "alice" , "" , nil , nil )
@@ -265,17 +268,18 @@ func TestSubscriberCommitsIntentAndCapturesUpstreamSource(t *testing.T) {
265268 upstreamRes := meshresource .NewConditionRouteResourceWithAttributes ("demo.condition-router" , "mesh" )
266269 upstreamRes .Spec = & meshproto.ConditionRoute {Key : "demo" , Priority : 2 }
267270 require .NoError (t , sub .ProcessEvent (events .NewResourceChangedEvent (cache .Updated , adminRes , upstreamRes )))
268- items , err := store . ListVersions ( meshresource . ConditionRouteKind , adminRes . ResourceKey ())
269- require . NoError (t , err )
270- require .Len (t , items , 2 )
271- require .Equal (t , SourceUpstream , items [ 0 ] .Source )
272- require .Equal (t , SourceAdmin , items [ 1 ] .Source )
273- require .Equal (t , "alice" , items [ 1 ] .Author )
271+
272+ versions := getRuleVersionsFromRM (t , rm , "mesh" , meshresource . ConditionRouteKind , "demo.condition-router" )
273+ require .Len (t , versions , 2 )
274+ require .Equal (t , string ( SourceUpstream ), versions [ 1 ]. Spec .Source )
275+ require .Equal (t , string ( SourceAdmin ), versions [ 0 ]. Spec .Source )
276+ require .Equal (t , "alice" , versions [ 0 ]. Spec .Author )
274277}
275278
276279func TestSubscriberRespectsRegistrySourceContext (t * testing.T ) {
277280 store := NewMemoryStore ()
278- sub := NewSubscriber (meshresource .ConditionRouteKind , fakeNoopResourceManager {}, store , 5 )
281+ rm := newFakeInMemoryRM ()
282+ sub := NewSubscriber (meshresource .ConditionRouteKind , rm , store , 5 )
279283
280284 upstreamRes := meshresource .NewConditionRouteResourceWithAttributes ("demo.condition-router" , "mesh" )
281285 upstreamRes .Spec = & meshproto.ConditionRoute {Key : "demo" , Priority : 2 }
@@ -286,32 +290,30 @@ func TestSubscriberRespectsRegistrySourceContext(t *testing.T) {
286290 map [string ]string {events .SourceRegistryContextKey : "zookeeper" },
287291 )))
288292
289- items , err := store .ListVersions (meshresource .ConditionRouteKind , upstreamRes .ResourceKey ())
290- require .NoError (t , err )
291- require .Len (t , items , 1 )
292- require .Equal (t , SourceUpstream , items [0 ].Source )
293- require .Equal (t , "system:zookeeper" , items [0 ].Author )
293+ versions := getRuleVersionsFromRM (t , rm , "mesh" , meshresource .ConditionRouteKind , "demo.condition-router" )
294+ require .Len (t , versions , 1 )
295+ require .Equal (t , string (SourceUpstream ), versions [0 ].Spec .Source )
296+ require .Equal (t , "system:zookeeper" , versions [0 ].Spec .Author )
294297}
295298
296299func TestSubscriberSkipsNoopUpstreamEchoAfterBootstrap (t * testing.T ) {
297300 store := NewMemoryStore ()
298- sub := NewSubscriber (meshresource .ConditionRouteKind , fakeNoopResourceManager {}, store , 5 )
301+ rm := newFakeInMemoryRM ()
302+ sub := NewSubscriber (meshresource .ConditionRouteKind , rm , store , 5 )
299303
300304 original := meshresource .NewConditionRouteResourceWithAttributes ("demo.condition-router" , "mesh" )
301305 original .Spec = & meshproto.ConditionRoute {Key : "demo" , Priority : 1 }
302- require .NoError (t , RecordBootstrap (fakeNoopResourceManager {} , 5 , original ))
306+ require .NoError (t , RecordBootstrap (rm , 5 , original ))
303307 require .NoError (t , sub .ProcessEvent (events .NewResourceChangedEventWithContext (
304308 cache .Updated ,
305309 nil ,
306310 original ,
307311 map [string ]string {events .SourceRegistryContextKey : "zookeeper" },
308312 )))
309313
310- items , err := store .ListVersions (meshresource .ConditionRouteKind , original .ResourceKey ())
311- require .NoError (t , err )
312- require .Len (t , items , 1 )
313- require .Equal (t , SourceBootstrap , items [0 ].Source )
314- require .True (t , items [0 ].IsCurrent )
314+ versions := getRuleVersionsFromRM (t , rm , "mesh" , meshresource .ConditionRouteKind , "demo.condition-router" )
315+ require .Len (t , versions , 1 )
316+ require .Equal (t , string (SourceBootstrap ), versions [0 ].Spec .Source )
315317
316318 changed := meshresource .NewConditionRouteResourceWithAttributes ("demo.condition-router" , "mesh" )
317319 changed .Spec = & meshproto.ConditionRoute {Key : "demo" , Priority : 2 }
@@ -322,31 +324,27 @@ func TestSubscriberSkipsNoopUpstreamEchoAfterBootstrap(t *testing.T) {
322324 map [string ]string {events .SourceRegistryContextKey : "zookeeper" },
323325 )))
324326
325- items , err = store .ListVersions (meshresource .ConditionRouteKind , original .ResourceKey ())
326- require .NoError (t , err )
327- require .Len (t , items , 2 )
328- require .Equal (t , SourceUpstream , items [0 ].Source )
329- require .Equal (t , "system:zookeeper" , items [0 ].Author )
330- require .True (t , items [0 ].IsCurrent )
327+ versions = getRuleVersionsFromRM (t , rm , "mesh" , meshresource .ConditionRouteKind , "demo.condition-router" )
328+ require .Len (t , versions , 2 )
329+ require .Equal (t , string (SourceUpstream ), versions [1 ].Spec .Source )
330+ require .Equal (t , "system:zookeeper" , versions [1 ].Spec .Author )
331331}
332332
333333func TestSubscriberRecordsEmptyCreateAfterDelete (t * testing.T ) {
334334 store := NewMemoryStore ()
335- sub := NewSubscriber (meshresource .ConditionRouteKind , fakeNoopResourceManager {}, store , 5 )
335+ rm := newFakeInMemoryRM ()
336+ sub := NewSubscriber (meshresource .ConditionRouteKind , rm , store , 5 )
336337 res := meshresource .NewConditionRouteResourceWithAttributes ("demo.condition-router" , "mesh" )
337338 res .Spec = & meshproto.ConditionRoute {}
338339
339340 require .NoError (t , sub .ProcessEvent (events .NewResourceChangedEvent (cache .Added , nil , res )))
340341 require .NoError (t , sub .ProcessEvent (events .NewResourceChangedEvent (cache .Deleted , res , nil )))
341342 require .NoError (t , sub .ProcessEvent (events .NewResourceChangedEvent (cache .Added , nil , res )))
342343
343- items , err := store .ListVersions (meshresource .ConditionRouteKind , res .ResourceKey ())
344- require .NoError (t , err )
345- require .Len (t , items , 3 )
346- require .Equal (t , OperationCreate , items [0 ].Operation )
347- require .True (t , items [0 ].IsCurrent )
348- require .Equal (t , OperationDelete , items [1 ].Operation )
349- require .False (t , items [1 ].IsCurrent )
344+ versions := getRuleVersionsFromRM (t , rm , "mesh" , meshresource .ConditionRouteKind , "demo.condition-router" )
345+ require .Len (t , versions , 3 )
346+ require .Equal (t , string (OperationCreate ), versions [2 ].Spec .Operation )
347+ require .Equal (t , string (OperationDelete ), versions [1 ].Spec .Operation )
350348}
351349
352350func TestSubscriberCommitsMatchingAdminIntent (t * testing.T ) {
@@ -415,7 +413,8 @@ func TestComponentAutoMigrateOnlyWhenEnabled(t *testing.T) {
415413 require .NoError (t , err )
416414
417415 components := map [coreruntime.ComponentType ]coreruntime.Component {
418- coreruntime .ResourceStore : testGormStoreComponent {db : db },
416+ coreruntime .ResourceStore : testGormStoreComponent {db : db },
417+ coreruntime .ResourceManager : testRMComponent {rm : fakeNoopResourceManager {}},
419418 }
420419 if tt .enabled {
421420 components [coreruntime .EventBus ] = newTestEventBus (t )
@@ -548,6 +547,90 @@ func (f fakeNoopResourceManager) DeleteByKey(model.ResourceKind, string, string)
548547 return nil
549548}
550549
550+ // fakeInMemoryResourceManager stores RuleVersion resources in memory for testing
551+ type fakeInMemoryResourceManager struct {
552+ versions map [string ][]model.Resource // key: mesh/kind/name
553+ }
554+
555+ func newFakeInMemoryRM () * fakeInMemoryResourceManager {
556+ return & fakeInMemoryResourceManager {
557+ versions : make (map [string ][]model.Resource ),
558+ }
559+ }
560+
561+ func (f * fakeInMemoryResourceManager ) GetByKey (model.ResourceKind , string ) (model.Resource , bool , error ) {
562+ return nil , false , nil
563+ }
564+
565+ func (f * fakeInMemoryResourceManager ) GetByKeys (model.ResourceKind , []string ) ([]model.Resource , error ) {
566+ return nil , nil
567+ }
568+
569+ func (f * fakeInMemoryResourceManager ) List (model.ResourceKind ) ([]model.Resource , error ) {
570+ return nil , nil
571+ }
572+
573+ func (f * fakeInMemoryResourceManager ) ListByIndexes (kind model.ResourceKind , indexes []index.IndexCondition ) ([]model.Resource , error ) {
574+ if kind != meshresource .RuleVersionKind {
575+ return nil , nil
576+ }
577+
578+ // Extract parent rule info from index condition
579+ var key string
580+ for _ , idx := range indexes {
581+ if idx .IndexName == "parent_rule" {
582+ key = idx .Value
583+ break
584+ }
585+ }
586+
587+ if key == "" {
588+ return nil , nil
589+ }
590+
591+ return f .versions [key ], nil
592+ }
593+
594+ func (f * fakeInMemoryResourceManager ) PageListByIndexes (model.ResourceKind , []index.IndexCondition , model.PageReq ) (* model.PageData [model.Resource ], error ) {
595+ return nil , nil
596+ }
597+
598+ func (f * fakeInMemoryResourceManager ) Add (r model.Resource ) error {
599+ rv , ok := r .(* meshresource.RuleVersion )
600+ if ! ok {
601+ return nil
602+ }
603+
604+ key := fmt .Sprintf ("%s:%s:%s" , rv .Mesh , rv .Spec .ParentRuleKind , rv .Spec .ParentRuleName )
605+ f .versions [key ] = append (f .versions [key ], r )
606+ return nil
607+ }
608+
609+ func (f * fakeInMemoryResourceManager ) Update (model.Resource ) error {
610+ return nil
611+ }
612+
613+ func (f * fakeInMemoryResourceManager ) Upsert (model.Resource ) error {
614+ return nil
615+ }
616+
617+ func (f * fakeInMemoryResourceManager ) DeleteByKey (model.ResourceKind , string , string ) error {
618+ return nil
619+ }
620+
621+ // Helper function to extract RuleVersion resources from fake RM
622+ func getRuleVersionsFromRM (t * testing.T , rm * fakeInMemoryResourceManager , mesh string , kind model.ResourceKind , name string ) []* meshresource.RuleVersion {
623+ key := fmt .Sprintf ("%s:%s:%s" , mesh , kind , name )
624+ resources := rm .versions [key ]
625+ versions := make ([]* meshresource.RuleVersion , 0 , len (resources ))
626+ for _ , res := range resources {
627+ if rv , ok := res .(* meshresource.RuleVersion ); ok {
628+ versions = append (versions , rv )
629+ }
630+ }
631+ return versions
632+ }
633+
551634type eventBusVersionResourceManager struct {
552635 emitter events.Emitter
553636}
0 commit comments