Skip to content

Commit 1d64e1c

Browse files
committed
test(decompression-plz): added tests for single and multi compression
1 parent 10d7002 commit 1d64e1c

File tree

7 files changed

+164
-23
lines changed

7 files changed

+164
-23
lines changed

decompression-plz/src/decompression/dstruct.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -301,12 +301,12 @@ mod tests {
301301
fn test_push_last_encoding_multi_header() {
302302
let encoding_info = all_encoding_info_multi_header();
303303
let to_verify = vec![
304-
EncodingInfo::new(0, vec![ContentEncoding::Brotli]),
305-
EncodingInfo::new(1, vec![ContentEncoding::Deflate]),
306-
EncodingInfo::new(2, vec![ContentEncoding::Identity]),
307-
EncodingInfo::new(3, vec![ContentEncoding::Gzip]),
304+
EncodingInfo::new(1, vec![ContentEncoding::Brotli]),
305+
EncodingInfo::new(3, vec![ContentEncoding::Deflate]),
306+
EncodingInfo::new(5, vec![ContentEncoding::Identity]),
307+
EncodingInfo::new(7, vec![ContentEncoding::Gzip]),
308308
EncodingInfo::new(
309-
4,
309+
9,
310310
vec![ContentEncoding::Zstd, ContentEncoding::Brotli],
311311
),
312312
];

decompression-plz/tests-utils/src/lib.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ use header_plz::body_headers::{
77

88
pub const INPUT: &[u8] = b"hello world";
99

10+
pub const ALL_COMPRESSIONS: &str = "br, deflate, gzip, zstd";
11+
1012
pub fn all_compressed_data() -> Vec<u8> {
1113
let brotli_compressed = compress_brotli(INPUT);
1214
let deflate_compressed = compress_deflate(&brotli_compressed);
@@ -29,11 +31,11 @@ pub fn single_compression(encoding: &ContentEncoding) -> Vec<u8> {
2931

3032
pub fn all_encoding_info_multi_header() -> Vec<EncodingInfo> {
3133
vec![
32-
EncodingInfo::new(0, vec![ContentEncoding::Brotli]),
33-
EncodingInfo::new(1, vec![ContentEncoding::Deflate]),
34-
EncodingInfo::new(2, vec![ContentEncoding::Identity]),
35-
EncodingInfo::new(3, vec![ContentEncoding::Gzip]),
36-
EncodingInfo::new(4, vec![ContentEncoding::Zstd]),
34+
EncodingInfo::new(1, vec![ContentEncoding::Brotli]),
35+
EncodingInfo::new(3, vec![ContentEncoding::Deflate]),
36+
EncodingInfo::new(5, vec![ContentEncoding::Identity]),
37+
EncodingInfo::new(7, vec![ContentEncoding::Gzip]),
38+
EncodingInfo::new(9, vec![ContentEncoding::Zstd]),
3739
]
3840
}
3941

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
use super::*;
2+
pub mod multi_compression;
23
pub mod no_encodings;
34
pub mod single_compression;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
use header_plz::body_headers::content_encoding::ContentEncoding;
2+
use tests_utils::{ALL_COMPRESSIONS, all_compressed_data};
3+
4+
use super::*;
5+
mod multi_header;
6+
mod single_header;
7+
8+
fn run_case_multi_compression(
9+
f: fn(&DecodeState<TestMessage>) -> bool,
10+
mut tm: TestMessage,
11+
verify: &str,
12+
) {
13+
let mut buf = BytesMut::new();
14+
let mut state = DecodeState::init(&mut tm, &mut buf);
15+
state = state.try_next().unwrap();
16+
assert!((f)(&state));
17+
state = state.try_next().unwrap();
18+
assert!(matches!(state, DecodeState::UpdateContentLength(_)));
19+
state = state.try_next().unwrap();
20+
assert!(matches!(state, DecodeState::End));
21+
22+
let result = tm.into_bytes();
23+
assert_eq!(result, verify);
24+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
use header_plz::const_headers::{CONTENT_ENCODING, TRANSFER_ENCODING};
2+
3+
use super::*;
4+
5+
fn build_test_message_all_encodings_multi_header(
6+
header_name: &str,
7+
) -> TestMessage {
8+
let body: Vec<u8> = all_compressed_data();
9+
let headers = format!(
10+
"Host: example.com\r\n\
11+
{}: br\r\n\
12+
Content-Type: text/html; charset=utf-8\r\n\
13+
{}: deflate\r\n\
14+
random: random\r\n\
15+
{}: identity\r\n\
16+
another-random: random\r\n\
17+
{}: gzip\r\n\
18+
test-header: test-header\r\n\
19+
{}: zstd\r\n\
20+
Content-Length: {}\r\n\r\n",
21+
header_name,
22+
header_name,
23+
header_name,
24+
header_name,
25+
header_name,
26+
body.len()
27+
);
28+
29+
let mut tm = TestMessage::build(
30+
headers.as_bytes().into(),
31+
Body::Raw(body.as_slice().into()),
32+
None,
33+
);
34+
tm
35+
}
36+
37+
const VERIFY: &str = "Host: example.com\r\n\
38+
Content-Type: text/html; charset=utf-8\r\n\
39+
random: random\r\n\
40+
another-random: random\r\n\
41+
test-header: test-header\r\n\
42+
Content-Length: 11\r\n\r\n\
43+
hello world";
44+
45+
#[test]
46+
fn assert_decode_state_ce_all_multi_header() {
47+
let tm = build_test_message_all_encodings_multi_header(CONTENT_ENCODING);
48+
49+
let f = move |s: &DecodeState<TestMessage>| {
50+
matches!(s, DecodeState::ContentEncoding(_, _))
51+
};
52+
run_case_multi_compression(f, tm, VERIFY);
53+
}
54+
55+
#[test]
56+
fn assert_decode_state_te_all_multi_header() {
57+
let tm = build_test_message_all_encodings_multi_header(TRANSFER_ENCODING);
58+
let f = move |s: &DecodeState<TestMessage>| {
59+
matches!(s, DecodeState::TransferEncoding(_, _))
60+
};
61+
run_case_multi_compression(f, tm, VERIFY);
62+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
use header_plz::const_headers::{CONTENT_ENCODING, TRANSFER_ENCODING};
2+
3+
use super::*;
4+
5+
fn build_test_message_all_encodings_single_header(
6+
header_name: &str,
7+
) -> TestMessage {
8+
let body: Vec<u8> = all_compressed_data();
9+
let headers = format!(
10+
"Host: example.com\r\n\
11+
Content-Type: text/html; charset=utf-8\r\n\
12+
{}: {}\r\n\
13+
Content-Length: {}\r\n\r\n",
14+
header_name,
15+
ALL_COMPRESSIONS,
16+
body.len()
17+
);
18+
19+
let mut tm = TestMessage::build(
20+
headers.as_bytes().into(),
21+
Body::Raw(body.as_slice().into()),
22+
None,
23+
);
24+
tm
25+
}
26+
27+
const VERIFY: &str = "Host: example.com\r\n\
28+
Content-Type: text/html; charset=utf-8\r\n\
29+
Content-Length: 11\r\n\r\n\
30+
hello world";
31+
32+
#[test]
33+
fn assert_decode_state_ce_all_single_header() {
34+
let tm = build_test_message_all_encodings_single_header(CONTENT_ENCODING);
35+
36+
let f = move |s: &DecodeState<TestMessage>| {
37+
matches!(s, DecodeState::ContentEncoding(_, _))
38+
};
39+
run_case_multi_compression(f, tm, VERIFY);
40+
}
41+
42+
#[test]
43+
fn assert_decode_state_te_all_single_header() {
44+
let tm = build_test_message_all_encodings_single_header(TRANSFER_ENCODING);
45+
let f = move |s: &DecodeState<TestMessage>| {
46+
matches!(s, DecodeState::TransferEncoding(_, _))
47+
};
48+
run_case_multi_compression(f, tm, VERIFY);
49+
}

decompression-plz/tests/test_cases/single_compression.rs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ use tests_utils::single_compression;
33

44
use super::*;
55

6-
fn run_case(case: &Case, content_encoding: ContentEncoding) {
6+
fn run_case_single_compression(
7+
case: &Case,
8+
content_encoding: ContentEncoding,
9+
) {
710
let body: Vec<u8> = single_compression(&content_encoding);
811
let headers = format!(
912
"Host: example.com\r\n\
@@ -45,7 +48,7 @@ fn assert_decode_state_single_te_brotli() {
4548
header_name: "Transfer-Encoding",
4649
expected_state: |s| matches!(s, DecodeState::TransferEncoding(_, _)),
4750
};
48-
run_case(&case, ContentEncoding::Brotli);
51+
run_case_single_compression(&case, ContentEncoding::Brotli);
4952
}
5053

5154
#[test]
@@ -54,7 +57,7 @@ fn assert_decode_state_single_te_compress() {
5457
header_name: "Transfer-Encoding",
5558
expected_state: |s| matches!(s, DecodeState::TransferEncoding(_, _)),
5659
};
57-
run_case(&case, ContentEncoding::Compress);
60+
run_case_single_compression(&case, ContentEncoding::Compress);
5861
}
5962

6063
#[test]
@@ -63,7 +66,7 @@ fn assert_decode_state_single_te_deflate() {
6366
header_name: "Transfer-Encoding",
6467
expected_state: |s| matches!(s, DecodeState::TransferEncoding(_, _)),
6568
};
66-
run_case(&case, ContentEncoding::Deflate);
69+
run_case_single_compression(&case, ContentEncoding::Deflate);
6770
}
6871

6972
#[test]
@@ -72,7 +75,7 @@ fn assert_decode_state_single_te_gzip() {
7275
header_name: "Transfer-Encoding",
7376
expected_state: |s| matches!(s, DecodeState::TransferEncoding(_, _)),
7477
};
75-
run_case(&case, ContentEncoding::Gzip);
78+
run_case_single_compression(&case, ContentEncoding::Gzip);
7679
}
7780

7881
#[test]
@@ -81,7 +84,7 @@ fn assert_decode_state_single_te_identity() {
8184
header_name: "Transfer-Encoding",
8285
expected_state: |s| matches!(s, DecodeState::TransferEncoding(_, _)),
8386
};
84-
run_case(&case, ContentEncoding::Identity);
87+
run_case_single_compression(&case, ContentEncoding::Identity);
8588
}
8689

8790
#[test]
@@ -90,7 +93,7 @@ fn assert_decode_state_single_te_zstd() {
9093
header_name: "Transfer-Encoding",
9194
expected_state: |s| matches!(s, DecodeState::TransferEncoding(_, _)),
9295
};
93-
run_case(&case, ContentEncoding::Zstd);
96+
run_case_single_compression(&case, ContentEncoding::Zstd);
9497
}
9598

9699
// CE only
@@ -100,7 +103,7 @@ fn assert_decode_state_single_ce_brotli() {
100103
header_name: "Content-Encoding",
101104
expected_state: |s| matches!(s, DecodeState::ContentEncoding(_, _)),
102105
};
103-
run_case(&case, ContentEncoding::Brotli);
106+
run_case_single_compression(&case, ContentEncoding::Brotli);
104107
}
105108

106109
#[test]
@@ -109,7 +112,7 @@ fn assert_decode_state_single_ce_compress() {
109112
header_name: "Content-Encoding",
110113
expected_state: |s| matches!(s, DecodeState::ContentEncoding(_, _)),
111114
};
112-
run_case(&case, ContentEncoding::Compress);
115+
run_case_single_compression(&case, ContentEncoding::Compress);
113116
}
114117

115118
#[test]
@@ -118,7 +121,7 @@ fn assert_decode_state_single_ce_deflate() {
118121
header_name: "Content-Encoding",
119122
expected_state: |s| matches!(s, DecodeState::ContentEncoding(_, _)),
120123
};
121-
run_case(&case, ContentEncoding::Deflate);
124+
run_case_single_compression(&case, ContentEncoding::Deflate);
122125
}
123126

124127
#[test]
@@ -127,7 +130,7 @@ fn assert_decode_state_single_ce_gzip() {
127130
header_name: "Content-Encoding",
128131
expected_state: |s| matches!(s, DecodeState::ContentEncoding(_, _)),
129132
};
130-
run_case(&case, ContentEncoding::Gzip);
133+
run_case_single_compression(&case, ContentEncoding::Gzip);
131134
}
132135

133136
#[test]
@@ -136,7 +139,7 @@ fn assert_decode_state_single_ce_identity() {
136139
header_name: "Content-Encoding",
137140
expected_state: |s| matches!(s, DecodeState::ContentEncoding(_, _)),
138141
};
139-
run_case(&case, ContentEncoding::Identity);
142+
run_case_single_compression(&case, ContentEncoding::Identity);
140143
}
141144

142145
#[test]
@@ -145,5 +148,5 @@ fn assert_decode_state_single_ce_zstd() {
145148
header_name: "Content-Encoding",
146149
expected_state: |s| matches!(s, DecodeState::ContentEncoding(_, _)),
147150
};
148-
run_case(&case, ContentEncoding::Zstd);
151+
run_case_single_compression(&case, ContentEncoding::Zstd);
149152
}

0 commit comments

Comments
 (0)