xref: /aosp_15_r20/tools/netsim/rust/frontend/src/netsim_test_server.rs (revision cf78ab8cffb8fc9207af348f23af247fb04370a6)
1 //! netsim Rust grpc test server
2 use std::io::Read;
3 use std::sync::Arc;
4 use std::{io, thread};
5 
6 use futures::channel::oneshot;
7 use futures::executor::block_on;
8 use futures::prelude::*;
9 use grpcio::{
10     ChannelBuilder, Environment, ResourceQuota, RpcContext, ServerBuilder, ServerCredentials,
11     UnarySink,
12 };
13 
14 use netsim_proto::frontend::VersionResponse;
15 use netsim_proto::frontend_grpc::{create_frontend_service, FrontendService};
16 
17 #[derive(Clone)]
18 struct FrontendClient;
19 
20 impl FrontendService for FrontendClient {
get_version( &mut self, ctx: RpcContext<'_>, req: protobuf::well_known_types::empty::Empty, sink: UnarySink<VersionResponse>, )21     fn get_version(
22         &mut self,
23         ctx: RpcContext<'_>,
24         req: protobuf::well_known_types::empty::Empty,
25         sink: UnarySink<VersionResponse>,
26     ) {
27         let response = VersionResponse {
28             version: "netsim test server version 0.0.1".to_string(),
29             ..Default::default()
30         };
31         let f = sink
32             .success(response)
33             .map_err(move |e| eprintln!("failed to reply {:?}: {:?}", req, e))
34             .map(|_| ());
35         ctx.spawn(f)
36     }
37 
list_device( &mut self, _ctx: grpcio::RpcContext, _req: protobuf::well_known_types::empty::Empty, _sink: grpcio::UnarySink<netsim_proto::frontend::ListDeviceResponse>, )38     fn list_device(
39         &mut self,
40         _ctx: grpcio::RpcContext,
41         _req: protobuf::well_known_types::empty::Empty,
42         _sink: grpcio::UnarySink<netsim_proto::frontend::ListDeviceResponse>,
43     ) {
44         todo!()
45     }
46 
patch_device( &mut self, _ctx: grpcio::RpcContext, _req: netsim_proto::frontend::PatchDeviceRequest, _sink: grpcio::UnarySink<protobuf::well_known_types::empty::Empty>, )47     fn patch_device(
48         &mut self,
49         _ctx: grpcio::RpcContext,
50         _req: netsim_proto::frontend::PatchDeviceRequest,
51         _sink: grpcio::UnarySink<protobuf::well_known_types::empty::Empty>,
52     ) {
53         todo!()
54     }
55 
reset( &mut self, _ctx: grpcio::RpcContext, _req: protobuf::well_known_types::empty::Empty, _sink: grpcio::UnarySink<protobuf::well_known_types::empty::Empty>, )56     fn reset(
57         &mut self,
58         _ctx: grpcio::RpcContext,
59         _req: protobuf::well_known_types::empty::Empty,
60         _sink: grpcio::UnarySink<protobuf::well_known_types::empty::Empty>,
61     ) {
62         todo!()
63     }
64 
patch_capture( &mut self, _ctx: grpcio::RpcContext, _req: netsim_proto::frontend::PatchCaptureRequest, _sink: grpcio::UnarySink<protobuf::well_known_types::empty::Empty>, )65     fn patch_capture(
66         &mut self,
67         _ctx: grpcio::RpcContext,
68         _req: netsim_proto::frontend::PatchCaptureRequest,
69         _sink: grpcio::UnarySink<protobuf::well_known_types::empty::Empty>,
70     ) {
71         todo!()
72     }
73 
list_capture( &mut self, _ctx: grpcio::RpcContext, _req: protobuf::well_known_types::empty::Empty, _sink: grpcio::UnarySink<netsim_proto::frontend::ListCaptureResponse>, )74     fn list_capture(
75         &mut self,
76         _ctx: grpcio::RpcContext,
77         _req: protobuf::well_known_types::empty::Empty,
78         _sink: grpcio::UnarySink<netsim_proto::frontend::ListCaptureResponse>,
79     ) {
80         todo!()
81     }
82 
get_capture( &mut self, _ctx: grpcio::RpcContext, _req: netsim_proto::frontend::GetCaptureRequest, _sink: grpcio::ServerStreamingSink<netsim_proto::frontend::GetCaptureResponse>, )83     fn get_capture(
84         &mut self,
85         _ctx: grpcio::RpcContext,
86         _req: netsim_proto::frontend::GetCaptureRequest,
87         _sink: grpcio::ServerStreamingSink<netsim_proto::frontend::GetCaptureResponse>,
88     ) {
89         todo!()
90     }
91 }
92 
main()93 fn main() {
94     let env = Arc::new(Environment::new(1));
95     let service = create_frontend_service(FrontendClient);
96 
97     let quota = ResourceQuota::new(Some("HelloServerQuota")).resize_memory(1024 * 1024);
98     let ch_builder = ChannelBuilder::new(env.clone()).set_resource_quota(quota);
99 
100     let mut server = ServerBuilder::new(env)
101         .register_service(service)
102         .channel_args(ch_builder.build_args())
103         .build()
104         .unwrap();
105     let port = server.add_listening_port("127.0.0.1:50051", ServerCredentials::insecure()).unwrap();
106     server.start();
107     println!("listening on port {}", port);
108 
109     let (tx, rx) = oneshot::channel();
110     thread::spawn(move || {
111         println!("Press ENTER to exit...");
112         let _ = io::stdin().read(&mut [0]).unwrap();
113         tx.send(())
114     });
115     let _ = block_on(rx);
116     let _ = block_on(server.shutdown());
117 }
118