1use anyhow::Error;
6use fidl_fuchsia_kernel as fkernel;
7use fuchsia_runtime::job_default;
8use futures::TryStreamExt;
9
10pub struct RootJob;
12
13impl RootJob {
14 pub async fn serve(
15 mut stream: fkernel::RootJobRequestStream,
16 rights: zx::Rights,
17 ) -> Result<(), Error> {
18 let job = job_default();
19 while let Some(fkernel::RootJobRequest::Get { responder }) = stream.try_next().await? {
20 responder.send(job.duplicate(rights)?)?;
21 }
22 Ok(())
23 }
24}
25
26#[cfg(test)]
27mod tests {
28 use super::*;
29 use fuchsia_async as fasync;
30 use futures::TryFutureExt;
31
32 #[fuchsia::test]
33 async fn has_correct_rights() -> Result<(), Error> {
34 let (proxy, stream) = fidl::endpoints::create_proxy_and_stream::<fkernel::RootJobMarker>();
35 fasync::Task::local(
36 RootJob::serve(stream, zx::Rights::TRANSFER)
37 .unwrap_or_else(|err| panic!("Error serving root job: {}", err)),
38 )
39 .detach();
40
41 let root_job = proxy.get().await?;
42 let info = zx::NullableHandle::from(root_job).basic_info()?;
43 assert_eq!(info.rights, zx::Rights::TRANSFER);
44 Ok(())
45 }
46}