diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py
index 0a6ab08..feed870 100755
--- a/Lib/test/test_fcntl.py
+++ b/Lib/test/test_fcntl.py
@@ -1,69 +1,89 @@
-#! /usr/bin/env python
 """Test program for the fcntl C module.
-   OS/2+EMX doesn't support the file locking operations.
-   Roger E. Masse
+
+OS/2+EMX doesn't support the file locking operations.
+
 """
 import struct
 import fcntl
 import os, sys
-from test.test_support import verbose, TESTFN
+import unittest
+from test.test_support import verbose, TESTFN, unlink, run_unittest
 
-filename = TESTFN
+# TODO - Write tests for ioctl(), flock() and lockf().
 
-try:
-    os.O_LARGEFILE
-except AttributeError:
-    start_len = "ll"
-else:
-    start_len = "qq"
 
-if sys.platform.startswith('atheos'):
-    start_len = "qq"
-
-if sys.platform in ('netbsd1', 'netbsd2', 'netbsd3',
-                    'Darwin1.2', 'darwin',
-                    'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
-                    'freebsd6', 'freebsd7', 'freebsd8',
-                    'bsdos2', 'bsdos3', 'bsdos4',
-                    'openbsd', 'openbsd2', 'openbsd3', 'openbsd4'):
-    if struct.calcsize('l') == 8:
-        off_t = 'l'
-        pid_t = 'i'
+def get_lockdata():
+    if sys.platform.startswith('atheos'):
+        start_len = "qq"
     else:
-        off_t = 'lxxxx'
-        pid_t = 'l'
-    lockdata = struct.pack(off_t+off_t+pid_t+'hh', 0, 0, 0, fcntl.F_WRLCK, 0)
-elif sys.platform in ['aix3', 'aix4', 'hp-uxB', 'unixware7']:
-    lockdata = struct.pack('hhlllii', fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0)
-elif sys.platform in ['os2emx']:
-    lockdata = None
-else:
-    lockdata = struct.pack('hh'+start_len+'hh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
-if lockdata:
-    if verbose:
-        print 'struct.pack: ', repr(lockdata)
+        try:
+            os.O_LARGEFILE
+        except AttributeError:
+            start_len = "ll"
+        else:
+            start_len = "qq"
 
-# the example from the library docs
-f = open(filename, 'w')
-rv = fcntl.fcntl(f.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
-if verbose:
-    print 'Status from fcntl with O_NONBLOCK: ', rv
+    if sys.platform in ('netbsd1', 'netbsd2', 'netbsd3',
+                        'Darwin1.2', 'darwin',
+                        'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
+                        'freebsd6', 'freebsd7', 'freebsd8',
+                        'bsdos2', 'bsdos3', 'bsdos4',
+                        'openbsd', 'openbsd2', 'openbsd3', 'openbsd4'):
+        if struct.calcsize('l') == 8:
+            off_t = 'l'
+            pid_t = 'i'
+        else:
+            off_t = 'lxxxx'
+            pid_t = 'l'
+        lockdata = struct.pack(off_t + off_t + pid_t + 'hh', 0, 0, 0,
+                               fcntl.F_WRLCK, 0)
+    elif sys.platform in ['aix3', 'aix4', 'hp-uxB', 'unixware7']:
+        lockdata = struct.pack('hhlllii', fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0)
+    elif sys.platform in ['os2emx']:
+        lockdata = None
+    else:
+        lockdata = struct.pack('hh'+start_len+'hh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
+    if lockdata:
+        if verbose:
+            print 'struct.pack: ', repr(lockdata)
+    return lockdata
 
-if sys.platform not in ['os2emx']:
-    rv = fcntl.fcntl(f.fileno(), fcntl.F_SETLKW, lockdata)
-    if verbose:
-        print 'String from fcntl with F_SETLKW: ', repr(rv)
-
-f.close()
-os.unlink(filename)
+lockdata = get_lockdata()
 
 
-# Again, but pass the file rather than numeric descriptor:
-f = open(filename, 'w')
-rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NONBLOCK)
+class TestFcntl(unittest.TestCase):
 
-if sys.platform not in ['os2emx']:
-    rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)
+    def setUp(self):
+        self.f = None
 
-f.close()
-os.unlink(filename)
+    def tearDown(self):
+        if not self.f.closed:
+            self.f.close()
+        unlink(TESTFN)
+
+    def test_fcntl_fileno(self):
+        # the example from the library docs
+        self.f = open(TESTFN, 'w')
+        rv = fcntl.fcntl(self.f.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
+        if verbose:
+            print 'Status from fcntl with O_NONBLOCK: ', rv
+        if sys.platform not in ['os2emx']:
+            rv = fcntl.fcntl(self.f.fileno(), fcntl.F_SETLKW, lockdata)
+            if verbose:
+                print 'String from fcntl with F_SETLKW: ', repr(rv)
+        self.f.close()
+
+    def test_fcntl_file_descriptor(self):
+        # again, but pass the file rather than numeric descriptor
+        self.f = open(TESTFN, 'w')
+        rv = fcntl.fcntl(self.f, fcntl.F_SETFL, os.O_NONBLOCK)
+        if sys.platform not in ['os2emx']:
+            rv = fcntl.fcntl(self.f, fcntl.F_SETLKW, lockdata)
+        self.f.close()
+
+
+def test_main():
+    run_unittest(TestFcntl)
+
+if __name__ == '__main__':
+    test_main()
