92 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| extern crate pretty_env_logger;
 | |
| 
 | |
| use futures::Async;
 | |
| use futures::future::poll_fn;
 | |
| use tokio::reactor::Core;
 | |
| 
 | |
| use mock::MockConnector;
 | |
| use super::*;
 | |
| 
 | |
| #[test]
 | |
| fn retryable_request() {
 | |
|     let _ = pretty_env_logger::try_init();
 | |
|     let mut core = Core::new().unwrap();
 | |
| 
 | |
|     let mut connector = MockConnector::new();
 | |
| 
 | |
|     let sock1 = connector.mock("http://mock.local/a");
 | |
|     let sock2 = connector.mock("http://mock.local/b");
 | |
| 
 | |
|     let client = Client::configure()
 | |
|         .connector(connector)
 | |
|         .build(&core.handle());
 | |
| 
 | |
| 
 | |
|     {
 | |
|         let res1 = client.get("http://mock.local/a".parse().unwrap());
 | |
|         let srv1 = poll_fn(|| {
 | |
|             try_ready!(sock1.read(&mut [0u8; 512]));
 | |
|             try_ready!(sock1.write(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"));
 | |
|             Ok(Async::Ready(()))
 | |
|         });
 | |
|         core.run(res1.join(srv1)).expect("res1");
 | |
|     }
 | |
|     drop(sock1);
 | |
| 
 | |
|     let res2 = client.get("http://mock.local/b".parse().unwrap())
 | |
|         .map(|res| {
 | |
|             assert_eq!(res.status().as_u16(), 222);
 | |
|         });
 | |
|     let srv2 = poll_fn(|| {
 | |
|         try_ready!(sock2.read(&mut [0u8; 512]));
 | |
|         try_ready!(sock2.write(b"HTTP/1.1 222 OK\r\nContent-Length: 0\r\n\r\n"));
 | |
|         Ok(Async::Ready(()))
 | |
|     });
 | |
| 
 | |
|     core.run(res2.join(srv2)).expect("res2");
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn conn_reset_after_write() {
 | |
|     let _ = pretty_env_logger::try_init();
 | |
|     let mut core = Core::new().unwrap();
 | |
| 
 | |
|     let mut connector = MockConnector::new();
 | |
| 
 | |
|     let sock1 = connector.mock("http://mock.local/a");
 | |
| 
 | |
|     let client = Client::configure()
 | |
|         .connector(connector)
 | |
|         .build(&core.handle());
 | |
| 
 | |
| 
 | |
|     {
 | |
|         let res1 = client.get("http://mock.local/a".parse().unwrap());
 | |
|         let srv1 = poll_fn(|| {
 | |
|             try_ready!(sock1.read(&mut [0u8; 512]));
 | |
|             try_ready!(sock1.write(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"));
 | |
|             Ok(Async::Ready(()))
 | |
|         });
 | |
|         core.run(res1.join(srv1)).expect("res1");
 | |
|     }
 | |
| 
 | |
|     let res2 = client.get("http://mock.local/a".parse().unwrap());
 | |
|     let mut sock1 = Some(sock1);
 | |
|     let srv2 = poll_fn(|| {
 | |
|         // We purposefully keep the socket open until the client
 | |
|         // has written the second request, and THEN disconnect.
 | |
|         //
 | |
|         // Not because we expect servers to be jerks, but to trigger
 | |
|         // state where we write on an assumedly good connetion, and
 | |
|         // only reset the close AFTER we wrote bytes.
 | |
|         try_ready!(sock1.as_mut().unwrap().read(&mut [0u8; 512]));
 | |
|         sock1.take();
 | |
|         Ok(Async::Ready(()))
 | |
|     });
 | |
|     let err = core.run(res2.join(srv2)).expect_err("res2");
 | |
|     match err {
 | |
|         ::Error::Incomplete => (),
 | |
|         other => panic!("expected Incomplete, found {:?}", other)
 | |
|     }
 | |
| }
 |