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