UICKeyChainStoreTests.m 78 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613
  1. //
  2. // UICKeyChainStoreTests.m
  3. // UICKeyChainStoreTests
  4. //
  5. // Created by kishikawa katsumi on 2014/06/22.
  6. // Copyright (c) 2014 kishikawa katsumi. All rights reserved.
  7. //
  8. #import <XCTest/XCTest.h>
  9. #import "UICKeyChainStore.h"
  10. @interface UICKeyChainStore (Private)
  11. - (CFTypeRef)protocolTypeObject;
  12. - (CFTypeRef)authenticationTypeObject;
  13. - (CFTypeRef)accessibilityObject;
  14. @end
  15. @interface UICKeyChainStoreTests : XCTestCase
  16. @end
  17. @implementation UICKeyChainStoreTests
  18. - (void)setUp
  19. {
  20. [super setUp];
  21. [UICKeyChainStore setDefaultService:@""];
  22. [UICKeyChainStore removeAllItems];
  23. [[UICKeyChainStore keyChainStoreWithService:@"Twitter" accessGroup:@"27AEDK3C9F.shared"] removeAllItems];
  24. [[UICKeyChainStore keyChainStoreWithService:@"Twitter"] removeAllItems];
  25. [[UICKeyChainStore keyChainStoreWithServer:(NSURL *)[NSURL URLWithString:@"https://example.com"] protocolType:UICKeyChainStoreProtocolTypeHTTPS] removeAllItems];
  26. [[UICKeyChainStore keyChainStore] removeAllItems];
  27. }
  28. - (void)tearDown
  29. {
  30. [super tearDown];
  31. }
  32. #pragma mark -
  33. - (void)testGenericPassword
  34. {
  35. {
  36. // Add Keychain items
  37. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  38. [keychain setString:@"kishikawa_katsumi" forKey:@"username"];
  39. [keychain setString:@"password_1234" forKey:@"password"];
  40. NSString *username = [keychain stringForKey:@"username"];
  41. XCTAssertEqualObjects(username, @"kishikawa_katsumi");
  42. NSString *password = [keychain stringForKey:@"password"];
  43. XCTAssertEqualObjects(password, @"password_1234");
  44. }
  45. {
  46. // Update Keychain items
  47. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  48. [keychain setString:@"katsumi_kishikawa" forKey:@"username"];
  49. [keychain setString:@"1234_password" forKey:@"password"];
  50. NSString *username = [keychain stringForKey:@"username"];
  51. XCTAssertEqualObjects(username, @"katsumi_kishikawa");
  52. NSString *password = [keychain stringForKey:@"password"];
  53. XCTAssertEqualObjects(password, @"1234_password");
  54. }
  55. {
  56. // Remove Keychain items
  57. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  58. [keychain removeItemForKey:@"username"];
  59. [keychain removeItemForKey:@"password"];
  60. XCTAssertNil([keychain stringForKey:@"username"]);
  61. XCTAssertNil([keychain stringForKey:@"password"]);
  62. }
  63. }
  64. - (void)testGenericPasswordSubscripting
  65. {
  66. {
  67. // Add Keychain items
  68. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter" accessGroup:@"27AEDK3C9F.shared"];
  69. keychain[@"username"] = @"kishikawa_katsumi";
  70. keychain[@"password"] = @"password_1234";
  71. NSString *username = keychain[@"username"];
  72. XCTAssertEqualObjects(username, @"kishikawa_katsumi");
  73. NSString *password = keychain[@"password"];
  74. XCTAssertEqualObjects(password, @"password_1234");
  75. }
  76. {
  77. // Update Keychain items
  78. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter" accessGroup:@"27AEDK3C9F.shared"];
  79. keychain[@"username"] = @"katsumi_kishikawa";
  80. keychain[@"password"] = @"1234_password";
  81. NSString *username = keychain[@"username"];
  82. XCTAssertEqualObjects(username, @"katsumi_kishikawa");
  83. NSString *password = keychain[@"password"];
  84. XCTAssertEqualObjects(password, @"1234_password");
  85. }
  86. {
  87. // Remove Keychain items
  88. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter" accessGroup:@"27AEDK3C9F.shared"];
  89. keychain[@"username"] = nil;
  90. keychain[@"password"] = nil;
  91. XCTAssertNil(keychain[@"username"]);
  92. XCTAssertNil(keychain[@"password"]);
  93. }
  94. }
  95. #pragma mark -
  96. - (void)testInternetPassword
  97. {
  98. {
  99. // Add Keychain items
  100. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:(NSURL *)[NSURL URLWithString:@"https://kishikawakatsumi.com"] protocolType:UICKeyChainStoreProtocolTypeHTTPS];
  101. [keychain setString:@"kishikawa_katsumi" forKey:@"username"];
  102. [keychain setString:@"password_1234" forKey:@"password"];
  103. NSString *username = [keychain stringForKey:@"username"];
  104. XCTAssertEqualObjects(username, @"kishikawa_katsumi");
  105. NSString *password = [keychain stringForKey:@"password"];
  106. XCTAssertEqualObjects(password, @"password_1234");
  107. }
  108. {
  109. // Update Keychain items
  110. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:(NSURL *)[NSURL URLWithString:@"https://kishikawakatsumi.com"] protocolType:UICKeyChainStoreProtocolTypeHTTPS];
  111. [keychain setString:@"katsumi_kishikawa" forKey:@"username"];
  112. [keychain setString:@"1234_password" forKey:@"password"];
  113. NSString *username = [keychain stringForKey:@"username"];
  114. XCTAssertEqualObjects(username, @"katsumi_kishikawa");
  115. NSString *password = [keychain stringForKey:@"password"];
  116. XCTAssertEqualObjects(password, @"1234_password");
  117. }
  118. {
  119. // Remove Keychain items
  120. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:(NSURL *)[NSURL URLWithString:@"https://kishikawakatsumi.com"] protocolType:UICKeyChainStoreProtocolTypeHTTPS];
  121. [keychain removeItemForKey:@"username"];
  122. [keychain removeItemForKey:@"password"];
  123. XCTAssertNil([keychain stringForKey:@"username"]);
  124. XCTAssertNil([keychain stringForKey:@"password"]);
  125. }
  126. }
  127. - (void)testInternetPasswordSubscripting
  128. {
  129. {
  130. // Add Keychain items
  131. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:(NSURL *)[NSURL URLWithString:@"https://kishikawakatsumi.com"] protocolType:UICKeyChainStoreProtocolTypeHTTPS];
  132. keychain[@"username"] = @"kishikawa_katsumi";
  133. keychain[@"password"] = @"password_1234";
  134. NSString *username = keychain[@"username"];
  135. XCTAssertEqualObjects(username, @"kishikawa_katsumi");
  136. NSString *password = keychain[@"password"];
  137. XCTAssertEqualObjects(password, @"password_1234");
  138. }
  139. {
  140. // Update Keychain items
  141. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:(NSURL *)[NSURL URLWithString:@"https://kishikawakatsumi.com"] protocolType:UICKeyChainStoreProtocolTypeHTTPS];
  142. keychain[@"username"] = @"katsumi_kishikawa";
  143. keychain[@"password"] = @"1234_password";
  144. NSString *username = keychain[@"username"];
  145. XCTAssertEqualObjects(username, @"katsumi_kishikawa");
  146. NSString *password = keychain[@"password"];
  147. XCTAssertEqualObjects(password, @"1234_password");
  148. }
  149. {
  150. // Remove Keychain items
  151. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:(NSURL *)[NSURL URLWithString:@"https://kishikawakatsumi.com"] protocolType:UICKeyChainStoreProtocolTypeHTTPS];
  152. keychain[@"username"] = nil;
  153. keychain[@"password"] = nil;
  154. XCTAssertNil(keychain[@"username"]);
  155. XCTAssertNil(keychain[@"password"]);
  156. }
  157. }
  158. #pragma mark -
  159. - (void)testSetDefaultService
  160. {
  161. NSString *serviceName = @"com.kishikawakatsumi.UICKeyChainStore";
  162. [UICKeyChainStore setDefaultService:serviceName];
  163. XCTAssertEqualObjects(serviceName, [UICKeyChainStore defaultService], @"specitfy default service name");
  164. }
  165. #pragma mark -
  166. - (void)testDefaultInitializer
  167. {
  168. UICKeyChainStore *keychain;
  169. keychain = [UICKeyChainStore keyChainStore];
  170. XCTAssertEqualObjects(keychain.service, @"");
  171. XCTAssertNil(keychain.accessGroup);
  172. keychain = [[UICKeyChainStore alloc] init];
  173. XCTAssertEqualObjects(keychain.service, @"");
  174. XCTAssertNil(keychain.accessGroup);
  175. }
  176. - (void)testInitializerWithService
  177. {
  178. UICKeyChainStore *keychain;
  179. keychain = [UICKeyChainStore keyChainStoreWithService:@"com.example.github-token"];
  180. XCTAssertEqualObjects(keychain.service, @"com.example.github-token");
  181. XCTAssertNil(keychain.accessGroup);
  182. keychain = [[UICKeyChainStore alloc] initWithService:@"com.example.github-token"];
  183. XCTAssertEqualObjects(keychain.service, @"com.example.github-token");
  184. XCTAssertNil(keychain.accessGroup);
  185. }
  186. - (void)testInitializerWithAccessGroup
  187. {
  188. UICKeyChainStore *keychain;
  189. keychain = [UICKeyChainStore keyChainStoreWithService:nil accessGroup:@"27AEDK3C9F.shared"];
  190. XCTAssertEqualObjects(keychain.service, @"");
  191. XCTAssertEqualObjects(keychain.accessGroup, @"27AEDK3C9F.shared");
  192. keychain = [[UICKeyChainStore alloc] initWithService:nil accessGroup:@"27AEDK3C9F.shared"];
  193. XCTAssertEqualObjects(keychain.service, @"");
  194. XCTAssertEqualObjects(keychain.accessGroup, @"27AEDK3C9F.shared");
  195. }
  196. - (void)testInitializerWithServiceAndAccessGroup
  197. {
  198. UICKeyChainStore *keychain;
  199. keychain = [UICKeyChainStore keyChainStoreWithService:@"com.example.github-token" accessGroup:@"27AEDK3C9F.shared"];
  200. XCTAssertEqualObjects(keychain.service, @"com.example.github-token");
  201. XCTAssertEqualObjects(keychain.accessGroup, @"27AEDK3C9F.shared");
  202. keychain = [[UICKeyChainStore alloc] initWithService:@"com.example.github-token" accessGroup:@"27AEDK3C9F.shared"];
  203. XCTAssertEqualObjects(keychain.service, @"com.example.github-token");
  204. XCTAssertEqualObjects(keychain.accessGroup, @"27AEDK3C9F.shared");
  205. }
  206. - (void)testInitializerWithServer
  207. {
  208. NSURL *URL = [NSURL URLWithString:@"https://kishikawakatsumi.com"];
  209. UICKeyChainStore *keychain;
  210. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeHTTPS];
  211. XCTAssertEqualObjects(keychain.server, URL);
  212. XCTAssertEqual(keychain.protocolType, UICKeyChainStoreProtocolTypeHTTPS);
  213. XCTAssertEqual(keychain.authenticationType, UICKeyChainStoreAuthenticationTypeDefault);
  214. keychain = [[UICKeyChainStore alloc] initWithServer:URL protocolType:UICKeyChainStoreProtocolTypeHTTPS];
  215. XCTAssertEqualObjects(keychain.server, URL);
  216. XCTAssertEqual(keychain.protocolType, UICKeyChainStoreProtocolTypeHTTPS);
  217. XCTAssertEqual(keychain.authenticationType, UICKeyChainStoreAuthenticationTypeDefault);
  218. }
  219. - (void)testInitializerWithServerAndAuthenticationType
  220. {
  221. NSURL *URL = [NSURL URLWithString:@"https://kishikawakatsumi.com"];
  222. UICKeyChainStore *keychain;
  223. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeHTTPS authenticationType:UICKeyChainStoreAuthenticationTypeHTMLForm];
  224. XCTAssertEqualObjects(keychain.server, URL);
  225. XCTAssertEqual(keychain.protocolType, UICKeyChainStoreProtocolTypeHTTPS);
  226. XCTAssertEqual(keychain.authenticationType, UICKeyChainStoreAuthenticationTypeHTMLForm);
  227. keychain = [[UICKeyChainStore alloc] initWithServer:URL protocolType:UICKeyChainStoreProtocolTypeHTTPS authenticationType:UICKeyChainStoreAuthenticationTypeHTMLForm];
  228. XCTAssertEqualObjects(keychain.server, URL);
  229. XCTAssertEqual(keychain.protocolType, UICKeyChainStoreProtocolTypeHTTPS);
  230. XCTAssertEqual(keychain.authenticationType, UICKeyChainStoreAuthenticationTypeHTMLForm);
  231. }
  232. #pragma mark -
  233. - (void)testContains
  234. {
  235. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  236. XCTAssertFalse([keychain contains:@"username"], @"not stored username");
  237. XCTAssertFalse([keychain contains:@"password"], @"not stored password");
  238. [keychain setString:@"kishikawa_katsumi" forKey:@"username"];
  239. XCTAssertTrue([keychain contains:@"username"], @"stored username");
  240. XCTAssertFalse([keychain contains:@"password"], @"not stored password");
  241. [keychain setString:@"password1234" forKey:@"password"];
  242. XCTAssertTrue([keychain contains:@"username"], @"stored username");
  243. XCTAssertTrue([keychain contains:@"password"], @"stored password");
  244. }
  245. #pragma mark -
  246. - (void)testSetString
  247. {
  248. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  249. XCTAssertNil([keychain stringForKey:@"username"], @"not stored username");
  250. XCTAssertNil([keychain stringForKey:@"password"], @"not stored password");
  251. [keychain setString:@"kishikawakatsumi" forKey:@"username"];
  252. XCTAssertEqualObjects([keychain stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  253. XCTAssertNil([keychain stringForKey:@"password"], @"not stored password");
  254. [keychain setString:@"password1234" forKey:@"password"];
  255. XCTAssertEqualObjects([keychain stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  256. XCTAssertEqualObjects([keychain stringForKey:@"password"], @"password1234", @"stored password");
  257. }
  258. - (void)testSetData
  259. {
  260. NSDictionary *JSONObject = @{@"username": @"kishikawakatsumi", @"password": @"password1234"};
  261. NSData *JSONData = [NSJSONSerialization dataWithJSONObject:JSONObject options:kNilOptions error:nil];
  262. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  263. XCTAssertNil([keychain dataForKey:@"JSONData"], @"not stored JSON data");
  264. [keychain setData:JSONData forKey:@"JSONData"];
  265. XCTAssertEqualObjects([keychain dataForKey:@"JSONData"], JSONData, @"stored JSON data");
  266. }
  267. - (void)testRemoveString
  268. {
  269. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  270. XCTAssertNil([keychain stringForKey:@"username"], @"not stored username");
  271. XCTAssertNil([keychain stringForKey:@"password"], @"not stored password");
  272. [keychain setString:@"kishikawakatsumi" forKey:@"username"];
  273. XCTAssertEqualObjects([keychain stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  274. [keychain setString:@"password1234" forKey:@"password"];
  275. XCTAssertEqualObjects([keychain stringForKey:@"password"], @"password1234", @"stored password");
  276. [keychain removeItemForKey:@"username"];
  277. XCTAssertNil([keychain stringForKey:@"username"], @"removed username");
  278. XCTAssertEqualObjects([keychain stringForKey:@"password"], @"password1234", @"left password");
  279. [keychain removeItemForKey:@"password"];
  280. XCTAssertNil([keychain stringForKey:@"username"], @"removed username");
  281. XCTAssertNil([keychain stringForKey:@"password"], @"removed password");
  282. }
  283. - (void)testRemoveData
  284. {
  285. NSDictionary *JSONObject = @{@"username": @"kishikawakatsumi", @"password": @"password1234"};
  286. NSData *JSONData = [NSJSONSerialization dataWithJSONObject:JSONObject options:kNilOptions error:nil];
  287. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  288. XCTAssertNil([keychain dataForKey:@"JSONData"], @"not stored JSON data");
  289. [keychain setData:JSONData forKey:@"JSONData"];
  290. XCTAssertEqualObjects([keychain dataForKey:@"JSONData"], JSONData, @"stored JSON Data");
  291. [keychain removeItemForKey:@"JSONData"];
  292. XCTAssertNil([keychain dataForKey:@"JSONData"], @"removed JSON data");
  293. }
  294. #pragma mark -
  295. #if TARGET_OS_IPHONE
  296. - (void)testRemoveAllItemsWithErrorClassMethod
  297. {
  298. XCTAssertNil([UICKeyChainStore stringForKey:@"username"], @"not stored username");
  299. XCTAssertNil([UICKeyChainStore stringForKey:@"password"], @"not stored password");
  300. [UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username"];
  301. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  302. [UICKeyChainStore setString:@"password1234" forKey:@"password"];
  303. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password"], @"password1234", @"stored password");
  304. NSError *error = nil;
  305. [UICKeyChainStore removeAllItemsWithError:&error];
  306. XCTAssertNil([UICKeyChainStore stringForKey:@"username"], @"removed username");
  307. XCTAssertNil([UICKeyChainStore stringForKey:@"password"], @"removed password");
  308. XCTAssertNil(error);
  309. }
  310. #else
  311. - (void)testRemoveAllItemsWithErrorClassMethod
  312. {
  313. XCTAssertNil([UICKeyChainStore stringForKey:@"username"], @"not stored username");
  314. XCTAssertNil([UICKeyChainStore stringForKey:@"password"], @"not stored password");
  315. [UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username"];
  316. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  317. [UICKeyChainStore setString:@"password1234" forKey:@"password"];
  318. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password"], @"password1234", @"stored password");
  319. [UICKeyChainStore removeAllItemsWithError:nil];
  320. XCTAssertNil([UICKeyChainStore stringForKey:@"username"], @"removed username");
  321. XCTAssertNil([UICKeyChainStore stringForKey:@"password"], @"removed password");
  322. }
  323. #endif
  324. - (void)testRemoveAllItemsForServiceClassMethod
  325. {
  326. XCTAssertNil([UICKeyChainStore stringForKey:@"username" service:@"Twitter"], @"not stored username");
  327. XCTAssertNil([UICKeyChainStore stringForKey:@"password" service:@"Twitter"], @"not stored password");
  328. [UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username" service:@"Twitter"];
  329. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"username" service:@"Twitter"], @"kishikawakatsumi", @"stored username");
  330. [UICKeyChainStore setString:@"password1234" forKey:@"password" service:@"Twitter"];
  331. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password" service:@"Twitter"], @"password1234", @"stored password");
  332. [UICKeyChainStore removeAllItemsForService:@"Twitter" error:nil];
  333. XCTAssertNil([UICKeyChainStore stringForKey:@"username"], @"removed username");
  334. XCTAssertNil([UICKeyChainStore stringForKey:@"password"], @"removed password");
  335. }
  336. #pragma mark -
  337. - (void)testSubscripting
  338. {
  339. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  340. XCTAssertNil([keychain stringForKey:@"username"], @"not stored username");
  341. XCTAssertNil([keychain stringForKey:@"password"], @"not stored password");
  342. keychain[@"username"] = @"kishikawakatsumi";
  343. XCTAssertEqualObjects([keychain stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  344. keychain[@"password"] = @"password1234";
  345. XCTAssertEqualObjects([keychain stringForKey:@"password"], @"password1234", @"stored password");
  346. keychain[@"username"] = nil;
  347. XCTAssertNil([keychain stringForKey:@"username"], @"removed username");
  348. XCTAssertEqualObjects([keychain stringForKey:@"password"], @"password1234", @"left password");
  349. keychain[@"password"] = nil;
  350. XCTAssertNil([keychain stringForKey:@"username"], @"removed username");
  351. XCTAssertNil([keychain stringForKey:@"password"], @"removed password");
  352. }
  353. #pragma mark -
  354. #if TARGET_OS_IPHONE
  355. - (void)testErrorHandling
  356. {
  357. {
  358. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter" accessGroup:@"27AEDK3C9F.shared"];
  359. NSError *error = nil;
  360. BOOL succeeded = [keychain removeAllItemsWithError:&error];
  361. XCTAssertNil(error, "no error occurred");
  362. XCTAssertTrue(succeeded, "succeeded");
  363. }
  364. {
  365. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  366. NSError *error = nil;
  367. BOOL succeeded = [keychain removeAllItemsWithError:&error];
  368. XCTAssertNil(error, "no error occurred");
  369. XCTAssertTrue(succeeded, "succeeded");
  370. }
  371. {
  372. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:(NSURL *)[NSURL URLWithString:@"https://kishikawakatsumi.com"] protocolType:UICKeyChainStoreProtocolTypeHTTPS];
  373. NSError *error = nil;
  374. BOOL succeeded = [keychain removeAllItemsWithError:&error];
  375. XCTAssertNil(error, "no error occurred");
  376. XCTAssertTrue(succeeded, "succeeded");
  377. }
  378. {
  379. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStore];
  380. NSError *error = nil;
  381. BOOL succeeded = [keychain removeAllItemsWithError:&error];
  382. XCTAssertNil(error, "no error occurred");
  383. XCTAssertTrue(succeeded, "succeeded");
  384. }
  385. {
  386. // Add Keychain items
  387. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  388. NSError *error = nil;
  389. BOOL succeeded = [keychain setString:@"kishikawa_katsumi" forKey:@"username" error:&error];
  390. XCTAssertNil(error, "no error occurred");
  391. XCTAssertTrue(succeeded, "succeeded");
  392. succeeded = [keychain setString:@"password_1234" forKey:@"password" error:&error];
  393. XCTAssertNil(error, "no error occurred");
  394. XCTAssertTrue(succeeded, "succeeded");
  395. NSString *username = [keychain stringForKey:@"username" error:&error];
  396. XCTAssertEqualObjects(username, @"kishikawa_katsumi");
  397. XCTAssertNil(error, "no error occurred");
  398. NSString *password = [keychain stringForKey:@"password" error:&error];
  399. XCTAssertEqualObjects(password, @"password_1234");
  400. XCTAssertNil(error, "no error occurred");
  401. }
  402. {
  403. // Update Keychain items
  404. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  405. NSError *error = nil;
  406. BOOL succeeded = [keychain setString:@"katsumi_kishikawa" forKey:@"username" error:&error];
  407. XCTAssertNil(error, "no error occurred");
  408. XCTAssertTrue(succeeded, "succeeded");
  409. succeeded = [keychain setString:@"1234_password" forKey:@"password" error:&error];
  410. XCTAssertNil(error, "no error occurred");
  411. XCTAssertTrue(succeeded, "succeeded");
  412. NSString *username = [keychain stringForKey:@"username" error:&error];
  413. XCTAssertEqualObjects(username, @"katsumi_kishikawa");
  414. XCTAssertNil(error, "no error occurred");
  415. NSString *password = [keychain stringForKey:@"password" error:&error];
  416. XCTAssertEqualObjects(password, @"1234_password");
  417. XCTAssertNil(error, "no error occurred");
  418. }
  419. {
  420. // Remove Keychain items
  421. UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  422. NSError *error = nil;
  423. BOOL succeeded = [keychain removeItemForKey:@"username" error:&error];
  424. XCTAssertNil(error, "no error occurred");
  425. XCTAssertTrue(succeeded, "succeeded");
  426. succeeded = [keychain removeItemForKey:@"password" error:&error];
  427. XCTAssertNil(error, "no error occurred");
  428. XCTAssertTrue(succeeded, "succeeded");
  429. XCTAssertNil([keychain stringForKey:@"username"]);
  430. XCTAssertNil([keychain stringForKey:@"password"]);
  431. }
  432. }
  433. #endif
  434. #pragma mark -
  435. - (void)testSetStringWithCustomService
  436. {
  437. NSString *username_1 = @"kishikawakatsumi";
  438. NSString *password_1 = @"password1234";
  439. NSString *username_2 = @"kishikawa_katsumi";
  440. NSString *password_2 = @"password_1234";
  441. NSString *username_3 = @"k_katsumi";
  442. NSString *password_3 = @"12341234";
  443. NSString *service_1 = @"";
  444. NSString *service_2 = @"com.kishikawakatsumi.KeychainAccess";
  445. NSString *service_3 = @"example.com";
  446. [[UICKeyChainStore keyChainStore] removeAllItems];
  447. [[UICKeyChainStore keyChainStoreWithService:service_1] removeAllItems];
  448. [[UICKeyChainStore keyChainStoreWithService:service_2] removeAllItems];
  449. [[UICKeyChainStore keyChainStoreWithService:service_3] removeAllItems];
  450. XCTAssertNil([[UICKeyChainStore keyChainStore] stringForKey:@"username"], @"not stored username");
  451. XCTAssertNil([[UICKeyChainStore keyChainStore] stringForKey:@"password"], @"not stored password");
  452. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"username"], @"not stored username");
  453. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"password"], @"not stored password");
  454. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"username"], @"not stored username");
  455. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"password"], @"not stored password");
  456. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"username"], @"not stored username");
  457. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"password"], @"not stored password");
  458. [[UICKeyChainStore keyChainStore] setString:username_1 forKey:@"username"];
  459. XCTAssertEqualObjects([[UICKeyChainStore keyChainStore] stringForKey:@"username"], username_1, @"stored username");
  460. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"username"], username_1, @"stored username");
  461. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"username"], @"not stored username");
  462. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"username"], @"not stored username");
  463. [[UICKeyChainStore keyChainStoreWithService:service_1] setString:username_1 forKey:@"username"];
  464. XCTAssertEqualObjects([[UICKeyChainStore keyChainStore] stringForKey:@"username"], username_1, @"stored username");
  465. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"username"], username_1, @"stored username");
  466. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"username"], @"not stored username");
  467. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"username"], @"not stored username");
  468. [[UICKeyChainStore keyChainStoreWithService:service_2] setString:username_2 forKey:@"username"];
  469. XCTAssertEqualObjects([[UICKeyChainStore keyChainStore] stringForKey:@"username"], username_1, @"stored username");
  470. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"username"], username_1, @"stored username");
  471. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"username"], username_2, @"stored username");
  472. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"username"], @"not stored username");
  473. [[UICKeyChainStore keyChainStoreWithService:service_3] setString:username_3 forKey:@"username"];
  474. XCTAssertEqualObjects([[UICKeyChainStore keyChainStore] stringForKey:@"username"], username_1, @"stored username");
  475. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"username"], username_1, @"stored username");
  476. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"username"], username_2, @"stored username");
  477. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"username"], username_3, @"stored username");
  478. [[UICKeyChainStore keyChainStore] setString:password_1 forKey:@"password"];
  479. XCTAssertEqualObjects([[UICKeyChainStore keyChainStore] stringForKey:@"password"], password_1, @"stored password");
  480. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"password"], password_1, @"stored password");
  481. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"password"], @"not stored password");
  482. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"password"], @"not stored password");
  483. [[UICKeyChainStore keyChainStoreWithService:service_1] setString:password_1 forKey:@"password"];
  484. XCTAssertEqualObjects([[UICKeyChainStore keyChainStore] stringForKey:@"password"], password_1, @"stored password");
  485. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"password"], password_1, @"stored password");
  486. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"password"], @"not stored password");
  487. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"password"], @"not stored password");
  488. [[UICKeyChainStore keyChainStoreWithService:service_2] setString:password_2 forKey:@"password"];
  489. XCTAssertEqualObjects([[UICKeyChainStore keyChainStore] stringForKey:@"password"], password_1, @"stored password");
  490. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"password"], password_1, @"stored password");
  491. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"password"], password_2, @"stored password");
  492. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"password"], @"not stored password");
  493. [[UICKeyChainStore keyChainStoreWithService:service_3] setString:password_3 forKey:@"password"];
  494. XCTAssertEqualObjects([[UICKeyChainStore keyChainStore] stringForKey:@"password"], password_1, @"stored password");
  495. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"password"], password_1, @"stored password");
  496. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"password"], password_2, @"stored password");
  497. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"password"], password_3, @"stored password");
  498. [[UICKeyChainStore keyChainStore] removeItemForKey:@"username"];
  499. XCTAssertNil([[UICKeyChainStore keyChainStore] stringForKey:@"username"], @"removed username");
  500. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"username"], @"removed username");
  501. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"username"], username_2, @"left username");
  502. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"username"], username_3, @"left username");
  503. [[UICKeyChainStore keyChainStoreWithService:service_1] removeItemForKey:@"username"];
  504. XCTAssertNil([[UICKeyChainStore keyChainStore] stringForKey:@"username"], @"removed username");
  505. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"username"], @"removed username");
  506. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"username"], username_2, @"left username");
  507. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"username"], username_3, @"left username");
  508. [[UICKeyChainStore keyChainStoreWithService:service_2] removeItemForKey:@"username"];
  509. XCTAssertNil([[UICKeyChainStore keyChainStore] stringForKey:@"username"], @"removed username");
  510. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"username"], @"removed username");
  511. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"username"], @"removed username");
  512. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"username"], username_3, @"left username");
  513. [[UICKeyChainStore keyChainStoreWithService:service_3] removeItemForKey:@"username"];
  514. XCTAssertNil([[UICKeyChainStore keyChainStore] stringForKey:@"username"], @"removed username");
  515. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"username"], @"removed username");
  516. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"username"], @"removed username");
  517. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"username"], @"removed username");
  518. [[UICKeyChainStore keyChainStore] removeItemForKey:@"password"];
  519. XCTAssertNil([[UICKeyChainStore keyChainStore] stringForKey:@"password"], @"removed password");
  520. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"password"], @"removed password");
  521. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"password"], password_2, @"left password");
  522. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"password"], password_3, @"left password");
  523. [[UICKeyChainStore keyChainStoreWithService:service_1] removeItemForKey:@"password"];
  524. XCTAssertNil([[UICKeyChainStore keyChainStore] stringForKey:@"password"], @"removed password");
  525. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"password"], @"removed password");
  526. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"password"], password_2, @"left password");
  527. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"password"], password_3, @"left password");
  528. [[UICKeyChainStore keyChainStoreWithService:service_2] removeItemForKey:@"password"];
  529. XCTAssertNil([[UICKeyChainStore keyChainStore] stringForKey:@"password"], @"removed password");
  530. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"password"], @"removed password");
  531. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"password"], @"removed password");
  532. XCTAssertEqualObjects([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"password"], password_3, @"left password");
  533. [[UICKeyChainStore keyChainStoreWithService:service_3] removeItemForKey:@"password"];
  534. XCTAssertNil([[UICKeyChainStore keyChainStore] stringForKey:@"password"], @"removed password");
  535. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_1] stringForKey:@"password"], @"removed password");
  536. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_2] stringForKey:@"password"], @"removed password");
  537. XCTAssertNil([[UICKeyChainStore keyChainStoreWithService:service_3] stringForKey:@"password"], @"removed password");
  538. }
  539. #pragma mark -
  540. - (void)testSetStringClassMethod
  541. {
  542. UICKeyChainStore *store = [UICKeyChainStore keyChainStore];
  543. [store removeAllItems];
  544. [UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username"];
  545. [UICKeyChainStore setString:@"password1234" forKey:@"password"];
  546. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  547. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password"], @"password1234", @"stored password");
  548. XCTAssertEqualObjects([store stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  549. XCTAssertEqualObjects([store stringForKey:@"password"], @"password1234", @"stored password");
  550. [UICKeyChainStore removeItemForKey:@"username"];
  551. XCTAssertNil([UICKeyChainStore stringForKey:@"username"], @"removed username");
  552. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password"], @"password1234", @"left password");
  553. XCTAssertEqualObjects([store stringForKey:@"password"], @"password1234", @"left password");
  554. [UICKeyChainStore removeItemForKey:@"password"];
  555. XCTAssertNil([UICKeyChainStore stringForKey:@"username"], @"removed username");
  556. XCTAssertNil([UICKeyChainStore stringForKey:@"password"], @"removed password");
  557. XCTAssertNil([store stringForKey:@"username"], @"removed username");
  558. XCTAssertNil([store stringForKey:@"password"], @"removed password");
  559. }
  560. - (void)testSetStringWithServiceClassMethod1
  561. {
  562. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  563. [store removeAllItems];
  564. [UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username" service:@"Twitter"];
  565. [UICKeyChainStore setString:@"password1234" forKey:@"password" service:@"Twitter"];
  566. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"username" service:@"Twitter"], @"kishikawakatsumi", @"stored username");
  567. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password" service:@"Twitter"], @"password1234", @"stored password");
  568. XCTAssertEqualObjects([store stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  569. XCTAssertEqualObjects([store stringForKey:@"password"], @"password1234", @"stored password");
  570. [UICKeyChainStore removeItemForKey:@"username" service:@"Twitter"];
  571. XCTAssertNil([UICKeyChainStore stringForKey:@"username" service:@"Twitter"], @"removed username");
  572. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password" service:@"Twitter"], @"password1234", @"left password");
  573. XCTAssertEqualObjects([store stringForKey:@"password"], @"password1234", @"left password");
  574. [UICKeyChainStore removeItemForKey:@"password" service:@"Twitter"];
  575. XCTAssertNil([UICKeyChainStore stringForKey:@"username" service:@"Twitter"], @"removed username");
  576. XCTAssertNil([UICKeyChainStore stringForKey:@"password" service:@"Twitter"], @"removed password");
  577. XCTAssertNil([store stringForKey:@"username"], @"removed username");
  578. XCTAssertNil([store stringForKey:@"password"], @"removed password");
  579. }
  580. #if TARGET_OS_IPHONE
  581. - (void)testSetStringWithServiceClassMethod2
  582. {
  583. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  584. [store removeAllItems];
  585. NSError *error = nil;
  586. [UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username" service:@"Twitter" error:&error];
  587. XCTAssertNil(error);
  588. [UICKeyChainStore setString:@"password1234" forKey:@"password" service:@"Twitter" error:&error];
  589. XCTAssertNil(error);
  590. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"username" service:@"Twitter" error:&error], @"kishikawakatsumi", @"stored username");
  591. XCTAssertNil(error);
  592. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password" service:@"Twitter" error:&error], @"password1234", @"stored password");
  593. XCTAssertNil(error);
  594. XCTAssertEqualObjects([store stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  595. XCTAssertEqualObjects([store stringForKey:@"password"], @"password1234", @"stored password");
  596. [UICKeyChainStore removeItemForKey:@"username" service:@"Twitter" error:&error];
  597. XCTAssertNil(error);
  598. XCTAssertNil([UICKeyChainStore stringForKey:@"username" service:@"Twitter" error:&error], @"removed username");
  599. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password" service:@"Twitter" error:&error], @"password1234", @"left password");
  600. XCTAssertNil(error);
  601. XCTAssertEqualObjects([store stringForKey:@"password"], @"password1234", @"left password");
  602. [UICKeyChainStore removeItemForKey:@"password" service:@"Twitter" error:&error];
  603. XCTAssertNil(error);
  604. XCTAssertNil([UICKeyChainStore stringForKey:@"username" service:@"Twitter" error:&error], @"removed username");
  605. XCTAssertNil(error);
  606. XCTAssertNil([UICKeyChainStore stringForKey:@"password" service:@"Twitter" error:&error], @"removed password");
  607. XCTAssertNil(error);
  608. XCTAssertNil([store stringForKey:@"username"], @"removed username");
  609. XCTAssertNil([store stringForKey:@"password"], @"removed password");
  610. }
  611. #endif
  612. - (void)testSetStringWithServiceAndAccessGroupClassMethod
  613. {
  614. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"Twitter" accessGroup:@"27AEDK3C9F.shared"];
  615. [store removeAllItems];
  616. [UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared"];
  617. [UICKeyChainStore setString:@"password1234" forKey:@"password" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared"];
  618. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"username" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared"], @"kishikawakatsumi", @"stored username");
  619. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared"], @"password1234", @"stored password");
  620. XCTAssertEqualObjects([store stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  621. XCTAssertEqualObjects([store stringForKey:@"password"], @"password1234", @"stored password");
  622. [UICKeyChainStore removeItemForKey:@"username" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared"];
  623. XCTAssertNil([UICKeyChainStore stringForKey:@"username" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared"], @"removed username");
  624. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password" service:@"Twitter"], @"password1234", @"left password");
  625. XCTAssertEqualObjects([store stringForKey:@"password"], @"password1234", @"left password");
  626. [UICKeyChainStore removeItemForKey:@"password" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared"];
  627. XCTAssertNil([UICKeyChainStore stringForKey:@"username" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared"], @"removed username");
  628. XCTAssertNil([UICKeyChainStore stringForKey:@"password" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared"], @"removed password");
  629. XCTAssertNil([store stringForKey:@"username"], @"removed username");
  630. XCTAssertNil([store stringForKey:@"password"], @"removed password");
  631. }
  632. #if TARGET_OS_IPHONE
  633. - (void)testSetStringClassMethodAndError
  634. {
  635. NSError *error = nil;
  636. UICKeyChainStore *store = [UICKeyChainStore keyChainStore];
  637. [store removeAllItemsWithError:&error];
  638. XCTAssertNil(error, @"no error");
  639. [UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username" error:&error];
  640. XCTAssertNil(error, @"no error");
  641. [UICKeyChainStore setString:@"password1234" forKey:@"password" error:&error];
  642. XCTAssertNil(error, @"no error");
  643. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"username" error:&error], @"kishikawakatsumi", @"stored username");
  644. XCTAssertNil(error, @"no error");
  645. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password" error:&error], @"password1234", @"stored password");
  646. XCTAssertNil(error, @"no error");
  647. XCTAssertEqualObjects([store stringForKey:@"username" error:&error], @"kishikawakatsumi", @"stored username");
  648. XCTAssertNil(error, @"no error");
  649. XCTAssertEqualObjects([store stringForKey:@"password" error:&error], @"password1234", @"stored password");
  650. XCTAssertNil(error, @"no error");
  651. [UICKeyChainStore removeItemForKey:@"username" error:&error];
  652. XCTAssertNil(error, @"no error");
  653. XCTAssertNil([UICKeyChainStore stringForKey:@"username" error:&error], @"removed username");
  654. XCTAssertNil(error, @"no error");
  655. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password" error:&error], @"password1234", @"left password");
  656. XCTAssertNil(error, @"no error");
  657. XCTAssertEqualObjects([store stringForKey:@"password" error:&error], @"password1234", @"left password");
  658. XCTAssertNil(error, @"no error");
  659. [UICKeyChainStore removeItemForKey:@"password" error:&error];
  660. XCTAssertNil(error, @"no error");
  661. XCTAssertNil([UICKeyChainStore stringForKey:@"username" error:&error], @"removed username");
  662. XCTAssertNil(error, @"no error");
  663. XCTAssertNil([UICKeyChainStore stringForKey:@"password" error:&error], @"removed password");
  664. XCTAssertNil(error, @"no error");
  665. XCTAssertNil([store stringForKey:@"username" error:&error], @"removed username");
  666. XCTAssertNil(error, @"no error");
  667. XCTAssertNil([store stringForKey:@"password" error:&error], @"removed password");
  668. XCTAssertNil(error, @"no error");
  669. }
  670. #endif
  671. - (void)testSetNilStringClassMethod
  672. {
  673. UICKeyChainStore *store = [UICKeyChainStore keyChainStore];
  674. [store removeAllItems];
  675. [UICKeyChainStore setString:nil forKey:@"username"];
  676. [UICKeyChainStore setString:nil forKey:@"password"];
  677. XCTAssertNil([UICKeyChainStore dataForKey:@"username"], @"no username");
  678. XCTAssertNil([UICKeyChainStore dataForKey:@"password"], @"no password");
  679. [UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username"];
  680. [UICKeyChainStore setString:@"password1234" forKey:@"password"];
  681. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  682. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password"], @"password1234", @"stored password");
  683. XCTAssertEqualObjects([store stringForKey:@"username"], @"kishikawakatsumi", @"stored username");
  684. XCTAssertEqualObjects([store stringForKey:@"password"], @"password1234", @"stored password");
  685. [UICKeyChainStore setString:nil forKey:@"username"];
  686. XCTAssertNil([UICKeyChainStore stringForKey:@"username"], @"removed username");
  687. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"password"], @"password1234", @"left password");
  688. XCTAssertEqualObjects([store stringForKey:@"password"], @"password1234", @"left password");
  689. [UICKeyChainStore setString:nil forKey:@"password"];
  690. XCTAssertNil([UICKeyChainStore stringForKey:@"username"], @"removed username");
  691. XCTAssertNil([UICKeyChainStore stringForKey:@"password"], @"removed password");
  692. XCTAssertNil([store stringForKey:@"username"], @"removed username");
  693. XCTAssertNil([store stringForKey:@"password"], @"removed password");
  694. }
  695. #pragma mark -
  696. - (void)testSetDataClassMethod
  697. {
  698. NSData *usernameData = [@"kishikawakatsumi" dataUsingEncoding:NSUTF8StringEncoding];
  699. NSData *passwordData = [@"password1234" dataUsingEncoding:NSUTF8StringEncoding];
  700. [UICKeyChainStore setData:usernameData forKey:@"username"];
  701. [UICKeyChainStore setData:passwordData forKey:@"password"];
  702. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"username"], usernameData, @"stored username");
  703. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"password"], passwordData, @"stored password");
  704. [UICKeyChainStore removeItemForKey:@"username"];
  705. XCTAssertNil([UICKeyChainStore dataForKey:@"username"], @"removed username");
  706. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"password"], passwordData, @"left password");
  707. [UICKeyChainStore removeItemForKey:@"password"];
  708. XCTAssertNil([UICKeyChainStore dataForKey:@"username"], @"removed username");
  709. XCTAssertNil([UICKeyChainStore dataForKey:@"password"], @"removed password");
  710. }
  711. - (void)testSetDataWithServiceClassMethod
  712. {
  713. NSData *usernameData = [@"kishikawakatsumi" dataUsingEncoding:NSUTF8StringEncoding];
  714. NSData *passwordData = [@"password1234" dataUsingEncoding:NSUTF8StringEncoding];
  715. [UICKeyChainStore setData:usernameData forKey:@"username" service:@"Twitter"];
  716. [UICKeyChainStore setData:passwordData forKey:@"password" service:@"Twitter"];
  717. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"username" service:@"Twitter"], usernameData, @"stored username");
  718. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"password" service:@"Twitter"], passwordData, @"stored password");
  719. [UICKeyChainStore removeItemForKey:@"username" service:@"Twitter"];
  720. XCTAssertNil([UICKeyChainStore dataForKey:@"username" service:@"Twitter"], @"removed username");
  721. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"password" service:@"Twitter"], passwordData, @"left password");
  722. [UICKeyChainStore removeItemForKey:@"password" service:@"Twitter"];
  723. XCTAssertNil([UICKeyChainStore dataForKey:@"username" service:@"Twitter"], @"removed username");
  724. XCTAssertNil([UICKeyChainStore dataForKey:@"password" service:@"Twitter"], @"removed password");
  725. }
  726. #if TARGET_OS_IPHONE
  727. - (void)testSetDataClassMethodAndError
  728. {
  729. NSData *usernameData = [@"kishikawakatsumi" dataUsingEncoding:NSUTF8StringEncoding];
  730. NSData *passwordData = [@"password1234" dataUsingEncoding:NSUTF8StringEncoding];
  731. NSError *error = nil;
  732. [UICKeyChainStore setData:usernameData forKey:@"username" error:&error];
  733. XCTAssertNil(error, @"no error");
  734. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"username" error:&error], usernameData, @"stored username");
  735. XCTAssertNil(error, @"no error");
  736. [UICKeyChainStore setData:passwordData forKey:@"password" error:&error];
  737. XCTAssertNil(error, @"no error");
  738. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"password" error:&error], passwordData, @"stored password");
  739. XCTAssertNil(error, @"no error");
  740. [UICKeyChainStore removeItemForKey:@"username" service:[UICKeyChainStore defaultService] error:&error];
  741. XCTAssertNil(error, @"no error");
  742. XCTAssertNil([UICKeyChainStore dataForKey:@"username" error:&error], @"removed username");
  743. XCTAssertNil(error, @"no error");
  744. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"password" error:&error], passwordData, @"left password");
  745. XCTAssertNil(error, @"no error");
  746. [UICKeyChainStore removeItemForKey:@"password" service:[UICKeyChainStore defaultService] error:&error];
  747. XCTAssertNil(error, @"no error");
  748. XCTAssertNil([UICKeyChainStore dataForKey:@"username" error:&error], @"removed username");
  749. XCTAssertNil(error, @"no error");
  750. XCTAssertNil([UICKeyChainStore dataForKey:@"password" error:&error], @"removed password");
  751. XCTAssertNil(error, @"no error");
  752. }
  753. - (void)testSetDataWithServiceClassMethodAndError
  754. {
  755. NSData *usernameData = [@"kishikawakatsumi" dataUsingEncoding:NSUTF8StringEncoding];
  756. NSData *passwordData = [@"password1234" dataUsingEncoding:NSUTF8StringEncoding];
  757. NSError *error = nil;
  758. [UICKeyChainStore setData:usernameData forKey:@"username" service:@"Twitter" error:&error];
  759. XCTAssertNil(error, @"no error");
  760. [UICKeyChainStore setData:passwordData forKey:@"password" service:@"Twitter" error:&error];
  761. XCTAssertNil(error, @"no error");
  762. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"username" service:@"Twitter" error:&error], usernameData, @"stored username");
  763. XCTAssertNil(error, @"no error");
  764. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"password" service:@"Twitter" error:&error], passwordData, @"stored password");
  765. XCTAssertNil(error, @"no error");
  766. [UICKeyChainStore removeItemForKey:@"username" service:@"Twitter" error:&error];
  767. XCTAssertNil(error, @"no error");
  768. XCTAssertNil([UICKeyChainStore dataForKey:@"username" service:@"Twitter" error:&error], @"removed username");
  769. XCTAssertNil(error, @"no error");
  770. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"password" service:@"Twitter" error:&error], passwordData, @"left password");
  771. XCTAssertNil(error, @"no error");
  772. [UICKeyChainStore removeItemForKey:@"password" service:@"Twitter" error:&error];
  773. XCTAssertNil(error, @"no error");
  774. XCTAssertNil([UICKeyChainStore dataForKey:@"username" service:@"Twitter" error:&error], @"removed username");
  775. XCTAssertNil(error, @"no error");
  776. XCTAssertNil([UICKeyChainStore dataForKey:@"password" service:@"Twitter" error:&error], @"removed password");
  777. XCTAssertNil(error, @"no error");
  778. }
  779. - (void)testSetDataWithServiceAndAccessGroupClassMethodAndError
  780. {
  781. NSData *usernameData = [@"kishikawakatsumi" dataUsingEncoding:NSUTF8StringEncoding];
  782. NSData *passwordData = [@"password1234" dataUsingEncoding:NSUTF8StringEncoding];
  783. NSError *error = nil;
  784. [UICKeyChainStore setData:usernameData forKey:@"username" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared" error:&error];
  785. XCTAssertNil(error, @"no error");
  786. [UICKeyChainStore setData:passwordData forKey:@"password" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared" error:&error];
  787. XCTAssertNil(error, @"no error");
  788. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"username" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared" error:&error], usernameData, @"stored username");
  789. XCTAssertNil(error, @"no error");
  790. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"password" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared" error:&error], passwordData, @"stored password");
  791. XCTAssertNil(error, @"no error");
  792. [UICKeyChainStore removeItemForKey:@"username" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared" error:&error];
  793. XCTAssertNil(error, @"no error");
  794. XCTAssertNil([UICKeyChainStore dataForKey:@"username" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared" error:&error], @"removed username");
  795. XCTAssertNil(error, @"no error");
  796. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"password" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared" error:&error], passwordData, @"left password");
  797. XCTAssertNil(error, @"no error");
  798. [UICKeyChainStore removeItemForKey:@"password" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared" error:&error];
  799. XCTAssertNil(error, @"no error");
  800. XCTAssertNil([UICKeyChainStore dataForKey:@"username" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared" error:&error], @"removed username");
  801. XCTAssertNil(error, @"no error");
  802. XCTAssertNil([UICKeyChainStore dataForKey:@"password" service:@"Twitter" accessGroup:@"27AEDK3C9F.shared" error:&error], @"removed password");
  803. XCTAssertNil(error, @"no error");
  804. }
  805. #endif
  806. - (void)testSetNilData
  807. {
  808. NSData *usernameData = [@"kishikawakatsumi" dataUsingEncoding:NSUTF8StringEncoding];
  809. NSData *passwordData = [@"password1234" dataUsingEncoding:NSUTF8StringEncoding];
  810. [UICKeyChainStore setData:nil forKey:@"username"];
  811. [UICKeyChainStore setData:nil forKey:@"password"];
  812. XCTAssertNil([UICKeyChainStore dataForKey:@"username"], @"no username");
  813. XCTAssertNil([UICKeyChainStore dataForKey:@"password"], @"no password");
  814. [UICKeyChainStore setData:usernameData forKey:@"username"];
  815. [UICKeyChainStore setData:passwordData forKey:@"password"];
  816. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"username"], usernameData, @"stored username");
  817. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"password"], passwordData, @"stored password");
  818. [UICKeyChainStore setData:nil forKey:@"username"];
  819. XCTAssertNil([UICKeyChainStore dataForKey:@"username"], @"removed username");
  820. XCTAssertEqualObjects([UICKeyChainStore dataForKey:@"password"], passwordData, @"left password");
  821. [UICKeyChainStore setData:nil forKey:@"password"];
  822. XCTAssertNil([UICKeyChainStore dataForKey:@"username"], @"removed username");
  823. XCTAssertNil([UICKeyChainStore dataForKey:@"password"], @"removed password");
  824. [UICKeyChainStore removeItemForKey:@"username"];
  825. XCTAssertNil([UICKeyChainStore dataForKey:@"username"], @"removed username");
  826. XCTAssertNil([UICKeyChainStore dataForKey:@"password"], @"removed password");
  827. [UICKeyChainStore removeItemForKey:@"password"];
  828. XCTAssertNil([UICKeyChainStore dataForKey:@"username"], @"removed username");
  829. XCTAssertNil([UICKeyChainStore dataForKey:@"password"], @"removed password");
  830. }
  831. #pragma mark -
  832. - (void)testClassMethodsSetAndRemoveItem
  833. {
  834. [UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username"];
  835. XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"username"], @"kishikawakatsumi");
  836. [UICKeyChainStore removeItemForKey:@"username"];
  837. XCTAssertNil([UICKeyChainStore stringForKey:@"username"]);
  838. }
  839. #if TARGET_OS_IPHONE
  840. - (void)testClassMethodsSetAndRemoveItemWithNoError
  841. {
  842. NSError *error = nil;
  843. [UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username" error:&error];
  844. XCTAssertNil(error, @"no error");
  845. NSString *username = [UICKeyChainStore stringForKey:@"username" error:&error];
  846. XCTAssertNil(error, @"no error");
  847. XCTAssertEqualObjects(username, @"kishikawakatsumi");
  848. [UICKeyChainStore removeItemForKey:@"username" error:&error];
  849. XCTAssertNil(error, @"no error");
  850. username = [UICKeyChainStore stringForKey:@"username" error:&error];
  851. XCTAssertNil(error, @"no error");
  852. XCTAssertNil(username);
  853. }
  854. #endif
  855. - (void)testInstanceMethodsSetAndRemoveItem
  856. {
  857. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  858. [store setString:@"kishikawakatsumi" forKey:@"username"];
  859. XCTAssertEqualObjects([store stringForKey:@"username"], @"kishikawakatsumi");
  860. [store removeItemForKey:@"username"];
  861. XCTAssertNil([store stringForKey:@"username"]);
  862. }
  863. #if TARGET_OS_IPHONE
  864. - (void)testInstanceMethodsSetAndRemoveItemWithNoError
  865. {
  866. NSError *error = nil;
  867. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  868. [store setString:@"kishikawakatsumi" forKey:@"username" error:&error];
  869. XCTAssertNil(error, @"no error");
  870. NSString *username = [store stringForKey:@"username" error:&error];
  871. XCTAssertNil(error, @"no error");
  872. XCTAssertEqualObjects(username, @"kishikawakatsumi");
  873. [store removeItemForKey:@"username" error:&error];
  874. XCTAssertNil(error, @"no error");
  875. username = [store stringForKey:@"username" error:&error];
  876. XCTAssertNil(error, @"no error");
  877. XCTAssertNil(username);
  878. }
  879. #endif
  880. - (void)testInstanceMethodsSetAndRemoveWithNilValue
  881. {
  882. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  883. [store setString:@"kishikawakatsumi" forKey:@"username"];
  884. NSString *username = [store stringForKey:@"username"];
  885. XCTAssertEqualObjects(username, @"kishikawakatsumi");
  886. [store setString:nil forKey:@"username"];
  887. username = [store stringForKey:@"username"];
  888. XCTAssertNil(username);
  889. }
  890. #pragma mark -
  891. - (void)testGetAllKeys1
  892. {
  893. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"github.com"];
  894. [store removeAllItems];
  895. [store setString:@"01234567-89ab-cdef-0123-456789abcdef" forKey:@"kishikawakatsumi"];
  896. [store setString:@"00000000-89ab-cdef-0000-456789abcdef" forKey:@"hirohamada"];
  897. [store setString:@"11111111-89ab-cdef-1111-456789abcdef" forKey:@"honeylemon"];
  898. NSArray *allKeys = store.allKeys;
  899. XCTAssertTrue([allKeys containsObject:@"kishikawakatsumi"]);
  900. XCTAssertTrue([allKeys containsObject:@"hirohamada"]);
  901. XCTAssertTrue([allKeys containsObject:@"honeylemon"]);
  902. XCTAssertEqual(allKeys.count, 3);
  903. [store removeAllItems];
  904. }
  905. - (void)testGetAllKeys2
  906. {
  907. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithServer:(NSURL *)[NSURL URLWithString:@"https://kishikawakatsumi.com"] protocolType:UICKeyChainStoreProtocolTypeHTTPS];
  908. [store removeAllItems];
  909. [store setString:@"01234567-89ab-cdef-0123-456789abcdef" forKey:@"kishikawakatsumi"];
  910. [store setString:@"00000000-89ab-cdef-0000-456789abcdef" forKey:@"hirohamada"];
  911. [store setString:@"11111111-89ab-cdef-1111-456789abcdef" forKey:@"honeylemon"];
  912. NSArray *allKeys = store.allKeys;
  913. XCTAssertTrue([allKeys containsObject:@"kishikawakatsumi"]);
  914. XCTAssertTrue([allKeys containsObject:@"hirohamada"]);
  915. XCTAssertTrue([allKeys containsObject:@"honeylemon"]);
  916. XCTAssertEqual(allKeys.count, 3);
  917. [store removeAllItems];
  918. }
  919. - (void)testGetAllItems1
  920. {
  921. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"github.com"];
  922. [store removeAllItems];
  923. [store setString:@"01234567-89ab-cdef-0123-456789abcdef" forKey:@"kishikawakatsumi"];
  924. [store setString:@"00000000-89ab-cdef-0000-456789abcdef" forKey:@"hirohamada"];
  925. [store setString:@"11111111-89ab-cdef-1111-456789abcdef" forKey:@"honeylemon"];
  926. NSArray *allItems = store.allItems;
  927. for (NSDictionary *item in allItems) {
  928. if ([item[@"key"] isEqualToString:@"kishikawakatsumi"]) {
  929. #if TARGET_OS_IPHONE
  930. XCTAssertEqualObjects(item[@"value"], @"01234567-89ab-cdef-0123-456789abcdef");
  931. #else
  932. XCTAssertEqualObjects(item[@"value"], @"");
  933. #endif
  934. XCTAssertEqualObjects(item[@"service"], @"github.com");
  935. #if TARGET_OS_IPHONE
  936. XCTAssertEqualObjects(item[@"accessibility"], (__bridge id)kSecAttrAccessibleAfterFirstUnlock);
  937. #endif
  938. }
  939. if ([item[@"key"] isEqualToString:@"hirohamada"]) {
  940. #if TARGET_OS_IPHONE
  941. XCTAssertEqualObjects(item[@"value"], @"00000000-89ab-cdef-0000-456789abcdef");
  942. #else
  943. XCTAssertEqualObjects(item[@"value"], @"");
  944. #endif
  945. XCTAssertEqualObjects(item[@"service"], @"github.com");
  946. #if TARGET_OS_IPHONE
  947. XCTAssertEqualObjects(item[@"accessibility"], (__bridge id)kSecAttrAccessibleAfterFirstUnlock);
  948. #endif
  949. }
  950. if ([item[@"key"] isEqualToString:@"honeylemon"]) {
  951. #if TARGET_OS_IPHONE
  952. XCTAssertEqualObjects(item[@"value"], @"11111111-89ab-cdef-1111-456789abcdef");
  953. #else
  954. XCTAssertEqualObjects(item[@"value"], @"");
  955. #endif
  956. XCTAssertEqualObjects(item[@"service"], @"github.com");
  957. #if TARGET_OS_IPHONE
  958. XCTAssertEqualObjects(item[@"accessibility"], (__bridge id)kSecAttrAccessibleAfterFirstUnlock);
  959. #endif
  960. }
  961. }
  962. XCTAssertEqual(allItems.count, 3);
  963. [store removeAllItems];
  964. }
  965. - (void)testGetAllItems2
  966. {
  967. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithServer:(NSURL *)[NSURL URLWithString:@"https://kishikawakatsumi.com"] protocolType:UICKeyChainStoreProtocolTypeHTTPS];
  968. [store removeAllItems];
  969. [store setString:@"01234567-89ab-cdef-0123-456789abcdef" forKey:@"kishikawakatsumi"];
  970. [store setString:@"00000000-89ab-cdef-0000-456789abcdef" forKey:@"hirohamada"];
  971. [store setString:@"11111111-89ab-cdef-1111-456789abcdef" forKey:@"honeylemon"];
  972. NSArray *allItems = store.allItems;
  973. for (NSDictionary *item in allItems) {
  974. if ([item[@"key"] isEqualToString:@"kishikawakatsumi"]) {
  975. #if TARGET_OS_IPHONE
  976. XCTAssertEqualObjects(item[@"value"], @"01234567-89ab-cdef-0123-456789abcdef");
  977. #else
  978. XCTAssertEqualObjects(item[@"value"], @"");
  979. #endif
  980. XCTAssertEqualObjects(item[@"server"], @"kishikawakatsumi.com");
  981. XCTAssertEqualObjects(item[@"protocol"], (__bridge id)kSecAttrProtocolHTTPS);
  982. XCTAssertEqualObjects(item[@"authenticationType"], (__bridge id)kSecAttrAuthenticationTypeDefault);
  983. #if TARGET_OS_IPHONE
  984. XCTAssertEqualObjects(item[@"accessibility"], (__bridge id)kSecAttrAccessibleAfterFirstUnlock);
  985. #endif
  986. }
  987. if ([item[@"key"] isEqualToString:@"hirohamada"]) {
  988. #if TARGET_OS_IPHONE
  989. XCTAssertEqualObjects(item[@"value"], @"00000000-89ab-cdef-0000-456789abcdef");
  990. #else
  991. XCTAssertEqualObjects(item[@"value"], @"");
  992. #endif
  993. XCTAssertEqualObjects(item[@"server"], @"kishikawakatsumi.com");
  994. XCTAssertEqualObjects(item[@"protocol"], (__bridge id)kSecAttrProtocolHTTPS);
  995. XCTAssertEqualObjects(item[@"authenticationType"], (__bridge id)kSecAttrAuthenticationTypeDefault);
  996. #if TARGET_OS_IPHONE
  997. XCTAssertEqualObjects(item[@"accessibility"], (__bridge id)kSecAttrAccessibleAfterFirstUnlock);
  998. #endif
  999. }
  1000. if ([item[@"key"] isEqualToString:@"honeylemon"]) {
  1001. #if TARGET_OS_IPHONE
  1002. XCTAssertEqualObjects(item[@"value"], @"11111111-89ab-cdef-1111-456789abcdef");
  1003. #else
  1004. XCTAssertEqualObjects(item[@"value"], @"");
  1005. #endif
  1006. XCTAssertEqualObjects(item[@"server"], @"kishikawakatsumi.com");
  1007. XCTAssertEqualObjects(item[@"protocol"], (__bridge id)kSecAttrProtocolHTTPS);
  1008. XCTAssertEqualObjects(item[@"authenticationType"], (__bridge id)kSecAttrAuthenticationTypeDefault);
  1009. #if TARGET_OS_IPHONE
  1010. XCTAssertEqualObjects(item[@"accessibility"], (__bridge id)kSecAttrAccessibleAfterFirstUnlock);
  1011. #endif
  1012. }
  1013. }
  1014. XCTAssertEqual(allItems.count, 3);
  1015. [store removeAllItems];
  1016. }
  1017. - (void)testGetAllKeysGenericPasswordClassMethod
  1018. {
  1019. [UICKeyChainStore removeAllItemsForService:@"github.com"];
  1020. [UICKeyChainStore setString:@"01234567-89ab-cdef-0123-456789abcdef" forKey:@"kishikawakatsumi" service:@"github.com"];
  1021. [UICKeyChainStore setString:@"00000000-89ab-cdef-0000-456789abcdef" forKey:@"hirohamada" service:@"github.com"];
  1022. [UICKeyChainStore setString:@"11111111-89ab-cdef-1111-456789abcdef" forKey:@"honeylemon" service:@"github.com"];
  1023. NSArray *allKeysAndServices = [UICKeyChainStore allKeysWithItemClass:UICKeyChainStoreItemClassGenericPassword];
  1024. NSMutableArray *keys = [[NSMutableArray alloc] init];
  1025. for (NSDictionary *keyAndService in allKeysAndServices) {
  1026. if ([keyAndService[@"service"] isEqualToString:@"github.com"]) {
  1027. [keys addObject:(NSString *)keyAndService[@"key"]];
  1028. }
  1029. }
  1030. XCTAssertTrue([keys containsObject:@"kishikawakatsumi"]);
  1031. XCTAssertTrue([keys containsObject:@"hirohamada"]);
  1032. XCTAssertTrue([keys containsObject:@"honeylemon"]);
  1033. [UICKeyChainStore removeAllItemsForService:@"github.com"];
  1034. }
  1035. - (void)testGetAllItemsClassMethod
  1036. {
  1037. [UICKeyChainStore removeAllItemsForService:@"github.com"];
  1038. [UICKeyChainStore setString:@"01234567-89ab-cdef-0123-456789abcdef" forKey:@"kishikawakatsumi" service:@"github.com"];
  1039. [UICKeyChainStore setString:@"00000000-89ab-cdef-0000-456789abcdef" forKey:@"hirohamada" service:@"github.com"];
  1040. [UICKeyChainStore setString:@"11111111-89ab-cdef-1111-456789abcdef" forKey:@"honeylemon" service:@"github.com"];
  1041. NSArray *allItems = [UICKeyChainStore allItemsWithItemClass:UICKeyChainStoreItemClassGenericPassword];
  1042. for (NSDictionary *item in allItems) {
  1043. if ([item[@"key"] isEqualToString:@"kishikawakatsumi"]) {
  1044. #if TARGET_OS_IPHONE
  1045. XCTAssertEqualObjects(item[@"value"], @"01234567-89ab-cdef-0123-456789abcdef");
  1046. #else
  1047. XCTAssertEqualObjects(item[@"value"], @"");
  1048. #endif
  1049. XCTAssertEqualObjects(item[@"service"], @"github.com");
  1050. #if TARGET_OS_IPHONE
  1051. XCTAssertEqualObjects(item[@"accessibility"], (__bridge id)kSecAttrAccessibleAfterFirstUnlock);
  1052. #endif
  1053. }
  1054. if ([item[@"key"] isEqualToString:@"hirohamada"]) {
  1055. #if TARGET_OS_IPHONE
  1056. XCTAssertEqualObjects(item[@"value"], @"00000000-89ab-cdef-0000-456789abcdef");
  1057. #else
  1058. XCTAssertEqualObjects(item[@"value"], @"");
  1059. #endif
  1060. XCTAssertEqualObjects(item[@"service"], @"github.com");
  1061. #if TARGET_OS_IPHONE
  1062. XCTAssertEqualObjects(item[@"accessibility"], (__bridge id)kSecAttrAccessibleAfterFirstUnlock);
  1063. #endif
  1064. }
  1065. if ([item[@"key"] isEqualToString:@"honeylemon"]) {
  1066. #if TARGET_OS_IPHONE
  1067. XCTAssertEqualObjects(item[@"value"], @"11111111-89ab-cdef-1111-456789abcdef");
  1068. #else
  1069. XCTAssertEqualObjects(item[@"value"], @"");
  1070. #endif
  1071. XCTAssertEqualObjects(item[@"service"], @"github.com");
  1072. #if TARGET_OS_IPHONE
  1073. XCTAssertEqualObjects(item[@"accessibility"], (__bridge id)kSecAttrAccessibleAfterFirstUnlock);
  1074. #endif
  1075. }
  1076. }
  1077. [UICKeyChainStore removeAllItemsForService:@"github.com"];
  1078. }
  1079. #pragma mark -
  1080. - (void)testSetStringLabelAndComment
  1081. {
  1082. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  1083. [store setString:@"kishikawakatsumi" forKey:@"username" label:@"Label" comment:@"Comment"];
  1084. NSString *username = [store stringForKey:@"username"];
  1085. XCTAssertEqualObjects(username, @"kishikawakatsumi");
  1086. [store setString:nil forKey:@"username"];
  1087. username = [store stringForKey:@"username"];
  1088. XCTAssertNil(username);
  1089. }
  1090. - (void)testSetDataLabelAndComment
  1091. {
  1092. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  1093. NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@[@"Keychain"]];
  1094. [store setData:data forKey:@"data" label:@"Label" comment:@"Comment"];
  1095. XCTAssertEqualObjects(data, [store dataForKey:@"data"]);
  1096. }
  1097. #pragma mark -
  1098. - (void)testDescription
  1099. {
  1100. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"github.com"];
  1101. [store removeAllItems];
  1102. [store setString:@"01234567-89ab-cdef-0123-456789abcdef" forKey:@"kishikawakatsumi"];
  1103. [store setString:@"00000000-89ab-cdef-0000-456789abcdef" forKey:@"hirohamada"];
  1104. [store setString:@"11111111-89ab-cdef-1111-456789abcdef" forKey:@"honeylemon"];
  1105. #if TARGET_OS_IPHONE
  1106. NSString *description = @"(\n" \
  1107. @" {\n"
  1108. @" accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\";\n" \
  1109. @" accessibility = ck;\n" \
  1110. @" class = GenericPassword;\n" \
  1111. @" key = kishikawakatsumi;\n" \
  1112. @" service = \"github.com\";\n" \
  1113. @" synchronizable = 0;\n" \
  1114. @" value = \"01234567-89ab-cdef-0123-456789abcdef\";\n" \
  1115. @"} {\n" \
  1116. @" accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\";\n" \
  1117. @" accessibility = ck;\n" \
  1118. @" class = GenericPassword;\n" \
  1119. @" key = hirohamada;\n" \
  1120. @" service = \"github.com\";\n" \
  1121. @" synchronizable = 0;\n" \
  1122. @" value = \"00000000-89ab-cdef-0000-456789abcdef\";\n" \
  1123. @"} {\n" \
  1124. @" accessGroup = \"27AEDK3C9F.com.kishikawakatsumi.KeychainAccess.TestHost\";\n" \
  1125. @" accessibility = ck;\n" \
  1126. @" class = GenericPassword;\n" \
  1127. @" key = honeylemon;\n" \
  1128. @" service = \"github.com\";\n" \
  1129. @" synchronizable = 0;\n" \
  1130. @" value = \"11111111-89ab-cdef-1111-456789abcdef\";\n" \
  1131. @"})";
  1132. #else
  1133. NSString *description = @"(\n" \
  1134. @" {\n"
  1135. @" class = GenericPassword;\n" \
  1136. @" key = kishikawakatsumi;\n" \
  1137. @" service = \"github.com\";\n" \
  1138. @" value = \"\";\n" \
  1139. @"} {\n" \
  1140. @" class = GenericPassword;\n" \
  1141. @" key = hirohamada;\n" \
  1142. @" service = \"github.com\";\n" \
  1143. @" value = \"\";\n" \
  1144. @"} {\n" \
  1145. @" class = GenericPassword;\n" \
  1146. @" key = honeylemon;\n" \
  1147. @" service = \"github.com\";\n" \
  1148. @" value = \"\";\n" \
  1149. @"})";
  1150. #endif
  1151. XCTAssertEqualObjects(store.description, description);
  1152. [store removeAllItems];
  1153. }
  1154. #pragma mark -
  1155. - (void)testStringConversionError
  1156. {
  1157. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  1158. NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@[@"Keychain"]];
  1159. [store setData:data forKey:@"data"];
  1160. NSError *error = nil;
  1161. NSString *s = [store stringForKey:@"data" error:&error];
  1162. XCTAssertNil(s);
  1163. XCTAssertNotNil(error);
  1164. }
  1165. #if !__has_feature(nullability)
  1166. - (void)testArgumentError
  1167. {
  1168. UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  1169. NSError *error = nil;
  1170. [store setString:@"kishikawakatsumi" forKey:nil error:&error];
  1171. XCTAssertNotNil(error);
  1172. }
  1173. #endif
  1174. #pragma mark -
  1175. - (void)testProtocolTypeAndAuthenticationTypePrivateMethod
  1176. {
  1177. NSURL *URL = [NSURL URLWithString:@"https://kishikawakatsumi.com"];
  1178. UICKeyChainStore *keychain;
  1179. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeFTP authenticationType:UICKeyChainStoreAuthenticationTypeNTLM];
  1180. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolFTP);
  1181. XCTAssertEqualObjects([keychain authenticationTypeObject], (__bridge id)kSecAttrAuthenticationTypeNTLM);
  1182. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeFTPAccount authenticationType:UICKeyChainStoreAuthenticationTypeMSN];
  1183. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolFTPAccount);
  1184. XCTAssertEqualObjects([keychain authenticationTypeObject], (__bridge id)kSecAttrAuthenticationTypeMSN);
  1185. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeHTTP authenticationType:UICKeyChainStoreAuthenticationTypeDPA];
  1186. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolHTTP);
  1187. XCTAssertEqualObjects([keychain authenticationTypeObject], (__bridge id)kSecAttrAuthenticationTypeDPA);
  1188. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeIRC authenticationType:UICKeyChainStoreAuthenticationTypeRPA];
  1189. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolIRC);
  1190. XCTAssertEqualObjects([keychain authenticationTypeObject], (__bridge id)kSecAttrAuthenticationTypeRPA);
  1191. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeNNTP authenticationType:UICKeyChainStoreAuthenticationTypeHTTPBasic];
  1192. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolNNTP);
  1193. XCTAssertEqualObjects([keychain authenticationTypeObject], (__bridge id)kSecAttrAuthenticationTypeHTTPBasic);
  1194. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypePOP3 authenticationType:UICKeyChainStoreAuthenticationTypeHTTPDigest];
  1195. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolPOP3);
  1196. XCTAssertEqualObjects([keychain authenticationTypeObject], (__bridge id)kSecAttrAuthenticationTypeHTTPDigest);
  1197. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeSMTP authenticationType:UICKeyChainStoreAuthenticationTypeHTMLForm];
  1198. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolSMTP);
  1199. XCTAssertEqualObjects([keychain authenticationTypeObject], (__bridge id)kSecAttrAuthenticationTypeHTMLForm);
  1200. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeSOCKS authenticationType:UICKeyChainStoreAuthenticationTypeDefault];
  1201. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolSOCKS);
  1202. XCTAssertEqualObjects([keychain authenticationTypeObject], (__bridge id)kSecAttrAuthenticationTypeDefault);
  1203. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeIMAP];
  1204. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolIMAP);
  1205. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeLDAP];
  1206. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolLDAP);
  1207. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeAppleTalk];
  1208. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolAppleTalk);
  1209. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeAFP];
  1210. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolAFP);
  1211. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeTelnet];
  1212. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolTelnet);
  1213. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeSSH];
  1214. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolSSH);
  1215. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeFTPS];
  1216. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolFTPS);
  1217. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeHTTPS];
  1218. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolHTTPS);
  1219. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeHTTPProxy];
  1220. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolHTTPProxy);
  1221. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeHTTPSProxy];
  1222. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolHTTPSProxy);
  1223. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeFTPProxy];
  1224. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolFTPProxy);
  1225. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeSMB];
  1226. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolSMB);
  1227. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeRTSP];
  1228. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolRTSP);
  1229. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeRTSPProxy];
  1230. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolRTSPProxy);
  1231. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeDAAP];
  1232. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolDAAP);
  1233. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeEPPC];
  1234. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolEPPC);
  1235. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeNNTPS];
  1236. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolNNTPS);
  1237. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeLDAPS];
  1238. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolLDAPS);
  1239. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeTelnetS];
  1240. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolTelnetS);
  1241. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypeIRCS];
  1242. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolIRCS);
  1243. keychain = [UICKeyChainStore keyChainStoreWithServer:URL protocolType:UICKeyChainStoreProtocolTypePOP3S];
  1244. XCTAssertEqualObjects([keychain protocolTypeObject], (__bridge id)kSecAttrProtocolPOP3S);
  1245. }
  1246. #pragma mark -
  1247. - (void)testAccessibilityPrivateMethod
  1248. {
  1249. UICKeyChainStore *keychain;
  1250. keychain = [UICKeyChainStore keyChainStoreWithService:@"Twitter"];
  1251. keychain.accessibility = UICKeyChainStoreAccessibilityWhenUnlocked;
  1252. XCTAssertEqualObjects([keychain accessibilityObject], (__bridge id)kSecAttrAccessibleWhenUnlocked);
  1253. keychain.accessibility = UICKeyChainStoreAccessibilityAfterFirstUnlock;
  1254. XCTAssertEqualObjects([keychain accessibilityObject], (__bridge id)kSecAttrAccessibleAfterFirstUnlock);
  1255. keychain.accessibility = UICKeyChainStoreAccessibilityAlways;
  1256. XCTAssertEqualObjects([keychain accessibilityObject], (__bridge id)kSecAttrAccessibleAlways);
  1257. #if TARGET_OS_IPHONE
  1258. keychain.accessibility = UICKeyChainStoreAccessibilityWhenPasscodeSetThisDeviceOnly;
  1259. XCTAssertEqualObjects([keychain accessibilityObject], (__bridge id)kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly);
  1260. #endif
  1261. keychain.accessibility = UICKeyChainStoreAccessibilityWhenUnlockedThisDeviceOnly;
  1262. XCTAssertEqualObjects([keychain accessibilityObject], (__bridge id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly);
  1263. keychain.accessibility = UICKeyChainStoreAccessibilityAfterFirstUnlockThisDeviceOnly;
  1264. XCTAssertEqualObjects([keychain accessibilityObject], (__bridge id)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly);
  1265. keychain.accessibility = UICKeyChainStoreAccessibilityAlwaysThisDeviceOnly;
  1266. XCTAssertEqualObjects([keychain accessibilityObject], (__bridge id)kSecAttrAccessibleAlwaysThisDeviceOnly);
  1267. }
  1268. @end