lingxia_devtool_protocol/
session_test.rs1use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Debug, Clone, Deserialize, Serialize)]
7pub struct TestStartArgs {
8 pub source: String,
9 pub source_name: Option<String>,
10 pub timeout_ms: Option<u64>,
11 #[serde(default)]
12 pub args: HashMap<String, String>,
13}
14
15#[derive(Debug, Clone, Deserialize, Serialize)]
16pub struct TestStartResponse {
17 pub run_id: String,
18 pub state: TestRunState,
19}
20
21#[derive(Debug, Clone, Deserialize, Serialize)]
22pub struct TestPollArgs {
23 pub run_id: String,
24 #[serde(default)]
25 pub after_seq: u64,
26}
27
28#[derive(Debug, Clone, Deserialize, Serialize)]
29pub struct TestPollResponse {
30 pub run_id: String,
31 pub state: TestRunState,
32 pub next_seq: u64,
33 pub events: Vec<TestEvent>,
34 #[serde(skip_serializing_if = "Option::is_none")]
35 pub result: Option<TestRunResult>,
36}
37
38#[derive(Debug, Clone, Deserialize, Serialize)]
39pub struct TestCancelArgs {
40 pub run_id: String,
41 pub reason: Option<String>,
42}
43
44#[derive(Debug, Clone, Deserialize, Serialize)]
45pub struct TestCancelResponse {
46 pub run_id: String,
47 pub state: TestRunState,
48}
49
50#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
51#[serde(rename_all = "snake_case")]
52pub enum TestRunState {
53 Running,
54 Passed,
55 Failed,
56 TimedOut,
57 Cancelled,
58 InternalError,
59}
60
61impl TestRunState {
62 pub fn as_str(self) -> &'static str {
63 match self {
64 Self::Running => "running",
65 Self::Passed => "passed",
66 Self::Failed => "failed",
67 Self::TimedOut => "timed_out",
68 Self::Cancelled => "cancelled",
69 Self::InternalError => "internal_error",
70 }
71 }
72
73 pub fn is_terminal(self) -> bool {
74 !matches!(self, Self::Running)
75 }
76}
77
78#[derive(Debug, Clone, Deserialize, Serialize)]
79pub struct TestEvent {
80 pub seq: u64,
81 #[serde(flatten)]
82 pub payload: TestEventPayload,
83}
84
85#[derive(Debug, Clone, Deserialize, Serialize)]
86#[serde(tag = "kind", rename_all = "snake_case")]
87pub enum TestEventPayload {
88 Console {
89 level: String,
90 message: String,
91 },
92 Artifact {
93 name: String,
94 mime_type: String,
95 base64: String,
96 },
97 CaseStarted {
98 name: String,
99 full_name: String,
100 },
101 CaseFinished {
102 name: String,
103 full_name: String,
104 status: TestCaseStatus,
105 duration_ms: u64,
106 #[serde(skip_serializing_if = "Option::is_none")]
107 error: Option<TestRunError>,
108 },
109}
110
111#[derive(Debug, Clone, Deserialize, Serialize)]
112pub struct TestRunResult {
113 pub duration_ms: u64,
114 #[serde(skip_serializing_if = "Option::is_none")]
115 pub error: Option<TestRunError>,
116 #[serde(skip_serializing_if = "Option::is_none")]
117 pub report: Option<TestReport>,
118}
119
120#[derive(Debug, Clone, Deserialize, Serialize)]
121pub struct TestRunError {
122 pub name: String,
123 pub message: String,
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub stack: Option<String>,
126 #[serde(default, skip_serializing_if = "Vec::is_empty")]
127 pub causes: Vec<TestRunError>,
128}
129
130#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
131#[serde(rename_all = "snake_case")]
132pub enum TestCaseStatus {
133 Passed,
134 Failed,
135 Skipped,
136}
137
138#[derive(Debug, Clone, Deserialize, Serialize)]
139pub struct TestCaseResult {
140 pub name: String,
141 pub full_name: String,
142 pub status: TestCaseStatus,
143 pub duration_ms: u64,
144 #[serde(skip_serializing_if = "Option::is_none")]
145 pub error: Option<TestRunError>,
146}
147
148#[derive(Debug, Clone, Deserialize, Serialize)]
149pub struct TestReport {
150 pub total: usize,
151 pub passed: usize,
152 pub failed: usize,
153 pub skipped: usize,
154 pub duration_ms: u64,
155 pub cases: Vec<TestCaseResult>,
156}