blob: 95916d6540a007fa45d8973c0dbd49b19150831b [file] [log] [blame]
// Copyright 2022 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.
use {
fidl::endpoints::ClientEnd,
fidl_fuchsia_test_manager as ftest_manager,
ftest_manager::{
CaseStatus, DebugDataIteratorMarker, Event as FidlEvent, EventDetails as FidlEventDetails,
RunEvent as FidlRunEvent, RunEventPayload as FidlRunEventPayload,
SuiteEvent as FidlSuiteEvent, SuiteEventPayload as FidlSuiteEventPayload, SuiteResult,
SuiteStatus, TestCaseResult,
},
fuchsia_zircon as zx,
};
pub(crate) enum RunEventPayload {
DebugData(ClientEnd<DebugDataIteratorMarker>),
}
pub(crate) struct RunEvent {
timestamp: i64,
payload: RunEventPayload,
}
impl Into<FidlRunEvent> for RunEvent {
fn into(self) -> FidlRunEvent {
match self.payload {
RunEventPayload::DebugData(client) => FidlRunEvent {
timestamp: Some(self.timestamp),
payload: Some(FidlRunEventPayload::Artifact(ftest_manager::Artifact::DebugData(
client,
))),
..Default::default()
},
}
}
}
impl RunEvent {
pub fn debug_data(client: ClientEnd<DebugDataIteratorMarker>) -> Self {
Self {
timestamp: zx::Time::get_monotonic().into_nanos(),
payload: RunEventPayload::DebugData(client),
}
}
#[cfg(test)]
pub fn into_payload(self) -> RunEventPayload {
self.payload
}
}
pub(crate) enum SuiteEventPayload {
CaseFound(String, u32),
CaseStarted(u32),
CaseStopped(u32, CaseStatus),
CaseFinished(u32),
CaseStdout(u32, zx::Socket),
CaseStderr(u32, zx::Socket),
CustomArtifact(ftest_manager::CustomArtifact),
SuiteSyslog(ftest_manager::Syslog),
SuiteStarted,
SuiteStopped(SuiteStatus),
DebugData(ClientEnd<DebugDataIteratorMarker>),
}
pub struct SuiteEvents {
timestamp: i64,
payload: SuiteEventPayload,
}
impl Into<FidlSuiteEvent> for SuiteEvents {
fn into(self) -> FidlSuiteEvent {
match self.payload {
SuiteEventPayload::CaseFound(name, identifier) => FidlSuiteEvent {
timestamp: Some(self.timestamp),
payload: Some(FidlSuiteEventPayload::CaseFound(ftest_manager::CaseFound {
test_case_name: name,
identifier,
})),
..Default::default()
},
SuiteEventPayload::CaseStarted(identifier) => FidlSuiteEvent {
timestamp: Some(self.timestamp),
payload: Some(FidlSuiteEventPayload::CaseStarted(ftest_manager::CaseStarted {
identifier,
})),
..Default::default()
},
SuiteEventPayload::CaseStopped(identifier, status) => FidlSuiteEvent {
timestamp: Some(self.timestamp),
payload: Some(FidlSuiteEventPayload::CaseStopped(ftest_manager::CaseStopped {
identifier,
status,
})),
..Default::default()
},
SuiteEventPayload::CaseFinished(identifier) => FidlSuiteEvent {
timestamp: Some(self.timestamp),
payload: Some(FidlSuiteEventPayload::CaseFinished(ftest_manager::CaseFinished {
identifier,
})),
..Default::default()
},
SuiteEventPayload::CaseStdout(identifier, socket) => FidlSuiteEvent {
timestamp: Some(self.timestamp),
payload: Some(FidlSuiteEventPayload::CaseArtifact(ftest_manager::CaseArtifact {
identifier,
artifact: ftest_manager::Artifact::Stdout(socket),
})),
..Default::default()
},
SuiteEventPayload::CaseStderr(identifier, socket) => FidlSuiteEvent {
timestamp: Some(self.timestamp),
payload: Some(FidlSuiteEventPayload::CaseArtifact(ftest_manager::CaseArtifact {
identifier,
artifact: ftest_manager::Artifact::Stderr(socket),
})),
..Default::default()
},
SuiteEventPayload::CustomArtifact(custom) => FidlSuiteEvent {
timestamp: Some(self.timestamp),
payload: Some(FidlSuiteEventPayload::SuiteArtifact(ftest_manager::SuiteArtifact {
artifact: ftest_manager::Artifact::Custom(custom),
})),
..Default::default()
},
SuiteEventPayload::SuiteSyslog(syslog) => FidlSuiteEvent {
timestamp: Some(self.timestamp),
payload: Some(FidlSuiteEventPayload::SuiteArtifact(ftest_manager::SuiteArtifact {
artifact: ftest_manager::Artifact::Log(syslog),
})),
..Default::default()
},
SuiteEventPayload::SuiteStarted => FidlSuiteEvent {
timestamp: Some(self.timestamp),
payload: Some(FidlSuiteEventPayload::SuiteStarted(ftest_manager::SuiteStarted {})),
..Default::default()
},
SuiteEventPayload::SuiteStopped(status) => FidlSuiteEvent {
timestamp: Some(self.timestamp),
payload: Some(FidlSuiteEventPayload::SuiteStopped(ftest_manager::SuiteStopped {
status,
})),
..Default::default()
},
SuiteEventPayload::DebugData(client) => FidlSuiteEvent {
timestamp: Some(self.timestamp),
payload: Some(FidlSuiteEventPayload::SuiteArtifact(ftest_manager::SuiteArtifact {
artifact: ftest_manager::Artifact::DebugData(client),
})),
..Default::default()
},
}
}
}
fn to_case_result(status: CaseStatus) -> TestCaseResult {
match status {
CaseStatus::Passed => TestCaseResult::Passed,
CaseStatus::Failed => TestCaseResult::Failed,
CaseStatus::TimedOut => TestCaseResult::TimedOut,
CaseStatus::Skipped => TestCaseResult::Skipped,
CaseStatus::Error => TestCaseResult::Error,
_ => TestCaseResult::Error,
}
}
fn to_suite_result(status: SuiteStatus) -> SuiteResult {
match status {
SuiteStatus::Passed => SuiteResult::Finished,
SuiteStatus::Failed => SuiteResult::Failed,
SuiteStatus::DidNotFinish => SuiteResult::DidNotFinish,
SuiteStatus::TimedOut => SuiteResult::TimedOut,
SuiteStatus::Stopped => SuiteResult::Stopped,
SuiteStatus::InternalError => SuiteResult::InternalError,
_ => SuiteResult::InternalError,
}
}
impl Into<FidlEvent> for SuiteEvents {
fn into(self) -> FidlEvent {
match self.payload {
SuiteEventPayload::SuiteStarted => FidlEvent {
timestamp: Some(self.timestamp),
details: Some(FidlEventDetails::SuiteStarted(
ftest_manager::SuiteStartedEventDetails { ..Default::default() },
)),
..Default::default()
},
SuiteEventPayload::CaseFound(name, identifier) => FidlEvent {
timestamp: Some(self.timestamp),
details: Some(FidlEventDetails::TestCaseFound(
ftest_manager::TestCaseFoundEventDetails {
test_case_name: Some(name),
test_case_id: Some(identifier),
..Default::default()
},
)),
..Default::default()
},
SuiteEventPayload::CaseStarted(identifier) => FidlEvent {
timestamp: Some(self.timestamp),
details: Some(FidlEventDetails::TestCaseStarted(
ftest_manager::TestCaseStartedEventDetails {
test_case_id: Some(identifier),
..Default::default()
},
)),
..Default::default()
},
SuiteEventPayload::CaseStopped(identifier, status) => FidlEvent {
timestamp: Some(self.timestamp),
details: Some(FidlEventDetails::TestCaseStopped(
ftest_manager::TestCaseStoppedEventDetails {
test_case_id: Some(identifier),
result: Some(to_case_result(status)),
..Default::default()
},
)),
..Default::default()
},
SuiteEventPayload::CaseFinished(identifier) => FidlEvent {
timestamp: Some(self.timestamp),
details: Some(FidlEventDetails::TestCaseFinished(
ftest_manager::TestCaseFinishedEventDetails {
test_case_id: Some(identifier),
..Default::default()
},
)),
..Default::default()
},
SuiteEventPayload::CaseStdout(identifier, socket) => FidlEvent {
timestamp: Some(self.timestamp),
details: Some(FidlEventDetails::TestCaseArtifactGenerated(
ftest_manager::TestCaseArtifactGeneratedEventDetails {
test_case_id: Some(identifier),
artifact: Some(ftest_manager::Artifact::Stdout(socket)),
..Default::default()
},
)),
..Default::default()
},
SuiteEventPayload::CaseStderr(identifier, socket) => FidlEvent {
timestamp: Some(self.timestamp),
details: Some(FidlEventDetails::TestCaseArtifactGenerated(
ftest_manager::TestCaseArtifactGeneratedEventDetails {
test_case_id: Some(identifier),
artifact: Some(ftest_manager::Artifact::Stderr(socket)),
..Default::default()
},
)),
..Default::default()
},
SuiteEventPayload::CustomArtifact(custom) => FidlEvent {
timestamp: Some(self.timestamp),
details: Some(FidlEventDetails::SuiteArtifactGenerated(
ftest_manager::SuiteArtifactGeneratedEventDetails {
artifact: Some(ftest_manager::Artifact::Custom(custom)),
..Default::default()
},
)),
..Default::default()
},
SuiteEventPayload::SuiteSyslog(syslog) => FidlEvent {
timestamp: Some(self.timestamp),
details: Some(FidlEventDetails::SuiteArtifactGenerated(
ftest_manager::SuiteArtifactGeneratedEventDetails {
artifact: Some(ftest_manager::Artifact::Log(syslog)),
..Default::default()
},
)),
..Default::default()
},
SuiteEventPayload::SuiteStopped(status) => FidlEvent {
timestamp: Some(self.timestamp),
details: Some(FidlEventDetails::SuiteStopped(
ftest_manager::SuiteStoppedEventDetails {
result: Some(to_suite_result(status)),
..Default::default()
},
)),
..Default::default()
},
SuiteEventPayload::DebugData(client) => FidlEvent {
timestamp: Some(self.timestamp),
details: Some(FidlEventDetails::SuiteArtifactGenerated(
ftest_manager::SuiteArtifactGeneratedEventDetails {
artifact: Some(ftest_manager::Artifact::DebugData(client)),
..Default::default()
},
)),
..Default::default()
},
}
}
}
impl SuiteEvents {
pub fn case_found(identifier: u32, name: String) -> Self {
Self {
timestamp: zx::Time::get_monotonic().into_nanos(),
payload: SuiteEventPayload::CaseFound(name, identifier),
}
}
pub fn case_started(identifier: u32) -> Self {
Self {
timestamp: zx::Time::get_monotonic().into_nanos(),
payload: SuiteEventPayload::CaseStarted(identifier),
}
}
pub fn case_stopped(identifier: u32, status: CaseStatus) -> Self {
Self {
timestamp: zx::Time::get_monotonic().into_nanos(),
payload: SuiteEventPayload::CaseStopped(identifier, status),
}
}
pub fn case_finished(identifier: u32) -> Self {
Self {
timestamp: zx::Time::get_monotonic().into_nanos(),
payload: SuiteEventPayload::CaseFinished(identifier),
}
}
pub fn case_stdout(identifier: u32, socket: zx::Socket) -> Self {
Self {
timestamp: zx::Time::get_monotonic().into_nanos(),
payload: SuiteEventPayload::CaseStdout(identifier, socket),
}
}
pub fn case_stderr(identifier: u32, socket: zx::Socket) -> Self {
Self {
timestamp: zx::Time::get_monotonic().into_nanos(),
payload: SuiteEventPayload::CaseStderr(identifier, socket),
}
}
pub fn suite_syslog(syslog: ftest_manager::Syslog) -> Self {
Self {
timestamp: zx::Time::get_monotonic().into_nanos(),
payload: SuiteEventPayload::SuiteSyslog(syslog),
}
}
pub fn suite_custom_artifact(custom: ftest_manager::CustomArtifact) -> Self {
Self {
timestamp: zx::Time::get_monotonic().into_nanos(),
payload: SuiteEventPayload::CustomArtifact(custom),
}
}
pub fn suite_started() -> Self {
Self {
timestamp: zx::Time::get_monotonic().into_nanos(),
payload: SuiteEventPayload::SuiteStarted,
}
}
pub fn suite_stopped(status: SuiteStatus) -> Self {
Self {
timestamp: zx::Time::get_monotonic().into_nanos(),
payload: SuiteEventPayload::SuiteStopped(status),
}
}
pub fn debug_data(client: ClientEnd<DebugDataIteratorMarker>) -> Self {
Self {
timestamp: zx::Time::get_monotonic().into_nanos(),
payload: SuiteEventPayload::DebugData(client),
}
}
#[cfg(test)]
pub fn into_suite_run_event(self) -> FidlSuiteEvent {
self.into()
}
#[cfg(test)]
pub fn into_event(self) -> FidlEvent {
self.into()
}
#[cfg(test)]
pub fn into_payload(self) -> SuiteEventPayload {
self.payload
}
}
#[cfg(test)]
mod tests {
use {super::*, assert_matches::assert_matches};
#[test]
fn suite_events() {
let event = SuiteEvents::case_found(1, "case1".to_string()).into_suite_run_event();
assert_matches!(event.timestamp, Some(_));
assert_eq!(
event.payload,
Some(FidlSuiteEventPayload::CaseFound(ftest_manager::CaseFound {
test_case_name: "case1".into(),
identifier: 1
}))
);
let event = SuiteEvents::case_started(2).into_suite_run_event();
assert_matches!(event.timestamp, Some(_));
assert_eq!(
event.payload,
Some(FidlSuiteEventPayload::CaseStarted(ftest_manager::CaseStarted { identifier: 2 }))
);
let event = SuiteEvents::case_stopped(2, CaseStatus::Failed).into_suite_run_event();
assert_matches!(event.timestamp, Some(_));
assert_eq!(
event.payload,
Some(FidlSuiteEventPayload::CaseStopped(ftest_manager::CaseStopped {
identifier: 2,
status: CaseStatus::Failed
}))
);
let event = SuiteEvents::case_finished(2).into_suite_run_event();
assert_matches!(event.timestamp, Some(_));
assert_eq!(
event.payload,
Some(FidlSuiteEventPayload::CaseFinished(ftest_manager::CaseFinished {
identifier: 2
}))
);
let (sock1, _sock2) = zx::Socket::create_stream();
let event = SuiteEvents::case_stdout(2, sock1).into_suite_run_event();
assert_matches!(event.timestamp, Some(_));
assert_matches!(
event.payload,
Some(FidlSuiteEventPayload::CaseArtifact(ftest_manager::CaseArtifact {
identifier: 2,
artifact: ftest_manager::Artifact::Stdout(_)
}))
);
let (sock1, _sock2) = zx::Socket::create_stream();
let event = SuiteEvents::case_stderr(2, sock1).into_suite_run_event();
assert_matches!(event.timestamp, Some(_));
assert_matches!(
event.payload,
Some(FidlSuiteEventPayload::CaseArtifact(ftest_manager::CaseArtifact {
identifier: 2,
artifact: ftest_manager::Artifact::Stderr(_)
}))
);
let event = SuiteEvents::suite_stopped(SuiteStatus::Failed).into_suite_run_event();
assert_matches!(event.timestamp, Some(_));
assert_eq!(
event.payload,
Some(FidlSuiteEventPayload::SuiteStopped(ftest_manager::SuiteStopped {
status: SuiteStatus::Failed,
}))
);
let (client_end, _server_end) = fuchsia_zircon::Socket::create_stream();
let event = SuiteEvents::suite_syslog(ftest_manager::Syslog::Stream(client_end))
.into_suite_run_event();
assert_matches!(event.timestamp, Some(_));
assert_matches!(
event.payload,
Some(FidlSuiteEventPayload::SuiteArtifact(ftest_manager::SuiteArtifact {
artifact: ftest_manager::Artifact::Log(ftest_manager::Syslog::Stream(_)),
}))
);
let (client_end, _server_end) = fidl::endpoints::create_endpoints();
let event = SuiteEvents::suite_syslog(ftest_manager::Syslog::Batch(client_end))
.into_suite_run_event();
assert_matches!(event.timestamp, Some(_));
assert_matches!(
event.payload,
Some(FidlSuiteEventPayload::SuiteArtifact(ftest_manager::SuiteArtifact {
artifact: ftest_manager::Artifact::Log(ftest_manager::Syslog::Batch(_)),
}))
);
// New Event FIDL type.
let event = SuiteEvents::suite_started().into_event();
assert_matches!(event.timestamp, Some(_));
assert_eq!(
event.details,
Some(FidlEventDetails::SuiteStarted(ftest_manager::SuiteStartedEventDetails {
..Default::default()
}))
);
let event = SuiteEvents::suite_stopped(SuiteStatus::Failed).into_event();
assert_matches!(event.timestamp, Some(_));
assert_eq!(
event.details,
Some(FidlEventDetails::SuiteStopped(ftest_manager::SuiteStoppedEventDetails {
result: Some(SuiteResult::Failed),
..Default::default()
}))
);
let event = SuiteEvents::case_found(1, "case1".to_string()).into_event();
assert_matches!(event.timestamp, Some(_));
assert_eq!(
event.details,
Some(FidlEventDetails::TestCaseFound(ftest_manager::TestCaseFoundEventDetails {
test_case_name: Some("case1".into()),
test_case_id: Some(1),
..Default::default()
}))
);
let event = SuiteEvents::case_started(2).into_event();
assert_matches!(event.timestamp, Some(_));
assert_eq!(
event.details,
Some(FidlEventDetails::TestCaseStarted(ftest_manager::TestCaseStartedEventDetails {
test_case_id: Some(2),
..Default::default()
}))
);
let (sock1, _sock2) = zx::Socket::create_stream();
let event = SuiteEvents::case_stdout(2, sock1).into_event();
assert_matches!(event.timestamp, Some(_));
assert_matches!(
event.details,
Some(FidlEventDetails::TestCaseArtifactGenerated(
ftest_manager::TestCaseArtifactGeneratedEventDetails {
test_case_id: Some(2),
artifact: Some(ftest_manager::Artifact::Stdout(_)),
..
}
))
);
let (sock1, _sock2) = zx::Socket::create_stream();
let event = SuiteEvents::case_stderr(2, sock1).into_event();
assert_matches!(event.timestamp, Some(_));
assert_matches!(
event.details,
Some(FidlEventDetails::TestCaseArtifactGenerated(
ftest_manager::TestCaseArtifactGeneratedEventDetails {
test_case_id: Some(2),
artifact: Some(ftest_manager::Artifact::Stderr(_)),
..
}
))
);
let event = SuiteEvents::case_stopped(2, CaseStatus::Failed).into_event();
assert_matches!(event.timestamp, Some(_));
assert_eq!(
event.details,
Some(FidlEventDetails::TestCaseStopped(ftest_manager::TestCaseStoppedEventDetails {
test_case_id: Some(2),
result: Some(TestCaseResult::Failed),
..Default::default()
}))
);
let event = SuiteEvents::case_finished(2).into_event();
assert_matches!(event.timestamp, Some(_));
assert_eq!(
event.details,
Some(FidlEventDetails::TestCaseFinished(ftest_manager::TestCaseFinishedEventDetails {
test_case_id: Some(2),
..Default::default()
}))
);
let (client_end, _server_end) = fuchsia_zircon::Socket::create_stream();
let event =
SuiteEvents::suite_syslog(ftest_manager::Syslog::Stream(client_end)).into_event();
assert_matches!(event.timestamp, Some(_));
assert_matches!(
event.details,
Some(FidlEventDetails::SuiteArtifactGenerated(
ftest_manager::SuiteArtifactGeneratedEventDetails {
artifact: Some(ftest_manager::Artifact::Log(ftest_manager::Syslog::Stream(_))),
..
}
))
);
let (client_end, _server_end) = fidl::endpoints::create_endpoints();
let event =
SuiteEvents::suite_syslog(ftest_manager::Syslog::Batch(client_end)).into_event();
assert_matches!(event.timestamp, Some(_));
assert_matches!(
event.details,
Some(FidlEventDetails::SuiteArtifactGenerated(
ftest_manager::SuiteArtifactGeneratedEventDetails {
artifact: Some(ftest_manager::Artifact::Log(ftest_manager::Syslog::Batch(_))),
..
}
))
);
let event = SuiteEvents::suite_stopped(SuiteStatus::Failed).into_event();
assert_matches!(event.timestamp, Some(_));
assert_eq!(
event.details,
Some(FidlEventDetails::SuiteStopped(ftest_manager::SuiteStoppedEventDetails {
result: Some(SuiteResult::Failed),
..Default::default()
}))
);
}
}