##// END OF EJS Templates
tests: update ssl requirement for test-https.t...
Mads Kiilerich -
r13418:28555e29 default
parent child Browse files
Show More
@@ -1,272 +1,274
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 """Test the running system for features availability. Exit with zero
2 """Test the running system for features availability. Exit with zero
3 if all features are there, non-zero otherwise. If a feature name is
3 if all features are there, non-zero otherwise. If a feature name is
4 prefixed with "no-", the absence of feature is tested.
4 prefixed with "no-", the absence of feature is tested.
5 """
5 """
6 import optparse
6 import optparse
7 import os
7 import os
8 import re
8 import re
9 import sys
9 import sys
10 import tempfile
10 import tempfile
11
11
12 tempprefix = 'hg-hghave-'
12 tempprefix = 'hg-hghave-'
13
13
14 def matchoutput(cmd, regexp, ignorestatus=False):
14 def matchoutput(cmd, regexp, ignorestatus=False):
15 """Return True if cmd executes successfully and its output
15 """Return True if cmd executes successfully and its output
16 is matched by the supplied regular expression.
16 is matched by the supplied regular expression.
17 """
17 """
18 r = re.compile(regexp)
18 r = re.compile(regexp)
19 fh = os.popen(cmd)
19 fh = os.popen(cmd)
20 s = fh.read()
20 s = fh.read()
21 try:
21 try:
22 ret = fh.close()
22 ret = fh.close()
23 except IOError:
23 except IOError:
24 # Happen in Windows test environment
24 # Happen in Windows test environment
25 ret = 1
25 ret = 1
26 return (ignorestatus or ret is None) and r.search(s)
26 return (ignorestatus or ret is None) and r.search(s)
27
27
28 def has_baz():
28 def has_baz():
29 return matchoutput('baz --version 2>&1', r'baz Bazaar version')
29 return matchoutput('baz --version 2>&1', r'baz Bazaar version')
30
30
31 def has_bzr():
31 def has_bzr():
32 try:
32 try:
33 import bzrlib
33 import bzrlib
34 return bzrlib.__doc__ != None
34 return bzrlib.__doc__ != None
35 except ImportError:
35 except ImportError:
36 return False
36 return False
37
37
38 def has_bzr114():
38 def has_bzr114():
39 try:
39 try:
40 import bzrlib
40 import bzrlib
41 return (bzrlib.__doc__ != None
41 return (bzrlib.__doc__ != None
42 and bzrlib.version_info[:2] >= (1, 14))
42 and bzrlib.version_info[:2] >= (1, 14))
43 except ImportError:
43 except ImportError:
44 return False
44 return False
45
45
46 def has_cvs():
46 def has_cvs():
47 re = r'Concurrent Versions System.*?server'
47 re = r'Concurrent Versions System.*?server'
48 return matchoutput('cvs --version 2>&1', re)
48 return matchoutput('cvs --version 2>&1', re)
49
49
50 def has_darcs():
50 def has_darcs():
51 return matchoutput('darcs --version', r'2\.[2-9]', True)
51 return matchoutput('darcs --version', r'2\.[2-9]', True)
52
52
53 def has_mtn():
53 def has_mtn():
54 return matchoutput('mtn --version', r'monotone', True) and not matchoutput(
54 return matchoutput('mtn --version', r'monotone', True) and not matchoutput(
55 'mtn --version', r'monotone 0\.(\d|[12]\d|3[01])[^\d]', True)
55 'mtn --version', r'monotone 0\.(\d|[12]\d|3[01])[^\d]', True)
56
56
57 def has_eol_in_paths():
57 def has_eol_in_paths():
58 try:
58 try:
59 fd, path = tempfile.mkstemp(prefix=tempprefix, suffix='\n\r')
59 fd, path = tempfile.mkstemp(prefix=tempprefix, suffix='\n\r')
60 os.close(fd)
60 os.close(fd)
61 os.remove(path)
61 os.remove(path)
62 return True
62 return True
63 except:
63 except:
64 return False
64 return False
65
65
66 def has_executablebit():
66 def has_executablebit():
67 fd, path = tempfile.mkstemp(prefix=tempprefix)
67 fd, path = tempfile.mkstemp(prefix=tempprefix)
68 os.close(fd)
68 os.close(fd)
69 try:
69 try:
70 s = os.lstat(path).st_mode
70 s = os.lstat(path).st_mode
71 os.chmod(path, s | 0100)
71 os.chmod(path, s | 0100)
72 return (os.lstat(path).st_mode & 0100 != 0)
72 return (os.lstat(path).st_mode & 0100 != 0)
73 finally:
73 finally:
74 os.remove(path)
74 os.remove(path)
75
75
76 def has_icasefs():
76 def has_icasefs():
77 # Stolen from mercurial.util
77 # Stolen from mercurial.util
78 fd, path = tempfile.mkstemp(prefix=tempprefix, dir='.')
78 fd, path = tempfile.mkstemp(prefix=tempprefix, dir='.')
79 os.close(fd)
79 os.close(fd)
80 try:
80 try:
81 s1 = os.stat(path)
81 s1 = os.stat(path)
82 d, b = os.path.split(path)
82 d, b = os.path.split(path)
83 p2 = os.path.join(d, b.upper())
83 p2 = os.path.join(d, b.upper())
84 if path == p2:
84 if path == p2:
85 p2 = os.path.join(d, b.lower())
85 p2 = os.path.join(d, b.lower())
86 try:
86 try:
87 s2 = os.stat(p2)
87 s2 = os.stat(p2)
88 return s2 == s1
88 return s2 == s1
89 except:
89 except:
90 return False
90 return False
91 finally:
91 finally:
92 os.remove(path)
92 os.remove(path)
93
93
94 def has_inotify():
94 def has_inotify():
95 try:
95 try:
96 import hgext.inotify.linux.watcher
96 import hgext.inotify.linux.watcher
97 return True
97 return True
98 except ImportError:
98 except ImportError:
99 return False
99 return False
100
100
101 def has_fifo():
101 def has_fifo():
102 return hasattr(os, "mkfifo")
102 return hasattr(os, "mkfifo")
103
103
104 def has_lsprof():
104 def has_lsprof():
105 try:
105 try:
106 import _lsprof
106 import _lsprof
107 return True
107 return True
108 except ImportError:
108 except ImportError:
109 return False
109 return False
110
110
111 def has_git():
111 def has_git():
112 return matchoutput('git --version 2>&1', r'^git version')
112 return matchoutput('git --version 2>&1', r'^git version')
113
113
114 def has_docutils():
114 def has_docutils():
115 try:
115 try:
116 from docutils.core import publish_cmdline
116 from docutils.core import publish_cmdline
117 return True
117 return True
118 except ImportError:
118 except ImportError:
119 return False
119 return False
120
120
121 def has_svn():
121 def has_svn():
122 return matchoutput('svn --version 2>&1', r'^svn, version') and \
122 return matchoutput('svn --version 2>&1', r'^svn, version') and \
123 matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
123 matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
124
124
125 def has_svn_bindings():
125 def has_svn_bindings():
126 try:
126 try:
127 import svn.core
127 import svn.core
128 version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
128 version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
129 if version < (1, 4):
129 if version < (1, 4):
130 return False
130 return False
131 return True
131 return True
132 except ImportError:
132 except ImportError:
133 return False
133 return False
134
134
135 def has_p4():
135 def has_p4():
136 return matchoutput('p4 -V', r'Rev\. P4/') and matchoutput('p4d -V', r'Rev\. P4D/')
136 return matchoutput('p4 -V', r'Rev\. P4/') and matchoutput('p4d -V', r'Rev\. P4D/')
137
137
138 def has_symlink():
138 def has_symlink():
139 return hasattr(os, "symlink")
139 return hasattr(os, "symlink")
140
140
141 def has_tla():
141 def has_tla():
142 return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
142 return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
143
143
144 def has_gpg():
144 def has_gpg():
145 return matchoutput('gpg --version 2>&1', r'GnuPG')
145 return matchoutput('gpg --version 2>&1', r'GnuPG')
146
146
147 def has_unix_permissions():
147 def has_unix_permissions():
148 d = tempfile.mkdtemp(prefix=tempprefix, dir=".")
148 d = tempfile.mkdtemp(prefix=tempprefix, dir=".")
149 try:
149 try:
150 fname = os.path.join(d, 'foo')
150 fname = os.path.join(d, 'foo')
151 for umask in (077, 007, 022):
151 for umask in (077, 007, 022):
152 os.umask(umask)
152 os.umask(umask)
153 f = open(fname, 'w')
153 f = open(fname, 'w')
154 f.close()
154 f.close()
155 mode = os.stat(fname).st_mode
155 mode = os.stat(fname).st_mode
156 os.unlink(fname)
156 os.unlink(fname)
157 if mode & 0777 != ~umask & 0666:
157 if mode & 0777 != ~umask & 0666:
158 return False
158 return False
159 return True
159 return True
160 finally:
160 finally:
161 os.rmdir(d)
161 os.rmdir(d)
162
162
163 def has_pygments():
163 def has_pygments():
164 try:
164 try:
165 import pygments
165 import pygments
166 return True
166 return True
167 except ImportError:
167 except ImportError:
168 return False
168 return False
169
169
170 def has_outer_repo():
170 def has_outer_repo():
171 return matchoutput('hg root 2>&1', r'')
171 return matchoutput('hg root 2>&1', r'')
172
172
173 def has_ssl():
173 def has_ssl():
174 try:
174 try:
175 import ssl
175 import ssl
176 import OpenSSL
177 OpenSSL.SSL.Context
176 return True
178 return True
177 except ImportError:
179 except ImportError:
178 return False
180 return False
179
181
180 checks = {
182 checks = {
181 "baz": (has_baz, "GNU Arch baz client"),
183 "baz": (has_baz, "GNU Arch baz client"),
182 "bzr": (has_bzr, "Canonical's Bazaar client"),
184 "bzr": (has_bzr, "Canonical's Bazaar client"),
183 "bzr114": (has_bzr114, "Canonical's Bazaar client >= 1.14"),
185 "bzr114": (has_bzr114, "Canonical's Bazaar client >= 1.14"),
184 "cvs": (has_cvs, "cvs client/server"),
186 "cvs": (has_cvs, "cvs client/server"),
185 "darcs": (has_darcs, "darcs client"),
187 "darcs": (has_darcs, "darcs client"),
186 "docutils": (has_docutils, "Docutils text processing library"),
188 "docutils": (has_docutils, "Docutils text processing library"),
187 "eol-in-paths": (has_eol_in_paths, "end-of-lines in paths"),
189 "eol-in-paths": (has_eol_in_paths, "end-of-lines in paths"),
188 "execbit": (has_executablebit, "executable bit"),
190 "execbit": (has_executablebit, "executable bit"),
189 "fifo": (has_fifo, "named pipes"),
191 "fifo": (has_fifo, "named pipes"),
190 "git": (has_git, "git command line client"),
192 "git": (has_git, "git command line client"),
191 "gpg": (has_gpg, "gpg client"),
193 "gpg": (has_gpg, "gpg client"),
192 "icasefs": (has_icasefs, "case insensitive file system"),
194 "icasefs": (has_icasefs, "case insensitive file system"),
193 "inotify": (has_inotify, "inotify extension support"),
195 "inotify": (has_inotify, "inotify extension support"),
194 "lsprof": (has_lsprof, "python lsprof module"),
196 "lsprof": (has_lsprof, "python lsprof module"),
195 "mtn": (has_mtn, "monotone client (> 0.31)"),
197 "mtn": (has_mtn, "monotone client (> 0.31)"),
196 "outer-repo": (has_outer_repo, "outer repo"),
198 "outer-repo": (has_outer_repo, "outer repo"),
197 "p4": (has_p4, "Perforce server and client"),
199 "p4": (has_p4, "Perforce server and client"),
198 "pygments": (has_pygments, "Pygments source highlighting library"),
200 "pygments": (has_pygments, "Pygments source highlighting library"),
199 "ssl": (has_ssl, "python >= 2.6 ssl module"),
201 "ssl": (has_ssl, "python >= 2.6 ssl module"),
200 "svn": (has_svn, "subversion client and admin tools"),
202 "svn": (has_svn, "subversion client and admin tools"),
201 "svn-bindings": (has_svn_bindings, "subversion python bindings"),
203 "svn-bindings": (has_svn_bindings, "subversion python bindings"),
202 "symlink": (has_symlink, "symbolic links"),
204 "symlink": (has_symlink, "symbolic links"),
203 "tla": (has_tla, "GNU Arch tla client"),
205 "tla": (has_tla, "GNU Arch tla client"),
204 "unix-permissions": (has_unix_permissions, "unix-style permissions"),
206 "unix-permissions": (has_unix_permissions, "unix-style permissions"),
205 }
207 }
206
208
207 def list_features():
209 def list_features():
208 for name, feature in checks.iteritems():
210 for name, feature in checks.iteritems():
209 desc = feature[1]
211 desc = feature[1]
210 print name + ':', desc
212 print name + ':', desc
211
213
212 def test_features():
214 def test_features():
213 failed = 0
215 failed = 0
214 for name, feature in checks.iteritems():
216 for name, feature in checks.iteritems():
215 check, _ = feature
217 check, _ = feature
216 try:
218 try:
217 check()
219 check()
218 except Exception, e:
220 except Exception, e:
219 print "feature %s failed: %s" % (name, e)
221 print "feature %s failed: %s" % (name, e)
220 failed += 1
222 failed += 1
221 return failed
223 return failed
222
224
223 parser = optparse.OptionParser("%prog [options] [features]")
225 parser = optparse.OptionParser("%prog [options] [features]")
224 parser.add_option("--test-features", action="store_true",
226 parser.add_option("--test-features", action="store_true",
225 help="test available features")
227 help="test available features")
226 parser.add_option("--list-features", action="store_true",
228 parser.add_option("--list-features", action="store_true",
227 help="list available features")
229 help="list available features")
228 parser.add_option("-q", "--quiet", action="store_true",
230 parser.add_option("-q", "--quiet", action="store_true",
229 help="check features silently")
231 help="check features silently")
230
232
231 if __name__ == '__main__':
233 if __name__ == '__main__':
232 options, args = parser.parse_args()
234 options, args = parser.parse_args()
233 if options.list_features:
235 if options.list_features:
234 list_features()
236 list_features()
235 sys.exit(0)
237 sys.exit(0)
236
238
237 if options.test_features:
239 if options.test_features:
238 sys.exit(test_features())
240 sys.exit(test_features())
239
241
240 quiet = options.quiet
242 quiet = options.quiet
241
243
242 failures = 0
244 failures = 0
243
245
244 def error(msg):
246 def error(msg):
245 global failures
247 global failures
246 if not quiet:
248 if not quiet:
247 sys.stderr.write(msg + '\n')
249 sys.stderr.write(msg + '\n')
248 failures += 1
250 failures += 1
249
251
250 for feature in args:
252 for feature in args:
251 negate = feature.startswith('no-')
253 negate = feature.startswith('no-')
252 if negate:
254 if negate:
253 feature = feature[3:]
255 feature = feature[3:]
254
256
255 if feature not in checks:
257 if feature not in checks:
256 error('skipped: unknown feature: ' + feature)
258 error('skipped: unknown feature: ' + feature)
257 continue
259 continue
258
260
259 check, desc = checks[feature]
261 check, desc = checks[feature]
260 try:
262 try:
261 available = check()
263 available = check()
262 except Exception, e:
264 except Exception, e:
263 error('hghave check failed: ' + feature)
265 error('hghave check failed: ' + feature)
264 continue
266 continue
265
267
266 if not negate and not available:
268 if not negate and not available:
267 error('skipped: missing feature: ' + desc)
269 error('skipped: missing feature: ' + desc)
268 elif negate and available:
270 elif negate and available:
269 error('skipped: system supports %s' % desc)
271 error('skipped: system supports %s' % desc)
270
272
271 if failures != 0:
273 if failures != 0:
272 sys.exit(1)
274 sys.exit(1)
General Comments 0
You need to be logged in to leave comments. Login now