1from PyObjCTools.TestSupport import *
2
3from SystemConfiguration import *
4import SystemConfiguration
5import os
6
7class TestSCDynamicStore (TestCase):
8    def testTypes(self):
9        self.assertTrue(isinstance(SCDynamicStoreRef, objc.objc_class))
10
11    def testStructs(self):
12        self.assertFalse( hasattr(SystemConfiguration, 'SCDynamicStoreContext') )
13
14    def testFunctions(self):
15        n = SCDynamicStoreGetTypeID()
16        self.assertTrue(isinstance(n, (int, long)))
17
18
19        l = []
20        info = object()
21        def callback(store, changedKeys, info):
22            l.append((store, changedKeys, info))
23
24        st = SCDynamicStoreCreate(None,
25                "pyobjc.test",
26                callback, info)
27        self.assertTrue(isinstance(st, SCDynamicStoreRef))
28
29        st = SCDynamicStoreCreateWithOptions(None,
30                "pyobjc.test",
31                {},
32                callback,
33                info)
34        self.assertTrue(isinstance(st, SCDynamicStoreRef))
35
36
37        src = SCDynamicStoreCreateRunLoopSource(None, st, 0)
38        self.assertTrue(isinstance(src, CFRunLoopSourceRef))
39        del src
40
41        v = SCDynamicStoreCopyKeyList(st, u'.*')
42        self.assertTrue(isinstance(v, CFArrayRef))
43        self.assertTrue(len(v) > 0)
44        self.assertTrue(isinstance(v[0], unicode))
45
46        r = SCDynamicStoreAddValue(st, "Setup:/PyObjC", { u"key":42 })
47        self.assertTrue(r is True or r is False)
48
49        r = SCDynamicStoreAddTemporaryValue(st, "Setup:/PyObjC", { u"key":42 })
50        self.assertTrue(r is True or r is False)
51
52        v = SCDynamicStoreCopyValue(st, "Setup:/")
53        self.assertTrue(isinstance(v, CFDictionaryRef))
54
55        v = SCDynamicStoreCopyMultiple(st, None, ['.*'])
56        self.assertTrue(isinstance(v, CFDictionaryRef))
57
58        r = SCDynamicStoreSetValue(st, "Setup:/PyObjC", { u"key":42 })
59        self.assertTrue(r is True or r is False)
60
61        r = SCDynamicStoreSetMultiple(st,
62                {
63                    'Setup:/PyObjC2': { u"key": 42},
64                },
65                ['Setup:/PyObjC'],
66                ['System:/'])
67        self.assertTrue(r is True or r is False)
68
69        r = SCDynamicStoreRemoveValue(st, "Setup:/PyObjC")
70        self.assertTrue(r is True or r is False)
71
72        r = SCDynamicStoreNotifyValue(st, "Setup:/")
73        self.assertTrue(r is True or r is False)
74
75        r = SCDynamicStoreSetNotificationKeys(st, ['Setup:/'], None)
76        self.assertTrue(r is True)
77
78        r = SCDynamicStoreCopyNotifiedKeys(st)
79        self.assertTrue(isinstance(r, CFArrayRef))
80
81    @expectedFailure
82    def testCallbacks(self):
83        if os.getuid() != 0:
84            self.fail("WARNING: Need root privileges to test callback mechanism")
85            return
86
87        info = object()
88        l = []
89        def callback(store, changedKeys, info):
90            l.append((store, changedKeys, info))
91
92        st = SCDynamicStoreCreate(None,
93                u"pyobjc.test",
94                callback, info)
95
96        SCDynamicStoreSetNotificationKeys(st, None, ['.*'])
97        src = SCDynamicStoreCreateRunLoopSource(None, st, 0)
98        self.assertTrue(isinstance(src, CFRunLoopSourceRef))
99
100        SCDynamicStoreAddTemporaryValue(st, "pyobjc.test.key", "value")
101
102        CFRunLoopAddSource(CFRunLoopGetCurrent(), src, kCFRunLoopCommonModes)
103        CFRunLoopRunInMode(kCFRunLoopDefaultMode, 2.0, False)
104
105        self.assertTrue(len(l) > 1)
106        self.assertTrue(l[0][0] is st)
107        self.assertIsInstance(l[0][1], CFArrayRef)
108        self.assertTrue(l[0][2] is info)
109
110
111
112
113
114
115
116
117
118    def testContants(self):
119        self.assertTrue( isinstance(kSCDynamicStoreUseSessionKeys, unicode) )
120
121
122if __name__ == "__main__":
123    main()
124