Commits

Erik Bray committed 2aa2693

Adds a test for and fixes #112. If attempting to write to the __pycache__ directory raises a permission error _write_pyc() should just return False to prevent any further write attempts.

  • Participants
  • Parent commits 5d0b612

Comments (0)

Files changed (2)

_pytest/assertion/rewrite.py

             # This happens when we get a EEXIST in find_module creating the
             # __pycache__ directory and __pycache__ is by some non-dir node.
             return False
+        elif err == errno.EACCES:
+            # The directory is read-only; this can happen for example when
+            # running the tests in a package installed as root
+            return False
         raise
     try:
         fp.write(imp.get_magic())

testing/test_assertrewrite.py

 import os
+import stat
 import sys
 import zipfile
 import py
     assert "@py_builtins" in globals()""")
         assert testdir.runpytest().ret == 0
 
+    def test_pycache_is_readonly(self, testdir):
+        cache = testdir.tmpdir.mkdir("__pycache__")
+        old_mode = cache.stat().mode
+        cache.chmod(old_mode ^ stat.S_IWRITE)
+        testdir.makepyfile("""
+def test_rewritten():
+    assert "@py_builtins" in globals()""")
+        try:
+            assert testdir.runpytest().ret == 0
+        finally:
+            cache.chmod(old_mode)
+
     def test_zipfile(self, testdir):
         z = testdir.tmpdir.join("myzip.zip")
         z_fn = str(z)
 def test_rewritten():
     assert "@py_builtins" in globals()
 """).encode("utf-8"), "wb")
+        old_mode = sub.stat().mode
         sub.chmod(320)
-        assert testdir.runpytest().ret == 0
+        try:
+            assert testdir.runpytest().ret == 0
+        finally:
+            sub.chmod(old_mode)
 
     def test_dont_write_bytecode(self, testdir, monkeypatch):
         testdir.makepyfile("""