use tokio::sync::mpsc::UnboundedSender;
use tonic::{Request, Response, Status};
use crate::proto::test::test_executor_server::TestExecutor;
use crate::proto::test::{
Empty, ExternalRunnerSpec, ExternalRunnerSpecRequest, UnstableHeapDumpRequest,
UnstableHeapDumpResponse,
};
pub enum SpecEnvelope {
Spec(Box<ExternalRunnerSpec>),
EndOfRequests,
}
pub type SpecSender = UnboundedSender<SpecEnvelope>;
pub struct ExecutorService {
intake: SpecSender,
}
impl ExecutorService {
pub fn new(intake: SpecSender) -> Self {
Self { intake }
}
}
#[tonic::async_trait]
impl TestExecutor for ExecutorService {
async fn external_runner_spec(
&self,
request: Request<ExternalRunnerSpecRequest>,
) -> Result<Response<Empty>, Status> {
let spec = request.into_inner().test_spec.ok_or_else(|| {
Status::invalid_argument("ExternalRunnerSpecRequest missing test_spec")
})?;
self.intake
.send(SpecEnvelope::Spec(Box::new(spec)))
.map_err(|_| {
Status::unavailable("test runner scheduler is no longer accepting specs")
})?;
Ok(Response::new(Empty {}))
}
async fn end_of_test_requests(
&self,
_request: Request<Empty>,
) -> Result<Response<Empty>, Status> {
self.intake.send(SpecEnvelope::EndOfRequests).map_err(|_| {
Status::unavailable("test runner scheduler is no longer accepting specs")
})?;
Ok(Response::new(Empty {}))
}
async fn unstable_heap_dump(
&self,
_request: Request<UnstableHeapDumpRequest>,
) -> Result<Response<UnstableHeapDumpResponse>, Status> {
Err(Status::unimplemented("quokka does not support heap dumps"))
}
}