|
| 1 | +from collections import OrderedDict |
| 2 | + |
| 3 | +import pytest |
| 4 | + |
| 5 | +from w3lib.http import headers_dict_to_raw, headers_raw_to_dict |
| 6 | + |
| 7 | +pytestmark = pytest.mark.benchmark |
| 8 | + |
| 9 | + |
| 10 | +def _header_case_long_headers(): |
| 11 | + dct = OrderedDict( |
| 12 | + [ |
| 13 | + (b"X-Custom-Header", [b"a" * 1_000]), |
| 14 | + (b"X-Custom-Header-2", [b"b" * 1_000]), |
| 15 | + ] |
| 16 | + ) |
| 17 | + raw = ( |
| 18 | + b"X-Custom-Header: " + b"a" * 1_000 + b"\r\n" |
| 19 | + b"X-Custom-Header-2: " + b"b" * 1_000 |
| 20 | + ) |
| 21 | + return "long_headers", dct, raw |
| 22 | + |
| 23 | + |
| 24 | +def _header_case_many_unique_headers(): |
| 25 | + dct = OrderedDict( |
| 26 | + [(f"Header-{i}".encode(), [f"value-{i}".encode()]) for i in range(100)] |
| 27 | + ) |
| 28 | + raw = b"\r\n".join([f"Header-{i}: value-{i}".encode() for i in range(100)]) |
| 29 | + return "many_unique_headers", dct, raw |
| 30 | + |
| 31 | + |
| 32 | +def _header_case_many_repeated_headers(): |
| 33 | + values = [f"id={i}".encode() for i in range(100)] |
| 34 | + dct = OrderedDict([(b"Set-Cookie", values)]) |
| 35 | + raw = b"\r\n".join([b"Set-Cookie: " + val for val in values]) |
| 36 | + return "many_repeated_headers", dct, raw |
| 37 | + |
| 38 | + |
| 39 | +header_cases = [ |
| 40 | + _header_case_long_headers(), |
| 41 | + _header_case_many_unique_headers(), |
| 42 | + _header_case_many_repeated_headers(), |
| 43 | +] |
| 44 | + |
| 45 | + |
| 46 | +@pytest.mark.parametrize( |
| 47 | + ("_id", "dct", "raw"), |
| 48 | + header_cases, |
| 49 | + ids=[case[0] for case in header_cases], |
| 50 | +) |
| 51 | +class TestBenchmarkHttp: |
| 52 | + def test_bench_dict_to_raw(self, benchmark, _id, dct, raw): # noqa: PT019 |
| 53 | + result = benchmark(lambda: headers_dict_to_raw(dct)) |
| 54 | + assert result == raw |
| 55 | + |
| 56 | + def test_bench_raw_to_dict(self, benchmark, _id, dct, raw): # noqa: PT019 |
| 57 | + result = benchmark(lambda: headers_raw_to_dict(raw)) |
| 58 | + assert result == dct |
0 commit comments