1from PyObjCTools.TestSupport import *
2import array
3from CoreFoundation import *
4import os
5from Foundation import NSURL
6
7
8class TestURL (TestCase):
9    def testTypes(self):
10        self.failUnless(CFURLRef is NSURL)
11
12    def testTypeID(self):
13        val = CFURLGetTypeID()
14        self.failUnless( isinstance(val, (int, long)) )
15
16    def testCreateWithBytes(self):
17        url = "http://www.omroep.nl/"
18
19        ref = CFURLCreateWithBytes(None, url, len(url), kCFStringEncodingUTF8, None)
20        self.failUnless( isinstance(ref, CFURLRef) )
21
22        strval =  CFURLGetString(ref)
23        self.failUnlessEqual(strval, unicode(url, "utf-8"))
24
25        ref2 = CFURLCreateWithBytes(None, url, len(url), kCFStringEncodingUTF8, ref)
26        self.failUnless( isinstance(ref2, CFURLRef) )
27
28        a = array.array('c', 'http://www.nu.nl/')
29        ref3 = CFURLCreateWithBytes(None, a, len(a), kCFStringEncodingUTF8, None)
30        self.failUnless( isinstance(ref3, CFURLRef) )
31
32        # Explictely test for unicode's buffer madness.
33        self.failUnlessRaises((ValueError, TypeError), CFURLCreateWithBytes, None, unicode(url), len(url), kCFStringEncodingUTF8, None)
34
35    def testCreateData(self):
36        url = "http://www.omroep.nl/ blank"
37
38        ref = CFURLCreateWithBytes(None, url, len(url), kCFStringEncodingUTF8, None)
39        self.failUnless( isinstance(ref, CFURLRef) )
40
41        data = CFURLCreateData(None, ref, kCFStringEncodingUTF8, False)
42        self.failUnless( isinstance(data, CFDataRef) )
43        val = CFDataGetBytes(data, (0, CFDataGetLength(data)), None)
44        self.assertEquals(val, url.replace(' ', '%20'))
45
46        data = CFURLCreateData(None, ref, kCFStringEncodingUTF8, True)
47        self.failUnless( isinstance(data, CFDataRef) )
48        val = CFDataGetBytes(data, (0, CFDataGetLength(data)), None)
49        self.assertEquals(val, url.replace(' ', '%20'))
50
51    def testCreateWithString(self):
52        url = u"http://www.omroep.nl/"
53
54        ref = CFURLCreateWithString(None, url, None)
55        self.failUnless( isinstance(ref, CFURLRef) )
56
57        strval =  CFURLGetString(ref)
58        self.failUnlessEqual(strval, url)
59
60        ref2 = CFURLCreateWithString(None, url, ref)
61        self.failUnless( isinstance(ref2, CFURLRef) )
62
63    def testCreateAbsolute(self):
64        url = u"http://www.omroep.nl/sport/"
65        baseref = CFURLCreateWithString(None, url, None)
66
67        self.failUnlessArgHasType(CFURLCreateAbsoluteURLWithBytes, 1, 'n^v')
68        self.failUnlessArgSizeInArg(CFURLCreateAbsoluteURLWithBytes, 1, 2)
69        ref = CFURLCreateAbsoluteURLWithBytes(None, "socker", len("socker"), kCFStringEncodingUTF8, baseref, True)
70        self.failUnless( isinstance(ref, CFURLRef) )
71
72        strval =  CFURLGetString(ref)
73        self.failUnlessEqual(strval, u"http://www.omroep.nl/sport/socker")
74
75        relpath = "../../../dummy"
76        ref = CFURLCreateAbsoluteURLWithBytes(None, relpath, len(relpath), kCFStringEncodingUTF8, baseref, True)
77        self.failUnless( isinstance(ref, CFURLRef) )
78        strval =  CFURLGetString(ref)
79        self.failUnlessEqual(strval, u"http://www.omroep.nl/dummy")
80
81        relpath = "../../../dummy"
82        ref = CFURLCreateAbsoluteURLWithBytes(None, relpath, len(relpath), kCFStringEncodingUTF8, baseref, False)
83        self.failUnless( isinstance(ref, CFURLRef) )
84        strval =  CFURLGetString(ref)
85        self.failUnlessEqual(strval, u"http://www.omroep.nl/../../dummy")
86
87
88    def testCopyAbs(self):
89        # CFURLCopyAbsoluteURL
90        base = CFURLCreateWithString(None, u"http://www.omroep.nl/", None)
91        self.failUnless( isinstance(base, CFURLRef) )
92
93        ref = CFURLCreateWithString(None, u"/sport", base)
94        self.failUnless( isinstance(ref, CFURLRef) )
95
96        self.failUnless( CFURLGetString(ref) == u"/sport" )
97
98        abs = CFURLCopyAbsoluteURL(ref)
99        self.failUnless( isinstance(abs, CFURLRef) )
100        self.failUnless( CFURLGetString(abs) == u"http://www.omroep.nl/sport" )
101
102    def testPaths(self):
103        url = CFURLCreateWithFileSystemPath(None,
104                u"/tmp/", kCFURLPOSIXPathStyle, True)
105        self.failUnless( isinstance(url, CFURLRef) )
106        self.failUnless(CFURLHasDirectoryPath(url))
107
108        url = CFURLCreateWithFileSystemPath(None,
109                u"/etc/hosts", kCFURLPOSIXPathStyle, False)
110        self.failUnless( isinstance(url, CFURLRef) )
111        self.failIf(CFURLHasDirectoryPath(url))
112
113        p = os.path.expanduser('~')
114        self.failUnlessArgHasType(CFURLCreateFromFileSystemRepresentation, 1, 'n^t')
115        self.failUnlessArgIsNullTerminated(CFURLCreateFromFileSystemRepresentation, 1)
116        url = CFURLCreateFromFileSystemRepresentation(None,
117                p, len(p), True)
118        self.failUnless( isinstance(url, CFURLRef))
119        self.assertRaises((ValueError, TypeError),
120            CFURLCreateFromFileSystemRepresentation, None,
121                u"/tmp/", 4, True)
122
123        base = CFURLCreateWithFileSystemPath(None,
124                u"/tmp", kCFURLPOSIXPathStyle, True)
125        self.failUnless( isinstance(base, CFURLRef) )
126
127        self.failUnlessArgIsBOOL(CFURLCreateWithFileSystemPathRelativeToBase, 3)
128        url = CFURLCreateWithFileSystemPathRelativeToBase(None,
129                u"filename", kCFURLPOSIXPathStyle, True, base)
130        self.failUnless( isinstance(url, CFURLRef) )
131
132        strval =  CFURLGetString(url)
133        self.assertEquals(strval, u"filename/")
134
135
136        self.failUnlessArgIsBOOL(CFURLCreateFromFileSystemRepresentationRelativeToBase, 3)
137        url = CFURLCreateFromFileSystemRepresentationRelativeToBase(None,
138                "filename2", 9, False, base)
139        self.failUnless( isinstance(url, CFURLRef) )
140        strval =  CFURLGetString(url)
141        self.assertEquals(strval, u"filename2")
142
143        ok, strval = CFURLGetFileSystemRepresentation(url, True, None, 100)
144        self.failUnless(ok)
145
146        # Unfortunately metadata doesn't allow describing what we actually need
147        if '\0' in strval:
148            strval = strval[:strval.index('\0')]
149        self.assertEquals(strval, u"/tmp/filename2")
150
151    def testParts(self):
152        base = CFURLCreateWithString(None, u"http://www.omroep.nl/", None)
153        self.failUnless( isinstance(base, CFURLRef) )
154
155        ref = CFURLCreateWithString(None, u"/sport", base)
156        self.failUnless( isinstance(ref, CFURLRef) )
157
158        self.assertEquals(CFURLGetBaseURL(base), None)
159        self.assertEquals(CFURLGetBaseURL(ref), base)
160        self.assert_(CFURLCanBeDecomposed(ref) is True)
161
162        self.assertEquals(CFURLCopyScheme(ref), u"http")
163        self.assertEquals(CFURLCopyNetLocation(ref), u"www.omroep.nl")
164        self.assertEquals(CFURLCopyPath(ref), u"/sport")
165
166        path, isDir = CFURLCopyStrictPath(ref, None)
167        self.assertEquals(path, u"sport")
168        self.assertEquals(isDir, True)
169
170        path = CFURLCopyFileSystemPath(ref, kCFURLPOSIXPathStyle)
171        self.assertEquals(path, u"/sport")
172
173        path = CFURLCopyFileSystemPath(ref, kCFURLPOSIXPathStyle)
174        self.assertEquals(path, u"/sport")
175        path = CFURLCopyFileSystemPath(ref, kCFURLWindowsPathStyle)
176        self.assertEquals(path, u"\\sport")
177
178        self.failIf(CFURLHasDirectoryPath(ref))
179
180        v =  CFURLCopyResourceSpecifier(ref)
181        self.assertEquals(v, None)
182
183        v =  CFURLCopyHostName(ref)
184        self.assertEquals(v, "www.omroep.nl")
185
186        v =  CFURLGetPortNumber(ref)
187        self.assertEquals(v, -1)
188
189        ref = CFURLCreateWithString(None, u"https://ronald:test@www.nu.nl:42/sport/results.cgi?qs=1#anchor", None)
190        v =  CFURLGetPortNumber(ref)
191        self.assertEquals(v, 42)
192
193        v = CFURLCopyResourceSpecifier(ref)
194        self.assertEquals(v, u"?qs=1#anchor")
195
196        v = CFURLCopyUserName(ref)
197        self.assertEquals(v, "ronald")
198
199        v = CFURLCopyPassword(ref)
200        self.assertEquals(v, "test")
201
202        v = CFURLCopyParameterString(ref, None)
203        self.assertEquals(v, None)
204
205        v = CFURLCopyQueryString(ref, None)
206        self.assertEquals(v, "qs=1")
207
208        v = CFURLCopyLastPathComponent(ref)
209        self.assertEquals(v, "results.cgi")
210
211        v = CFURLCopyPathExtension(ref)
212        self.assertEquals(v, "cgi")
213
214        cnt, bytes = CFURLGetBytes(ref, None, 100)
215        self.assertEquals(cnt, 62)
216        self.assertEquals(bytes,
217                "https://ronald:test@www.nu.nl:42/sport/results.cgi?qs=1#anchor")
218
219        cnt, bytes = CFURLGetBytes(ref, objc.NULL, 0)
220        self.assertEquals(cnt, 62)
221        self.assertEquals(bytes, objc.NULL)
222
223        rng1, rng2 = CFURLGetByteRangeForComponent(ref, kCFURLComponentHost, None)
224        self.assert_(isinstance(rng1, CFRange))
225        self.assert_(isinstance(rng2, CFRange))
226
227
228    def testUpdating(self):
229        base = CFURLCreateWithString(None, u"http://www.omroep.nl/sport", None)
230        self.failUnless( isinstance(base, CFURLRef) )
231
232        url = CFURLCreateCopyAppendingPathComponent(None, base, "soccer", True)
233        self.failUnless( isinstance(url, CFURLRef) )
234
235        strval =  CFURLGetString(url)
236        self.assertEquals(strval, "http://www.omroep.nl/sport/soccer/")
237
238        url = CFURLCreateCopyDeletingLastPathComponent(None, base)
239        self.failUnless( isinstance(url, CFURLRef) )
240        strval =  CFURLGetString(url)
241        self.assertEquals(strval, "http://www.omroep.nl/")
242
243        url = CFURLCreateCopyAppendingPathExtension(None, base, "cgi")
244        self.failUnless( isinstance(url, CFURLRef) )
245        strval =  CFURLGetString(url)
246        self.assertEquals(strval, "http://www.omroep.nl/sport.cgi")
247
248        url2 = CFURLCreateCopyDeletingPathExtension(None, base)
249        self.failUnless( isinstance(url2, CFURLRef) )
250        strval =  CFURLGetString(url2)
251        self.assertEquals(strval, "http://www.omroep.nl/sport")
252
253    def testStringEncoding(self):
254        base = u"http://www.omroep.nl/sport%20en%20%73%70el"
255
256        strval = CFURLCreateStringByReplacingPercentEscapes(None, base, objc.NULL)
257        self.assertEquals(strval, "http://www.omroep.nl/sport%20en%20%73%70el")
258
259        strval = CFURLCreateStringByReplacingPercentEscapes(None, base, "")
260        self.assertEquals(strval, "http://www.omroep.nl/sport en spel")
261
262        strval = CFURLCreateStringByReplacingPercentEscapes(None, base, " ")
263        self.assertEquals(strval, "http://www.omroep.nl/sport%20en%20spel")
264
265        strval = CFURLCreateStringByReplacingPercentEscapesUsingEncoding(None, base, "", kCFStringEncodingISOLatin1)
266        self.assertEquals(strval, "http://www.omroep.nl/sport en spel")
267
268
269        base = u"http://www.omroep.nl/sport en spel"
270        strval = CFURLCreateStringByAddingPercentEscapes(None, base, "", "",
271                kCFStringEncodingISOLatin1)
272        self.assertEquals(strval, u"http://www.omroep.nl/sport%20en%20spel")
273        strval = CFURLCreateStringByAddingPercentEscapes(None, base, " ", "s",
274                kCFStringEncodingISOLatin1)
275        self.assertEquals(strval, u"http://www.omroep.nl/%73port en %73pel")
276
277    def testFSRef(self):
278        ref = CFURLCreateWithFileSystemPath(None, os.getcwd(), kCFURLPOSIXPathStyle, True)
279        self.failUnless( isinstance(ref, CFURLRef) )
280
281        ok, fsref = CFURLGetFSRef(ref, None)
282        self.failUnless(ok)
283        self.failUnless(isinstance(fsref, objc.FSRef))
284        self.failUnless( fsref.as_pathname() ==  os.getcwd())
285
286        ref2 = CFURLCreateFromFSRef(None, fsref)
287        self.failUnlessEqual(ref, ref2)
288
289    def testConstants(self):
290        self.failUnless( kCFURLPOSIXPathStyle == 0 )
291        self.failUnless( kCFURLHFSPathStyle == 1 )
292        self.failUnless( kCFURLWindowsPathStyle == 2 )
293
294        self.failUnless( kCFURLComponentScheme == 1 )
295        self.failUnless( kCFURLComponentNetLocation == 2 )
296        self.failUnless( kCFURLComponentPath == 3 )
297        self.failUnless( kCFURLComponentResourceSpecifier == 4 )
298        self.failUnless( kCFURLComponentUser == 5 )
299        self.failUnless( kCFURLComponentPassword == 6 )
300        self.failUnless( kCFURLComponentUserInfo == 7 )
301        self.failUnless( kCFURLComponentHost == 8 )
302        self.failUnless( kCFURLComponentPort == 9 )
303        self.failUnless( kCFURLComponentParameterString == 10 )
304        self.failUnless( kCFURLComponentQuery == 11 )
305        self.failUnless( kCFURLComponentFragment == 12 )
306
307
308if __name__ == "__main__":
309    main()
310