215 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #[macro_use]
 | |
| extern crate h2_support;
 | |
| 
 | |
| use h2_support::prelude::*;
 | |
| 
 | |
| use std::error::Error;
 | |
| 
 | |
| #[test]
 | |
| fn read_none() {
 | |
|     let mut codec = Codec::from(mock_io::Builder::new().build());
 | |
| 
 | |
|     assert_closed!(codec);
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| #[ignore]
 | |
| fn read_frame_too_big() {}
 | |
| 
 | |
| // ===== DATA =====
 | |
| 
 | |
| #[test]
 | |
| fn read_data_no_padding() {
 | |
|     let mut codec = raw_codec! {
 | |
|         read => [
 | |
|             0, 0, 5, 0, 0, 0, 0, 0, 1,
 | |
|             "hello",
 | |
|         ];
 | |
|     };
 | |
| 
 | |
|     let data = poll_frame!(Data, codec);
 | |
|     assert_eq!(data.stream_id(), 1);
 | |
|     assert_eq!(data.payload(), &b"hello"[..]);
 | |
|     assert!(!data.is_end_stream());
 | |
| 
 | |
|     assert_closed!(codec);
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn read_data_empty_payload() {
 | |
|     let mut codec = raw_codec! {
 | |
|         read => [
 | |
|             0, 0, 0, 0, 0, 0, 0, 0, 1,
 | |
|         ];
 | |
|     };
 | |
| 
 | |
|     let data = poll_frame!(Data, codec);
 | |
|     assert_eq!(data.stream_id(), 1);
 | |
|     assert_eq!(data.payload(), &b""[..]);
 | |
|     assert!(!data.is_end_stream());
 | |
| 
 | |
|     assert_closed!(codec);
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn read_data_end_stream() {
 | |
|     let mut codec = raw_codec! {
 | |
|         read => [
 | |
|             0, 0, 5, 0, 1, 0, 0, 0, 1,
 | |
|             "hello",
 | |
|         ];
 | |
|     };
 | |
| 
 | |
|     let data = poll_frame!(Data, codec);
 | |
|     assert_eq!(data.stream_id(), 1);
 | |
|     assert_eq!(data.payload(), &b"hello"[..]);
 | |
|     assert!(data.is_end_stream());
 | |
| 
 | |
|     assert_closed!(codec);
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn read_data_padding() {
 | |
|     let mut codec = raw_codec! {
 | |
|         read => [
 | |
|             0, 0, 16, 0, 0x8, 0, 0, 0, 1,
 | |
|             5,       // Pad length
 | |
|             "helloworld", // Data
 | |
|             "\0\0\0\0\0", // Padding
 | |
|         ];
 | |
|     };
 | |
| 
 | |
|     let data = poll_frame!(Data, codec);
 | |
|     assert_eq!(data.stream_id(), 1);
 | |
|     assert_eq!(data.payload(), &b"helloworld"[..]);
 | |
|     assert!(!data.is_end_stream());
 | |
| 
 | |
|     assert_closed!(codec);
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn read_push_promise() {
 | |
|     let mut codec = raw_codec! {
 | |
|         read => [
 | |
|             0, 0, 0x5,
 | |
|             0x5, 0x4,
 | |
|             0, 0, 0, 0x1, // stream id
 | |
|             0, 0, 0, 0x2, // promised id
 | |
|             0x82, // HPACK :method="GET"
 | |
|         ];
 | |
|     };
 | |
| 
 | |
|     let pp = poll_frame!(PushPromise, codec);
 | |
|     assert_eq!(pp.stream_id(), 1);
 | |
|     assert_eq!(pp.promised_id(), 2);
 | |
|     assert_eq!(pp.into_parts().0.method, Some(Method::GET));
 | |
| 
 | |
|     assert_closed!(codec);
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn read_data_stream_id_zero() {
 | |
|     let mut codec = raw_codec! {
 | |
|         read => [
 | |
|             0, 0, 5, 0, 0, 0, 0, 0, 0,
 | |
|             "hello", // Data
 | |
|         ];
 | |
|     };
 | |
| 
 | |
|     poll_err!(codec);
 | |
| }
 | |
| 
 | |
| // ===== HEADERS =====
 | |
| 
 | |
| #[test]
 | |
| #[ignore]
 | |
| fn read_headers_without_pseudo() {}
 | |
| 
 | |
| #[test]
 | |
| #[ignore]
 | |
| fn read_headers_with_pseudo() {}
 | |
| 
 | |
| #[test]
 | |
| #[ignore]
 | |
| fn read_headers_empty_payload() {}
 | |
| 
 | |
| #[test]
 | |
| fn read_continuation_frames() {
 | |
|     let _ = ::env_logger::try_init();
 | |
|     let (io, srv) = mock::new();
 | |
| 
 | |
|     let large = build_large_headers();
 | |
|     let frame = large.iter().fold(
 | |
|         frames::headers(1).response(200),
 | |
|         |frame, &(name, ref value)| frame.field(name, &value[..]),
 | |
|     ).eos();
 | |
| 
 | |
|     let srv = srv.assert_client_handshake()
 | |
|         .unwrap()
 | |
|         .recv_settings()
 | |
|         .recv_frame(
 | |
|             frames::headers(1)
 | |
|                 .request("GET", "https://http2.akamai.com/")
 | |
|                 .eos(),
 | |
|         )
 | |
|         .send_frame(frame)
 | |
|         .close();
 | |
| 
 | |
|     let client = client::handshake(io)
 | |
|         .expect("handshake")
 | |
|         .and_then(|(mut client, conn)| {
 | |
|             let request = Request::builder()
 | |
|                 .uri("https://http2.akamai.com/")
 | |
|                 .body(())
 | |
|                 .unwrap();
 | |
| 
 | |
|             let req = client
 | |
|                 .send_request(request, true)
 | |
|                 .expect("send_request")
 | |
|                 .0
 | |
|                 .expect("response")
 | |
|                 .map(move |res| {
 | |
|                     assert_eq!(res.status(), StatusCode::OK);
 | |
|                     let (head, _body) = res.into_parts();
 | |
|                     let expected = large.iter().fold(HeaderMap::new(), |mut map, &(name, ref value)| {
 | |
|                         use h2_support::frames::HttpTryInto;
 | |
|                         map.append(name, value.as_str().try_into().unwrap());
 | |
|                         map
 | |
|                     });
 | |
|                     assert_eq!(head.headers, expected);
 | |
|                 });
 | |
| 
 | |
|             conn.drive(req)
 | |
|                 .and_then(move |(h2, _)| {
 | |
|                     h2.expect("client")
 | |
|                 }).map(|c| (client, c))
 | |
|         });
 | |
| 
 | |
|     client.join(srv).wait().expect("wait");
 | |
| 
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn update_max_frame_len_at_rest() {
 | |
|     let _ = ::env_logger::try_init();
 | |
|     // TODO: add test for updating max frame length in flight as well?
 | |
|     let mut codec = raw_codec! {
 | |
|         read => [
 | |
|             0, 0, 5, 0, 0, 0, 0, 0, 1,
 | |
|             "hello",
 | |
|             0, 64, 1, 0, 0, 0, 0, 0, 1,
 | |
|             vec![0; 16_385],
 | |
|         ];
 | |
|     };
 | |
| 
 | |
|     assert_eq!(poll_frame!(Data, codec).payload(), &b"hello"[..]);
 | |
| 
 | |
|     codec.set_max_recv_frame_size(16_384);
 | |
| 
 | |
|     assert_eq!(codec.max_recv_frame_size(), 16_384);
 | |
|     assert_eq!(
 | |
|         codec.poll().unwrap_err().description(),
 | |
|         "frame with invalid size"
 | |
|     );
 | |
| }
 |