func (p *ProcessorPool) runProcessor(queue JobQueue) error { processorUUID := uuid.NewRandom() ctx := context.FromProcessor(p.Context, processorUUID.String()) jobsChan, err := queue.Jobs(ctx) if err != nil { context.LoggerFromContext(p.Context).WithField("err", err).Error("couldn't create jobs channel") return err } proc, err := NewProcessor(ctx, p.Hostname, jobsChan, p.Provider, p.Generator, p.Canceller, p.HardTimeout, p.LogTimeout) if err != nil { context.LoggerFromContext(p.Context).WithField("err", err).Error("couldn't create processor") return err } proc.SkipShutdownOnLogTimeout = p.SkipShutdownOnLogTimeout p.processorsLock.Lock() p.processors = append(p.processors, proc) p.processorsLock.Unlock() proc.Run() return nil }
func TestProcessor(t *testing.T) { uuid := uuid.NewRandom() ctx := workerctx.FromProcessor(context.TODO(), uuid.String()) provider, err := backend.NewBackendProvider("fake", config.ProviderConfigFromMap(map[string]string{ "LOG_OUTPUT": "hello, world", })) if err != nil { t.Error(err) } generator := buildScriptGeneratorFunction(func(ctx context.Context, json *simplejson.Json) ([]byte, error) { return []byte("hello, world"), nil }) jobChan := make(chan Job) canceller := &fakeCanceller{} processor, err := NewProcessor(ctx, "test-hostname", jobChan, provider, generator, canceller, 2*time.Second, time.Second, 3*time.Second, 4*time.Second) if err != nil { t.Error(err) } doneChan := make(chan struct{}) go func() { processor.Run() doneChan <- struct{}{} }() job := &fakeJob{ payload: &JobPayload{ Type: "job:test", Job: JobJobPayload{ ID: 2, Number: "3.1", }, Build: BuildPayload{ ID: 1, Number: "3", }, Repository: RepositoryPayload{ ID: 4, Slug: "green-eggs/ham", }, UUID: "foo-bar", Config: map[string]interface{}{}, Timeouts: TimeoutsPayload{}, }, startAttributes: &backend.StartAttributes{}, } jobChan <- job processor.GracefulShutdown() <-doneChan if processor.ProcessedCount != 1 { t.Errorf("processor.ProcessedCount = %d, expected %d", processor.ProcessedCount, 1) } expectedEvents := []string{"received", "started", string(FinishStatePassed)} if !reflect.DeepEqual(expectedEvents, job.events) { t.Errorf("job.events = %#v, expected %#v", job.events, expectedEvents) } if canceller.subscribedIDs[0] != 2 { t.Errorf("canceller.subscribedIDs[0] = %d, expected 2", canceller.subscribedIDs[0]) } if canceller.unsubscribedIDs[0] != 2 { t.Errorf("canceller.unsubscribedIDs[0] = %d, expected 2", canceller.unsubscribedIDs[0]) } }