|
| 1 | +import os |
1 | 2 | import pickle |
2 | 3 | from pathlib import Path |
3 | 4 |
|
4 | 5 | import pytest |
5 | 6 |
|
6 | | -here = Path(__file__).resolve().parent |
| 7 | +WRITE_PICKLE_FILES = bool(os.environ.get("WRITE_PICKLE_FILES")) |
7 | 8 |
|
8 | 9 |
|
9 | | -def test_pickle(any_multidict_class, pickle_protocol): |
10 | | - d = any_multidict_class([("a", 1), ("a", 2)]) |
11 | | - pbytes = pickle.dumps(d, pickle_protocol) |
12 | | - obj = pickle.loads(pbytes) |
13 | | - assert d == obj |
14 | | - assert isinstance(obj, any_multidict_class) |
| 10 | +def test_unpickle(any_multidict_class, dict_data, pickled_data): |
| 11 | + expected = any_multidict_class(dict_data) |
| 12 | + actual = pickle.loads(pickled_data) |
| 13 | + assert actual == expected |
| 14 | + assert isinstance(actual, any_multidict_class) |
15 | 15 |
|
16 | 16 |
|
17 | | -def test_pickle_proxy(any_multidict_class, any_multidict_proxy_class): |
18 | | - d = any_multidict_class([("a", 1), ("a", 2)]) |
| 17 | +def test_pickle_proxy(any_multidict_class, any_multidict_proxy_class, dict_data): |
| 18 | + d = any_multidict_class(dict_data) |
19 | 19 | proxy = any_multidict_proxy_class(d) |
20 | 20 | with pytest.raises(TypeError): |
21 | 21 | pickle.dumps(proxy) |
22 | 22 |
|
23 | 23 |
|
24 | | -def test_load_from_file(any_multidict_class, multidict_implementation, pickle_protocol): |
25 | | - multidict_class_name = any_multidict_class.__name__ |
26 | | - pickle_file_basename = "-".join( |
27 | | - ( |
28 | | - multidict_class_name.lower(), |
29 | | - multidict_implementation.tag, |
30 | | - ) |
31 | | - ) |
32 | | - d = any_multidict_class([("a", 1), ("a", 2)]) |
33 | | - fname = f"{pickle_file_basename}.pickle.{pickle_protocol}" |
34 | | - p = here / fname |
35 | | - with p.open("rb") as f: |
36 | | - obj = pickle.load(f) |
37 | | - assert d == obj |
38 | | - assert isinstance(obj, any_multidict_class) |
| 24 | +def test_pickle_format_stability(pickled_data, pickle_file_path, pickle_protocol): |
| 25 | + if pickle_protocol == 0: |
| 26 | + # TODO: consider updating pickle files |
| 27 | + pytest.skip(reason="Format for pickle protocol 0 is changed, it's a known fact") |
| 28 | + expected = pickle_file_path.read_bytes() |
| 29 | + assert pickled_data == expected |
| 30 | + |
| 31 | + |
| 32 | +def test_pickle_backward_compatibility( |
| 33 | + any_multidict_class, |
| 34 | + dict_data, |
| 35 | + pickle_file_path, |
| 36 | +): |
| 37 | + expected = any_multidict_class(dict_data) |
| 38 | + with pickle_file_path.open("rb") as f: |
| 39 | + actual = pickle.load(f) |
| 40 | + |
| 41 | + assert actual == expected |
| 42 | + assert isinstance(actual, any_multidict_class) |
| 43 | + |
| 44 | + |
| 45 | +@pytest.mark.skipif( |
| 46 | + not WRITE_PICKLE_FILES, |
| 47 | + reason="This is a helper that writes pickle test files", |
| 48 | +) |
| 49 | +def test_write_pickle_file(pickled_data: bytes, pickle_file_path: Path) -> None: |
| 50 | + pickle_file_path.write_bytes(pickled_data) |
0 commit comments