(t *testing.T)
| 184 | } |
| 185 | |
| 186 | func TestModuleWaitsForAllDependencies(t *testing.T) { |
| 187 | var serviceA services.Service |
| 188 | |
| 189 | initA := func() (services.Service, error) { |
| 190 | serviceA = services.NewIdleService(func(serviceContext context.Context) error { |
| 191 | // Slow-starting service. Delay is here to verify that service for C is not started before this service |
| 192 | // has finished starting. |
| 193 | time.Sleep(1 * time.Second) |
| 194 | return nil |
| 195 | }, nil) |
| 196 | |
| 197 | return serviceA, nil |
| 198 | } |
| 199 | |
| 200 | initC := func() (services.Service, error) { |
| 201 | return services.NewIdleService(func(serviceContext context.Context) error { |
| 202 | // At this point, serviceA should be Running, because "C" depends (indirectly) on "A". |
| 203 | if s := serviceA.State(); s != services.Running { |
| 204 | return fmt.Errorf("serviceA has invalid state: %v", s) |
| 205 | } |
| 206 | return nil |
| 207 | }, nil), nil |
| 208 | } |
| 209 | |
| 210 | m := NewManager(log.NewNopLogger()) |
| 211 | m.RegisterModule("A", initA) |
| 212 | m.RegisterModule("B", nil) |
| 213 | m.RegisterModule("C", initC) |
| 214 | |
| 215 | // C -> B -> A. Even though B has no service, C must still wait for service A to start, before C can start. |
| 216 | require.NoError(t, m.AddDependency("B", "A")) |
| 217 | require.NoError(t, m.AddDependency("C", "B")) |
| 218 | |
| 219 | servsMap, err := m.InitModuleServices("C") |
| 220 | require.NoError(t, err) |
| 221 | |
| 222 | // Build service manager from services, and start it. |
| 223 | servs := []services.Service(nil) |
| 224 | for _, s := range servsMap { |
| 225 | servs = append(servs, s) |
| 226 | } |
| 227 | |
| 228 | servManager, err := services.NewManager(servs...) |
| 229 | require.NoError(t, err) |
| 230 | assert.NoError(t, services.StartManagerAndAwaitHealthy(context.Background(), servManager)) |
| 231 | assert.NoError(t, services.StopManagerAndAwaitStopped(context.Background(), servManager)) |
| 232 | } |
nothing calls this directly
no test coverage detected