|
1 | | -import setup_utils |
2 | | - |
| 1 | +import struct |
| 2 | +import sys |
| 3 | +from pathlib import Path |
3 | 4 |
|
4 | | -def test_filter_incompatible_multiarch_skips_foreign_arch(monkeypatch): |
5 | | - monkeypatch.setattr(setup_utils, "_linux_multiarch_dirs", lambda: ["x86_64-linux-gnu"]) |
6 | | - paths = [ |
7 | | - "/usr/lib/x86_64-linux-gnu/libpcre2-8.so", |
8 | | - "/usr/lib/i386-linux-gnu/libpcre2-8.so.0", |
9 | | - "/opt/lib/libpcre2-8.so", |
10 | | - ] |
| 5 | +import setup_utils |
11 | 6 |
|
12 | | - result = setup_utils.filter_incompatible_multiarch(paths) |
13 | 7 |
|
14 | | - assert result == [ |
15 | | - "/usr/lib/x86_64-linux-gnu/libpcre2-8.so", |
16 | | - "/opt/lib/libpcre2-8.so", |
17 | | - ] |
| 8 | +def _write_pe_binary(path: Path, optional_magic: int) -> None: |
| 9 | + e_lfanew = 0x80 |
| 10 | + data = bytearray(b"MZ") |
| 11 | + if len(data) < 0x3C: |
| 12 | + data.extend(b"\x00" * (0x3C - len(data))) |
| 13 | + data.extend(struct.pack("<I", e_lfanew)) |
| 14 | + if len(data) < e_lfanew: |
| 15 | + data.extend(b"\x00" * (e_lfanew - len(data))) |
| 16 | + data.extend(b"PE\x00\x00") |
| 17 | + data.extend(b"\x00" * 20) |
| 18 | + data.extend(struct.pack("<H", optional_magic)) |
| 19 | + path.write_bytes(data) |
18 | 20 |
|
19 | 21 |
|
20 | | -def test_filter_incompatible_multiarch_keeps_host_arch(monkeypatch): |
21 | | - monkeypatch.setattr(setup_utils, "_linux_multiarch_dirs", lambda: ["aarch64-linux-gnu"]) |
22 | | - paths = [ |
23 | | - "/usr/lib/x86_64-linux-gnu/libpcre2-8.so", |
24 | | - "/usr/lib/aarch64-linux-gnu/libpcre2-8.so", |
25 | | - "/usr/lib/i386-linux-gnu/libpcre2-8.so.0", |
26 | | - ] |
| 22 | +def test_filter_incompatible_multiarch_filters_elf_32bit(monkeypatch, tmp_path): |
| 23 | + monkeypatch.setattr(setup_utils, "_linux_multiarch_dirs", lambda: ["x86_64-linux-gnu"]) |
| 24 | + monkeypatch.setattr(setup_utils, "_host_pointer_width", lambda: 64) |
| 25 | + lib64 = tmp_path / "libpcre2-8.so" |
| 26 | + lib64.write_bytes(b"\x7fELF\x02" + b"\x00" * 16) |
| 27 | + lib32 = tmp_path / "libpcre2-8-compat.so" |
| 28 | + lib32.write_bytes(b"\x7fELF\x01" + b"\x00" * 16) |
27 | 29 |
|
28 | | - result = setup_utils.filter_incompatible_multiarch(paths) |
| 30 | + result = setup_utils.filter_incompatible_multiarch([str(lib64), str(lib32)]) |
29 | 31 |
|
30 | | - assert result == ["/usr/lib/aarch64-linux-gnu/libpcre2-8.so"] |
| 32 | + assert result == [str(lib64)] |
31 | 33 |
|
32 | 34 |
|
33 | | -def test_filter_incompatible_multiarch_drops_32bit_when_unknown_host(monkeypatch): |
| 35 | +def test_filter_incompatible_multiarch_filters_macho_32bit(monkeypatch, tmp_path): |
| 36 | + monkeypatch.setattr(sys, "platform", "darwin") |
34 | 37 | monkeypatch.setattr(setup_utils, "_linux_multiarch_dirs", lambda: []) |
35 | | - paths = [ |
36 | | - "/usr/lib/i386-linux-gnu/libpcre2-8.so.0", |
37 | | - "/usr/lib/i686-linux-gnu/libpcre2-8.so.0", |
38 | | - "/usr/lib/x86_64-linux-gnu/libpcre2-8.so", |
39 | | - ] |
| 38 | + monkeypatch.setattr(setup_utils, "_host_pointer_width", lambda: 64) |
| 39 | + macho64 = tmp_path / "libpcre2-8.dylib" |
| 40 | + macho32 = tmp_path / "libpcre2-8-compat.dylib" |
| 41 | + macho64.write_bytes(struct.pack(">I", 0xCFFAEDFE)) |
| 42 | + macho32.write_bytes(struct.pack(">I", 0xCEFAEDFE)) |
40 | 43 |
|
41 | | - result = setup_utils.filter_incompatible_multiarch(paths) |
| 44 | + result = setup_utils.filter_incompatible_multiarch([str(macho64), str(macho32)]) |
42 | 45 |
|
43 | | - assert result == ["/usr/lib/x86_64-linux-gnu/libpcre2-8.so"] |
| 46 | + assert result == [str(macho64)] |
44 | 47 |
|
45 | 48 |
|
46 | | -def test_filter_incompatible_multiarch_drops_32bit_arm(monkeypatch): |
47 | | - monkeypatch.setattr(setup_utils, "_linux_multiarch_dirs", lambda: ["aarch64-linux-gnu"]) |
48 | | - paths = [ |
49 | | - "/usr/lib/arm-linux-gnueabihf/libpcre2-8.so.0", |
50 | | - "/usr/lib/aarch64-linux-gnu/libpcre2-8.so", |
51 | | - ] |
| 49 | +def test_filter_incompatible_multiarch_filters_pe32(monkeypatch, tmp_path): |
| 50 | + monkeypatch.setattr(sys, "platform", "win32") |
| 51 | + monkeypatch.setattr(setup_utils, "_linux_multiarch_dirs", lambda: []) |
| 52 | + monkeypatch.setattr(setup_utils, "_host_pointer_width", lambda: 64) |
| 53 | + pe64 = tmp_path / "pcre2-8.dll" |
| 54 | + pe32 = tmp_path / "pcre2-8-compat.dll" |
| 55 | + _write_pe_binary(pe64, 0x20B) |
| 56 | + _write_pe_binary(pe32, 0x10B) |
52 | 57 |
|
53 | | - result = setup_utils.filter_incompatible_multiarch(paths) |
| 58 | + result = setup_utils.filter_incompatible_multiarch([str(pe64), str(pe32)]) |
54 | 59 |
|
55 | | - assert result == ["/usr/lib/aarch64-linux-gnu/libpcre2-8.so"] |
| 60 | + assert result == [str(pe64)] |
0 commit comments