2019-12-29 08:42:42 +01:00
|
|
|
use std::cell::Cell;
|
|
|
|
use std::rc::Rc;
|
2019-07-03 09:02:03 +02:00
|
|
|
|
|
|
|
use actix_codec::BytesCodec;
|
2019-12-29 08:42:42 +01:00
|
|
|
use actix_service::{fn_factory_with_config, fn_service, IntoService, Service};
|
2019-11-25 16:49:11 +01:00
|
|
|
use actix_testing::TestServer;
|
2019-12-29 08:42:42 +01:00
|
|
|
use actix_utils::mpsc;
|
|
|
|
use bytes::{Bytes, BytesMut};
|
2019-11-14 13:38:24 +01:00
|
|
|
use futures::future::ok;
|
2019-07-03 09:02:03 +02:00
|
|
|
|
2019-12-29 08:42:42 +01:00
|
|
|
use actix_ioframe::{Builder, Connect, FactoryBuilder};
|
2019-07-03 09:02:03 +02:00
|
|
|
|
2019-12-02 16:27:48 +01:00
|
|
|
#[derive(Clone)]
|
2019-12-29 08:42:42 +01:00
|
|
|
struct State(Option<mpsc::Sender<Bytes>>);
|
2019-07-03 09:02:03 +02:00
|
|
|
|
2019-11-25 16:49:11 +01:00
|
|
|
#[actix_rt::test]
|
2019-12-29 08:42:42 +01:00
|
|
|
async fn test_basic() {
|
|
|
|
let client_item = Rc::new(Cell::new(false));
|
2019-07-03 09:02:03 +02:00
|
|
|
|
2019-09-25 05:51:28 +02:00
|
|
|
let srv = TestServer::with(move || {
|
2019-12-29 08:42:42 +01:00
|
|
|
FactoryBuilder::new(fn_service(|conn: Connect<_, _>| {
|
|
|
|
ok(conn.codec(BytesCodec).state(State(None)))
|
|
|
|
}))
|
|
|
|
// echo
|
|
|
|
.build(fn_service(|t: BytesMut| ok(Some(t.freeze()))))
|
2019-07-03 09:02:03 +02:00
|
|
|
});
|
|
|
|
|
2019-12-29 08:42:42 +01:00
|
|
|
let item = client_item.clone();
|
|
|
|
let mut client = Builder::new(fn_service(move |conn: Connect<_, _>| {
|
|
|
|
async move {
|
|
|
|
let (tx, rx) = mpsc::channel();
|
|
|
|
let _ = tx.send(Bytes::from_static(b"Hello"));
|
|
|
|
Ok(conn.codec(BytesCodec).out(rx).state(State(Some(tx))))
|
|
|
|
}
|
|
|
|
}))
|
|
|
|
.build(fn_factory_with_config(move |mut cfg: State| {
|
|
|
|
let item = item.clone();
|
|
|
|
ok((move |t: BytesMut| {
|
|
|
|
assert_eq!(t.freeze(), Bytes::from_static(b"Hello"));
|
|
|
|
item.set(true);
|
|
|
|
// drop Sender, which will close connection
|
|
|
|
cfg.0.take();
|
|
|
|
ok::<_, ()>(None)
|
2019-07-03 09:02:03 +02:00
|
|
|
})
|
2019-12-29 08:42:42 +01:00
|
|
|
.into_service())
|
|
|
|
}));
|
2019-07-03 09:02:03 +02:00
|
|
|
|
2019-11-25 16:49:11 +01:00
|
|
|
let conn = actix_connect::default_connector()
|
|
|
|
.call(actix_connect::Connect::with(String::new(), srv.addr()))
|
|
|
|
.await
|
|
|
|
.unwrap();
|
2019-07-03 09:02:03 +02:00
|
|
|
|
2019-11-25 16:49:11 +01:00
|
|
|
client.call(conn.into_parts().0).await.unwrap();
|
2019-12-29 08:42:42 +01:00
|
|
|
assert!(client_item.get());
|
2019-07-03 09:02:03 +02:00
|
|
|
}
|