Skip test_dbm if we can't write to the file
Cleanup (remove) the file(s) after we are done with the test.
(Fixes problem on snake farm)
diff --git a/Lib/test/test_dbm.py b/Lib/test/test_dbm.py
index 3c6ddd6..e5757c9 100755
--- a/Lib/test/test_dbm.py
+++ b/Lib/test/test_dbm.py
@@ -2,42 +2,54 @@
 """Test script for the dbm module
    Roger E. Masse
 """
+import os
+import random
 import dbm
 from dbm import error
-from test.test_support import verbose, verify
+from test.test_support import verbose, verify, TestSkipped
 
-filename = '/tmp/delete_me'
+# make filename unique to allow multiple concurrent tests
+# and to minimize the likelihood of a problem from an old file
+filename = '/tmp/delete_me_' + str(random.random())[-6:]
 
-d = dbm.open(filename, 'c')
-verify(d.keys() == [])
-d['a'] = 'b'
-d['12345678910'] = '019237410982340912840198242'
-d.keys()
-if d.has_key('a'):
-    if verbose:
-        print 'Test dbm keys: ', d.keys()
+def cleanup():
+    for suffix in ['', '.pag', '.dir', '.db']:
+        try:
+            os.unlink(filename + suffix)
+        except OSError, (errno, strerror):
+            # if we can't delete the file because of permissions,
+            # nothing will work, so skip the test
+            if errno == 1:
+                raise TestSkipped, 'unable to remove: ' + filename + suffix
 
-d.close()
-d = dbm.open(filename, 'r')
-d.close()
-d = dbm.open(filename, 'rw')
-d.close()
-d = dbm.open(filename, 'w')
-d.close()
-d = dbm.open(filename, 'n')
-d.close()
+def test_keys():
+    d = dbm.open(filename, 'c')
+    verify(d.keys() == [])
+    d['a'] = 'b'
+    d['12345678910'] = '019237410982340912840198242'
+    d.keys()
+    if d.has_key('a'):
+        if verbose:
+            print 'Test dbm keys: ', d.keys()
 
+    d.close()
+
+def test_modes():
+    d = dbm.open(filename, 'r')
+    d.close()
+    d = dbm.open(filename, 'rw')
+    d.close()
+    d = dbm.open(filename, 'w')
+    d.close()
+    d = dbm.open(filename, 'n')
+    d.close()
+
+cleanup()
 try:
-    import os
-    if dbm.library == "ndbm":
-        # classic dbm
-        os.unlink(filename + '.dir')
-        os.unlink(filename + '.pag')
-    elif dbm.library == "BSD db":
-        # BSD DB's compatibility layer
-        os.unlink(filename + '.db')
-    else:
-        # GNU gdbm compatibility layer
-        os.unlink(filename)
+    test_keys()
+    test_modes()
 except:
-    pass
+    cleanup()
+    raise
+
+cleanup()