diff --git a/common/storage/setup_gen_test.go b/common/storage/setup_gen_test.go new file mode 100644 index 00000000..dc19ee65 --- /dev/null +++ b/common/storage/setup_gen_test.go @@ -0,0 +1,53 @@ +package storage + +import ( + "testing" + + "github.com/go-admin-team/go-admin-core/v2/sdk" + "github.com/go-admin-team/go-admin-core/v2/sdk/config" + "github.com/go-admin-team/go-admin-core/v2/sdk/runtime" +) + +// Issue #892: a configuration reload replaces the queue adapter and the +// consumers registered against the previous one are attached to a queue nobody +// publishes to any more. +// +// The fix has two halves. attachQueueConsumers gives a new queue its own +// consumers and the same queue none, which cmd/api covers against a queue the +// test controls. This is the other half: that a reload actually produces a new +// queue for it to notice. Setup is what config re-runs on every change, so +// calling it twice is what a reload does to this package. +func TestSetupBumpsTheQueueGenerationOnEveryReload(t *testing.T) { + // Setup writes the process-wide sdk.Runtime - the cache and queue adapters - + // and this package's own record of what it installed. Restoring all of it + // keeps the test from deciding what a later test in this binary sees, + // which is the same isolation cmd/api's freshRuntime provides. + prevQ, prevC := config.QueueConfig, config.CacheConfig + prevRuntime := sdk.Runtime + prevInstalled, prevGen := installed, installedGen + t.Cleanup(func() { + config.QueueConfig, config.CacheConfig = prevQ, prevC + sdk.Runtime = prevRuntime + queueMu.Lock() + installed, installedGen = prevInstalled, prevGen + queueMu.Unlock() + }) + sdk.Runtime = runtime.NewConfig() + + config.CacheConfig = &config.Cache{Memory: struct{}{}} + config.QueueConfig = &config.Queue{Memory: &config.QueueMemory{PoolSize: 10}} + + before := QueueGeneration() + Setup() + first := QueueGeneration() + Setup() + second := QueueGeneration() + + t.Logf("before=%d first=%d second=%d", before, first, second) + if first == before { + t.Fatal("the first Setup did not install a queue") + } + if second == first { + t.Fatal("a second Setup - which is what a configuration reload does - did not install a new one") + } +}