]> git.saurik.com Git - apple/security.git/blame - sec/SOSCircle/Regressions/sc-102-cfusernotification.c
Security-55471.14.18.tar.gz
[apple/security.git] / sec / SOSCircle / Regressions / sc-102-cfusernotification.c
CommitLineData
427c49bc
A
1//
2// sc-102-xx
3// sec
4//
5// Created by John Hurley 10/16/12.
6// Copyright 2012 Apple Inc. All rights reserved.
7//
8
9/*
10 This test is a simple test of SOSCloudKeychainUserNotification to show
11 an OK/Cancel dialog to the user and get the response. Run with:
12
13 /AppleInternal/Applications/SecurityTests.app/SecurityTests sc_102_cfusernotification -v
14
15*/
16
17#include <AssertMacros.h>
18#include <CoreFoundation/CFUserNotification.h>
19#include <dispatch/dispatch.h>
20
21#include <utilities/SecCFWrappers.h>
22#include <utilities/debugging.h>
23
24#include "SOSCircle_regressions.h"
25#include "SOSCloudKeychainClient.h"
26#include "SOSCloudKeychainConstants.h"
27
28#if TARGET_OS_EMBEDDED && !TARGET_IPHONE_SIMULATOR
29#include <MobileGestalt.h>
30#endif
31
32static void tests(void)
33{
34// CFStringRef messageToUser = CFSTR("OK to sync with world?");
35// CFStringRef messageToUser = CFSTR("Allow “Emily‘s iPad to use your iCloud Keychain?");
36#if !TARGET_IPHONE_SIMULATOR
37#if TARGET_OS_EMBEDDED
38 CFStringRef our_peer_id = (CFStringRef)MGCopyAnswer(kMGQUserAssignedDeviceName, NULL);
39#else
40 CFStringRef our_peer_id = CFSTR("🔥💩");
41#endif
42#else
43 CFStringRef our_peer_id = CFSTR("Emily‘s iPad");
44#endif
45
46 CFStringRef messageToUser = CFStringCreateWithFormat(kCFAllocatorDefault, 0, CFSTR("Allow “%@” to use your iCloud Keychain?"), our_peer_id);
47 dispatch_queue_t processQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
48 dispatch_group_t work_group = dispatch_group_create();
49
50 // Prep the group for exitting the whole shebang.
51 dispatch_group_enter(work_group);
52 dispatch_group_notify(work_group, processQueue, ^
53 {
54 printf("Exiting via dispatch_group_notify; all work done\n");
55 CFRunLoopStop(CFRunLoopGetMain());
56 // exit(0);
57 });
58
59 SOSCloudKeychainUserNotification(messageToUser, processQueue, ^ (CFDictionaryRef returnedValues, CFErrorRef error)
60 {
61 uint64_t flags = 0;
62 pass("Reply from SOSCloudKeychainUserNotification: %@", returnedValues);
63 CFStringRef nfkey = CFStringCreateWithCString(kCFAllocatorDefault, kMessageKeyNotificationFlags, kCFStringEncodingUTF8);
64 CFTypeRef cfflags = returnedValues ? CFDictionaryGetValue(returnedValues, nfkey) : NULL;
65 if (cfflags && (CFGetTypeID(cfflags) == CFNumberGetTypeID()))
66 CFNumberGetValue(cfflags, kCFNumberSInt64Type, &flags);
67 CFReleaseSafe(nfkey);
68
69 // flags is not actually a mask
70 if (flags == kCFUserNotificationDefaultResponse)
71 pass("OK button pressed");
72 else
73 if (flags == kCFUserNotificationCancelResponse)
74 pass("Cancel button pressed");
75 else
76 if (flags == kCFUserNotificationAlternateResponse)
77 pass("Alternate button pressed");
78 else
79 pass("Flags: %#llx", flags);
80
81 ok(error == NULL, "SOSCloudKeychainPutObjectsInCloud [error: %@:]", error);
82 dispatch_group_leave(work_group);
83 });
84
85 pass("Dialog is up for device \"%@\"", our_peer_id);
86 printf("Dialog is up\n");
87 dispatch_group_wait(work_group, DISPATCH_TIME_FOREVER);
88 CFRunLoopRun(); // Wait for it...
89 pass("Exit from run loop");
90}
91
92static int kUNTestCount = 5;
93
94int sc_102_cfusernotification(int argc, char *const *argv)
95{
96 plan_tests(kUNTestCount);
97 tests();
98
99 return 0;
100}