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