Commits

Christophe Combelles committed e4d6964

set-up infrastructure to write tests with a real http server, and reproduced issue 163.

Comments (0)

Files changed (5)

 bin
 include
 \.Python
+*.swp

setuptools/tests/server.py

+"""Basic http server for tests to simulate PyPI or custom indexes
+"""
+import urllib2
+from threading import Thread
+from BaseHTTPServer import HTTPServer
+from SimpleHTTPServer import SimpleHTTPRequestHandler
+
+class IndexServer(HTTPServer):
+    """Basic single-threaded http server simulating a package index
+
+    You can use this server in unittest like this::
+        s = IndexServer()
+        s.start()
+        index_url = s.base_url() + 'mytestindex'
+        # do some test requests to the index
+        s.stop()
+    """
+    def __init__(self):
+        HTTPServer.__init__(self, ('', 0), SimpleHTTPRequestHandler)
+        self._run = True
+
+    def serve(self):
+        while True:
+            self.handle_request()
+            if not self._run: break
+
+    def start(self):
+        self.thread = Thread(target=self.serve)
+        self.thread.start()
+
+    def stop(self):
+        """self.shutdown is not supported on python < 2.6"""
+        self._run = False
+        urllib2.urlopen('http://127.0.0.1:%s/' % self.server_address[1])
+        self.thread.join()
+
+    def base_url(self):
+        port = self.server_address[1]
+        return 'http://127.0.0.1:%s/setuptools/tests/indexes/' % port

setuptools/tests/test_packageindex.py

 import os, shutil, tempfile, unittest, urllib2
 import pkg_resources
 import setuptools.package_index
+from server import IndexServer
 
 class TestPackageIndex(unittest.TestCase):
 
         url = 'file:///tmp/test_package_index'
         self.assert_(index.url_ok(url, True))
 
+    def test_links_priority(self):
+        """
+        Download links from the pypi simple index should be used before
+        external download links.
+        http://bitbucket.org/tarek/distribute/issue/163/md5-validation-error
+
+        Usecase :
+        - someone uploads a package on pypi, a md5 is generated
+        - someone manually copies this link (with the md5 in the url) onto an
+          external page accessible from the package page.
+        - someone reuploads the package (with a different md5)
+        - while easy_installing, an MD5 error occurs because the external link
+          is used
+        -> Distribute should use the link from pypi, not the external one.
+        """
+        # start an index server
+        server = IndexServer()
+        server.start()
+        index_url = server.base_url() + 'test_links_priority/simple/'
+
+        # scan a test index
+        pi = setuptools.package_index.PackageIndex(index_url)
+        requirement = pkg_resources.Requirement.parse('foobar')
+        pi.find_packages(requirement)
+        server.stop()
+
+        # the distribution has been found
+        self.assert_('foobar' in pi)
+        # we have two links
+        self.assert_(len(pi['foobar'])==2)
+        # the first link should be from the index
+        self.assert_('correct_md5' in pi['foobar'][0].location)
+        # the second link should be the external one
+        self.assert_('bad_md5' in pi['foobar'][1].location)
+
+
+
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.