//Returns a result and a debug channels. The channels are closed on test run finalization func runOnLambda(l *lambda.Lambda, cw *cloudwatchlogs.CloudWatchLogs, test *util.TestDescription) (<-chan string, <-chan string) { result := make(chan string, 1) debug := make(chan string, 1) go func() { defer close(result) defer close(debug) name := test.Name debug <- "Getting old log" old_invocation_log, err := getLog(cw, name) if err != nil { old_invocation_log = "" } payload, _ := json.Marshal(test.Event) invoke_input := &lambda.InvokeInput{ FunctionName: aws.String(name), InvocationType: aws.String("Event"), Payload: payload, } debug <- "Enqueuing task" _, err = l.Invoke(invoke_input) if err != nil { debug <- fmt.Sprintf("Error invoking function %s ", err) return } timeout := time.Duration(test.Timeout) * time.Second debug <- "Waiting for task" now := time.Now() elapsed := time.After(timeout) ticker := time.NewTicker(3 * time.Second) defer ticker.Stop() log := "" completed := false requestId := "" logGetter := func() (string, error) { return getLog(cw, name) } // waiting for test.Timeout or for the full log whichever occurs first logWaitLoop: for { select { case <-elapsed: break logWaitLoop case <-ticker.C: log, requestId, completed, err = getLogAndDetectRequestComplete(logGetter, old_invocation_log, requestId) if err != nil { debug <- fmt.Sprintf("Error getting log %s ", err) return } if completed { break logWaitLoop } } } if !completed { log, requestId, completed, err = getLogAndDetectRequestComplete(logGetter, old_invocation_log, requestId) if err != nil { debug <- fmt.Sprintf("Error getting log %s ", err) return } if !completed { if requestId != "" { debug <- fmt.Sprintf("Request Id: %s", requestId) } debug <- time.Now().Sub(now).String() logLines := strings.Split(log, "\n") switch len(logLines) { case 0: debug <- "Log for current test run is empty" case 1: debug <- fmt.Sprintf("Log does not contain entries for current test run:\n%s", logLines[0]) default: debug <- fmt.Sprintf("Log does not contain entries for current test run:\n%s\n...\n%s", logLines[0], logLines[len(logLines)-1]) } return } } debug <- fmt.Sprintf("Request Id: %s", requestId) final, err := cleanLambda(log) if err != nil { debug <- fmt.Sprintf("Error cleaning log %s", err) return } result <- final }() return result, debug }