1/*
2 * Copyright (c) 2014 Apple Inc. All Rights Reserved.
3 */
4
5#include <CoreFoundation/CoreFoundation.h>
6#include <Security/SecItem.h>
7#include <Security/SecBase.h>
8#include <utilities/array_size.h>
9#include <utilities/SecCFWrappers.h>
10#include <stdlib.h>
11#include <unistd.h>
12
13#include "Security_regressions.h"
14
15static void tests(void)
16{
17    CFDictionaryRef item = CFDictionaryCreateForCFTypes(NULL,
18                                                        kSecClass, kSecClassGenericPassword,
19                                                        kSecAttrAccount, CFSTR("empty-data-account-test"),
20                                                        kSecAttrService, CFSTR("empty-data-svce-test"),
21                                                        NULL);
22    ok_status(SecItemAdd(item, NULL), "add generic password");
23
24    CFDictionaryRef query = CFDictionaryCreateForCFTypes(NULL,
25                                                         kSecClass, kSecClassGenericPassword,
26                                                         kSecAttrService, CFSTR("empty-data-svce-test"),
27                                                         kSecMatchLimit, kSecMatchLimitAll,
28                                                         kSecReturnData, kCFBooleanTrue,
29                                                         kSecReturnAttributes, kCFBooleanTrue,
30                                                         NULL);
31    CFTypeRef result;
32    ok_status(SecItemCopyMatching(query, &result), "query generic password");
33    ok(isArray(result) && CFArrayGetCount(result) == 1, "return 1-sized array of results");
34    CFDictionaryRef row = CFArrayGetValueAtIndex(result, 0);
35    ok(isDictionary(row), "array row is dictionary");
36    ok(CFDictionaryGetValue(row, kSecValueData) == NULL, "result contains no data");
37    ok(CFEqual(CFDictionaryGetValue(row, kSecAttrService), CFSTR("empty-data-svce-test")), "svce attribute is returned");
38    ok(CFEqual(CFDictionaryGetValue(row, kSecAttrAccount), CFSTR("empty-data-account-test")), "account attribute is returned");
39
40    CFRelease(result);
41    CFRelease(query);
42    query = CFDictionaryCreateForCFTypes(NULL,
43                                         kSecClass, kSecClassGenericPassword,
44                                         kSecAttrService, CFSTR("empty-data-svce-test"),
45                                         NULL);
46    ok_status(SecItemDelete(query), "delete testing item");
47
48    CFRelease(query);
49    CFRelease(item);
50}
51
52int si_80_empty_data(int argc, char *const *argv)
53{
54    plan_tests(8);
55
56    tests();
57
58    return 0;
59}
60