diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py
index 22e25ba..9b7e3b7 100644
--- a/Lib/test/test_imp.py
+++ b/Lib/test/test_imp.py
@@ -1,29 +1,39 @@
-
 import imp
-import unittest
-from test.test_support import TestFailed, run_unittest
+from test.test_support import TestFailed
 
-class ImpLock(unittest.TestCase):
+def verify_lock_state(expected):
+    if imp.lock_held() != expected:
+        raise TestFailed("expected imp.lock_held() to be %r" % expected)
 
-    # XXX this test is woefully inadequate, please fix me
-    def testLock(self):
-        LOOPS = 50
-        for i in range(LOOPS):
-            imp.acquire_lock()
-        for i in range(LOOPS):
+def testLock():
+    LOOPS = 50
+
+    # The import lock may already be held, e.g. if the test suite is run
+    # via "import test.autotest".
+    lock_held_at_start = imp.lock_held()
+    verify_lock_state(lock_held_at_start)
+
+    for i in range(LOOPS):
+        imp.acquire_lock()
+        verify_lock_state(True)
+
+    for i in range(LOOPS):
+        imp.release_lock()
+
+    # The original state should be restored now.
+    verify_lock_state(lock_held_at_start)
+
+    if not lock_held_at_start:
+        try:
             imp.release_lock()
-
-        for i in range(LOOPS):
-            try:
-                imp.release_lock()
-            except RuntimeError:
-                pass
-            else:
-                raise TestFailed, \
-                    "release_lock() without lock should raise RuntimeError"
+        except RuntimeError:
+            pass
+        else:
+            raise TestFailed("release_lock() without lock should raise "
+                             "RuntimeError")
 
 def test_main():
-    run_unittest(ImpLock)
+    testLock()
 
 if __name__ == "__main__":
     test_main()
