capnproto / capnp-rpc-rust

Cap'n Proto RPC for Rust
125 stars 16 forks source link

Unit testing seems to be difficult #27

Open steveej opened 6 years ago

steveej commented 6 years ago

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 ;-)

dwrensha commented 6 years ago

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?

steveej commented 6 years ago

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.

dwrensha commented 6 years ago

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.