43 lines
2.1 KiB
Python
43 lines
2.1 KiB
Python
"""Regression for PATH-selected OpenSSL libraries disappearing from the bundle."""
|
|
import _ssl
|
|
import shutil
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest import mock
|
|
|
|
from packaging_native import pin_ssl_binaries, python_ssl_binaries
|
|
|
|
|
|
class PythonSslPackagingTest(unittest.TestCase):
|
|
def test_dependencies_come_from_build_python(self):
|
|
dependencies = python_ssl_binaries()
|
|
self.assertTrue(any(name.startswith("libssl") for name, _, _ in dependencies))
|
|
self.assertTrue(any(name.startswith("libcrypto") for name, _, _ in dependencies))
|
|
for name, source, kind in dependencies:
|
|
self.assertTrue(Path(source).is_file())
|
|
self.assertTrue(Path(source).resolve().is_relative_to(Path(sys.base_prefix).resolve()))
|
|
self.assertEqual(Path(source).name, name)
|
|
self.assertEqual(kind, "BINARY")
|
|
|
|
def test_path_collision_is_replaced_and_required_libraries_are_retained(self):
|
|
verified = python_ssl_binaries()
|
|
wrong = [(name.upper(), "C:/unrelated-pdf-tool/" + name, "BINARY") for name, _, _ in verified]
|
|
other = ("_ssl.pyd", str(_ssl.__file__), "EXTENSION")
|
|
result = pin_ssl_binaries(wrong + [other], verified)
|
|
self.assertEqual(result, [other] + verified)
|
|
# The existing unrelated-runtime filter must keep the corrected DLLs.
|
|
filtered = [item for item in result if ".cache" not in item[1] or
|
|
Path(item[1]).resolve().is_relative_to(Path(sys.base_prefix).resolve())]
|
|
self.assertEqual(filtered, result)
|
|
|
|
def test_missing_python_ssl_dependency_fails_before_packaging(self):
|
|
with tempfile.TemporaryDirectory() as temporary:
|
|
root = Path(temporary)
|
|
extension = root / "_ssl.pyd"
|
|
shutil.copyfile(_ssl.__file__, extension)
|
|
with mock.patch.object(_ssl, "__file__", str(extension)), mock.patch.object(sys, "base_prefix", str(root)):
|
|
with self.assertRaisesRegex(RuntimeError, "OpenSSL dependency is missing"):
|
|
python_ssl_binaries()
|