diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py
index ecab6f2..27b5038 100644
--- a/Lib/test/test_urllib2.py
+++ b/Lib/test/test_urllib2.py
@@ -1,7 +1,7 @@
 import unittest
 from test import test_support
 
-import os
+import os, socket
 import StringIO
 
 import urllib2
@@ -671,6 +671,12 @@
             self.assert_(False)
 
 class NetworkTests(unittest.TestCase):
+    def setUp(self):
+        if 0:  # for debugging
+            import logging
+            logger = logging.getLogger("test_urllib2")
+            logger.addHandler(logging.StreamHandler())
+
     def test_range (self):
         req = urllib2.Request("http://www.python.org",
                               headers={'Range': 'bytes=20-39'})
@@ -678,6 +684,128 @@
         data = result.read()
         self.assertEqual(len(data), 20)
 
+    # XXX The rest of these tests aren't very good -- they don't check much.
+    # They do sometimes catch some major disasters, though.
+
+    def test_ftp(self):
+        urls = [
+            'ftp://www.python.org/pub/python/misc/sousa.au',
+            'ftp://www.python.org/pub/tmp/blat',
+            'ftp://gatekeeper.research.compaq.com/pub/DEC/SRC'
+                '/research-reports/00README-Legal-Rules-Regs',
+            ]
+        self._test_urls(urls, self._extra_handlers())
+
+    def test_gopher(self):
+        urls = [
+            # Thanks to Fred for finding these!
+            'gopher://gopher.lib.ncsu.edu/11/library/stacks/Alex',
+            'gopher://gopher.vt.edu:10010/10/33',
+            ]
+        self._test_urls(urls, self._extra_handlers())
+
+    def test_file(self):
+        TESTFN = test_support.TESTFN
+        f = open(TESTFN, 'w')
+        try:
+            f.write('hi there\n')
+            f.close()
+            urls = [
+                'file:'+sanepathname2url(os.path.abspath(TESTFN)),
+
+                # XXX bug, should raise URLError
+                #('file://nonsensename/etc/passwd', None, urllib2.URLError)
+                ('file://nonsensename/etc/passwd', None, (OSError, socket.error))
+                ]
+            self._test_urls(urls, self._extra_handlers())
+        finally:
+            os.remove(TESTFN)
+
+    def test_http(self):
+        urls = [
+            'http://www.espn.com/', # redirect
+            'http://www.python.org/Spanish/Inquistion/',
+            ('http://www.python.org/cgi-bin/faqw.py',
+             'query=pythonistas&querytype=simple&casefold=yes&req=search', None),
+            'http://www.python.org/',
+            ]
+        self._test_urls(urls, self._extra_handlers())
+
+    # XXX Following test depends on machine configurations that are internal
+    # to CNRI.  Need to set up a public server with the right authentication
+    # configuration for test purposes.
+
+##     def test_cnri(self):
+##         if socket.gethostname() == 'bitdiddle':
+##             localhost = 'bitdiddle.cnri.reston.va.us'
+##         elif socket.gethostname() == 'bitdiddle.concentric.net':
+##             localhost = 'localhost'
+##         else:
+##             localhost = None
+##         if localhost is not None:
+##             urls = [
+##                 'file://%s/etc/passwd' % localhost,
+##                 'http://%s/simple/' % localhost,
+##                 'http://%s/digest/' % localhost,
+##                 'http://%s/not/found.h' % localhost,
+##                 ]
+
+##             bauth = HTTPBasicAuthHandler()
+##             bauth.add_password('basic_test_realm', localhost, 'jhylton',
+##                                'password')
+##             dauth = HTTPDigestAuthHandler()
+##             dauth.add_password('digest_test_realm', localhost, 'jhylton',
+##                                'password')
+
+##             self._test_urls(urls, self._extra_handlers()+[bauth, dauth])
+
+    def _test_urls(self, urls, handlers):
+        import socket
+        import time
+        import logging
+        debug = logging.getLogger("test_urllib2").debug
+
+        urllib2.install_opener(urllib2.build_opener(*handlers))
+
+        for url in urls:
+            if isinstance(url, tuple):
+                url, req, expected_err = url
+            else:
+                req = expected_err = None
+            debug(url)
+            try:
+                f = urllib2.urlopen(url, req)
+            except (IOError, socket.error, OSError), err:
+                debug(err)
+                if expected_err:
+                    self.assert_(isinstance(err, expected_err))
+            else:
+                buf = f.read()
+                f.close()
+                debug("read %d bytes" % len(buf))
+            debug("******** next url coming up...")
+            time.sleep(0.1)
+
+    def _extra_handlers(self):
+        handlers = []
+
+        handlers.append(urllib2.GopherHandler)
+
+        cfh = urllib2.CacheFTPHandler()
+        cfh.setTimeout(1)
+        handlers.append(cfh)
+
+##         # XXX try out some custom proxy objects too!
+##         def at_cnri(req):
+##             host = req.get_host()
+##             debug(host)
+##             if host[-18:] == '.cnri.reston.va.us':
+##                 return True
+##         p = CustomProxy('http', at_cnri, 'proxy.cnri.reston.va.us')
+##         ph = CustomProxyHandler(p)
+##         handlers.append(ph)
+
+        return handlers
 
 
 def test_main(verbose=None):
