##// END OF EJS Templates
tests: ignore http tests that are known wontfix failures on python 2.4...
Mads Kiilerich -
r20384:c499fff7 default
parent child Browse files
Show More
@@ -1,340 +1,344
1 1 import os, stat, socket
2 2 import re
3 3 import sys
4 4 import tempfile
5 5
6 6 tempprefix = 'hg-hghave-'
7 7
8 8 def matchoutput(cmd, regexp, ignorestatus=False):
9 9 """Return True if cmd executes successfully and its output
10 10 is matched by the supplied regular expression.
11 11 """
12 12 r = re.compile(regexp)
13 13 fh = os.popen(cmd)
14 14 s = fh.read()
15 15 try:
16 16 ret = fh.close()
17 17 except IOError:
18 18 # Happen in Windows test environment
19 19 ret = 1
20 20 return (ignorestatus or ret is None) and r.search(s)
21 21
22 22 def has_baz():
23 23 return matchoutput('baz --version 2>&1', r'baz Bazaar version')
24 24
25 25 def has_bzr():
26 26 try:
27 27 import bzrlib
28 28 return bzrlib.__doc__ is not None
29 29 except ImportError:
30 30 return False
31 31
32 32 def has_bzr114():
33 33 try:
34 34 import bzrlib
35 35 return (bzrlib.__doc__ is not None
36 36 and bzrlib.version_info[:2] >= (1, 14))
37 37 except ImportError:
38 38 return False
39 39
40 40 def has_cvs():
41 41 re = r'Concurrent Versions System.*?server'
42 42 return matchoutput('cvs --version 2>&1', re) and not has_msys()
43 43
44 44 def has_cvs112():
45 45 re = r'Concurrent Versions System \(CVS\) 1.12.*?server'
46 46 return matchoutput('cvs --version 2>&1', re) and not has_msys()
47 47
48 48 def has_darcs():
49 49 return matchoutput('darcs --version', r'2\.[2-9]', True)
50 50
51 51 def has_mtn():
52 52 return matchoutput('mtn --version', r'monotone', True) and not matchoutput(
53 53 'mtn --version', r'monotone 0\.', True)
54 54
55 55 def has_eol_in_paths():
56 56 try:
57 57 fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix, suffix='\n\r')
58 58 os.close(fd)
59 59 os.remove(path)
60 60 return True
61 61 except (IOError, OSError):
62 62 return False
63 63
64 64 def has_executablebit():
65 65 try:
66 66 EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
67 67 fh, fn = tempfile.mkstemp(dir='.', prefix=tempprefix)
68 68 try:
69 69 os.close(fh)
70 70 m = os.stat(fn).st_mode & 0777
71 71 new_file_has_exec = m & EXECFLAGS
72 72 os.chmod(fn, m ^ EXECFLAGS)
73 73 exec_flags_cannot_flip = ((os.stat(fn).st_mode & 0777) == m)
74 74 finally:
75 75 os.unlink(fn)
76 76 except (IOError, OSError):
77 77 # we don't care, the user probably won't be able to commit anyway
78 78 return False
79 79 return not (new_file_has_exec or exec_flags_cannot_flip)
80 80
81 81 def has_icasefs():
82 82 # Stolen from mercurial.util
83 83 fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix)
84 84 os.close(fd)
85 85 try:
86 86 s1 = os.stat(path)
87 87 d, b = os.path.split(path)
88 88 p2 = os.path.join(d, b.upper())
89 89 if path == p2:
90 90 p2 = os.path.join(d, b.lower())
91 91 try:
92 92 s2 = os.stat(p2)
93 93 return s2 == s1
94 94 except OSError:
95 95 return False
96 96 finally:
97 97 os.remove(path)
98 98
99 99 def has_inotify():
100 100 try:
101 101 import hgext.inotify.linux.watcher
102 102 except ImportError:
103 103 return False
104 104 name = tempfile.mktemp(dir='.', prefix=tempprefix)
105 105 sock = socket.socket(socket.AF_UNIX)
106 106 try:
107 107 sock.bind(name)
108 108 except socket.error:
109 109 return False
110 110 sock.close()
111 111 os.unlink(name)
112 112 return True
113 113
114 114 def has_fifo():
115 115 if getattr(os, "mkfifo", None) is None:
116 116 return False
117 117 name = tempfile.mktemp(dir='.', prefix=tempprefix)
118 118 try:
119 119 os.mkfifo(name)
120 120 os.unlink(name)
121 121 return True
122 122 except OSError:
123 123 return False
124 124
125 125 def has_killdaemons():
126 126 return True
127 127
128 128 def has_cacheable_fs():
129 129 from mercurial import util
130 130
131 131 fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix)
132 132 os.close(fd)
133 133 try:
134 134 return util.cachestat(path).cacheable()
135 135 finally:
136 136 os.remove(path)
137 137
138 138 def has_lsprof():
139 139 try:
140 140 import _lsprof
141 141 return True
142 142 except ImportError:
143 143 return False
144 144
145 145 def has_gettext():
146 146 return matchoutput('msgfmt --version', 'GNU gettext-tools')
147 147
148 148 def has_git():
149 149 return matchoutput('git --version 2>&1', r'^git version')
150 150
151 151 def has_docutils():
152 152 try:
153 153 from docutils.core import publish_cmdline
154 154 return True
155 155 except ImportError:
156 156 return False
157 157
158 158 def getsvnversion():
159 159 m = matchoutput('svn --version --quiet 2>&1', r'^(\d+)\.(\d+)')
160 160 if not m:
161 161 return (0, 0)
162 162 return (int(m.group(1)), int(m.group(2)))
163 163
164 164 def has_svn15():
165 165 return getsvnversion() >= (1, 5)
166 166
167 167 def has_svn13():
168 168 return getsvnversion() >= (1, 3)
169 169
170 170 def has_svn():
171 171 return matchoutput('svn --version 2>&1', r'^svn, version') and \
172 172 matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
173 173
174 174 def has_svn_bindings():
175 175 try:
176 176 import svn.core
177 177 version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
178 178 if version < (1, 4):
179 179 return False
180 180 return True
181 181 except ImportError:
182 182 return False
183 183
184 184 def has_p4():
185 185 return (matchoutput('p4 -V', r'Rev\. P4/') and
186 186 matchoutput('p4d -V', r'Rev\. P4D/'))
187 187
188 188 def has_symlink():
189 189 if getattr(os, "symlink", None) is None:
190 190 return False
191 191 name = tempfile.mktemp(dir='.', prefix=tempprefix)
192 192 try:
193 193 os.symlink(".", name)
194 194 os.unlink(name)
195 195 return True
196 196 except (OSError, AttributeError):
197 197 return False
198 198
199 199 def has_hardlink():
200 200 from mercurial import util
201 201 fh, fn = tempfile.mkstemp(dir='.', prefix=tempprefix)
202 202 os.close(fh)
203 203 name = tempfile.mktemp(dir='.', prefix=tempprefix)
204 204 try:
205 205 try:
206 206 util.oslink(fn, name)
207 207 os.unlink(name)
208 208 return True
209 209 except OSError:
210 210 return False
211 211 finally:
212 212 os.unlink(fn)
213 213
214 214 def has_tla():
215 215 return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
216 216
217 217 def has_gpg():
218 218 return matchoutput('gpg --version 2>&1', r'GnuPG')
219 219
220 220 def has_unix_permissions():
221 221 d = tempfile.mkdtemp(dir='.', prefix=tempprefix)
222 222 try:
223 223 fname = os.path.join(d, 'foo')
224 224 for umask in (077, 007, 022):
225 225 os.umask(umask)
226 226 f = open(fname, 'w')
227 227 f.close()
228 228 mode = os.stat(fname).st_mode
229 229 os.unlink(fname)
230 230 if mode & 0777 != ~umask & 0666:
231 231 return False
232 232 return True
233 233 finally:
234 234 os.rmdir(d)
235 235
236 236 def has_root():
237 237 return getattr(os, 'geteuid', None) and os.geteuid() == 0
238 238
239 239 def has_pyflakes():
240 240 return matchoutput("sh -c \"echo 'import re' 2>&1 | pyflakes\"",
241 241 r"<stdin>:1: 're' imported but unused",
242 242 True)
243 243
244 244 def has_pygments():
245 245 try:
246 246 import pygments
247 247 return True
248 248 except ImportError:
249 249 return False
250 250
251 def has_python243():
252 return sys.version_info >= (2, 4, 3)
253
251 254 def has_outer_repo():
252 255 # failing for other reasons than 'no repo' imply that there is a repo
253 256 return not matchoutput('hg root 2>&1',
254 257 r'abort: no repository found', True)
255 258
256 259 def has_ssl():
257 260 try:
258 261 import ssl
259 262 import OpenSSL
260 263 OpenSSL.SSL.Context
261 264 return True
262 265 except ImportError:
263 266 return False
264 267
265 268 def has_windows():
266 269 return os.name == 'nt'
267 270
268 271 def has_system_sh():
269 272 return os.name != 'nt'
270 273
271 274 def has_serve():
272 275 return os.name != 'nt' # gross approximation
273 276
274 277 def has_tic():
275 278 try:
276 279 import curses
277 280 curses.COLOR_BLUE
278 281 return matchoutput('test -x "`which tic`"', '')
279 282 except ImportError:
280 283 return False
281 284
282 285 def has_msys():
283 286 return os.getenv('MSYSTEM')
284 287
285 288 def has_aix():
286 289 return sys.platform.startswith("aix")
287 290
288 291 def has_absimport():
289 292 import __future__
290 293 from mercurial import util
291 294 return util.safehasattr(__future__, "absolute_import")
292 295
293 296 def has_py3k():
294 297 return 3 == sys.version_info[0]
295 298
296 299 checks = {
297 300 "true": (lambda: True, "yak shaving"),
298 301 "false": (lambda: False, "nail clipper"),
299 302 "baz": (has_baz, "GNU Arch baz client"),
300 303 "bzr": (has_bzr, "Canonical's Bazaar client"),
301 304 "bzr114": (has_bzr114, "Canonical's Bazaar client >= 1.14"),
302 305 "cacheable": (has_cacheable_fs, "cacheable filesystem"),
303 306 "cvs": (has_cvs, "cvs client/server"),
304 307 "cvs112": (has_cvs112, "cvs client/server >= 1.12"),
305 308 "darcs": (has_darcs, "darcs client"),
306 309 "docutils": (has_docutils, "Docutils text processing library"),
307 310 "eol-in-paths": (has_eol_in_paths, "end-of-lines in paths"),
308 311 "execbit": (has_executablebit, "executable bit"),
309 312 "fifo": (has_fifo, "named pipes"),
310 313 "gettext": (has_gettext, "GNU Gettext (msgfmt)"),
311 314 "git": (has_git, "git command line client"),
312 315 "gpg": (has_gpg, "gpg client"),
313 316 "hardlink": (has_hardlink, "hardlinks"),
314 317 "icasefs": (has_icasefs, "case insensitive file system"),
315 318 "inotify": (has_inotify, "inotify extension support"),
316 319 "killdaemons": (has_killdaemons, 'killdaemons.py support'),
317 320 "lsprof": (has_lsprof, "python lsprof module"),
318 321 "mtn": (has_mtn, "monotone client (>= 1.0)"),
319 322 "outer-repo": (has_outer_repo, "outer repo"),
320 323 "p4": (has_p4, "Perforce server and client"),
321 324 "pyflakes": (has_pyflakes, "Pyflakes python linter"),
322 325 "pygments": (has_pygments, "Pygments source highlighting library"),
326 "python243": (has_python243, "python >= 2.4.3"),
323 327 "root": (has_root, "root permissions"),
324 328 "serve": (has_serve, "platform and python can manage 'hg serve -d'"),
325 329 "ssl": (has_ssl, "python >= 2.6 ssl module and python OpenSSL"),
326 330 "svn": (has_svn, "subversion client and admin tools"),
327 331 "svn13": (has_svn13, "subversion client and admin tools >= 1.3"),
328 332 "svn15": (has_svn15, "subversion client and admin tools >= 1.5"),
329 333 "svn-bindings": (has_svn_bindings, "subversion python bindings"),
330 334 "symlink": (has_symlink, "symbolic links"),
331 335 "system-sh": (has_system_sh, "system() uses sh"),
332 336 "tic": (has_tic, "terminfo compiler and curses module"),
333 337 "tla": (has_tla, "GNU Arch tla client"),
334 338 "unix-permissions": (has_unix_permissions, "unix-style permissions"),
335 339 "windows": (has_windows, "Windows"),
336 340 "msys": (has_msys, "Windows with MSYS"),
337 341 "aix": (has_aix, "AIX"),
338 342 "absimport": (has_absimport, "absolute_import in __future__"),
339 343 "py3k": (has_py3k, "running with Python 3.x"),
340 344 }
@@ -1,237 +1,241
1 1 $ "$TESTDIR/hghave" serve || exit 80
2 2
3 3 $ hg init test
4 4 $ cd test
5 5 $ echo foo>foo
6 6 $ mkdir foo.d foo.d/bAr.hg.d foo.d/baR.d.hg
7 7 $ echo foo>foo.d/foo
8 8 $ echo bar>foo.d/bAr.hg.d/BaR
9 9 $ echo bar>foo.d/baR.d.hg/bAR
10 10 $ hg commit -A -m 1
11 11 adding foo
12 12 adding foo.d/bAr.hg.d/BaR
13 13 adding foo.d/baR.d.hg/bAR
14 14 adding foo.d/foo
15 15 $ hg serve -p $HGPORT -d --pid-file=../hg1.pid -E ../error.log
16 16 $ hg --config server.uncompressed=False serve -p $HGPORT1 -d --pid-file=../hg2.pid
17 17
18 18 Test server address cannot be reused
19 19
20 20 #if windows
21 21 $ hg serve -p $HGPORT1 2>&1
22 22 abort: cannot start server at ':$HGPORT1': * (glob)
23 23 [255]
24 24 #else
25 25 $ hg serve -p $HGPORT1 2>&1
26 26 abort: cannot start server at ':$HGPORT1': Address already in use
27 27 [255]
28 28 #endif
29 29 $ cd ..
30 30 $ cat hg1.pid hg2.pid >> $DAEMON_PIDS
31 31
32 32 clone via stream
33 33
34 34 $ hg clone --uncompressed http://localhost:$HGPORT/ copy 2>&1
35 35 streaming all changes
36 36 6 files to transfer, 606 bytes of data
37 37 transferred * bytes in * seconds (*/sec) (glob)
38 38 updating to branch default
39 39 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
40 40 $ hg verify -R copy
41 41 checking changesets
42 42 checking manifests
43 43 crosschecking files in changesets and manifests
44 44 checking files
45 45 4 files, 1 changesets, 4 total revisions
46 46
47 47 try to clone via stream, should use pull instead
48 48
49 49 $ hg clone --uncompressed http://localhost:$HGPORT1/ copy2
50 50 requesting all changes
51 51 adding changesets
52 52 adding manifests
53 53 adding file changes
54 54 added 1 changesets with 4 changes to 4 files
55 55 updating to branch default
56 56 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
57 57
58 58 clone via pull
59 59
60 60 $ hg clone http://localhost:$HGPORT1/ copy-pull
61 61 requesting all changes
62 62 adding changesets
63 63 adding manifests
64 64 adding file changes
65 65 added 1 changesets with 4 changes to 4 files
66 66 updating to branch default
67 67 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
68 68 $ hg verify -R copy-pull
69 69 checking changesets
70 70 checking manifests
71 71 crosschecking files in changesets and manifests
72 72 checking files
73 73 4 files, 1 changesets, 4 total revisions
74 74 $ cd test
75 75 $ echo bar > bar
76 76 $ hg commit -A -d '1 0' -m 2
77 77 adding bar
78 78 $ cd ..
79 79
80 80 clone over http with --update
81 81
82 82 $ hg clone http://localhost:$HGPORT1/ updated --update 0
83 83 requesting all changes
84 84 adding changesets
85 85 adding manifests
86 86 adding file changes
87 87 added 2 changesets with 5 changes to 5 files
88 88 updating to branch default
89 89 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
90 90 $ hg log -r . -R updated
91 91 changeset: 0:8b6053c928fe
92 92 user: test
93 93 date: Thu Jan 01 00:00:00 1970 +0000
94 94 summary: 1
95 95
96 96 $ rm -rf updated
97 97
98 98 incoming via HTTP
99 99
100 100 $ hg clone http://localhost:$HGPORT1/ --rev 0 partial
101 101 adding changesets
102 102 adding manifests
103 103 adding file changes
104 104 added 1 changesets with 4 changes to 4 files
105 105 updating to branch default
106 106 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
107 107 $ cd partial
108 108 $ touch LOCAL
109 109 $ hg ci -qAm LOCAL
110 110 $ hg incoming http://localhost:$HGPORT1/ --template '{desc}\n'
111 111 comparing with http://localhost:$HGPORT1/
112 112 searching for changes
113 113 2
114 114 $ cd ..
115 115
116 116 pull
117 117
118 118 $ cd copy-pull
119 119 $ echo '[hooks]' >> .hg/hgrc
120 120 $ echo "changegroup = python \"$TESTDIR/printenv.py\" changegroup" >> .hg/hgrc
121 121 $ hg pull
122 122 pulling from http://localhost:$HGPORT1/
123 123 searching for changes
124 124 adding changesets
125 125 adding manifests
126 126 adding file changes
127 127 added 1 changesets with 1 changes to 1 files
128 128 changegroup hook: HG_NODE=5fed3813f7f5e1824344fdc9cf8f63bb662c292d HG_SOURCE=pull HG_URL=http://localhost:$HGPORT1/
129 129 (run 'hg update' to get a working copy)
130 130 $ cd ..
131 131
132 132 clone from invalid URL
133 133
134 134 $ hg clone http://localhost:$HGPORT/bad
135 135 abort: HTTP Error 404: Not Found
136 136 [255]
137 137
138 138 test http authentication
139 139 + use the same server to test server side streaming preference
140 140
141 141 $ cd test
142 142 $ cat << EOT > userpass.py
143 143 > import base64
144 144 > from mercurial.hgweb import common
145 145 > def perform_authentication(hgweb, req, op):
146 146 > auth = req.env.get('HTTP_AUTHORIZATION')
147 147 > if not auth:
148 148 > raise common.ErrorResponse(common.HTTP_UNAUTHORIZED, 'who',
149 149 > [('WWW-Authenticate', 'Basic Realm="mercurial"')])
150 150 > if base64.b64decode(auth.split()[1]).split(':', 1) != ['user', 'pass']:
151 151 > raise common.ErrorResponse(common.HTTP_FORBIDDEN, 'no')
152 152 > def extsetup():
153 153 > common.permhooks.insert(0, perform_authentication)
154 154 > EOT
155 155 $ hg --config extensions.x=userpass.py serve -p $HGPORT2 -d --pid-file=pid \
156 156 > --config server.preferuncompressed=True
157 157 $ cat pid >> $DAEMON_PIDS
158 158
159 159 $ cat << EOF > get_pass.py
160 160 > import getpass
161 161 > def newgetpass(arg):
162 162 > return "pass"
163 163 > getpass.getpass = newgetpass
164 164 > EOF
165 165
166 #if python243
166 167 $ hg id http://localhost:$HGPORT2/
167 168 abort: http authorization required for http://localhost:$HGPORT2/
168 169 [255]
169 170 $ hg id http://localhost:$HGPORT2/
170 171 abort: http authorization required for http://localhost:$HGPORT2/
171 172 [255]
172 173 $ hg id --config ui.interactive=true --config extensions.getpass=get_pass.py http://user@localhost:$HGPORT2/
173 174 http authorization required for http://localhost:$HGPORT2/
174 175 realm: mercurial
175 176 user: user
176 177 password: 5fed3813f7f5
177 178 $ hg id http://user:pass@localhost:$HGPORT2/
178 179 5fed3813f7f5
180 #endif
179 181 $ echo '[auth]' >> .hg/hgrc
180 182 $ echo 'l.schemes=http' >> .hg/hgrc
181 183 $ echo 'l.prefix=lo' >> .hg/hgrc
182 184 $ echo 'l.username=user' >> .hg/hgrc
183 185 $ echo 'l.password=pass' >> .hg/hgrc
184 186 $ hg id http://localhost:$HGPORT2/
185 187 5fed3813f7f5
186 188 $ hg id http://localhost:$HGPORT2/
187 189 5fed3813f7f5
188 190 $ hg id http://user@localhost:$HGPORT2/
189 191 5fed3813f7f5
192 #if python243
190 193 $ hg clone http://user:pass@localhost:$HGPORT2/ dest 2>&1
191 194 streaming all changes
192 195 7 files to transfer, 916 bytes of data
193 196 transferred * bytes in * seconds (*/sec) (glob)
194 197 updating to branch default
195 198 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
196 199
197 200 $ hg id http://user2@localhost:$HGPORT2/
198 201 abort: http authorization required for http://localhost:$HGPORT2/
199 202 [255]
200 203 $ hg id http://user:pass2@localhost:$HGPORT2/
201 204 abort: HTTP Error 403: no
202 205 [255]
206 #endif
203 207
204 208 $ cd ..
205 209
206 210 clone of serve with repo in root and unserved subrepo (issue2970)
207 211
208 212 $ hg --cwd test init sub
209 213 $ echo empty > test/sub/empty
210 214 $ hg --cwd test/sub add empty
211 215 $ hg --cwd test/sub commit -qm 'add empty'
212 216 $ hg --cwd test/sub tag -r 0 something
213 217 $ echo sub = sub > test/.hgsub
214 218 $ hg --cwd test add .hgsub
215 219 $ hg --cwd test commit -qm 'add subrepo'
216 220 $ hg clone http://localhost:$HGPORT noslash-clone
217 221 requesting all changes
218 222 adding changesets
219 223 adding manifests
220 224 adding file changes
221 225 added 3 changesets with 7 changes to 7 files
222 226 updating to branch default
223 227 abort: HTTP Error 404: Not Found
224 228 [255]
225 229 $ hg clone http://localhost:$HGPORT/ slash-clone
226 230 requesting all changes
227 231 adding changesets
228 232 adding manifests
229 233 adding file changes
230 234 added 3 changesets with 7 changes to 7 files
231 235 updating to branch default
232 236 abort: HTTP Error 404: Not Found
233 237 [255]
234 238
235 239 check error log
236 240
237 241 $ cat error.log
General Comments 0
You need to be logged in to leave comments. Login now