1from PyObjCTools.TestSupport import * 2from CFNetwork import * 3import os 4 5SCRIPT=""" 6function FindProxyForURL(url, host) { 7 if (shExpMatch(host, "*.apple.com")) { 8 return "PROXY proxy.apple.com:8080"; 9 } 10 return "DIRECT"; 11} 12""" 13 14class TestCFProxySupport (TestCase): 15 16 @min_os_level('10.5') 17 def testFunctions(self): 18 self.failUnlessResultIsCFRetained(CFNetworkCopyProxiesForURL) 19 url = CFURLCreateWithString(None, "http://www.apple.com/", None) 20 v = CFNetworkCopyProxiesForURL(url, None) 21 self.failUnlessIsInstance(v, CFArrayRef) 22 23 self.failUnlessResultIsCFRetained(CFNetworkCopyProxiesForAutoConfigurationScript) 24 self.failUnlessArgIsOut(CFNetworkCopyProxiesForAutoConfigurationScript, 2) 25 v, err = CFNetworkCopyProxiesForAutoConfigurationScript( 26 SCRIPT, url, None) 27 self.failUnless(err is None) 28 self.failUnlessIsInstance(v, CFArrayRef) 29 x = v[0] 30 self.failUnlessEqual(x[kCFProxyTypeKey], kCFProxyTypeHTTP) 31 self.failUnlessEqual(x[kCFProxyHostNameKey], "proxy.apple.com") 32 self.failUnlessEqual(x[kCFProxyPortNumberKey], 8080) 33 34 self.failUnlessResultIsCFRetained(CFNetworkCopySystemProxySettings) 35 v = CFNetworkCopySystemProxySettings() 36 self.failUnlessIsInstance(v, CFDictionaryRef) 37 38 39 @min_os_level('10.5') 40 def testManual(self): 41 lst = [] 42 ctx = object() 43 def callback(ctx, proxies, error): 44 lst.append([ctx, proxies, error]) 45 46 url = CFURLCreateWithString(None, "http://www.apple.com/", None) 47 48 rls = CFNetworkExecuteProxyAutoConfigurationScript( 49 SCRIPT, url, callback, ctx) 50 self.failUnlessIsInstance(rls, CFRunLoopSourceRef) 51 52 rl = CFRunLoopGetCurrent() 53 CFRunLoopAddSource(rl, rls, kCFRunLoopCommonModes) 54 55 CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0, True) 56 57 CFRunLoopRemoveSource(rl, rls, kCFRunLoopCommonModes) 58 59 self.failIfEqual(len(lst), 0) 60 self.failUnless(lst[0][0] is ctx) 61 self.failUnlessIsInstance(lst[0][1], CFArrayRef) 62 self.failUnlessEqual(lst[0][2], None) 63 64 lst[:] = [] 65 path = os.path.join(os.path.dirname(__file__), "proxy.pac") 66 cwd = os.getcwd() 67 if path.startswith(cwd): 68 path = path[len(cwd)+1:] 69 scriptURL = CFURLCreateWithFileSystemPath( 70 None, 71 path, 72 kCFURLPOSIXPathStyle, 73 False) 74 75 rls = CFNetworkExecuteProxyAutoConfigurationURL( 76 scriptURL, url, callback, ctx) 77 self.failUnlessIsInstance(rls, CFRunLoopSourceRef) 78 79 CFRunLoopAddSource(rl, rls, kCFRunLoopCommonModes) 80 81 CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0, True) 82 83 CFRunLoopRemoveSource(rl, rls, kCFRunLoopCommonModes) 84 85 #print lst 86 87 self.failIfEqual(len(lst), 0) 88 self.failUnless(lst[0][0] is ctx) 89 if lst[0][2] is None: 90 self.failUnlessIsInstance(lst[0][1], CFArrayRef) 91 self.failUnlessEqual(lst[0][2], None) 92 93 else: 94 self.failUnlessEqual(lst[0][1], None) 95 self.failUnlessIsInstance(lst[0][2], CFErrorRef) 96 97 98 99 100 @min_os_level('10.5') 101 def testConstants(self): 102 self.failUnlessIsInstance(kCFProxyTypeKey, unicode) 103 self.failUnlessIsInstance(kCFProxyHostNameKey, unicode) 104 self.failUnlessIsInstance(kCFProxyPortNumberKey, unicode) 105 self.failUnlessIsInstance(kCFProxyAutoConfigurationURLKey, unicode) 106 self.failUnlessIsInstance(kCFProxyUsernameKey, unicode) 107 self.failUnlessIsInstance(kCFProxyPasswordKey, unicode) 108 self.failUnlessIsInstance(kCFProxyTypeNone, unicode) 109 self.failUnlessIsInstance(kCFProxyTypeHTTP, unicode) 110 self.failUnlessIsInstance(kCFProxyTypeHTTPS, unicode) 111 self.failUnlessIsInstance(kCFProxyTypeSOCKS, unicode) 112 self.failUnlessIsInstance(kCFProxyTypeFTP, unicode) 113 self.failUnlessIsInstance(kCFProxyTypeAutoConfigurationURL, unicode) 114 self.failUnlessIsInstance(kCFNetworkProxiesHTTPEnable, unicode) 115 self.failUnlessIsInstance(kCFNetworkProxiesHTTPPort, unicode) 116 self.failUnlessIsInstance(kCFNetworkProxiesHTTPProxy, unicode) 117 self.failUnlessIsInstance(kCFNetworkProxiesProxyAutoConfigEnable, unicode) 118 self.failUnlessIsInstance(kCFNetworkProxiesProxyAutoConfigURLString, unicode) 119 120 121if __name__ == "__main__": 122 main() 123