MCPcopy
hub / github.com/grafana/dskit / TestModuleWaitsForAllDependencies

Function TestModuleWaitsForAllDependencies

modules/modules_test.go:306–352  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

304}
305
306func TestModuleWaitsForAllDependencies(t *testing.T) {
307 var serviceA services.Service
308
309 initA := func() (services.Service, error) {
310 serviceA = services.NewIdleService(func(context.Context) error {
311 // Slow-starting service. Delay is here to verify that service for C is not started before this service
312 // has finished starting.
313 time.Sleep(1 * time.Second)
314 return nil
315 }, nil)
316
317 return serviceA, nil
318 }
319
320 initC := func() (services.Service, error) {
321 return services.NewIdleService(func(context.Context) error {
322 // At this point, serviceA should be Running, because "C" depends (indirectly) on "A".
323 if s := serviceA.State(); s != services.Running {
324 return fmt.Errorf("serviceA has invalid state: %v", s)
325 }
326 return nil
327 }, nil), nil
328 }
329
330 m := NewManager(log.NewNopLogger())
331 m.RegisterModule("A", initA)
332 m.RegisterModule("B", nil)
333 m.RegisterModule("C", initC)
334
335 // C -> B -> A. Even though B has no service, C must still wait for service A to start, before C can start.
336 require.NoError(t, m.AddDependency("B", "A"))
337 require.NoError(t, m.AddDependency("C", "B"))
338
339 servsMap, err := m.InitModuleServices("C")
340 require.NoError(t, err)
341
342 // Build service manager from services, and start it.
343 servs := []services.Service(nil)
344 for _, s := range servsMap {
345 servs = append(servs, s)
346 }
347
348 servManager, err := services.NewManager(servs...)
349 require.NoError(t, err)
350 assert.NoError(t, services.StartManagerAndAwaitHealthy(context.Background(), servManager))
351 assert.NoError(t, services.StopManagerAndAwaitStopped(context.Background(), servManager))
352}
353
354func TestModuleService_InterruptedFastStartup(t *testing.T) {
355 finishStarting := make(chan struct{})

Callers

nothing calls this directly

Calls 11

StateMethod · 0.95
RegisterModuleMethod · 0.95
AddDependencyMethod · 0.95
InitModuleServicesMethod · 0.95
NewIdleServiceFunction · 0.92
NewManagerFunction · 0.92
ErrorfMethod · 0.80
NewManagerFunction · 0.70
SleepMethod · 0.65

Tested by

no test coverage detected