package main // The moved path started before its runtime answers asks again until it does (issue 943). import ( "context" "errors" "testing" "time" "git.novox.be/novox/mesh-sdk/go/provider" ) // earlyBus refuses its first watches as the runtime does before Serve runs, then answers as the bucket bus does. type earlyBus struct { *bucketBus refuse int } func (b *earlyBus) Watch(ctx context.Context, bucket string, handle func(string, []byte)) error { if b.refuse > 0 { b.refuse-- return errors.New("before Serve: a bundle reaches the bus through the runtime that launched it") } return b.bucketBus.Watch(ctx, bucket, handle) } func TestAMovedPathStartedTooEarlyAsksAgainUntilTheRuntimeAnswers(t *testing.T) { w := newMovedWorld(t, map[[2]string]string{}) w.run.FirstRetry = time.Millisecond w.run.loaded = false bus := &earlyBus{bucketBus: w.bus, refuse: 3} p := provider.New(provider.Options{Node: "novox", Module: "postgres", Bus: w.bus, Vault: provider.ConsumersFile{Paths: []string{w.file}}, Make: w.run.Make, Gone: w.run.Gone, Every: time.Hour, Logf: func(string, ...any) {}}) ctx, cancel := context.WithCancel(context.Background()) done := make(chan error, 1) go func() { done <- w.run.Run(ctx, p, bus) }() deadline := time.After(time.Second) for { w.run.mu.Lock() loaded := w.run.loaded w.run.mu.Unlock() if loaded { break } select { case err := <-done: cancel() t.Fatalf("Run stopped before the runtime answered: %v", err) case <-deadline: cancel() t.Fatal("the plans were never watched") case <-time.After(time.Millisecond): } } cancel() <-done if bus.refuse != 0 { t.Fatalf("%d refusals left", bus.refuse) } }