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