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