##// END OF EJS Templates
url: fix tests
Matt Mackall -
r13808:58b86b91 default
parent child Browse files
Show More
@@ -1,190 +1,192 b''
1 1 import sys
2 2
3 3 def check(a, b):
4 4 if a != b:
5 5 print (a, b)
6 6
7 7 def cert(cn):
8 8 return dict(subject=((('commonName', cn),),))
9 9
10 10 from mercurial.url import _verifycert
11 11
12 12 # Test non-wildcard certificates
13 13 check(_verifycert(cert('example.com'), 'example.com'),
14 14 None)
15 15 check(_verifycert(cert('example.com'), 'www.example.com'),
16 16 'certificate is for example.com')
17 17 check(_verifycert(cert('www.example.com'), 'example.com'),
18 18 'certificate is for www.example.com')
19 19
20 20 # Test wildcard certificates
21 21 check(_verifycert(cert('*.example.com'), 'www.example.com'),
22 22 None)
23 23 check(_verifycert(cert('*.example.com'), 'example.com'),
24 24 'certificate is for *.example.com')
25 25 check(_verifycert(cert('*.example.com'), 'w.w.example.com'),
26 26 'certificate is for *.example.com')
27 27
28 28 # Test subjectAltName
29 29 san_cert = {'subject': ((('commonName', 'example.com'),),),
30 30 'subjectAltName': (('DNS', '*.example.net'),
31 31 ('DNS', 'example.net'))}
32 32 check(_verifycert(san_cert, 'example.net'),
33 33 None)
34 34 check(_verifycert(san_cert, 'foo.example.net'),
35 35 None)
36 36 # subject is only checked when subjectAltName is empty
37 37 check(_verifycert(san_cert, 'example.com'),
38 38 'certificate is for *.example.net, example.net')
39 39
40 40 # Avoid some pitfalls
41 41 check(_verifycert(cert('*.foo'), 'foo'),
42 42 'certificate is for *.foo')
43 43 check(_verifycert(cert('*o'), 'foo'),
44 44 'certificate is for *o')
45 45
46 46 check(_verifycert({'subject': ()},
47 47 'example.com'),
48 48 'no commonName or subjectAltName found in certificate')
49 49 check(_verifycert(None, 'example.com'),
50 50 'no certificate received')
51 51
52 52 import doctest
53 53
54 54 def test_url():
55 55 """
56 56 >>> from mercurial.url import url
57 57
58 58 This tests for edge cases in url.URL's parsing algorithm. Most of
59 59 these aren't useful for documentation purposes, so they aren't
60 60 part of the class's doc tests.
61 61
62 62 Query strings and fragments:
63 63
64 64 >>> url('http://host/a?b#c')
65 65 <url scheme: 'http', host: 'host', path: 'a', query: 'b', fragment: 'c'>
66 66 >>> url('http://host/a?')
67 67 <url scheme: 'http', host: 'host', path: 'a'>
68 68 >>> url('http://host/a#b#c')
69 69 <url scheme: 'http', host: 'host', path: 'a', fragment: 'b#c'>
70 70 >>> url('http://host/a#b?c')
71 71 <url scheme: 'http', host: 'host', path: 'a', fragment: 'b?c'>
72 72 >>> url('http://host/?a#b')
73 73 <url scheme: 'http', host: 'host', path: '', query: 'a', fragment: 'b'>
74 74 >>> url('http://host/?a#b', parse_query=False)
75 75 <url scheme: 'http', host: 'host', path: '?a', fragment: 'b'>
76 76 >>> url('http://host/?a#b', parse_fragment=False)
77 77 <url scheme: 'http', host: 'host', path: '', query: 'a#b'>
78 78 >>> url('http://host/?a#b', parse_query=False, parse_fragment=False)
79 79 <url scheme: 'http', host: 'host', path: '?a#b'>
80 80
81 81 IPv6 addresses:
82 82
83 83 >>> url('ldap://[2001:db8::7]/c=GB?objectClass?one')
84 84 <url scheme: 'ldap', host: '[2001:db8::7]', path: 'c=GB',
85 85 query: 'objectClass?one'>
86 86 >>> url('ldap://joe:xxx@[2001:db8::7]:80/c=GB?objectClass?one')
87 87 <url scheme: 'ldap', user: 'joe', passwd: 'xxx', host: '[2001:db8::7]',
88 88 port: '80', path: 'c=GB', query: 'objectClass?one'>
89 89
90 90 Missing scheme, host, etc.:
91 91
92 92 >>> url('://192.0.2.16:80/')
93 93 <url path: '://192.0.2.16:80/'>
94 94 >>> url('http://mercurial.selenic.com')
95 95 <url scheme: 'http', host: 'mercurial.selenic.com'>
96 96 >>> url('/foo')
97 97 <url path: '/foo'>
98 98 >>> url('bundle:/foo')
99 99 <url scheme: 'bundle', path: '/foo'>
100 100 >>> url('a?b#c')
101 101 <url path: 'a?b', fragment: 'c'>
102 102 >>> url('http://x.com?arg=/foo')
103 103 <url scheme: 'http', host: 'x.com', query: 'arg=/foo'>
104 104 >>> url('http://joe:xxx@/foo')
105 105 <url scheme: 'http', user: 'joe', passwd: 'xxx', path: 'foo'>
106 106
107 107 Just a scheme and a path:
108 108
109 109 >>> url('mailto:John.Doe@example.com')
110 110 <url scheme: 'mailto', path: 'John.Doe@example.com'>
111 111 >>> url('a:b:c:d')
112 <url scheme: 'a', path: 'b:c:d'>
112 <url path: 'a:b:c:d'>
113 >>> url('aa:bb:cc:dd')
114 <url scheme: 'aa', path: 'bb:cc:dd'>
113 115
114 116 SSH examples:
115 117
116 118 >>> url('ssh://joe@host//home/joe')
117 119 <url scheme: 'ssh', user: 'joe', host: 'host', path: '/home/joe'>
118 120 >>> url('ssh://joe:xxx@host/src')
119 121 <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', path: 'src'>
120 122 >>> url('ssh://joe:xxx@host')
121 123 <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host'>
122 124 >>> url('ssh://joe@host')
123 125 <url scheme: 'ssh', user: 'joe', host: 'host'>
124 126 >>> url('ssh://host')
125 127 <url scheme: 'ssh', host: 'host'>
126 128 >>> url('ssh://')
127 129 <url scheme: 'ssh'>
128 130 >>> url('ssh:')
129 131 <url scheme: 'ssh'>
130 132
131 133 Non-numeric port:
132 134
133 135 >>> url('http://example.com:dd')
134 136 <url scheme: 'http', host: 'example.com', port: 'dd'>
135 137 >>> url('ssh://joe:xxx@host:ssh/foo')
136 138 <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', port: 'ssh',
137 139 path: 'foo'>
138 140
139 141 Bad authentication credentials:
140 142
141 143 >>> url('http://joe@joeville:123@4:@host/a?b#c')
142 144 <url scheme: 'http', user: 'joe@joeville', passwd: '123@4:',
143 145 host: 'host', path: 'a', query: 'b', fragment: 'c'>
144 146 >>> url('http://!*#?/@!*#?/:@host/a?b#c')
145 147 <url scheme: 'http', host: '!*', fragment: '?/@!*#?/:@host/a?b#c'>
146 148 >>> url('http://!*#?@!*#?:@host/a?b#c')
147 149 <url scheme: 'http', host: '!*', fragment: '?@!*#?:@host/a?b#c'>
148 150 >>> url('http://!*@:!*@@host/a?b#c')
149 151 <url scheme: 'http', user: '!*@', passwd: '!*@', host: 'host',
150 152 path: 'a', query: 'b', fragment: 'c'>
151 153
152 154 File paths:
153 155
154 156 >>> url('a/b/c/d.g.f')
155 157 <url path: 'a/b/c/d.g.f'>
156 158 >>> url('/x///z/y/')
157 159 <url path: '/x///z/y/'>
158 160
159 161 Empty URL:
160 162
161 163 >>> u = url('')
162 164 >>> u
163 165 <url path: ''>
164 166 >>> str(u)
165 167 ''
166 168
167 169 Empty path with query string:
168 170
169 171 >>> str(url('http://foo/?bar'))
170 172 'http://foo/?bar'
171 173
172 174 Invalid path:
173 175
174 176 >>> u = url('http://foo/bar')
175 177 >>> u.path = 'bar'
176 178 >>> str(u)
177 179 'http://foo/bar'
178 180
179 181 >>> u = url('file:///foo/bar/baz')
180 182 >>> u
181 183 <url scheme: 'file', path: '/foo/bar/baz'>
182 184 >>> str(u)
183 185 'file:/foo/bar/baz'
184 186 """
185 187
186 188 doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)
187 189
188 190 # Unicode (IDN) certname isn't supported
189 191 check(_verifycert(cert(u'\u4f8b.jp'), 'example.jp'),
190 192 'IDN in certificate not supported')
General Comments 0
You need to be logged in to leave comments. Login now