mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-29 14:06:36 +08:00
merge(wavelet): honor Use() order when reconciling plugins
Pull the core reconcile rescan so admin migrations run before OpenFlare server seeds that insert into w_schedules.
This commit is contained in:
@@ -300,6 +300,9 @@ func (a *App) reconcileLocked() error {
|
||||
return fmt.Errorf("core: load fiber %q failed: %w", f.Name(), err)
|
||||
}
|
||||
progress = true
|
||||
// Rescan from the head of the Use() list so earlier pending
|
||||
// plugins run before later ones that became ready in this pass.
|
||||
break
|
||||
}
|
||||
}
|
||||
if !progress {
|
||||
|
||||
@@ -98,6 +98,38 @@ func TestFiber_ConfluenceAndReactiveActivation(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestReconcileAppliesEarlierConsumersBeforeLaterOnes(t *testing.T) {
|
||||
app := core.NewApp()
|
||||
var order []string
|
||||
early := &orderPlugin{name: "early-consumer", order: &order, inject: []reflect.Type{reflect.TypeFor[MockServiceA]()}}
|
||||
provider := &orderPlugin{name: "provider", order: &order, provide: true}
|
||||
late := &orderPlugin{name: "late-consumer", order: &order, inject: []reflect.Type{reflect.TypeFor[MockServiceA]()}}
|
||||
app.Use(early, provider, late)
|
||||
|
||||
require.NoError(t, app.Start(context.Background()))
|
||||
assert.Equal(t, []string{"provider", "early-consumer", "late-consumer"}, order)
|
||||
require.NoError(t, app.Stop())
|
||||
}
|
||||
|
||||
type orderPlugin struct {
|
||||
name string
|
||||
order *[]string
|
||||
inject []reflect.Type
|
||||
provide bool
|
||||
}
|
||||
|
||||
func (p *orderPlugin) Name() string { return p.name }
|
||||
|
||||
func (p *orderPlugin) Inject() []reflect.Type { return p.inject }
|
||||
|
||||
func (p *orderPlugin) Apply(ctx *core.Context) error {
|
||||
*p.order = append(*p.order, p.name)
|
||||
if p.provide {
|
||||
core.Provide[MockServiceA](ctx, &mockServiceAImpl{})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func TestFiber_UnsatisfiedDependencyReturnsError(t *testing.T) {
|
||||
app := core.NewApp()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user