File: test_repair.py

package info (click to toggle)
python-auditwheel 5.3.0%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 816 kB
  • sloc: python: 4,270; ansic: 205; cpp: 58; makefile: 20; f90: 12
file content (115 lines) | stat: -rw-r--r-- 4,652 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import os
from unittest.mock import call, patch

from auditwheel.patcher import Patchelf
from auditwheel.repair import append_rpath_within_wheel


@patch("auditwheel.patcher._verify_patchelf")
@patch("auditwheel.patcher.check_output")
@patch("auditwheel.patcher.check_call")
class TestRepair:
    def test_append_rpath(self, check_call, check_output, _):
        patcher = Patchelf()
        # When a library has an existing RPATH entry within wheel_dir
        existing_rpath = b"$ORIGIN/.existinglibdir"
        check_output.return_value = existing_rpath
        wheel_dir = "."
        lib_name = "test.so"
        full_lib_name = os.path.abspath(lib_name)
        append_rpath_within_wheel(lib_name, "$ORIGIN/.lib", wheel_dir, patcher)
        check_output_expected_args = [
            call(["patchelf", "--print-rpath", full_lib_name])
        ]
        # Then that entry is preserved when updating the RPATH
        check_call_expected_args = [
            call(["patchelf", "--remove-rpath", full_lib_name]),
            call(
                [
                    "patchelf",
                    "--force-rpath",
                    "--set-rpath",
                    f"{existing_rpath.decode()}:$ORIGIN/.lib",
                    full_lib_name,
                ]
            ),
        ]

        assert check_output.call_args_list == check_output_expected_args
        assert check_call.call_args_list == check_call_expected_args

    def test_append_rpath_reject_outside_wheel(self, check_call, check_output, _):
        patcher = Patchelf()
        # When a library has an existing RPATH entry outside wheel_dir
        existing_rpath = b"/outside/wheel/dir"
        check_output.return_value = existing_rpath
        wheel_dir = "/not/outside"
        lib_name = "test.so"
        full_lib_name = os.path.abspath(lib_name)
        append_rpath_within_wheel(lib_name, "$ORIGIN/.lib", wheel_dir, patcher)
        check_output_expected_args = [
            call(["patchelf", "--print-rpath", full_lib_name])
        ]
        # Then that entry is eliminated when updating the RPATH
        check_call_expected_args = [
            call(["patchelf", "--remove-rpath", full_lib_name]),
            call(
                [
                    "patchelf",
                    "--force-rpath",
                    "--set-rpath",
                    "$ORIGIN/.lib",
                    full_lib_name,
                ]
            ),
        ]

        assert check_output.call_args_list == check_output_expected_args
        assert check_call.call_args_list == check_call_expected_args

    def test_append_rpath_ignore_duplicates(self, check_call, check_output, _):
        patcher = Patchelf()
        # When a library has an existing RPATH entry and we try and append it again
        existing_rpath = b"$ORIGIN"
        check_output.return_value = existing_rpath
        wheel_dir = "."
        lib_name = "test.so"
        full_lib_name = os.path.abspath(lib_name)
        append_rpath_within_wheel(lib_name, "$ORIGIN", wheel_dir, patcher)
        check_output_expected_args = [
            call(["patchelf", "--print-rpath", full_lib_name])
        ]
        # Then that entry is ignored when updating the RPATH
        check_call_expected_args = [
            call(["patchelf", "--remove-rpath", full_lib_name]),
            call(
                ["patchelf", "--force-rpath", "--set-rpath", "$ORIGIN", full_lib_name]
            ),
        ]

        assert check_output.call_args_list == check_output_expected_args
        assert check_call.call_args_list == check_call_expected_args

    def test_append_rpath_ignore_relative(self, check_call, check_output, _):
        patcher = Patchelf()
        # When a library has an existing RPATH entry but it cannot be resolved
        # to an absolute path, it is eliminated
        existing_rpath = b"not/absolute"
        check_output.return_value = existing_rpath
        wheel_dir = "."
        lib_name = "test.so"
        full_lib_name = os.path.abspath(lib_name)
        append_rpath_within_wheel(lib_name, "$ORIGIN", wheel_dir, patcher)
        check_output_expected_args = [
            call(["patchelf", "--print-rpath", full_lib_name])
        ]
        # Then that entry is ignored when updating the RPATH
        check_call_expected_args = [
            call(["patchelf", "--remove-rpath", full_lib_name]),
            call(
                ["patchelf", "--force-rpath", "--set-rpath", "$ORIGIN", full_lib_name]
            ),
        ]

        assert check_output.call_args_list == check_output_expected_args
        assert check_call.call_args_list == check_call_expected_args