capnp-rpc-rust icon indicating copy to clipboard operation
capnp-rpc-rust copied to clipboard

Unit testing seems to be difficult

Open steveej opened this issue 6 years ago • 3 comments

I've just gotten started using this crate and I'm struggling with something rather simple. Here's a snippet of my code, which is supposed to build a greeting message:

impl Server for Proxy {
    fn hello(&mut self,
            params: HelloParams<>,
            mut results: HelloResults<>)
            -> ::capnp::capability::Promise<(), ::capnp::Error> {

        results
            .get()
            .set_greetings(&format!("Hello {}", pry!(params.get()).get_name().unwrap()));
        ::capnp::capability::Promise::ok(())
    }
}

I would like to write a unit test for this, but no matter which approach I try it seems too difficult to immitate capnp's internals. I'd be happy about any pointers on how to approach this, or if someone could point out any mistakes I've already made ;-)

steveej avatar Jan 19 '18 15:01 steveej

It's possible to turn your Proxy object into a Client and then call it directly, without needing to construct any RpcSystem. There are some examples of this in the test suite: https://github.com/capnproto/capnp-rpc-rust/blob/69859603b6c14fcec1c46458649602fc12bc6982/test/test.rs#L823-L834

Does that work for you?

dwrensha avatar Jan 20 '18 21:01 dwrensha

Thanks @dwrensha. That snippet allowed me to construct this simple testcase, although I haven't yet grasped what is happening internally.

    #[test]
    fn proxy_server_hello() {
        let client =
            ::proxy_capnp::proxy::ToClient::new(Proxy {}).from_server::<::capnp_rpc::Server>();
        let mut request = client.hello_request();
        request.get().set_name("Proxy");
        let response = request.send().promise.wait().unwrap();
        assert_eq!(
            response.get().unwrap().get_greetings().unwrap(),
            "Hello Proxy"
        );
    }

Is there a document where the mechanics of client/server is described? If not, since it's not self-explanatory I'm happy to help build some beginner friendly docs.

steveej avatar Jan 21 '18 15:01 steveej

I think the important thing to remember is: a Server is something you implement, and a Client is something you call.

The main documentation we have for this stuff right now is in the README.md at the root of the capnp-rpc-rust repo. That could certainly be expanded upon.

dwrensha avatar Jan 21 '18 21:01 dwrensha