Skip to main content

lingxia_devtool_protocol/
session_test.rs

1//! Wire types for the `session.test.*` devtool handlers.
2
3use 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}