| // Copyright 2021 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 ffxutil |
| |
| import ( |
| "encoding/json" |
| "os" |
| "path/filepath" |
| ) |
| |
| const ( |
| // The name of the summary.json describing a test run. |
| runSummaryFilename = "run_summary.json" |
| |
| // Test outcome values. This should match the list of values for the `outcome` field |
| // of the run summary at //src/sys/run_test_suite/directory/schema/suite_summary.schema.json |
| TestNotStarted = "NOT_STARTED" |
| TestPassed = "PASSED" |
| TestFailed = "FAILED" |
| TestInconclusive = "INCONCLUSIVE" |
| TestTimedOut = "TIMEDOUT" |
| TestError = "ERROR" |
| TestSkipped = "SKIPPED" |
| |
| // Artifact types. This should match the list under `artifact_metadata.artifact_type` |
| // at //src/sys/run_test_suite/directory/schema/suite_summary.schema.json. |
| SyslogType = "SYSLOG" |
| StdoutType = "STDOUT" |
| StderrType = "STDERR" |
| CustomType = "CUSTOM" |
| RestrictedLogType = "RESTRICTED_LOG" |
| ReportType = "REPORT" |
| DebugType = "DEBUG" |
| ) |
| |
| // TestRunResult is the JSON schema for a test run in structured results output |
| // by `ffx test run`. |
| type TestRunResult struct { |
| Artifacts map[string]ArtifactMetadata `json:"artifacts"` |
| ArtifactDir string `json:"artifact_dir"` |
| Outcome string `json:"outcome"` |
| Suites []suiteEntry `json:"suites"` |
| outputDir string |
| } |
| |
| func GetRunResult(outputDir string) (*TestRunResult, error) { |
| runSummaryBytes, err := os.ReadFile(filepath.Join(outputDir, runSummaryFilename)) |
| if err != nil { |
| return nil, err |
| } |
| runResult := &TestRunResult{} |
| err = json.Unmarshal(runSummaryBytes, runResult) |
| if err != nil { |
| return nil, err |
| } |
| runResult.outputDir = outputDir |
| return runResult, nil |
| } |
| |
| // GetSuiteResults returns a list of the suite summaries from a test run. |
| func (r *TestRunResult) GetSuiteResults() ([]*SuiteResult, error) { |
| var suiteResults []*SuiteResult |
| for _, suite := range r.Suites { |
| suiteSummaryBytes, err := os.ReadFile(filepath.Join(r.outputDir, suite.Summary)) |
| if err != nil { |
| return suiteResults, err |
| } |
| suiteResult := &SuiteResult{} |
| err = json.Unmarshal(suiteSummaryBytes, suiteResult) |
| if err != nil { |
| return suiteResults, err |
| } |
| suiteResults = append(suiteResults, suiteResult) |
| } |
| return suiteResults, nil |
| } |
| |
| // GetTestOutputDir returns the path to the test output directory. |
| func (r *TestRunResult) GetTestOutputDir() string { |
| return r.outputDir |
| } |
| |
| // suiteEntry is an entry for a test suite in TestRunResult. |
| type suiteEntry struct { |
| Summary string `json:"summary"` |
| } |
| |
| // SuiteResult is a JSON schema for a suite in structured results output by `ffx test run`. |
| type SuiteResult struct { |
| Outcome string `json:"outcome"` |
| Name string `json:"name"` |
| Cases []CaseResult `json:"cases"` |
| StartTime int64 `json:"start_time"` |
| DurationMilliseconds int64 `json:"duration_milliseconds"` |
| Artifacts map[string]ArtifactMetadata `json:"artifacts"` |
| ArtifactDir string `json:"artifact_dir"` |
| } |
| |
| // ArtifactMetadata is metadata tied to an artifact. |
| type ArtifactMetadata struct { |
| ArtifactType string `json:"artifact_type"` |
| ComponentMoniker string `json:"component_moniker"` |
| } |
| |
| // CaseResult is a JSON schema for a test case in structured results. |
| type CaseResult struct { |
| Outcome string `json:"outcome"` |
| Name string `json:"name"` |
| StartTime int64 `json:"start_time"` |
| DurationMilliseconds int64 `json:"duration_milliseconds"` |
| Artifacts map[string]ArtifactMetadata `json:"artifacts"` |
| ArtifactDir string `json:"artifact_dir"` |
| } |