5 // Created by John Hurley on 9/6/12.
9 #include <AssertMacros.h>
16 #include <Security/SecBase.h>
17 #include <Security/SecItem.h>
19 #include <SecureObjectSync/SOSAccount.h>
20 #include <CKBridge/SOSCloudKeychainClient.h>
21 #include <utilities/SecCFWrappers.h>
22 #include <utilities/debugging.h>
24 #include "SOSCircle_regressions.h"
25 #include "SOSRegressionUtilities.h"
27 static bool verboseCKDClientDebugging
= false;
29 static CFStringRef kTestKeyIDTimestamp
= CFSTR("IDTimestamp");
31 static void printTimeNow(const char *msg
)
33 if (verboseCKDClientDebugging
)
35 CFAbsoluteTime now
= CFAbsoluteTimeGetCurrent();
36 const char *nowstr
= cfabsoluteTimeToString(now
);
39 printf("%s %s\n", nowstr
, msg
);
45 // MARK: ----- basicKVSTests -----
47 static bool postIDTimestamp(dispatch_queue_t theq
)
49 __block
bool result
= false;
50 CFStringRef macaddr
= myMacAddress();
51 CFAbsoluteTime now
= CFAbsoluteTimeGetCurrent();
52 const char *nowstr
= cfabsoluteTimeToStringLocal(now
);
53 CFStringRef cfidstr
= CFStringCreateWithFormat(kCFAllocatorDefault
, NULL
, CFSTR("%@: %@ %s"), kTestKeyIDTimestamp
, macaddr
,nowstr
);
54 secerror("Setting %@ key: %@", kTestKeyIDTimestamp
, cfidstr
);
56 // create a dictionary with one key/value pair
57 CFDictionaryRef objects
= CFDictionaryCreateForCFTypes(kCFAllocatorDefault
, kTestKeyIDTimestamp
, cfidstr
, NULL
);
58 SOSCloudKeychainPutObjectsInCloud(objects
, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT
, 0),
59 ^(CFDictionaryRef returnedValues
, CFErrorRef error
) {
61 fail("Error putting: %@", error
);
66 CFMutableArrayRef keysToGet
= CFArrayCreateMutableForCFTypes(kCFAllocatorDefault
);
67 CFArrayAppendValue(keysToGet
, kTestKeyIDTimestamp
);
68 SOSCloudKeychainGetObjectsFromCloud(keysToGet
, theq
, ^ (CFDictionaryRef returnedValues
, CFErrorRef error
)
70 CFStringRef returnedTimestamp
= (CFStringRef
)CFDictionaryGetValue(returnedValues
, kTestKeyIDTimestamp
);
71 if (returnedTimestamp
)
72 result
= CFEqual(returnedTimestamp
, cfidstr
);
80 static const int kbasicKVSTestsCount
= 1;
81 static void basicKVSTests2()
83 dispatch_queue_t generalq
= dispatch_queue_create("general", DISPATCH_QUEUE_SERIAL
);
85 const UInt8 tdata
[] = {0x01, 0x02, 0x03, 0x04, 'a', 'b', 'c'};
86 CFDataRef testData
= CFDataCreate(kCFAllocatorDefault
, tdata
, sizeof(tdata
)/sizeof(UInt8
));
88 const CFStringRef adata
[] = {CFSTR("A"), CFSTR("b"), CFSTR("C"), CFSTR("D")};
89 CFArrayRef testArray
= CFArrayCreate(kCFAllocatorDefault
, (const void **)&adata
, sizeof(adata
)/sizeof(CFStringRef
), &kCFTypeArrayCallBacks
);
92 const CFStringRef circleKeyStrings
[] = {CFSTR("circleA"), CFSTR("circleB"), CFSTR("circleC"), CFSTR("circleD")};
93 CFArrayRef circleKeys
= CFArrayCreate(kCFAllocatorDefault
, (const void **)&circleKeyStrings
, sizeof(circleKeyStrings
)/sizeof(CFStringRef
), &kCFTypeArrayCallBacks
);
95 const CFStringRef keysWhenUnlockedKeyStrings
[] = {CFSTR("foo"), CFSTR("bar"), CFSTR("baz")};
96 CFArrayRef keysWhenUnlocked
= CFArrayCreate(kCFAllocatorDefault
, (const void **)&keysWhenUnlockedKeyStrings
, sizeof(keysWhenUnlockedKeyStrings
)/sizeof(CFStringRef
), &kCFTypeArrayCallBacks
);
98 printTimeNow("Start tests [basicKVSTests]");
100 ok(postIDTimestamp(generalq
), "testPostGet for %@", kTestKeyIDTimestamp
);
102 printTimeNow("Start tests [basicKVSTests2]");
106 CFRelease(testArray
);
107 CFRelease(circleKeys
);
108 CFRelease(keysWhenUnlocked
);
111 // MARK: ----- start of all tests -----
113 static const int kCloudTransportTestsCount
= 0;
114 static int kTestTestCount
= kbasicKVSTestsCount
+ kCloudTransportTestsCount
;
115 static void tests(void)
118 skip("Skipping ckdclient tests because CloudKeychainProxy.xpc is not installed", kTestTestCount
, XPCServiceInstalled());
120 // cloudTransportTests();
121 sleep(15); // on iOS, we need to hang around long enough for syncdefaultsd to see us
125 int sc_95_ckd2client(int argc
, char *const *argv
)
127 plan_tests(kTestTestCount
);