PerformStub: func() error { close(substepReadyChan) time.Sleep(substepPerformTime) close(substepFinishedChan) return substepPerformError }, } logger = lagertest.NewTestLogger("test") }) Describe("Perform", func() { var err error JustBeforeEach(func() { err = steps.NewTimeout(substep, timeout, logger).Perform() }) Context("When the substep finishes before the timeout expires", func() { BeforeEach(func() { substepPerformTime = 10 * time.Millisecond timeout = 100 * time.Millisecond }) Context("when the substep returns an error", func() { BeforeEach(func() { substepPerformError = errors.New("some error") }) It("performs the substep", func() { Expect(substepFinishedChan).To(BeClosed())
func (transformer *Transformer) StepFor( logStreamer log_streamer.LogStreamer, action *models.Action, container garden.Container, externalIP string, ports []executor.PortMapping, logger lager.Logger, ) steps.Step { a := action.GetValue() switch actionModel := a.(type) { case *models.RunAction: return steps.NewRun( container, *actionModel, logStreamer.WithSource(actionModel.LogSource), logger, externalIP, ports, transformer.exportNetworkEnvVars, transformer.clock, ) case *models.DownloadAction: return steps.NewDownload( container, *actionModel, transformer.cachedDownloader, transformer.downloadLimiter, logStreamer.WithSource(actionModel.LogSource), logger, ) case *models.UploadAction: return steps.NewUpload( container, *actionModel, transformer.uploader, transformer.compressor, transformer.tempDir, logStreamer.WithSource(actionModel.LogSource), transformer.uploadLimiter, logger, ) case *models.EmitProgressAction: return steps.NewEmitProgress( transformer.StepFor( logStreamer, actionModel.Action, container, externalIP, ports, logger, ), actionModel.StartMessage, actionModel.SuccessMessage, actionModel.FailureMessagePrefix, logStreamer.WithSource(actionModel.LogSource), logger, ) case *models.TimeoutAction: return steps.NewTimeout( transformer.StepFor( logStreamer.WithSource(actionModel.LogSource), actionModel.Action, container, externalIP, ports, logger, ), time.Duration(actionModel.Timeout), logger, ) case *models.TryAction: return steps.NewTry( transformer.StepFor( logStreamer.WithSource(actionModel.LogSource), actionModel.Action, container, externalIP, ports, logger, ), logger, ) case *models.ParallelAction: subSteps := make([]steps.Step, len(actionModel.Actions)) for i, action := range actionModel.Actions { subSteps[i] = transformer.StepFor( logStreamer.WithSource(actionModel.LogSource), action, container, externalIP, ports, logger, ) } return steps.NewParallel(subSteps) case *models.CodependentAction: subSteps := make([]steps.Step, len(actionModel.Actions)) for i, action := range actionModel.Actions { subSteps[i] = transformer.StepFor( logStreamer.WithSource(actionModel.LogSource), action, container, externalIP, ports, logger, ) } errorOnExit := true return steps.NewCodependent(subSteps, errorOnExit) case *models.SerialAction: subSteps := make([]steps.Step, len(actionModel.Actions)) for i, action := range actionModel.Actions { subSteps[i] = transformer.StepFor( logStreamer, action, container, externalIP, ports, logger, ) } return steps.NewSerial(subSteps) } panic(fmt.Sprintf("unknown action: %T", action)) }