test_urllibnet.py 6.64 KB
Newer Older
1 2 3 4 5 6
#!/usr/bin/env python

import unittest
from test import test_support

import socket
7
import urllib
8
import sys
9 10
import os
import mimetools
11

12 13 14 15 16 17 18 19 20 21 22 23 24 25

def _open_with_retry(func, host, *args, **kwargs):
    # Connecting to remote hosts is flaky.  Make it more robust
    # by retrying the connection several times.
    for i in range(3):
        try:
            return func(host, *args, **kwargs)
        except IOError, last_exc:
            continue
        except:
            raise
    raise last_exc


26 27 28 29 30 31 32 33 34 35 36
class URLTimeoutTest(unittest.TestCase):

    TIMEOUT = 10.0

    def setUp(self):
        socket.setdefaulttimeout(self.TIMEOUT)

    def tearDown(self):
        socket.setdefaulttimeout(None)

    def testURLread(self):
37
        f = _open_with_retry(urllib.urlopen, "http://www.python.org/")
38 39
        x = f.read()

40 41
class urlopenNetworkTests(unittest.TestCase):
    """Tests urllib.urlopen using the network.
42

43 44 45 46
    These tests are not exhaustive.  Assuming that testing using files does a
    good job overall of some of the basic interface features.  There are no
    tests exercising the optional 'data' and 'proxies' arguments.  No tests
    for transparent redirection have been written.
47

48 49 50 51
    setUp is not used for always constructing a connection to
    http://www.python.org/ since there a few tests that don't use that address
    and making a connection is expensive enough to warrant minimizing unneeded
    connections.
52

53 54
    """

55 56 57
    def urlopen(self, *args):
        return _open_with_retry(urllib.urlopen, *args)

58 59
    def test_basic(self):
        # Simple test expected to pass.
60
        open_url = self.urlopen("http://www.python.org/")
61 62 63 64 65 66 67 68 69 70 71
        for attr in ("read", "readline", "readlines", "fileno", "close",
                     "info", "geturl"):
            self.assert_(hasattr(open_url, attr), "object returned from "
                            "urlopen lacks the %s attribute" % attr)
        try:
            self.assert_(open_url.read(), "calling 'read' failed")
        finally:
            open_url.close()

    def test_readlines(self):
        # Test both readline and readlines.
72
        open_url = self.urlopen("http://www.python.org/")
73 74 75 76 77 78 79 80 81 82
        try:
            self.assert_(isinstance(open_url.readline(), basestring),
                         "readline did not return a string")
            self.assert_(isinstance(open_url.readlines(), list),
                         "readlines did not return a list")
        finally:
            open_url.close()

    def test_info(self):
        # Test 'info'.
83
        open_url = self.urlopen("http://www.python.org/")
84 85 86 87 88 89 90 91 92 93 94 95
        try:
            info_obj = open_url.info()
        finally:
            open_url.close()
            self.assert_(isinstance(info_obj, mimetools.Message),
                         "object returned by 'info' is not an instance of "
                         "mimetools.Message")
            self.assertEqual(info_obj.getsubtype(), "html")

    def test_geturl(self):
        # Make sure same URL as opened is returned by geturl.
        URL = "http://www.python.org/"
96
        open_url = self.urlopen(URL)
97 98 99 100 101 102
        try:
            gotten_url = open_url.geturl()
        finally:
            open_url.close()
        self.assertEqual(gotten_url, URL)

103 104 105 106 107 108 109 110 111 112
    def test_getcode(self):
        # test getcode() with the fancy opener to get 404 error codes
        URL = "http://www.python.org/XXXinvalidXXX"
        open_url = urllib.FancyURLopener().open(URL)
        try:
            code = open_url.getcode()
        finally:
            open_url.close()
        self.assertEqual(code, 404)

113
    def test_fileno(self):
Tim Peters's avatar
Tim Peters committed
114
        if (sys.platform in ('win32',) or
115 116 117 118
                not hasattr(os, 'fdopen')):
            # On Windows, socket handles are not file descriptors; this
            # test can't pass on Windows.
            return
119
        # Make sure fd returned by fileno is valid.
120
        open_url = self.urlopen("http://www.python.org/")
121 122 123 124 125 126 127
        fd = open_url.fileno()
        FILE = os.fdopen(fd)
        try:
            self.assert_(FILE.read(), "reading from file created using fd "
                                      "returned by fileno failed")
        finally:
            FILE.close()
128 129 130 131 132

    def test_bad_address(self):
        # Make sure proper exception is raised when connecting to a bogus
        # address.
        self.assertRaises(IOError,
133 134 135 136 137 138 139
                          # SF patch 809915:  In Sep 2003, VeriSign started
                          # highjacking invalid .com and .net addresses to
                          # boost traffic to their own site.  This test
                          # started failing then.  One hopes the .invalid
                          # domain will be spared to serve its defined
                          # purpose.
                          # urllib.urlopen, "http://www.sadflkjsasadf.com/")
140
                          urllib.urlopen, "http://www.python.invalid./")
141 142 143 144

class urlretrieveNetworkTests(unittest.TestCase):
    """Tests urllib.urlretrieve using the network."""

145 146 147
    def urlretrieve(self, *args):
        return _open_with_retry(urllib.urlretrieve, *args)

148 149
    def test_basic(self):
        # Test basic functionality.
150
        file_location,info = self.urlretrieve("http://www.python.org/")
151 152 153 154
        self.assert_(os.path.exists(file_location), "file location returned by"
                        " urlretrieve is not a valid path")
        FILE = file(file_location)
        try:
Jeremy Hylton's avatar
Jeremy Hylton committed
155 156
            self.assert_(FILE.read(), "reading from the file location returned"
                         " by urlretrieve failed")
157 158 159 160 161 162
        finally:
            FILE.close()
            os.unlink(file_location)

    def test_specified_path(self):
        # Make sure that specifying the location of the file to write to works.
163 164
        file_location,info = self.urlretrieve("http://www.python.org/",
                                              test_support.TESTFN)
165 166 167 168 169 170 171 172 173 174 175
        self.assertEqual(file_location, test_support.TESTFN)
        self.assert_(os.path.exists(file_location))
        FILE = file(file_location)
        try:
            self.assert_(FILE.read(), "reading from temporary file failed")
        finally:
            FILE.close()
            os.unlink(file_location)

    def test_header(self):
        # Make sure header returned as 2nd value from urlretrieve is good.
176
        file_location, header = self.urlretrieve("http://www.python.org/")
177 178 179
        os.unlink(file_location)
        self.assert_(isinstance(header, mimetools.Message),
                     "header is not an instance of mimetools.Message")
180

181 182


183 184
def test_main():
    test_support.requires('network')
185 186 187
    test_support.run_unittest(URLTimeoutTest,
                              urlopenNetworkTests,
                              urlretrieveNetworkTests)
188 189 190

if __name__ == "__main__":
    test_main()