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