[pypy-svn] r15426 - in pypy/dist/pypy/module/posix: . test

hpk at codespeak.net hpk at codespeak.net
Sat Jul 30 19:48:53 CEST 2005


Author: hpk
Date: Sat Jul 30 19:48:52 2005
New Revision: 15426

Modified:
   pypy/dist/pypy/module/posix/interp_posix.py
   pypy/dist/pypy/module/posix/test/test_posix2.py
Log:

check exception handling (which was completely broken 
or non-existent for the posix module) 



Modified: pypy/dist/pypy/module/posix/interp_posix.py
==============================================================================
--- pypy/dist/pypy/module/posix/interp_posix.py	(original)
+++ pypy/dist/pypy/module/posix/interp_posix.py	Sat Jul 30 19:48:52 2005
@@ -1,36 +1,75 @@
 from pypy.interpreter.baseobjspace import ObjSpace
 from pypy.rpython.rarithmetic import intmask
+from pypy.interpreter.error import OperationError
 
 import os
 from os import *
 
+def wrap_oserror(space, e): 
+    assert isinstance(e, OSError) 
+    errno = e.errno 
+    msg = os.strerror(errno) 
+    w_error = space.call_function(space.w_OSError,
+                                  space.wrap(errno),
+                                  space.wrap(msg))
+    return OperationError(space.w_OSError, w_error)
+                          
 def open(space, fname, flag, mode=0777):
-    fd = os.open(fname, flag, mode)
+    try: 
+        fd = os.open(fname, flag, mode)
+    except OSError, e: 
+        raise wrap_oserror(space, e) 
     return space.wrap(fd)
 open.unwrap_spec = [ObjSpace, str, int, int]
 
 def lseek(space, fd, pos, how):
-    return space.wrap(os.lseek(fd, pos, how))
+    try:
+        pos = os.lseek(fd, pos, how)
+    except OSError, e: 
+        raise wrap_oserror(space, e) 
+    else: 
+        return space.wrap(pos) 
 lseek.unwrap_spec = [ObjSpace, int, int, int]
 
 def isatty(space, fd):
-    return space.wrap(os.isatty(fd))
+    try:
+        res = os.isatty(fd)
+    except OSError, e: 
+        raise wrap_oserror(space, e) 
+    else:  
+        return space.wrap(res) 
 isatty.unwrap_spec = [ObjSpace, int]
 
 def read(space, fd, buffersize):
-    return space.wrap(os.read(fd, buffersize))
+    try: 
+        s = os.read(fd, buffersize)
+    except OSError, e: 
+        raise wrap_oserror(space, e) 
+    else: 
+        return space.wrap(s) 
 read.unwrap_spec = [ObjSpace, int, int]
 
 def write(space, fd, data):
-    return space.wrap(os.write(fd, data))
+    try: 
+        res = os.write(fd, data)
+    except OSError, e: 
+        raise wrap_oserror(space, e) 
+    else: 
+        return space.wrap(res) 
 write.unwrap_spec = [ObjSpace, int, str]
 
 def close(space, fd):
-    os.close(fd)
+    try: 
+        os.close(fd)
+    except OSError, e: 
+        raise wrap_oserror(space, e) 
 close.unwrap_spec = [ObjSpace, int]
 
 def ftruncate(space, fd, length):
-    os.ftruncate(fd, length)
+    try:
+        os.ftruncate(fd, length)
+    except OSError, e: 
+        raise wrap_oserror(space, e) 
 ftruncate.unwrap_spec = [ObjSpace, int, int]
 
 def build_stat_result(space, st):
@@ -43,17 +82,37 @@
     return space.call_function(w_stat_result, w_tuple)
 
 def fstat(space, fd):
-    return build_stat_result(space, os.fstat(fd))
+    try:
+        st = os.fstat(fd)
+    except OSError, e: 
+        raise wrap_oserror(space, e) 
+    else:
+        return build_stat_result(space, st)
 fstat.unwrap_spec = [ObjSpace, int]
 
 def stat(space, path):
-    return build_stat_result(space, os.stat(path))
+    try:
+        st = os.stat(path)
+    except OSError, e: 
+        raise wrap_oserror(space, e) 
+    else: 
+        return build_stat_result(space, st)
 stat.unwrap_spec = [ObjSpace, str]
 
 def getcwd(space):
-    return space.wrap(os.getcwd())
+    try:
+        cur = os.getcwd()
+    except OSError, e: 
+        raise wrap_oserror(space, e) 
+    else: 
+        return space.wrap(cur)
 getcwd.unwrap_spec = [ObjSpace]
 
 def dup(space, fd):
-    return space.wrap(os.dup(fd))
+    try:
+        newfd = os.dup(fd)
+    except OSError, e: 
+        raise wrap_oserror(space, e) 
+    else:
+        return space.wrap(newfd)
 dup.unwrap_spec = [ObjSpace, int]

Modified: pypy/dist/pypy/module/posix/test/test_posix2.py
==============================================================================
--- pypy/dist/pypy/module/posix/test/test_posix2.py	(original)
+++ pypy/dist/pypy/module/posix/test/test_posix2.py	Sat Jul 30 19:48:52 2005
@@ -30,3 +30,35 @@
         assert stat  # XXX 
         posix.close(fd2)
         posix.close(fd)
+
+    def test_open_exception(self): 
+        posix = self.posix
+        try: 
+            posix.open('qowieuqwoeiu', 0, 0)
+        except OSError: 
+            pass
+        else: 
+            assert 0
+
+    def test_functions_raise_error(self): 
+        def ex(func, *args):
+            try:
+                func(*args)
+            except OSError: 
+                pass
+            else:
+                raise AssertionError("%s(%s) did not raise" %(
+                                     func.__name__, 
+                                     ", ".join([str(x) for x in args])))
+        UNUSEDFD = 123123
+        ex(self.posix.open, "qweqwe", 0, 0)
+        ex(self.posix.lseek, UNUSEDFD, 123, 0)
+        #apparently not posix-required: ex(self.posix.isatty, UNUSEDFD)
+        ex(self.posix.read, UNUSEDFD, 123)
+        ex(self.posix.write, UNUSEDFD, "x")
+        ex(self.posix.close, UNUSEDFD)
+        #UMPF cpython raises IOError ex(self.posix.ftruncate, UNUSEDFD, 123)
+        ex(self.posix.fstat, UNUSEDFD)
+        ex(self.posix.stat, "qweqwehello")
+        # how can getcwd() raise? 
+        ex(self.posix.dup, UNUSEDFD)



More information about the Pypy-commit mailing list