47 'example.com'), |
47 'example.com'), |
48 'no commonName or subjectAltName found in certificate') |
48 'no commonName or subjectAltName found in certificate') |
49 check(_verifycert(None, 'example.com'), |
49 check(_verifycert(None, 'example.com'), |
50 'no certificate received') |
50 'no certificate received') |
51 |
51 |
|
52 import doctest |
|
53 |
|
54 def test_url(): |
|
55 """ |
|
56 >>> from mercurial.url import url |
|
57 |
|
58 This tests for edge cases in url.URL's parsing algorithm. Most of |
|
59 these aren't useful for documentation purposes, so they aren't |
|
60 part of the class's doc tests. |
|
61 |
|
62 Query strings and fragments: |
|
63 |
|
64 >>> url('http://host/a?b#c') |
|
65 <url scheme: 'http', host: 'host', path: 'a', query: 'b', fragment: 'c'> |
|
66 >>> url('http://host/a?') |
|
67 <url scheme: 'http', host: 'host', path: 'a'> |
|
68 >>> url('http://host/a#b#c') |
|
69 <url scheme: 'http', host: 'host', path: 'a', fragment: 'b#c'> |
|
70 >>> url('http://host/a#b?c') |
|
71 <url scheme: 'http', host: 'host', path: 'a', fragment: 'b?c'> |
|
72 >>> url('http://host/?a#b') |
|
73 <url scheme: 'http', host: 'host', path: '', query: 'a', fragment: 'b'> |
|
74 >>> url('http://host/?a#b', parse_query=False) |
|
75 <url scheme: 'http', host: 'host', path: '?a', fragment: 'b'> |
|
76 >>> url('http://host/?a#b', parse_fragment=False) |
|
77 <url scheme: 'http', host: 'host', path: '', query: 'a#b'> |
|
78 >>> url('http://host/?a#b', parse_query=False, parse_fragment=False) |
|
79 <url scheme: 'http', host: 'host', path: '?a#b'> |
|
80 |
|
81 IPv6 addresses: |
|
82 |
|
83 >>> url('ldap://[2001:db8::7]/c=GB?objectClass?one') |
|
84 <url scheme: 'ldap', host: '[2001:db8::7]', path: 'c=GB', |
|
85 query: 'objectClass?one'> |
|
86 >>> url('ldap://joe:xxx@[2001:db8::7]:80/c=GB?objectClass?one') |
|
87 <url scheme: 'ldap', user: 'joe', passwd: 'xxx', host: '[2001:db8::7]', |
|
88 port: '80', path: 'c=GB', query: 'objectClass?one'> |
|
89 |
|
90 Missing scheme, host, etc.: |
|
91 |
|
92 >>> url('://192.0.2.16:80/') |
|
93 <url path: '://192.0.2.16:80/'> |
|
94 >>> url('http://mercurial.selenic.com') |
|
95 <url scheme: 'http', host: 'mercurial.selenic.com'> |
|
96 >>> url('/foo') |
|
97 <url path: '/foo'> |
|
98 >>> url('bundle:/foo') |
|
99 <url scheme: 'bundle', path: '/foo'> |
|
100 >>> url('a?b#c') |
|
101 <url path: 'a?b', fragment: 'c'> |
|
102 >>> url('http://x.com?arg=/foo') |
|
103 <url scheme: 'http', host: 'x.com', query: 'arg=/foo'> |
|
104 >>> url('http://joe:xxx@/foo') |
|
105 <url scheme: 'http', user: 'joe', passwd: 'xxx', path: 'foo'> |
|
106 |
|
107 Just a scheme and a path: |
|
108 |
|
109 >>> url('mailto:John.Doe@example.com') |
|
110 <url scheme: 'mailto', path: 'John.Doe@example.com'> |
|
111 >>> url('a:b:c:d') |
|
112 <url scheme: 'a', path: 'b:c:d'> |
|
113 |
|
114 SSH examples: |
|
115 |
|
116 >>> url('ssh://joe@host//home/joe') |
|
117 <url scheme: 'ssh', user: 'joe', host: 'host', path: '/home/joe'> |
|
118 >>> url('ssh://joe:xxx@host/src') |
|
119 <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', path: 'src'> |
|
120 >>> url('ssh://joe:xxx@host') |
|
121 <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host'> |
|
122 >>> url('ssh://joe@host') |
|
123 <url scheme: 'ssh', user: 'joe', host: 'host'> |
|
124 >>> url('ssh://host') |
|
125 <url scheme: 'ssh', host: 'host'> |
|
126 >>> url('ssh://') |
|
127 <url scheme: 'ssh'> |
|
128 >>> url('ssh:') |
|
129 <url scheme: 'ssh'> |
|
130 |
|
131 Non-numeric port: |
|
132 |
|
133 >>> url('http://example.com:dd') |
|
134 <url scheme: 'http', host: 'example.com', port: 'dd'> |
|
135 >>> url('ssh://joe:xxx@host:ssh/foo') |
|
136 <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', port: 'ssh', |
|
137 path: 'foo'> |
|
138 |
|
139 Bad authentication credentials: |
|
140 |
|
141 >>> url('http://joe@joeville:123@4:@host/a?b#c') |
|
142 <url scheme: 'http', user: 'joe@joeville', passwd: '123@4:', |
|
143 host: 'host', path: 'a', query: 'b', fragment: 'c'> |
|
144 >>> url('http://!*#?/@!*#?/:@host/a?b#c') |
|
145 <url scheme: 'http', host: '!*', fragment: '?/@!*#?/:@host/a?b#c'> |
|
146 >>> url('http://!*#?@!*#?:@host/a?b#c') |
|
147 <url scheme: 'http', host: '!*', fragment: '?@!*#?:@host/a?b#c'> |
|
148 >>> url('http://!*@:!*@@host/a?b#c') |
|
149 <url scheme: 'http', user: '!*@', passwd: '!*@', host: 'host', |
|
150 path: 'a', query: 'b', fragment: 'c'> |
|
151 |
|
152 File paths: |
|
153 |
|
154 >>> url('a/b/c/d.g.f') |
|
155 <url path: 'a/b/c/d.g.f'> |
|
156 >>> url('/x///z/y/') |
|
157 <url path: '/x///z/y/'> |
|
158 |
|
159 Empty URL: |
|
160 |
|
161 >>> u = url('') |
|
162 >>> u |
|
163 <url path: ''> |
|
164 >>> str(u) |
|
165 '' |
|
166 |
|
167 Empty path with query string: |
|
168 |
|
169 >>> str(url('http://foo/?bar')) |
|
170 'http://foo/?bar' |
|
171 |
|
172 Invalid path: |
|
173 |
|
174 >>> u = url('http://foo/bar') |
|
175 >>> u.path = 'bar' |
|
176 >>> str(u) |
|
177 'http://foo/bar' |
|
178 |
|
179 >>> u = url('file:///foo/bar/baz') |
|
180 >>> u |
|
181 <url scheme: 'file', path: '/foo/bar/baz'> |
|
182 >>> str(u) |
|
183 'file:/foo/bar/baz' |
|
184 """ |
|
185 |
|
186 doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE) |
|
187 |
52 # Unicode (IDN) certname isn't supported |
188 # Unicode (IDN) certname isn't supported |
53 check(_verifycert(cert(u'\u4f8b.jp'), 'example.jp'), |
189 check(_verifycert(cert(u'\u4f8b.jp'), 'example.jp'), |
54 'IDN in certificate not supported') |
190 'IDN in certificate not supported') |