Skip to content

Commit c56842a

Browse files
committed
test(decompression-plz): added tests for extra body
1 parent e9492b3 commit c56842a

File tree

16 files changed

+578
-126
lines changed

16 files changed

+578
-126
lines changed

decompression-plz/src/decompression/state.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,10 @@ impl<'a> DecompressionState<'a> {
184184
|| matches!(self, Self::EndExtraMainSeparate(..))
185185
|| matches!(self, Self::EndExtraRawMainDone(..))
186186
}
187+
188+
pub fn is_extra_raw(&self) -> bool {
189+
matches!(self, Self::EndExtraRawMainDone(..))
190+
}
187191
}
188192

189193
impl<'a> From<DecompressionState<'a>> for (BytesMut, Option<BytesMut>) {

decompression-plz/src/state.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ fn apply_encoding<T>(
118118
encoding_info: &mut [EncodingInfo],
119119
) -> Result<(), MultiDecompressErrorReason>
120120
where
121-
T: DecompressTrait,
121+
T: DecompressTrait + std::fmt::Debug,
122122
{
123123
match decompression_runner(
124124
&decode_struct.body,
@@ -127,7 +127,12 @@ where
127127
decode_struct.buf,
128128
) {
129129
Ok(state) => {
130-
(decode_struct.body, decode_struct.extra_body) = state.into();
130+
let is_extra_raw = state.is_extra_raw();
131+
let (body, extra_body) = state.into();
132+
decode_struct.body = body;
133+
if !is_extra_raw {
134+
decode_struct.extra_body = extra_body;
135+
}
131136
let iter = encoding_info.iter().map(|einfo| einfo.header_index);
132137
// remove applied headers
133138
decode_struct

decompression-plz/tests/test_cases/single_compression.rs

Lines changed: 0 additions & 124 deletions
This file was deleted.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
use super::*;
2+
3+
// CE only
4+
#[test]
5+
fn assert_decode_state_single_ce_brotli() {
6+
assert_case_single_compression(
7+
CONTENT_ENCODING,
8+
ContentEncoding::Brotli,
9+
None,
10+
);
11+
}
12+
13+
#[test]
14+
fn assert_decode_state_single_ce_compress() {
15+
assert_case_single_compression(
16+
CONTENT_ENCODING,
17+
ContentEncoding::Compress,
18+
None,
19+
);
20+
}
21+
22+
#[test]
23+
fn assert_decode_state_single_ce_deflate() {
24+
assert_case_single_compression(
25+
CONTENT_ENCODING,
26+
ContentEncoding::Deflate,
27+
None,
28+
);
29+
}
30+
31+
#[test]
32+
fn assert_decode_state_single_ce_gzip() {
33+
assert_case_single_compression(
34+
CONTENT_ENCODING,
35+
ContentEncoding::Gzip,
36+
None,
37+
);
38+
}
39+
40+
#[test]
41+
fn assert_decode_state_single_ce_identity() {
42+
assert_case_single_compression(
43+
CONTENT_ENCODING,
44+
ContentEncoding::Identity,
45+
None,
46+
);
47+
}
48+
49+
#[test]
50+
fn assert_decode_state_single_ce_zstd() {
51+
assert_case_single_compression(
52+
CONTENT_ENCODING,
53+
ContentEncoding::Zstd,
54+
None,
55+
);
56+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
use super::*;
2+
mod ce;
3+
mod te;
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
use super::*;
2+
3+
// Transfer-Encoding
4+
#[test]
5+
fn assert_decode_state_single_te_brotli() {
6+
assert_case_single_compression(
7+
TRANSFER_ENCODING,
8+
ContentEncoding::Brotli,
9+
None,
10+
);
11+
}
12+
13+
#[test]
14+
fn assert_decode_state_single_te_compress() {
15+
assert_case_single_compression(
16+
TRANSFER_ENCODING,
17+
ContentEncoding::Compress,
18+
None,
19+
);
20+
}
21+
22+
#[test]
23+
fn assert_decode_state_single_te_deflate() {
24+
assert_case_single_compression(
25+
TRANSFER_ENCODING,
26+
ContentEncoding::Deflate,
27+
None,
28+
);
29+
}
30+
31+
#[test]
32+
fn assert_decode_state_single_te_gzip() {
33+
assert_case_single_compression(
34+
TRANSFER_ENCODING,
35+
ContentEncoding::Gzip,
36+
None,
37+
);
38+
}
39+
40+
#[test]
41+
fn assert_decode_state_single_te_identity() {
42+
assert_case_single_compression(
43+
TRANSFER_ENCODING,
44+
ContentEncoding::Identity,
45+
None,
46+
);
47+
}
48+
49+
#[test]
50+
fn assert_decode_state_single_te_zstd() {
51+
assert_case_single_compression(
52+
TRANSFER_ENCODING,
53+
ContentEncoding::Zstd,
54+
None,
55+
);
56+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
use header_plz::{
2+
body_headers::content_encoding::ContentEncoding,
3+
const_headers::{CONTENT_ENCODING, TRANSFER_ENCODING},
4+
};
5+
use tests_utils::single_compression;
6+
7+
use super::*;
8+
mod body_only;
9+
mod with_extra;
10+
11+
fn assert_case_single_compression(
12+
header_name: &str,
13+
content_encoding: ContentEncoding,
14+
extra: Option<BytesMut>,
15+
) {
16+
let body: Vec<u8> = single_compression(&content_encoding);
17+
let headers = format!(
18+
"Host: example.com\r\n\
19+
Content-Type: text/html; charset=utf-8\r\n\
20+
{}: {}\r\n\
21+
Content-Length: {}\r\n\r\n",
22+
header_name,
23+
content_encoding.as_ref(),
24+
body.len()
25+
);
26+
27+
let expected_state = encoding_state(header_name);
28+
let with_extra = extra.is_some();
29+
let mut tm = TestMessage::build(
30+
headers.as_bytes().into(),
31+
Body::Raw(body.as_slice().into()),
32+
extra,
33+
);
34+
let mut buf = BytesMut::new();
35+
let mut state = DecodeState::init(&mut tm, &mut buf);
36+
state = state.try_next().unwrap();
37+
assert!((expected_state)(&state));
38+
state = state.try_next().unwrap();
39+
assert!(matches!(state, DecodeState::UpdateContentLength(_)));
40+
state = state.try_next().unwrap();
41+
assert!(state.is_ended());
42+
43+
let verify = if with_extra {
44+
"Host: example.com\r\n\
45+
Content-Type: text/html; charset=utf-8\r\n\
46+
Content-Length: 22\r\n\r\n\
47+
hello worldhello world"
48+
} else {
49+
"Host: example.com\r\n\
50+
Content-Type: text/html; charset=utf-8\r\n\
51+
Content-Length: 11\r\n\r\n\
52+
hello world"
53+
};
54+
let result = tm.into_bytes();
55+
assert_eq!(result, verify);
56+
}

0 commit comments

Comments
 (0)