| Viewing file:  test_sandbox.py (4.23 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
"""develop tests"""
 import os
 import types
 
 import pytest
 
 import pkg_resources
 import setuptools.sandbox
 
 
 class TestSandbox:
 def test_devnull(self, tmpdir):
 with setuptools.sandbox.DirectorySandbox(str(tmpdir)):
 self._file_writer(os.devnull)
 
 @staticmethod
 def _file_writer(path):
 def do_write():
 with open(path, 'w', encoding="utf-8") as f:
 f.write('xxx')
 
 return do_write
 
 def test_setup_py_with_BOM(self):
 """
 It should be possible to execute a setup.py with a Byte Order Mark
 """
 target = pkg_resources.resource_filename(__name__, 'script-with-bom.py')
 namespace = types.ModuleType('namespace')
 setuptools.sandbox._execfile(target, vars(namespace))
 assert namespace.result == 'passed'
 
 def test_setup_py_with_CRLF(self, tmpdir):
 setup_py = tmpdir / 'setup.py'
 with setup_py.open('wb') as stream:
 stream.write(b'"degenerate script"\r\n')
 setuptools.sandbox._execfile(str(setup_py), globals())
 
 
 class TestExceptionSaver:
 def test_exception_trapped(self):
 with setuptools.sandbox.ExceptionSaver():
 raise ValueError("details")
 
 def test_exception_resumed(self):
 with setuptools.sandbox.ExceptionSaver() as saved_exc:
 raise ValueError("details")
 
 with pytest.raises(ValueError) as caught:
 saved_exc.resume()
 
 assert isinstance(caught.value, ValueError)
 assert str(caught.value) == 'details'
 
 def test_exception_reconstructed(self):
 orig_exc = ValueError("details")
 
 with setuptools.sandbox.ExceptionSaver() as saved_exc:
 raise orig_exc
 
 with pytest.raises(ValueError) as caught:
 saved_exc.resume()
 
 assert isinstance(caught.value, ValueError)
 assert caught.value is not orig_exc
 
 def test_no_exception_passes_quietly(self):
 with setuptools.sandbox.ExceptionSaver() as saved_exc:
 pass
 
 saved_exc.resume()
 
 def test_unpickleable_exception(self):
 class CantPickleThis(Exception):
 "This Exception is unpickleable because it's not in globals"
 
 def __repr__(self) -> str:
 return f'CantPickleThis{self.args!r}'
 
 with setuptools.sandbox.ExceptionSaver() as saved_exc:
 raise CantPickleThis('detail')
 
 with pytest.raises(setuptools.sandbox.UnpickleableException) as caught:
 saved_exc.resume()
 
 assert str(caught.value) == "CantPickleThis('detail',)"
 
 def test_unpickleable_exception_when_hiding_setuptools(self):
 """
 As revealed in #440, an infinite recursion can occur if an unpickleable
 exception while setuptools is hidden. Ensure this doesn't happen.
 """
 
 class ExceptionUnderTest(Exception):
 """
 An unpickleable exception (not in globals).
 """
 
 with pytest.raises(setuptools.sandbox.UnpickleableException) as caught:
 with setuptools.sandbox.save_modules():
 setuptools.sandbox.hide_setuptools()
 raise ExceptionUnderTest
 
 (msg,) = caught.value.args
 assert msg == 'ExceptionUnderTest()'
 
 def test_sandbox_violation_raised_hiding_setuptools(self, tmpdir):
 """
 When in a sandbox with setuptools hidden, a SandboxViolation
 should reflect a proper exception and not be wrapped in
 an UnpickleableException.
 """
 
 def write_file():
 "Trigger a SandboxViolation by writing outside the sandbox"
 with open('/etc/foo', 'w', encoding="utf-8"):
 pass
 
 with pytest.raises(setuptools.sandbox.SandboxViolation) as caught:
 with setuptools.sandbox.save_modules():
 setuptools.sandbox.hide_setuptools()
 with setuptools.sandbox.DirectorySandbox(str(tmpdir)):
 write_file()
 
 cmd, args, kwargs = caught.value.args
 assert cmd == 'open'
 assert args == ('/etc/foo', 'w')
 assert kwargs == {"encoding": "utf-8"}
 
 msg = str(caught.value)
 assert 'open' in msg
 assert "('/etc/foo', 'w')" in msg
 assert "{'encoding': 'utf-8'}" in msg
 
 |