1from PyObjCTools.TestSupport import *
2from SystemConfiguration import *
3import socket
4
5from test_scnetwork import resolver_available
6
7class TestSCNetworkReachability (TestCase):
8    def testTypes(self):
9        self.assertIsInstance(SCNetworkReachabilityRef, objc.objc_class)
10
11    @onlyIf(resolver_available(), "No DNS resolver available")
12    def testFunctions(self):
13        self.assertResultIsCFRetained(SCNetworkReachabilityCreateWithAddressPair)
14        v = SCNetworkReachabilityCreateWithAddressPair(None,
15                ('0.0.0.0', 20990),
16                ('www.python.org', 80))
17
18
19        sd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
20        sd.listen(5)
21
22        self.assertResultIsCFRetained(SCNetworkReachabilityCreateWithAddress)
23        ref = v = SCNetworkReachabilityCreateWithAddress(None, sd.getsockname())
24        self.assertIsInstance(v, SCNetworkReachabilityRef)
25
26        self.assertResultIsCFRetained(SCNetworkReachabilityCreateWithName)
27        v = SCNetworkReachabilityCreateWithName(None, b'www.python.org')
28        self.assertIsInstance(v, SCNetworkReachabilityRef)
29
30        v = SCNetworkReachabilityGetTypeID()
31        self.assertIsInstance(v, (int, long))
32
33        self.assertResultIsBOOL(SCNetworkReachabilityGetFlags)
34        v, fl = SCNetworkReachabilityGetFlags(ref, None)
35        self.assertTrue(v)
36        self.assertIsInstance(fl, (int, long))
37
38
39        l = []
40        def callout(ref, flags, ctx):
41            l.append([ref, flags, ctx])
42            print flags
43        ctx = object()
44        v = SCNetworkReachabilitySetCallback(ref, callout, ctx)
45        self.assertTrue(v is True)
46
47
48        rl = CFRunLoopGetCurrent()
49        self.assertResultIsBOOL(SCNetworkReachabilityScheduleWithRunLoop)
50        r = SCNetworkReachabilityScheduleWithRunLoop(ref, rl, kCFRunLoopCommonModes)
51
52        sd.close()
53        CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0, False)
54
55        self.assertResultIsBOOL(SCNetworkReachabilityUnscheduleFromRunLoop)
56        r = SCNetworkReachabilityUnscheduleFromRunLoop(ref, rl, kCFRunLoopCommonModes)
57
58
59
60
61
62
63
64
65
66
67if __name__ == "__main__":
68    main()
69