|  | // 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 | 
|  | } |