]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_keychain/regressions/kc-10-item-add-generic.c
Security-57740.1.18.tar.gz
[apple/security.git] / OSX / libsecurity_keychain / regressions / kc-10-item-add-generic.c
diff --git a/OSX/libsecurity_keychain/regressions/kc-10-item-add-generic.c b/OSX/libsecurity_keychain/regressions/kc-10-item-add-generic.c
new file mode 100644 (file)
index 0000000..f22e12f
--- /dev/null
@@ -0,0 +1,52 @@
+#include <Security/SecKeychain.h>
+#include <Security/SecKeychainItem.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "keychain_regressions.h"
+#include "kc-helpers.h"
+
+static void tests(void)
+{
+    SecKeychainRef keychain = getPopulatedTestKeychain();
+       SecKeychainItemRef item = NULL;
+       ok_status(SecKeychainAddGenericPassword(keychain, 7, "service", 7,
+               "account", 4, "test", &item), "add generic password");
+       ok(item, "is item non NULL");
+       SecKeychainItemRef oldItem = item;
+       is_status(SecKeychainAddGenericPassword(keychain, 7, "service", 7,
+               "account", 4, "test", &oldItem),
+               errSecDuplicateItem, "add generic password again");
+       is((intptr_t)item, (intptr_t)oldItem, "item is unchanged");
+
+       SecItemClass itemClass = 0;
+       SecKeychainAttribute attrs[] = 
+       {
+               { kSecAccountItemAttr },
+               { kSecServiceItemAttr }
+       };
+       SecKeychainAttributeList attrList = { sizeof(attrs) / sizeof(*attrs), attrs };
+       UInt32 length = 0;
+       void *data = NULL;
+       ok_status(SecKeychainItemCopyContent(item, &itemClass, &attrList, &length, &data), "SecKeychainItemCopyContent");
+    eq_string(data, "test", "Item data is wrong");
+    ok_status(SecKeychainItemFreeContent(&attrList, data), "SecKeychainItemCopyContent");
+
+       is(CFGetRetainCount(item), 1, "item retaincount is 1");
+       is(CFGetRetainCount(keychain), 2, "keychain retaincount is 2");
+       CFRelease(item);
+       is(CFGetRetainCount(keychain), 1, "keychain retaincount is 1");
+       ok_status(SecKeychainDelete(keychain), "delete keychain");
+       CFRelease(keychain);
+}
+
+int kc_10_item_add_generic(int argc, char *const *argv)
+{
+    initializeKeychainTests("kc-10-item-add-generic");
+       plan_tests(13);
+
+       tests();
+
+    deleteTestFiles();
+       return 0;
+}