PageRenderTime 163ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/core/externals/update-engine/Core/KSTicketTest.m

http://macfuse.googlecode.com/
Objective C | 949 lines | 722 code | 129 blank | 98 comment | 11 complexity | 73d7def073dfd18ece6ec10055845e97 MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause, GPL-2.0
  1. // Copyright 2008 Google Inc.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #import <SenTestingKit/SenTestingKit.h>
  15. #import "KSTicket.h"
  16. #import "KSExistenceChecker.h"
  17. @interface KSTicketTest : SenTestCase
  18. @end
  19. @implementation KSTicketTest
  20. - (void)testTicket {
  21. KSTicket *t = nil;
  22. t = [[KSTicket alloc] init];
  23. STAssertNil(t, nil);
  24. KSExistenceChecker *xc = [KSExistenceChecker falseChecker];
  25. NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  26. // Make sure tickets created with the convenience, and the init, are sane.
  27. KSTicket *t1 = [KSTicket ticketWithProductID:@"{GUID}"
  28. version:@"1.1"
  29. existenceChecker:xc
  30. serverURL:url];
  31. STAssertNotNil(t1, nil);
  32. KSTicket *t2 = [[KSTicket alloc] initWithProductID:@"{GUID}"
  33. version:@"1.1"
  34. existenceChecker:xc
  35. serverURL:url];
  36. STAssertNotNil(t2, nil);
  37. NSArray *tickets = [NSArray arrayWithObjects:t1, t2, nil];
  38. NSEnumerator *enumerator = [tickets objectEnumerator];
  39. while ((t = [enumerator nextObject])) {
  40. STAssertEqualObjects([t productID], @"{GUID}", nil);
  41. STAssertEqualObjects([t version], @"1.1", nil);
  42. STAssertEqualObjects([t existenceChecker], xc, nil);
  43. STAssertEqualObjects([t serverURL], url, nil);
  44. STAssertNil([t trustedTesterToken], nil);
  45. STAssertNil([t tag], nil);
  46. STAssertTrue([[t creationDate] timeIntervalSinceNow] < 0, nil);
  47. STAssertTrue(-[[t creationDate] timeIntervalSinceNow] < 0.5, nil);
  48. STAssertTrue([[t description] length] > 1, nil);
  49. }
  50. }
  51. - (void)testTicketEquality {
  52. KSTicket *t1 = nil;
  53. KSExistenceChecker *xc = [KSExistenceChecker falseChecker];
  54. NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  55. NSDate *cd = [NSDate dateWithTimeIntervalSinceNow:12345.67];
  56. NSMutableDictionary *args =
  57. [NSMutableDictionary dictionaryWithObjectsAndKeys:
  58. @"{GUID}", KSTicketProductIDKey,
  59. @"1.1", KSTicketVersionKey,
  60. xc, KSTicketExistenceCheckerKey,
  61. url, KSTicketServerURLKey,
  62. cd, KSTicketCreationDateKey,
  63. @"tttoken", KSTicketTrustedTesterTokenKey,
  64. @"ttaggen", KSTicketTagKey,
  65. @"path", KSTicketTagPathKey,
  66. @"key", KSTicketTagKeyKey,
  67. @"brandpath", KSTicketBrandPathKey,
  68. @"brandkey", KSTicketBrandKeyKey,
  69. @"versionpath", KSTicketVersionPathKey,
  70. @"versionkey", KSTicketVersionKeyKey,
  71. nil];
  72. t1 = [KSTicket ticketWithParameters:args];
  73. STAssertNotNil(t1, nil);
  74. STAssertTrue([t1 isEqual:t1], nil);
  75. STAssertTrue([t1 isEqualToTicket:t1], nil);
  76. STAssertFalse([t1 isEqual:@"blah"], nil);
  77. // "copy" t1 by archiving it then unarchiving it. This simulates adding the
  78. // ticket to the ticket store, then retrieving it.
  79. NSData *data = [NSKeyedArchiver archivedDataWithRootObject:t1];
  80. KSTicket *t2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  81. STAssertNotNil(t2, nil);
  82. // Make sure t2 has everything it should.
  83. STAssertEqualObjects([t2 productID], @"{GUID}", nil);
  84. STAssertEqualObjects([t2 version], @"1.1", nil);
  85. STAssertEqualObjects([t2 existenceChecker], xc, nil);
  86. STAssertEqualObjects([t2 serverURL], url, nil);
  87. STAssertEqualObjects([t2 creationDate], cd, nil);
  88. STAssertEqualObjects([t2 trustedTesterToken], @"tttoken", nil);
  89. STAssertEqualObjects([t2 tag], @"ttaggen", nil);
  90. STAssertEqualObjects([t2 tagPath], @"path", nil);
  91. STAssertEqualObjects([t2 tagKey], @"key", nil);
  92. STAssertEqualObjects([t2 brandPath], @"brandpath", nil);
  93. STAssertEqualObjects([t2 brandKey], @"brandkey", nil);
  94. STAssertEqualObjects([t2 versionPath], @"versionpath", nil);
  95. STAssertEqualObjects([t2 versionKey], @"versionkey", nil);
  96. STAssertTrue(t1 != t2, nil);
  97. STAssertTrue([t1 isEqual:t2], nil);
  98. STAssertTrue([t1 isEqualToTicket:t2], nil);
  99. STAssertEqualObjects(t1, t2, nil);
  100. STAssertEquals([t1 hash], [t2 hash], nil);
  101. t2 = [KSTicket ticketWithProductID:@"{GUID}"
  102. version:@"1.1"
  103. existenceChecker:xc
  104. serverURL:url];
  105. STAssertNotNil(t2, nil);
  106. STAssertFalse([t1 isEqual:t2], nil);
  107. KSTicket *t3 = nil;
  108. t3 = [KSTicket ticketWithProductID:@"{GUID}!"
  109. version:@"1.1"
  110. existenceChecker:xc
  111. serverURL:url];
  112. STAssertFalse([t1 isEqual:t3], nil);
  113. t3 = [KSTicket ticketWithProductID:@"{GUID}"
  114. version:@"1.1!"
  115. existenceChecker:xc
  116. serverURL:url];
  117. STAssertFalse([t1 isEqual:t3], nil);
  118. t3 = [KSTicket ticketWithProductID:@"{GUID}"
  119. version:@"1.1"
  120. existenceChecker:xc
  121. serverURL:[NSURL URLWithString:@"http://unixjunkie.net"]];
  122. STAssertFalse([t1 isEqual:t3], nil);
  123. KSExistenceChecker *xchecker =
  124. [KSPathExistenceChecker checkerWithPath:@"/tmp"];
  125. t3 = [KSTicket ticketWithProductID:@"{GUID}"
  126. version:@"1.1"
  127. existenceChecker:xchecker
  128. serverURL:url];
  129. STAssertFalse([t1 isEqual:t3], nil);
  130. // Make sure changing one of TTT, tag, tag path, or tag key renders
  131. // the tickets not equal.
  132. [args setObject:@"not-tttoken" forKey:KSTicketTrustedTesterTokenKey];
  133. t3 = [KSTicket ticketWithParameters:args];
  134. STAssertFalse([t1 isEqual:t3], nil);
  135. [args setObject:@"tttoken" forKey:KSTicketTrustedTesterTokenKey];
  136. [args setObject:@"not-ttaggen" forKey:KSTicketTagKey];
  137. t3 = [KSTicket ticketWithParameters:args];
  138. STAssertFalse([t1 isEqual:t3], nil);
  139. [args setObject:@"ttaggen" forKey:KSTicketTagKey];
  140. [args setObject:@"not-path" forKey:KSTicketTagPathKey];
  141. t3 = [KSTicket ticketWithParameters:args];
  142. STAssertFalse([t1 isEqual:t3], nil);
  143. [args setObject:@"path" forKey:KSTicketTagPathKey];
  144. [args setObject:@"not-key" forKey:KSTicketTagKeyKey];
  145. t3 = [KSTicket ticketWithParameters:args];
  146. STAssertFalse([t1 isEqual:t3], nil);
  147. [args setObject:@"key" forKey:KSTicketTagKeyKey];
  148. [args setObject:@"not-brandpath" forKey:KSTicketBrandPathKey];
  149. t3 = [KSTicket ticketWithParameters:args];
  150. STAssertFalse([t1 isEqual:t3], nil);
  151. [args setObject:@"brandpath" forKey:KSTicketBrandPathKey];
  152. [args setObject:@"not-brandkey" forKey:KSTicketBrandKeyKey];
  153. t3 = [KSTicket ticketWithParameters:args];
  154. STAssertFalse([t1 isEqual:t3], nil);
  155. [args setObject:@"brandkey" forKey:KSTicketBrandKeyKey];
  156. [args setObject:@"not-versionpath" forKey:KSTicketVersionPathKey];
  157. t3 = [KSTicket ticketWithParameters:args];
  158. STAssertFalse([t1 isEqual:t3], nil);
  159. [args setObject:@"versionpath" forKey:KSTicketVersionPathKey];
  160. [args setObject:@"not-versionkey" forKey:KSTicketVersionKeyKey];
  161. t3 = [KSTicket ticketWithParameters:args];
  162. STAssertFalse([t1 isEqual:t3], nil);
  163. }
  164. - (void)testNilArgs {
  165. KSTicket *t = nil;
  166. t = [KSTicket ticketWithProductID:nil version:nil
  167. existenceChecker:nil serverURL:nil];
  168. STAssertNil(t, nil);
  169. t = [KSTicket ticketWithProductID:@"hi" version:nil
  170. existenceChecker:nil serverURL:nil];
  171. STAssertNil(t, nil);
  172. t = [KSTicket ticketWithProductID:nil version:nil
  173. existenceChecker:nil serverURL:nil];
  174. STAssertNil(t, nil);
  175. t = [KSTicket ticketWithProductID:nil version:@"hi"
  176. existenceChecker:nil serverURL:nil];
  177. STAssertNil(t, nil);
  178. KSExistenceChecker *xc = [KSExistenceChecker falseChecker];
  179. t = [KSTicket ticketWithProductID:nil version:nil
  180. existenceChecker:xc serverURL:nil];
  181. STAssertNil(t, nil);
  182. NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  183. t = [KSTicket ticketWithProductID:nil version:nil
  184. existenceChecker:nil serverURL:url];
  185. STAssertNil(t, nil);
  186. t = [KSTicket ticketWithProductID:@"hi" version:@"hi"
  187. existenceChecker:xc serverURL:url];
  188. STAssertNotNil(t, nil);
  189. }
  190. - (void)testTTToken {
  191. NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  192. // basics: make sure tttoken works
  193. KSTicket *t = [KSTicket ticketWithProductID:@"{GUID}"
  194. version:@"1.1"
  195. existenceChecker:[KSExistenceChecker falseChecker]
  196. serverURL:url
  197. trustedTesterToken:@"tttoken"];
  198. STAssertNotNil(t, nil);
  199. STAssertEqualObjects([t trustedTesterToken], @"tttoken", nil);
  200. // basics: make sure different tttoken works
  201. KSTicket *u = [KSTicket ticketWithProductID:@"{GUID}"
  202. version:@"1.1"
  203. existenceChecker:[KSExistenceChecker falseChecker]
  204. serverURL:url
  205. trustedTesterToken:@"hi_mark"];
  206. STAssertNotNil(u, nil);
  207. STAssertEqualObjects([u trustedTesterToken], @"hi_mark", nil);
  208. // hash not changed by tttoken
  209. STAssertEquals([t hash], [u hash], nil);
  210. // Same as 'u' but different version; make sure tttoken doens't mess
  211. // up equality
  212. KSTicket *v = [KSTicket ticketWithProductID:@"{GUID}"
  213. version:@"1.2"
  214. existenceChecker:[KSExistenceChecker falseChecker]
  215. serverURL:url
  216. trustedTesterToken:@"hi_mark"];
  217. STAssertNotNil(v, nil);
  218. STAssertFalse([u isEqual:v], nil);
  219. STAssertTrue([[v description] length] > 1, nil);
  220. STAssertTrue([[v description] rangeOfString:@"hi_mark"].length > 0,
  221. nil);
  222. }
  223. - (void)testCreateDate {
  224. KSTicket *t = nil;
  225. KSExistenceChecker *xc = [KSExistenceChecker trueChecker];
  226. NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  227. NSDate *pastDate = [NSDate dateWithTimeIntervalSinceNow:-1234567.8];
  228. t = [KSTicket ticketWithProductID:@"{GUID}"
  229. version:@"1.3"
  230. existenceChecker:xc
  231. serverURL:url
  232. trustedTesterToken:nil
  233. creationDate:pastDate];
  234. STAssertEqualObjects(pastDate, [t creationDate], nil);
  235. t = [KSTicket ticketWithProductID:@"{GUID}"
  236. version:@"1.3"
  237. existenceChecker:xc
  238. serverURL:url
  239. trustedTesterToken:nil
  240. creationDate:nil];
  241. NSDate *now = [NSDate date];
  242. // We should get "now". Allow a minute slop to check.
  243. STAssertTrue(fabs([now timeIntervalSinceDate:[t creationDate]]) < 60, nil);
  244. }
  245. - (void)testTag {
  246. NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  247. // basics: make sure tag works
  248. KSTicket *t = [KSTicket ticketWithProductID:@"{GUID}"
  249. version:@"1.1"
  250. existenceChecker:[KSExistenceChecker falseChecker]
  251. serverURL:url
  252. trustedTesterToken:nil
  253. creationDate:nil
  254. tag:@"hi_greg"];
  255. STAssertNotNil(t, nil);
  256. STAssertEqualObjects([t tag], @"hi_greg", nil);
  257. // basics: make sure different tag works
  258. KSTicket *u = [KSTicket ticketWithProductID:@"{GUID}"
  259. version:@"1.1"
  260. existenceChecker:[KSExistenceChecker falseChecker]
  261. serverURL:url
  262. trustedTesterToken:nil
  263. creationDate:nil
  264. tag:@"snork"];
  265. STAssertNotNil(u, nil);
  266. STAssertEqualObjects([u tag], @"snork", nil);
  267. // hash not changed by tag
  268. STAssertEquals([t hash], [u hash], nil);
  269. // Same as 'u' but different version; make sure tag doens't mess
  270. // up equality
  271. KSTicket *v = [KSTicket ticketWithProductID:@"{GUID}"
  272. version:@"1.2"
  273. existenceChecker:[KSExistenceChecker falseChecker]
  274. serverURL:url
  275. trustedTesterToken:nil
  276. creationDate:nil
  277. tag:@"hi_mom"];
  278. STAssertNotNil(v, nil);
  279. STAssertFalse([u isEqual:v], nil);
  280. STAssertTrue([[v description] length] > 1, nil);
  281. STAssertTrue([[v description] rangeOfString:@"hi_mom"].length > 0,
  282. nil);
  283. }
  284. - (void)testTicketParameterCreation {
  285. KSTicket *t;
  286. KSExistenceChecker *xc = [KSExistenceChecker falseChecker];
  287. NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  288. NSDictionary *args;
  289. // Make sure insufficient data results in no ticket.
  290. t = [KSTicket ticketWithParameters:nil];
  291. STAssertNil(t, nil);
  292. t = [KSTicket ticketWithParameters:[NSDictionary dictionary]];
  293. STAssertNil(t, nil);
  294. t = [[[KSTicket alloc] initWithParameters:nil] autorelease];
  295. STAssertNil(t, nil);
  296. t = [[[KSTicket alloc] initWithParameters:[NSDictionary dictionary]]
  297. autorelease];
  298. STAssertNil(t, nil);
  299. // -testNilArgs covers the combination of required args. Make sure
  300. // that a sampling of missing required args result in a nil object.
  301. args = [NSDictionary dictionaryWithObjectsAndKeys:
  302. @"com.hassel.hoff", KSTicketProductIDKey,
  303. @"3.14.15", KSTicketVersionKey,
  304. nil];
  305. t = [KSTicket ticketWithParameters:args];
  306. STAssertNil(t, nil);
  307. args = [NSDictionary dictionaryWithObjectsAndKeys:
  308. xc, KSTicketExistenceCheckerKey,
  309. url, KSTicketServerURLKey,
  310. nil];
  311. t = [KSTicket ticketWithParameters:args];
  312. STAssertNil(t, nil);
  313. args = [NSDictionary dictionaryWithObjectsAndKeys:
  314. @"bubbles", KSTicketTrustedTesterTokenKey,
  315. [NSDate date], KSTicketCreationDateKey,
  316. @"tag", KSTicketTagKey,
  317. @"path", KSTicketTagPathKey,
  318. @"baby", KSTicketTagKeyKey,
  319. @"brandpath", KSTicketBrandPathKey,
  320. @"brandkey", KSTicketBrandKeyKey,
  321. nil];
  322. t = [KSTicket ticketWithParameters:args];
  323. STAssertNil(t, nil);
  324. // Make sure everything set makes it through.
  325. NSDate *now = [NSDate date];
  326. args = [NSDictionary dictionaryWithObjectsAndKeys:
  327. @"com.hassel.hoff", KSTicketProductIDKey,
  328. @"3.14.15", KSTicketVersionKey,
  329. xc, KSTicketExistenceCheckerKey,
  330. url, KSTicketServerURLKey,
  331. @"ttt", KSTicketTrustedTesterTokenKey,
  332. now, KSTicketCreationDateKey,
  333. @"tagge", KSTicketTagKey,
  334. @"pathe", KSTicketTagPathKey,
  335. @"taggekeye", KSTicketTagKeyKey,
  336. @"brandpathe", KSTicketBrandPathKey,
  337. @"brandekeye", KSTicketBrandKeyKey,
  338. nil];
  339. t = [KSTicket ticketWithParameters:args];
  340. STAssertNotNil(t, nil);
  341. STAssertEqualObjects([t productID], @"com.hassel.hoff", nil);
  342. STAssertEqualObjects([t version], @"3.14.15", nil);
  343. STAssertEqualObjects([t existenceChecker], xc, nil);
  344. STAssertEqualObjects([t serverURL], url, nil);
  345. STAssertEqualObjects([t trustedTesterToken], @"ttt", nil);
  346. STAssertEqualObjects([t creationDate], now, nil);
  347. STAssertEqualObjects([t tag], @"tagge", nil);
  348. STAssertEqualObjects([t tagPath], @"pathe", nil);
  349. STAssertEqualObjects([t tagKey], @"taggekeye", nil);
  350. STAssertEqualObjects([t brandPath], @"brandpathe", nil);
  351. STAssertEqualObjects([t brandKey], @"brandekeye", nil);
  352. }
  353. - (void)testTagPathAccessors {
  354. KSTicket *t;
  355. KSExistenceChecker *xc = [KSExistenceChecker falseChecker];
  356. NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  357. NSDictionary *args;
  358. args = [NSDictionary dictionaryWithObjectsAndKeys:
  359. @"com.hassel.hoff", KSTicketProductIDKey,
  360. @"3.14.15", KSTicketVersionKey,
  361. xc, KSTicketExistenceCheckerKey,
  362. url, KSTicketServerURLKey,
  363. @"path", KSTicketTagPathKey,
  364. @"key", KSTicketTagKeyKey,
  365. nil];
  366. t = [KSTicket ticketWithParameters:args];
  367. STAssertEqualObjects([t tagPath], @"path", nil);
  368. STAssertEqualObjects([t tagKey], @"key", nil);
  369. }
  370. - (void)testBrandPathAccessors {
  371. KSTicket *t;
  372. KSExistenceChecker *xc = [KSExistenceChecker falseChecker];
  373. NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  374. NSDictionary *args;
  375. args = [NSDictionary dictionaryWithObjectsAndKeys:
  376. @"com.hassel.hoff", KSTicketProductIDKey,
  377. @"3.14.15", KSTicketVersionKey,
  378. xc, KSTicketExistenceCheckerKey,
  379. url, KSTicketServerURLKey,
  380. @"tagpath", KSTicketTagPathKey,
  381. @"tagkey", KSTicketTagKeyKey,
  382. @"brandpath", KSTicketBrandPathKey,
  383. @"brandkey", KSTicketBrandKeyKey,
  384. nil];
  385. t = [KSTicket ticketWithParameters:args];
  386. STAssertEqualObjects([t brandPath], @"brandpath", nil);
  387. STAssertEqualObjects([t brandKey], @"brandkey", nil);
  388. }
  389. - (KSTicket *)ticketWithTagPath:(NSString *)tagPath
  390. tagKey:(NSString *)tagKey
  391. tag:(NSString *)tag
  392. brandPath:(NSString *)brandPath
  393. brandKey:(NSString *)brandKey
  394. versionPath:(NSString *)versionPath
  395. versionKey:(NSString *)versionKey
  396. version:(NSString *)version {
  397. KSExistenceChecker *xc = [KSExistenceChecker falseChecker];
  398. NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  399. NSMutableDictionary *args
  400. = [NSMutableDictionary dictionaryWithObjectsAndKeys:
  401. @"com.hassel.hoff", KSTicketProductIDKey,
  402. xc, KSTicketExistenceCheckerKey,
  403. url, KSTicketServerURLKey,
  404. @"3.14.15", KSTicketVersionKey,
  405. nil];
  406. if (tagPath) [args setObject:tagPath forKey:KSTicketTagPathKey];
  407. if (tagKey) [args setObject:tagKey forKey: KSTicketTagKeyKey];
  408. if (tag) [args setObject:tag forKey:KSTicketTagKey];
  409. if (brandPath) [args setObject:brandPath forKey:KSTicketBrandPathKey];
  410. if (brandKey) [args setObject:brandKey forKey:KSTicketBrandKeyKey];
  411. if (versionPath) [args setObject:versionPath forKey:KSTicketVersionPathKey];
  412. if (versionKey) [args setObject:versionKey forKey:KSTicketVersionKeyKey];
  413. if (version) [args setObject:version forKey:KSTicketVersionKey];
  414. KSTicket *t = [KSTicket ticketWithParameters:args];
  415. STAssertNotNil(t, nil);
  416. return t;
  417. }
  418. - (KSTicket *)ticketWithTagPath:(NSString *)tagPath
  419. tagKey:(NSString *)tagKey
  420. tag:(NSString *)tag {
  421. return [self ticketWithTagPath:tagPath
  422. tagKey:tagKey
  423. tag:tag
  424. brandPath:@"noBrandPath"
  425. brandKey:@"noBrandKey"
  426. versionPath:nil
  427. versionKey:nil
  428. version:nil];
  429. }
  430. - (KSTicket *)ticketWithVersionPath:(NSString *)versionPath
  431. versionKey:(NSString *)versionKey
  432. version:(NSString *)version {
  433. return [self ticketWithTagPath:nil
  434. tagKey:nil
  435. tag:nil
  436. brandPath:nil
  437. brandKey:nil
  438. versionPath:versionPath
  439. versionKey:versionKey
  440. version:version];
  441. }
  442. - (KSTicket *)ticketWithBrandPath:(NSString *)brandPath
  443. brandKey:(NSString *)brandKey {
  444. return [self ticketWithTagPath:nil
  445. tagKey:nil
  446. tag:nil
  447. brandPath:brandPath
  448. brandKey:brandKey
  449. versionPath:nil
  450. versionKey:nil
  451. version:nil];
  452. }
  453. - (KSTicket *)ticketForResourceName:(NSString *)name
  454. type:(NSString *)type
  455. tagKey:(NSString *)tagKey
  456. tag:(NSString *)tag {
  457. NSBundle *mainBundle = [NSBundle bundleForClass:[self class]];
  458. NSString *path = [mainBundle pathForResource:name ofType:type];
  459. STAssertNotNil(path, nil);
  460. return [self ticketWithTagPath:path
  461. tagKey:tagKey
  462. tag:tag
  463. brandPath:nil
  464. brandKey:nil
  465. versionPath:nil
  466. versionKey:nil
  467. version:nil];
  468. }
  469. - (KSTicket *)ticketForResourceName:(NSString *)name
  470. type:(NSString *)type
  471. versionKey:(NSString *)versionKey
  472. version:(NSString *)version {
  473. NSBundle *mainBundle = [NSBundle bundleForClass:[self class]];
  474. NSString *path = [mainBundle pathForResource:name ofType:type];
  475. STAssertNotNil(path, nil);
  476. return [self ticketWithTagPath:nil
  477. tagKey:nil
  478. tag:nil
  479. brandPath:nil
  480. brandKey:nil
  481. versionPath:path
  482. versionKey:versionKey
  483. version:version];
  484. }
  485. - (void)testDetermineTagPath {
  486. KSTicket *t;
  487. NSString *tag;
  488. // Legitimate file tests - these are all readable plist files, so
  489. // the -determinedTag should either be a value from the file, or nil.
  490. t = [self ticketForResourceName:@"TagPath-success"
  491. type:@"plist"
  492. tagKey:@"Awesomeness"
  493. tag:@"blargle"];
  494. tag = [t determineTag];
  495. STAssertEqualObjects(tag, @"CowsGoMoo", nil);
  496. // Binary-format plist should work the same.
  497. t = [self ticketForResourceName:@"TagPath-binary-success"
  498. type:@"plist"
  499. tagKey:@"Awesomeness"
  500. tag:@"blargle"];
  501. tag = [t determineTag];
  502. STAssertEqualObjects(tag, @"CowsGoMoo", nil);
  503. // This file does not have the Awesomeness2 key, so should evaulate to nil.
  504. t = [self ticketForResourceName:@"TagPath-success"
  505. type:@"plist"
  506. tagKey:@"Awesomeness2"
  507. tag:@"blargle"];
  508. tag = [t determineTag];
  509. STAssertNil(tag, nil);
  510. // This tag is huge, > 1K, so should evaluate to nil.
  511. t = [self ticketForResourceName:@"TagPath-success"
  512. type:@"plist"
  513. tagKey:@"Hugeitude"
  514. tag:@"blargle"];
  515. tag = [t determineTag];
  516. STAssertNil(tag, nil);
  517. // This tag is empty, so the returned tag should be nil.
  518. // Empty string == no tag.
  519. t = [self ticketForResourceName:@"TagPath-success"
  520. type:@"plist"
  521. tagKey:@"Groovyness"
  522. tag:@"blargle"];
  523. tag = [t determineTag];
  524. STAssertNil(tag, nil);
  525. // ServerFailure.plist has an array under "Rules" rather than a
  526. // string. Since the file exists and is a legit plist file, the tag
  527. // should not be returned. The determined tag will be nil because
  528. // the key doesn't point to a legitimate value.
  529. t = [self ticketForResourceName:@"ServerFailure"
  530. type:@"plist"
  531. tagKey:@"Rules"
  532. tag:@"blargle"];
  533. tag = [t determineTag];
  534. STAssertNil(tag, nil);
  535. // Invalid files, so -determineTag should use the existing tag value.
  536. // No file there.
  537. t = [self ticketWithTagPath:@"/flongwaffle"
  538. tagKey:@"notthere"
  539. tag:@"blargle"];
  540. tag = [t determineTag];
  541. STAssertEqualObjects(tag, @"blargle", nil);
  542. // This file is too big (10 meg on leopard, 18 on Sneaux Leopard),
  543. // and should be rejected.
  544. t = [self ticketWithTagPath:@"/mach_kernel"
  545. tagKey:@"notthere"
  546. tag:@"blargle"];
  547. tag = [t determineTag];
  548. STAssertEqualObjects(tag, @"blargle", nil);
  549. // This file is malformed (it's binary, but not even a plist), and
  550. // should be rejected without anybody crashing or getting hassled.
  551. // The tag should evaluate to "blargle" since the file is bad.
  552. t = [self ticketForResourceName:@"TagPath-malformed-failure"
  553. type:@"plist"
  554. tagKey:@"Awesomeness"
  555. tag:@"blargle"];
  556. tag = [t determineTag];
  557. STAssertEqualObjects(tag, @"blargle", nil);
  558. t = [self ticketForResourceName:@"ServerFailure"
  559. type:@"plist"
  560. tagKey:@"Rules"
  561. tag:nil];
  562. tag = [t determineTag];
  563. STAssertNil(tag, nil);
  564. t = [self ticketWithTagPath:@"/flongwaffle"
  565. tagKey:@"notthere"
  566. tag:nil];
  567. tag = [t determineTag];
  568. STAssertNil(tag, nil);
  569. t = [self ticketForResourceName:@"TagPath-malformed-failure"
  570. type:@"plist"
  571. tagKey:@"Awesomeness"
  572. tag:nil];
  573. tag = [t determineTag];
  574. STAssertNil(tag, nil);
  575. }
  576. - (void)testTagPathHomeExpansion {
  577. // Copy a file to $HOME and make sure tilde expansion works.
  578. NSBundle *mainBundle = [NSBundle bundleForClass:[self class]];
  579. NSString *path = [mainBundle pathForResource:@"TagPath-success"
  580. ofType:@"plist"];
  581. STAssertNotNil(path, nil);
  582. NSFileManager *fm = [NSFileManager defaultManager];
  583. NSString *destPath =
  584. [NSHomeDirectory()stringByAppendingPathComponent:@"TagPath-success.plist"];
  585. [fm copyPath:path toPath:destPath handler:nil];
  586. if (![fm fileExistsAtPath:destPath]) {
  587. // Don't know if Pulse will choke on this. If so, make a not of it and
  588. // then bail out.
  589. NSLog(@"Could not copy file to home directory.");
  590. return;
  591. }
  592. KSTicket *t = [self ticketWithTagPath:@"~/TagPath-success.plist"
  593. tagKey:@"Awesomeness"
  594. tag:@"blargle"];
  595. NSString *tag = [t determineTag];
  596. STAssertEqualObjects(tag, @"CowsGoMoo", nil);
  597. [fm removeFileAtPath:destPath handler:nil];
  598. }
  599. - (KSTicket *)ticketForResourceName:(NSString *)name
  600. type:(NSString *)type
  601. brandKey:(NSString *)brandKey {
  602. NSBundle *mainBundle = [NSBundle bundleForClass:[self class]];
  603. NSString *path = [mainBundle pathForResource:name ofType:type];
  604. STAssertNotNil(path, nil);
  605. return [self ticketWithTagPath:nil
  606. tagKey:nil
  607. tag:nil
  608. brandPath:path
  609. brandKey:brandKey
  610. versionPath:nil
  611. versionKey:nil
  612. version:nil];
  613. }
  614. - (void)testDetermineBrandPath {
  615. KSTicket *t;
  616. NSString *brand;
  617. // Legitimate file tests - these are all readable plist files, so
  618. // the -determinedBrand should either be a value from the file, or nil.
  619. // Use the test files from TagPath, since tags and brands use similar
  620. // implementations.
  621. t = [self ticketForResourceName:@"TagPath-success"
  622. type:@"plist"
  623. brandKey:@"Awesomeness"];
  624. brand = [t determineBrand];
  625. STAssertEqualObjects(brand, @"CowsGoMoo", nil);
  626. // Binary-format plist should work the same.
  627. t = [self ticketForResourceName:@"TagPath-binary-success"
  628. type:@"plist"
  629. brandKey:@"Awesomeness"];
  630. brand = [t determineBrand];
  631. STAssertEqualObjects(brand, @"CowsGoMoo", nil);
  632. // This file does not have the Awesomeness2 key, so should evaulate to nil.
  633. t = [self ticketForResourceName:@"TagPath-success"
  634. type:@"plist"
  635. brandKey:@"Awesomeness2"];
  636. brand = [t determineBrand];
  637. STAssertNil(brand, nil);
  638. // This brand is huge, > 1K, so should evaluate to nil.
  639. t = [self ticketForResourceName:@"TagPath-success"
  640. type:@"plist"
  641. brandKey:@"Hugeitude"];
  642. brand = [t determineBrand];
  643. STAssertNil(brand, nil);
  644. // This brand is empty, so the returned brand should be nil.
  645. // Empty string == no brand.
  646. t = [self ticketForResourceName:@"TagPath-success"
  647. type:@"plist"
  648. brandKey:@"Groovyness"];
  649. brand = [t determineBrand];
  650. STAssertNil(brand, nil);
  651. // ServerFailure.plist has an array under "Rules" rather than a
  652. // string. Since the file exists and is a legit plist file, the brand
  653. // should not be returned. The determined brand will be nil because
  654. // the key doesn't point to a legitimate value.
  655. t = [self ticketForResourceName:@"ServerFailure"
  656. type:@"plist"
  657. brandKey:@"Rules"];
  658. brand = [t determineBrand];
  659. STAssertNil(brand, nil);
  660. // Invalid files, so -determineBrand should return nil
  661. // No file there.
  662. t = [self ticketWithBrandPath:@"/flongwaffle"
  663. brandKey:@"notthere"];
  664. brand = [t determineBrand];
  665. STAssertNil(brand, nil);
  666. // This file is too big (10 meg on leopard, 18 on Sneaux Leopard),
  667. // and should be rejected.
  668. t = [self ticketWithBrandPath:@"/mach_kernel"
  669. brandKey:@"notthere"];
  670. brand = [t determineBrand];
  671. STAssertNil(brand, nil);
  672. // This file is malformed (it's binary, but not even a plist), and
  673. // should be rejected without anybody crashing or getting hassled.
  674. // The brand should evaluate to "blargle" since the file is bad.
  675. t = [self ticketForResourceName:@"TagPath-malformed-failure"
  676. type:@"plist"
  677. brandKey:@"Awesomeness"];
  678. brand = [t determineBrand];
  679. STAssertNil(brand, nil);
  680. }
  681. - (void)testDetermineVersionPath {
  682. KSTicket *t;
  683. NSString *version;
  684. // Legitimate file tests - these are all readable plist files, so
  685. // the -determinedVersion should either be a value from the file, or nil.
  686. t = [self ticketForResourceName:@"TagPath-success"
  687. type:@"plist"
  688. versionKey:@"CFBundleShortVersionString"
  689. version:@"blargle"];
  690. version = [t determineVersion];
  691. STAssertEqualObjects(version, @"4.0.249.30", nil);
  692. // Binary-format plist should work the same.
  693. t = [self ticketForResourceName:@"TagPath-binary-success"
  694. type:@"plist"
  695. versionKey:@"CFBundleShortVersionString"
  696. version:@"blargle"];
  697. version = [t determineVersion];
  698. STAssertEqualObjects(version, @"4.0.249.30", nil);
  699. // This file does not have the Awesomeness2 key, so should evaulate to nil.
  700. t = [self ticketForResourceName:@"TagPath-success"
  701. type:@"plist"
  702. versionKey:@"Awesomeness2"
  703. version:@"blargle"];
  704. version = [t determineVersion];
  705. STAssertEqualObjects(version, @"blargle", nil);
  706. // This version is huge, > 1K, so should evaluate to nil.
  707. t = [self ticketForResourceName:@"TagPath-success"
  708. type:@"plist"
  709. versionKey:@"Hugeitude"
  710. version:@"blargle"];
  711. version = [t determineVersion];
  712. STAssertEqualObjects(version, @"blargle", nil);
  713. // This version is empty, so the returned version should be nil.
  714. // Empty string == no version.
  715. t = [self ticketForResourceName:@"TagPath-success"
  716. type:@"plist"
  717. versionKey:@"Groovyness"
  718. version:@"blargle"];
  719. version = [t determineVersion];
  720. STAssertEqualObjects(version, @"blargle", nil);
  721. // ServerFailure.plist has an array under "Rules" rather than a
  722. // string. Since the file exists and is a legit plist file, the version
  723. // should not be returned. The determined version will be nil because
  724. // the key doesn't point to a legitimate value.
  725. t = [self ticketForResourceName:@"ServerFailure"
  726. type:@"plist"
  727. versionKey:@"Rules"
  728. version:@"blargle"];
  729. version = [t determineVersion];
  730. STAssertEqualObjects(version, @"blargle", nil);
  731. // Invalid files, so -determineVersion should use the existing version value.
  732. // No file there.
  733. t = [self ticketWithVersionPath:@"/flongwaffle"
  734. versionKey:@"notthere"
  735. version:@"1.2.3.4"];
  736. version = [t determineVersion];
  737. STAssertEqualObjects(version, @"1.2.3.4", nil);
  738. // This file is too big (10 meg on leopard, 18 on Sneaux Leopard),
  739. // and should be rejected.
  740. t = [self ticketWithVersionPath:@"/mach_kernel"
  741. versionKey:@"notthere"
  742. version:@"1.2.3.4"];
  743. version = [t determineVersion];
  744. STAssertEqualObjects(version, @"1.2.3.4", nil);
  745. // This file is malformed (it's binary, but not even a plist), and
  746. // should be rejected without anybody crashing or getting hassled.
  747. // The version should evaluate to "blargle" since the file is bad.
  748. t = [self ticketForResourceName:@"TagPath-malformed-failure"
  749. type:@"plist"
  750. versionKey:@"CFBundleShortVersionString"
  751. version:@"1.2.3.4"];
  752. version = [t determineVersion];
  753. STAssertEqualObjects(version, @"1.2.3.4", nil);
  754. t = [self ticketForResourceName:@"ServerFailure"
  755. type:@"plist"
  756. versionKey:@"Rules"
  757. version:@"1.2.3.4"];
  758. version = [t determineVersion];
  759. STAssertEqualObjects(version, @"1.2.3.4", nil);
  760. t = [self ticketWithVersionPath:@"/flongwaffle"
  761. versionKey:@"notthere"
  762. version:@"1.2.3.4"];
  763. version = [t determineVersion];
  764. STAssertEqualObjects(version, @"1.2.3.4", nil);
  765. t = [self ticketForResourceName:@"TagPath-malformed-failure"
  766. type:@"plist"
  767. versionKey:@"Awesomeness"
  768. version:@"1.2.3.4"];
  769. version = [t determineVersion];
  770. STAssertEqualObjects(version, @"1.2.3.4", nil);
  771. }
  772. const char *templateDescription = "<KSTicket:%p\n"
  773. " productID=com.hassel.hoff\n"
  774. " version=3.14.15\n"
  775. " xc=<KSPathExistenceChecker:%p path=/attack/of/the/clowns>\n"
  776. " url=http://www.google.com\n"
  777. " creationDate=%@\n"
  778. " trustedTesterToken=monkeys\n"
  779. " tag=tag\n"
  780. " tagPath=path\n"
  781. " tagKey=key\n"
  782. " brandPath=brandpath\n"
  783. " brandKey=brandkey\n"
  784. " versionPath=versionpath\n"
  785. " versionKey=versionkey\n"
  786. ">";
  787. - (void)testDescriptionStability {
  788. // The ticket's -description is easily parsable. Keep the format mostly
  789. // stable for clients that do so.
  790. KSExistenceChecker *xc =
  791. [KSPathExistenceChecker checkerWithPath:@"/attack/of/the/clowns"];
  792. NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  793. NSDate *creationDate = [NSDate date];
  794. NSDictionary *args =
  795. [NSDictionary dictionaryWithObjectsAndKeys:
  796. @"com.hassel.hoff", KSTicketProductIDKey,
  797. @"3.14.15", KSTicketVersionKey,
  798. xc, KSTicketExistenceCheckerKey,
  799. url, KSTicketServerURLKey,
  800. @"monkeys", KSTicketTrustedTesterTokenKey,
  801. creationDate, KSTicketCreationDateKey,
  802. @"tag", KSTicketTagKey,
  803. @"path", KSTicketTagPathKey,
  804. @"key", KSTicketTagKeyKey,
  805. @"brandpath", KSTicketBrandPathKey,
  806. @"brandkey", KSTicketBrandKeyKey,
  807. @"versionpath", KSTicketVersionPathKey,
  808. @"versionkey", KSTicketVersionKeyKey,
  809. nil];
  810. KSTicket *ticket = [KSTicket ticketWithParameters:args];
  811. NSString *description = [ticket description];
  812. NSString *format = [NSString stringWithUTF8String:templateDescription];
  813. // Date description changes based on time zone. Known clients depending
  814. // on the description are not using the creation date. The ticket and
  815. // xc addresses are also not stable, so plug those into the template too.
  816. NSString *expected = [NSString stringWithFormat:format,
  817. ticket, xc,creationDate];
  818. STAssertEqualObjects(description, expected, nil);
  819. }
  820. @end