-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathtest_results.rs
More file actions
152 lines (142 loc) · 5.9 KB
/
Copy pathtest_results.rs
File metadata and controls
152 lines (142 loc) · 5.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//! Top-level test result aggregate contract types.
use serde::Serialize;
use serde_json::Value;
use homeboy_finding::HomeboyFinding;
use homeboy_refactor_contract::AppliedRefactor;
use crate::ci_context::CiContext;
use crate::runner_contract::{PhaseFailure, PhaseReport};
use crate::test_analysis::{TestAnalysis, TestAnalysisInput};
use crate::test_duration::TestDurations;
use crate::test_parsing::{CoverageOutput, TestSummaryOutput};
use crate::test_result::{TestCounts, TestScopeOutput};
use crate::test_workflow::{
AutoFixDriftOutput, DriftReport, RawTestOutput, TestBaselineComparison,
};
use crate::ExtensionPhaseTiming;
/// Unified output envelope for all test command modes.
///
/// This is the single serialization target for the test command. Each sub-workflow
/// populates its relevant fields; unused fields are `None` and skipped in serialization.
#[derive(Serialize)]
pub struct TestCommandOutput {
pub passed: bool,
pub status: String,
pub component: String,
pub exit_code: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub phase: Option<PhaseReport>,
#[serde(skip_serializing_if = "Option::is_none")]
pub failure: Option<PhaseFailure>,
#[serde(skip_serializing_if = "Option::is_none")]
pub test_counts: Option<TestCounts>,
/// Positive evidence emitted by an inventory-only test run. This replaces
/// execution counts only for that explicit mode.
#[serde(default, skip_serializing_if = "Option::is_none")]
pub test_inventory: Option<TestInventoryOutput>,
/// Duration facts for this phase. Deliberately separate from `findings`:
/// those drive failure classification, and a slow test is not a failing
/// test. `None` when nothing could be measured — never a zeroed block.
/// (#10655)
#[serde(default, skip_serializing_if = "Option::is_none")]
pub test_durations: Option<TestDurations>,
#[serde(skip_serializing_if = "Option::is_none")]
pub findings: Option<Vec<HomeboyFinding>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub coverage: Option<CoverageOutput>,
#[serde(skip_serializing_if = "Option::is_none")]
pub baseline_comparison: Option<TestBaselineComparison>,
#[serde(skip_serializing_if = "Option::is_none")]
pub analysis: Option<TestAnalysis>,
#[serde(skip_serializing_if = "Option::is_none")]
pub autofix: Option<AppliedRefactor>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hints: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub drift: Option<DriftReport>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auto_fix_drift: Option<AutoFixDriftOutput>,
#[serde(skip_serializing_if = "Option::is_none")]
pub test_scope: Option<TestScopeOutput>,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<TestSummaryOutput>,
/// Tail of runner stdout/stderr when tests fail — lets CI wrappers and
/// users see the actual PHPUnit/cargo output. (#1143)
#[serde(skip_serializing_if = "Option::is_none")]
pub raw_output: Option<RawTestOutput>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ci_context: Option<CiContext>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extension_phase_timings: Vec<ExtensionPhaseTiming>,
#[serde(
rename = "_homeboy_actionable",
skip_serializing_if = "Option::is_none"
)]
pub actionable: Option<Value>,
}
#[derive(Debug, Clone, Serialize)]
pub struct TestRunWorkflowResult {
pub status: String,
pub component: String,
pub exit_code: i32,
/// The unmodified test-runner exit used when artifacts finalize the result.
#[serde(skip)]
pub runner_exit_code: Option<i32>,
pub test_counts: Option<TestCounts>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub test_inventory: Option<TestInventoryOutput>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub test_durations: Option<TestDurations>,
pub findings: Option<Vec<HomeboyFinding>>,
#[serde(skip)]
pub failure_analysis_input: Option<TestAnalysisInput>,
pub coverage: Option<CoverageOutput>,
pub baseline_comparison: Option<TestBaselineComparison>,
pub analysis: Option<TestAnalysis>,
pub autofix: Option<AppliedRefactor>,
pub hints: Option<Vec<String>>,
pub test_scope: Option<TestScopeOutput>,
pub summary: Option<TestSummaryOutput>,
/// Tail of the runner's stdout/stderr, surfaced when tests fail so users
/// can see runner output (bootstrap errors, stack traces) without
/// having to re-run with a different flag. (#1143)
pub raw_output: Option<RawTestOutput>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extension_phase_timings: Vec<ExtensionPhaseTiming>,
}
/// Validated inventory-only test evidence from a supervised extension child.
#[derive(Debug, Clone, Serialize)]
pub struct TestInventoryOutput {
pub schema: String,
pub runner: String,
pub runner_fingerprint: String,
pub workspace_fingerprint: String,
pub test_count: usize,
pub inventory_fingerprint: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct DriftWorkflowResult {
pub component: String,
pub report: DriftReport,
pub exit_code: i32,
}
#[derive(Debug, Clone, Serialize)]
pub struct AutoFixDriftWorkflowResult {
pub component: String,
pub output: AutoFixDriftOutput,
pub hints: Vec<String>,
pub report: Option<DriftReport>,
}
#[derive(Debug, Clone, Serialize)]
pub struct MainTestWorkflowResult {
pub status: String,
pub component: String,
pub exit_code: i32,
pub test_counts: Option<TestCounts>,
pub coverage: Option<serde_json::Value>,
pub baseline_comparison: Option<TestBaselineComparison>,
pub analysis: Option<TestAnalysis>,
pub autofix: Option<AppliedRefactor>,
pub hints: Option<Vec<String>>,
pub test_scope: Option<TestScopeOutput>,
pub summary: Option<serde_json::Value>,
}