| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package testparser |
| |
| import ( |
| "fmt" |
| "regexp" |
| "time" |
| ) |
| |
| var ( |
| goTestPreamblePattern = regexp.MustCompile(`^=== RUN\s+(.[^/]*)(?:/?)(.*?)$`) |
| goTestCasePattern = regexp.MustCompile(`^\s*--- (\w*?): (.[^/]*)(?:/?)(.*?) \((.*?)\)$`) |
| goTestPanicPattern = regexp.MustCompile(`^panic: test timed out after (\S+)$`) |
| ) |
| |
| func parseGoTest(lines [][]byte) []TestCaseResult { |
| var res []TestCaseResult |
| var preambleName string |
| for _, line := range lines { |
| var matched bool |
| line := string(line) |
| m := goTestPreamblePattern.FindStringSubmatch(line) |
| if m != nil { |
| preambleName = m[1] |
| continue |
| } |
| var status TestCaseStatus |
| var displayName string |
| var suiteName string |
| var caseName string |
| var duration time.Duration |
| m = goTestPanicPattern.FindStringSubmatch(line) |
| if m != nil { |
| status = Fail |
| caseName = preambleName |
| displayName = preambleName |
| duration, _ = time.ParseDuration(m[1]) |
| matched = true |
| } |
| m = goTestCasePattern.FindStringSubmatch(line) |
| if m != nil { |
| switch m[1] { |
| case "PASS": |
| status = Pass |
| case "FAIL": |
| status = Fail |
| case "SKIP": |
| status = Skip |
| } |
| if m[3] == "" { |
| caseName = m[2] |
| displayName = caseName |
| } else { |
| suiteName = m[2] |
| caseName = m[3] |
| displayName = fmt.Sprintf("%s/%s", suiteName, caseName) |
| } |
| duration, _ = time.ParseDuration(m[4]) |
| matched = true |
| } |
| if matched { |
| res = append(res, TestCaseResult{ |
| DisplayName: displayName, |
| SuiteName: suiteName, |
| CaseName: caseName, |
| Status: status, |
| Duration: duration, |
| Format: "Go", |
| }) |
| } |
| } |
| return res |
| } |