summaryrefslogtreecommitdiff
path: root/tests/test_all_pip.py
blob: f2f1ea16d48d9c22d698af5790a3e6df22562346 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import os
import re
import sys
import subprocess
import shutil
from os.path import dirname, abspath

from pip.backwardcompat import urllib
from pip.util import rmtree


src_folder = dirname(dirname(abspath(__file__)))


def all_projects():
    data = urllib.urlopen('http://pypi.python.org/simple/').read()
    projects = [m.group(1) for m in re.finditer(r'<a.*?>(.+)</a>', data)]
    return projects


def main(args=None):
    if args is None:
        args = sys.argv[1:]
    if not args:
        print('Usage: test_all_pip.py <output-dir>')
        sys.exit(1)
    output = os.path.abspath(args[0])
    if not os.path.exists(output):
        print('Creating %s' % output)
        os.makedirs(output)
    pending_fn = os.path.join(output, 'pending.txt')
    if not os.path.exists(pending_fn):
        print('Downloading pending list')
        projects = all_projects()
        print('Found %s projects' % len(projects))
        f = open(pending_fn, 'w')
        for name in projects:
            f.write(name + '\n')
        f.close()
    print('Starting testing...')
    while os.stat(pending_fn).st_size:
        _test_packages(output, pending_fn)
    print('Finished all pending!')


def _test_packages(output, pending_fn):
    package = get_last_item(pending_fn)
    print('Testing package %s' % package)
    dest_dir = os.path.join(output, package)
    print('Creating virtualenv in %s' % dest_dir)
    create_venv(dest_dir)
    print('Uninstalling actual pip')
    code = subprocess.check_call([os.path.join(dest_dir, 'bin', 'pip'),
                            'uninstall', '-y', 'pip'])
    assert not code, 'pip uninstallation failed'
    print('Installing development pip')
    code = subprocess.check_call([os.path.join(dest_dir, 'bin', 'python'),
                            'setup.py', 'install'],
                            cwd=src_folder)
    assert not code, 'pip installation failed'
    print('Trying installation of %s' % dest_dir)
    code = subprocess.check_call([os.path.join(dest_dir, 'bin', 'pip'),
                            'install', package])
    if code:
        print('Installation of %s failed' % package)
        print('Now checking easy_install...')
        create_venv(dest_dir)
        code = subprocess.check_call([os.path.join(dest_dir, 'bin', 'easy_install'),
                                package])
        if code:
            print('easy_install also failed')
            add_package(os.path.join(output, 'easy-failure.txt'), package)
        else:
            print('easy_install succeeded')
            add_package(os.path.join(output, 'failure.txt'), package)
        pop_last_item(pending_fn, package)
    else:
        print('Installation of %s succeeded' % package)
        add_package(os.path.join(output, 'success.txt'), package)
        pop_last_item(pending_fn, package)
        rmtree(dest_dir)


def create_venv(dest_dir):
    if os.path.exists(dest_dir):
        rmtree(dest_dir)
    print('Creating virtualenv in %s' % dest_dir)
    code = subprocess.check_call(['virtualenv', '--no-site-packages', dest_dir])
    assert not code, "virtualenv failed"


def get_last_item(fn):
    f = open(fn, 'r')
    lines = f.readlines()
    f.close()
    return lines[-1].strip()


def pop_last_item(fn, line=None):
    f = open(fn, 'r')
    lines = f.readlines()
    f.close()
    if line:
        assert lines[-1].strip() == line.strip()
    lines.pop()
    f = open(fn, 'w')
    f.writelines(lines)
    f.close()


def add_package(filename, package):
    f = open(filename, 'a')
    f.write(package + '\n')
    f.close()


if __name__ == '__main__':
    main()