diff --git a/Lib/urllib2.py b/Lib/urllib2.py
index a9c1c63..84d4c34 100644
--- a/Lib/urllib2.py
+++ b/Lib/urllib2.py
@@ -1274,80 +1274,3 @@
             if inspect.isclass(ph):
                 ph = ph()
             opener.add_handler(ph)
-
-if __name__ == "__main__":
-    # XXX some of the test code depends on machine configurations that
-    # are internal to CNRI.   Need to set up a public server with the
-    # right authentication configuration for test purposes.
-    if socket.gethostname() == 'bitdiddle':
-        localhost = 'bitdiddle.cnri.reston.va.us'
-    elif socket.gethostname() == 'bitdiddle.concentric.net':
-        localhost = 'localhost'
-    else:
-        localhost = None
-    urls = [
-        # Thanks to Fred for finding these!
-        'gopher://gopher.lib.ncsu.edu/11/library/stacks/Alex',
-        'gopher://gopher.vt.edu:10010/10/33',
-
-        'file:/etc/passwd',
-        'file://nonsensename/etc/passwd',
-        'ftp://www.python.org/pub/python/misc/sousa.au',
-        'ftp://www.python.org/pub/tmp/blat',
-        'http://www.espn.com/', # redirect
-        'http://www.python.org/Spanish/Inquistion/',
-        ('http://www.python.org/cgi-bin/faqw.py',
-         'query=pythonistas&querytype=simple&casefold=yes&req=search'),
-        'http://www.python.org/',
-        'ftp://gatekeeper.research.compaq.com/pub/DEC/SRC/research-reports/00README-Legal-Rules-Regs',
-            ]
-
-##    if localhost is not None:
-##        urls = urls + [
-##            'file://%s/etc/passwd' % localhost,
-##            'http://%s/simple/' % localhost,
-##            'http://%s/digest/' % localhost,
-##            'http://%s/not/found.h' % localhost,
-##            ]
-
-##        bauth = HTTPBasicAuthHandler()
-##        bauth.add_password('basic_test_realm', localhost, 'jhylton',
-##                           'password')
-##        dauth = HTTPDigestAuthHandler()
-##        dauth.add_password('digest_test_realm', localhost, 'jhylton',
-##                           'password')
-
-
-    cfh = CacheFTPHandler()
-    cfh.setTimeout(1)
-
-##    # XXX try out some custom proxy objects too!
-##    def at_cnri(req):
-##        host = req.get_host()
-##        print host
-##        if host[-18:] == '.cnri.reston.va.us':
-##            return 1
-##    p = CustomProxy('http', at_cnri, 'proxy.cnri.reston.va.us')
-##    ph = CustomProxyHandler(p)
-
-##    install_opener(build_opener(dauth, bauth, cfh, GopherHandler, ph))
-    install_opener(build_opener(cfh, GopherHandler))
-
-    for url in urls:
-        if isinstance(url, tuple):
-            url, req = url
-        else:
-            req = None
-        print url
-        try:
-            f = urlopen(url, req)
-        except IOError, err:
-            print "IOError:", err
-        except socket.error, err:
-            print "socket.error:", err
-        else:
-            buf = f.read()
-            f.close()
-            print "read %d bytes" % len(buf)
-        print
-        time.sleep(0.1)
