PageRenderTime 95ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/WebServiceDemo/Required_Libs/HTTPRequest/Classes/Tests/ASIS3RequestTests.m

https://gitlab.com/praveenvelanati/ios-demo
Objective C | 860 lines | 615 code | 154 blank | 91 comment | 24 complexity | e74171308016dc8ccd3f4adfe2caf1ec MD5 | raw file
  1. //
  2. // ASIS3RequestTests.m
  3. // Part of ASIHTTPRequest -> http://allseeing-i.com/ASIHTTPRequest
  4. //
  5. // Created by Ben Copsey on 12/07/2009.
  6. // Copyright 2009 All-Seeing Interactive. All rights reserved.
  7. //
  8. #import "ASIS3RequestTests.h"
  9. #import "ASINetworkQueue.h"
  10. #import "ASIS3BucketObject.h"
  11. #import "ASIS3ObjectRequest.h"
  12. #import "ASIS3BucketRequest.h"
  13. #import "ASIS3ServiceRequest.h"
  14. // Fill in these to run the tests that actually connect and manipulate objects on S3
  15. static NSString *secretAccessKey = @"";
  16. static NSString *accessKey = @"";
  17. // You should run these tests on a bucket that does not yet exist
  18. static NSString *bucket = @"";
  19. // Used for subclass test
  20. @interface ASIS3ObjectRequestSubclass : ASIS3ObjectRequest {}
  21. @end
  22. @implementation ASIS3ObjectRequestSubclass;
  23. @end
  24. @interface ASIS3BucketRequestSubclass : ASIS3BucketRequest {}
  25. @end
  26. @implementation ASIS3BucketRequestSubclass;
  27. @end
  28. @interface ASIS3BucketObjectSubclass : ASIS3BucketObject {}
  29. @end
  30. @implementation ASIS3BucketObjectSubclass;
  31. @end
  32. // Stop clang complaining about undeclared selectors
  33. @interface ASIS3RequestTests ()
  34. - (void)GETRequestDone:(ASIHTTPRequest *)request;
  35. - (void)GETRequestFailed:(ASIHTTPRequest *)request;
  36. - (void)PUTRequestDone:(ASIHTTPRequest *)request;
  37. - (void)PUTRequestFailed:(ASIHTTPRequest *)request;
  38. - (void)DELETERequestDone:(ASIHTTPRequest *)request;
  39. - (void)DELETERequestFailed:(ASIHTTPRequest *)request;
  40. @end
  41. @implementation ASIS3RequestTests
  42. // All these tests are based on Amazon's examples at: http://docs.amazonwebservices.com/AmazonS3/2006-03-01/
  43. - (void)testAuthenticationHeaderGeneration
  44. {
  45. NSString *exampleSecretAccessKey = @"uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o";
  46. NSString *exampleAccessKey = @"0PN5J17HBGZHT7JJ3X82";
  47. NSString *exampleBucket = @"johnsmith";
  48. // Test list all my buckets
  49. NSString *dateString = @"Wed, 28 Mar 2007 01:29:59 +0000";
  50. ASIS3ServiceRequest *serviceRequest = [ASIS3ServiceRequest serviceRequest];
  51. [serviceRequest setSecretAccessKey:exampleSecretAccessKey];
  52. [serviceRequest setAccessKey:exampleAccessKey];
  53. [serviceRequest setDateString:dateString];
  54. [serviceRequest buildRequestHeaders];
  55. BOOL success = [[[serviceRequest requestHeaders] valueForKey:@"Authorization"] isEqualToString:@"AWS 0PN5J17HBGZHT7JJ3X82:Db+gepJSUbZKwpx1FR0DLtEYoZA="];
  56. GHAssertTrue(success,@"Failed to generate the correct authorisation header for a GET service request");
  57. // Test GET
  58. NSString *key = @"photos/puppy.jpg";
  59. dateString = @"Tue, 27 Mar 2007 19:36:42 +0000";
  60. ASIS3ObjectRequest *request = [ASIS3ObjectRequest requestWithBucket:exampleBucket key:key];
  61. [request setDateString:dateString];
  62. [request setSecretAccessKey:exampleSecretAccessKey];
  63. [request setAccessKey:exampleAccessKey];
  64. [request buildRequestHeaders];
  65. success = [[[request requestHeaders] valueForKey:@"Authorization"] isEqualToString:@"AWS 0PN5J17HBGZHT7JJ3X82:xXjDGYUmKxnwqr5KXNPGldn5LbA="];
  66. GHAssertTrue(success,@"Failed to generate the correct authorisation header for a GET request");
  67. // Test PUT
  68. key = @"photos/puppy.jpg";
  69. dateString = @"Tue, 27 Mar 2007 21:15:45 +0000";
  70. request = [ASIS3ObjectRequest requestWithBucket:exampleBucket key:key];
  71. [request setRequestMethod:@"PUT"];
  72. [request setMimeType:@"image/jpeg"];
  73. [request setDateString:dateString];
  74. [request setSecretAccessKey:exampleSecretAccessKey];
  75. [request setAccessKey:exampleAccessKey];
  76. [request buildRequestHeaders];
  77. success = [[[request requestHeaders] valueForKey:@"Authorization"] isEqualToString:@"AWS 0PN5J17HBGZHT7JJ3X82:hcicpDDvL9SsO6AkvxqmIWkmOuQ="];
  78. GHAssertTrue(success,@"Failed to generate the correct authorisation header for a PUT request");
  79. // Test List
  80. dateString = @"Tue, 27 Mar 2007 19:42:41 +0000";
  81. ASIS3BucketRequest *listRequest = [ASIS3BucketRequest requestWithBucket:exampleBucket];
  82. [listRequest setPrefix:@"photos"];
  83. [listRequest setMaxResultCount:50];
  84. [listRequest setMarker:@"puppy"];
  85. [listRequest setDateString:dateString];
  86. [listRequest setSecretAccessKey:exampleSecretAccessKey];
  87. [listRequest setAccessKey:exampleAccessKey];
  88. [listRequest buildRequestHeaders];
  89. success = [[[listRequest requestHeaders] valueForKey:@"Authorization"] isEqualToString:@"AWS 0PN5J17HBGZHT7JJ3X82:jsRt/rhG+Vtp88HrYL706QhE4w4="];
  90. GHAssertTrue(success,@"Failed to generate the correct authorisation header for a list request");
  91. // Test fetch ACL
  92. dateString = @"Tue, 27 Mar 2007 19:44:46 +0000";
  93. listRequest = [ASIS3BucketRequest requestWithBucket:exampleBucket subResource:@"acl"];
  94. [listRequest setDateString:dateString];
  95. [listRequest setSecretAccessKey:exampleSecretAccessKey];
  96. [listRequest setAccessKey:exampleAccessKey];
  97. [listRequest buildRequestHeaders];
  98. success = [[[listRequest requestHeaders] valueForKey:@"Authorization"] isEqualToString:@"AWS 0PN5J17HBGZHT7JJ3X82:thdUi9VAkzhkniLj96JIrOPGi0g="];
  99. GHAssertTrue(success,@"Failed to generate the correct authorisation header for a list request");
  100. // Test Unicode keys
  101. // Comment out this test for now, as the S3 example is relying on mixed-case hex-encoded characters in the url, which isn't going to be easy to replicate
  102. // exampleBucket = @"dictionary";
  103. // key = @"français/préfère";
  104. // dateString = @"Wed, 28 Mar 2007 01:49:49 +0000";
  105. // request = [ASIS3ObjectRequest requestWithBucket:exampleBucket key:key];
  106. // [request setDateString:dateString];
  107. // [request setSecretAccessKey:exampleSecretAccessKey];
  108. // [request setAccessKey:exampleAccessKey];
  109. // [request buildRequestHeaders];
  110. // success = [[[request requestHeaders] valueForKey:@"Authorization"] isEqualToString:@"AWS 0PN5J17HBGZHT7JJ3X82:dxhSBHoI6eVSPcXJqEghlUzZMnY="];
  111. //GHAssertTrue(success,@"Failed to generate the correct authorisation header for a list request");
  112. }
  113. - (void)testFailure
  114. {
  115. // Needs expanding to cover more failure states - this is just a test to ensure Amazon's error description is being added to the error
  116. // We're actually going to try with the Amazon example details, but the request will fail because the date is old
  117. NSString *exampleSecretAccessKey = @"uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o";
  118. NSString *exampleAccessKey = @"0PN5J17HBGZHT7JJ3X82";
  119. NSString *exampleBucket = @"johnsmith";
  120. NSString *key = @"photos/puppy.jpg";
  121. NSString *dateString = @"Tue, 27 Mar 2007 19:36:42 +0000";
  122. ASIS3Request *request = [ASIS3ObjectRequest requestWithBucket:exampleBucket key:key];
  123. [request setDateString:dateString];
  124. [request setSecretAccessKey:exampleSecretAccessKey];
  125. [request setAccessKey:exampleAccessKey];
  126. [request startSynchronous];
  127. GHAssertNotNil([request error],@"Failed to generate an error when the request was not correctly signed");
  128. BOOL success = ([[request error] code] == ASIS3ResponseErrorType);
  129. GHAssertTrue(success,@"Generated error had the wrong error code");
  130. success = ([[[request error] localizedDescription] isEqualToString:@"The difference between the request time and the current time is too large."]);
  131. GHAssertTrue(success,@"Generated error had the wrong description");
  132. // Ensure a bucket request will correctly parse an error from S3
  133. request = [ASIS3BucketRequest requestWithBucket:exampleBucket];
  134. [request setDateString:dateString];
  135. [request setSecretAccessKey:exampleSecretAccessKey];
  136. [request setAccessKey:exampleAccessKey];
  137. [request startSynchronous];
  138. GHAssertNotNil([request error],@"Failed to generate an error when the request was not correctly signed");
  139. success = ([[request error] code] == ASIS3ResponseErrorType);
  140. GHAssertTrue(success,@"Generated error had the wrong error code");
  141. success = ([[[request error] localizedDescription] isEqualToString:@"The difference between the request time and the current time is too large."]);
  142. GHAssertTrue(success,@"Generated error had the wrong description");
  143. // Ensure a service request will correctly parse an error from S3
  144. request = [ASIS3ServiceRequest serviceRequest];
  145. [request setDateString:dateString];
  146. [request setSecretAccessKey:exampleSecretAccessKey];
  147. [request setAccessKey:exampleAccessKey];
  148. [request startSynchronous];
  149. GHAssertNotNil([request error],@"Failed to generate an error when the request was not correctly signed");
  150. success = ([[request error] code] == ASIS3ResponseErrorType);
  151. GHAssertTrue(success,@"Generated error had the wrong error code");
  152. success = ([[[request error] localizedDescription] isEqualToString:@"The difference between the request time and the current time is too large."]);
  153. GHAssertTrue(success,@"Generated error had the wrong description");
  154. }
  155. - (void)createTestBucket
  156. {
  157. // Test creating a bucket
  158. ASIS3BucketRequest *bucketRequest = [ASIS3BucketRequest PUTRequestWithBucket:bucket];
  159. [bucketRequest setSecretAccessKey:secretAccessKey];
  160. [bucketRequest setAccessKey:accessKey];
  161. [bucketRequest startSynchronous];
  162. GHAssertNil([bucketRequest error],@"Failed to create a bucket");
  163. }
  164. // To run this test, uncomment and fill in your S3 access details
  165. - (void)testREST
  166. {
  167. [self createTestBucket];
  168. BOOL success = (![secretAccessKey isEqualToString:@""] && ![accessKey isEqualToString:@""] && ![bucket isEqualToString:@""]);
  169. GHAssertTrue(success,@"You need to supply your S3 access details to run the REST test (see the top of ASIS3RequestTests.m)");
  170. // Test creating a bucket
  171. ASIS3BucketRequest *bucketRequest = [ASIS3BucketRequest PUTRequestWithBucket:bucket];
  172. [bucketRequest setSecretAccessKey:secretAccessKey];
  173. [bucketRequest setAccessKey:accessKey];
  174. [bucketRequest startSynchronous];
  175. GHAssertNil([bucketRequest error],@"Failed to create a bucket");
  176. // List buckets to make sure the bucket is there
  177. ASIS3ServiceRequest *serviceRequest = [ASIS3ServiceRequest serviceRequest];
  178. [serviceRequest setSecretAccessKey:secretAccessKey];
  179. [serviceRequest setAccessKey:accessKey];
  180. [serviceRequest startSynchronous];
  181. GHAssertNil([serviceRequest error],@"Failed to fetch the list of buckets from S3");
  182. BOOL foundBucket = NO;
  183. for (ASIS3Bucket *theBucket in [serviceRequest buckets]) {
  184. if ([[theBucket name] isEqualToString:bucket]) {
  185. foundBucket = YES;
  186. break;
  187. }
  188. }
  189. GHAssertTrue(foundBucket,@"Failed to retrive the newly-created bucket in a list of buckets");
  190. NSString *key = @"test";
  191. // Create the file
  192. NSString *text = @"This is my content";
  193. NSString *filePath = [[self filePathForTemporaryTestFiles] stringByAppendingPathComponent:@"testfile.txt"];
  194. [[text dataUsingEncoding:NSUTF8StringEncoding] writeToFile:filePath atomically:NO];
  195. // PUT the file
  196. ASIS3ObjectRequest *request = [ASIS3ObjectRequest PUTRequestForFile:filePath withBucket:bucket key:key];
  197. [request setSecretAccessKey:secretAccessKey];
  198. [request setAccessKey:accessKey];
  199. [request setStorageClass:ASIS3StorageClassReducedRedundancy];
  200. [request startSynchronous];
  201. success = [[request responseString] isEqualToString:@""];
  202. GHAssertTrue(success,@"Failed to PUT a file to S3");
  203. // GET the file
  204. request = [ASIS3ObjectRequest requestWithBucket:bucket key:key];
  205. [request setSecretAccessKey:secretAccessKey];
  206. [request setAccessKey:accessKey];
  207. [request startSynchronous];
  208. success = [[request responseString] isEqualToString:@"This is my content"];
  209. GHAssertTrue(success,@"Failed to GET the correct data from S3");
  210. // Test fetch subresource
  211. request = [ASIS3ObjectRequest requestWithBucket:bucket key:key subResource:@"acl"];
  212. [request setSecretAccessKey:secretAccessKey];
  213. [request setAccessKey:accessKey];
  214. [request startSynchronous];
  215. success = ([[request responseString] rangeOfString:@"<AccessControlPolicy"].location != NSNotFound);
  216. GHAssertTrue(success,@"Failed to GET a subresource");
  217. // COPY the file
  218. request = [ASIS3ObjectRequest COPYRequestFromBucket:bucket key:key toBucket:bucket key:@"test-copy"];
  219. [request setSecretAccessKey:secretAccessKey];
  220. [request setAccessKey:accessKey];
  221. [request startSynchronous];
  222. GHAssertNil([request error],@"Failed to COPY a file");
  223. // GET the copy
  224. request = [ASIS3ObjectRequest requestWithBucket:bucket key:@"test-copy"];
  225. [request setSecretAccessKey:secretAccessKey];
  226. [request setAccessKey:accessKey];
  227. [request startSynchronous];
  228. success = [[request responseString] isEqualToString:@"This is my content"];
  229. GHAssertTrue(success,@"Failed to GET the correct data from S3");
  230. // HEAD the copy
  231. request = [ASIS3ObjectRequest HEADRequestWithBucket:bucket key:@"test-copy"];
  232. [request setSecretAccessKey:secretAccessKey];
  233. [request setAccessKey:accessKey];
  234. [request startSynchronous];
  235. success = [[request responseString] isEqualToString:@""];
  236. GHAssertTrue(success,@"Got a response body for a HEAD request");
  237. // Test listing the objects in this bucket
  238. ASIS3BucketRequest *listRequest = [ASIS3BucketRequest requestWithBucket:bucket];
  239. [listRequest setSecretAccessKey:secretAccessKey];
  240. [listRequest setAccessKey:accessKey];
  241. [listRequest startSynchronous];
  242. GHAssertNil([listRequest error],@"Failed to download a list from S3");
  243. success = [[listRequest objects] count];
  244. GHAssertTrue(success,@"The file didn't show up in the list");
  245. // Test again with a prefix query
  246. listRequest = [ASIS3BucketRequest requestWithBucket:bucket];
  247. [listRequest setPrefix:@"test"];
  248. [listRequest setSecretAccessKey:secretAccessKey];
  249. [listRequest setAccessKey:accessKey];
  250. [listRequest startSynchronous];
  251. GHAssertNil([listRequest error],@"Failed to download a list from S3");
  252. success = [[listRequest objects] count];
  253. GHAssertTrue(success,@"The file didn't show up in the list");
  254. // DELETE the file
  255. request = [ASIS3ObjectRequest requestWithBucket:bucket key:key];
  256. [request setSecretAccessKey:secretAccessKey];
  257. [request setRequestMethod:@"DELETE"];
  258. [request setAccessKey:accessKey];
  259. [request startSynchronous];
  260. success = [[request responseString] isEqualToString:@""];
  261. GHAssertTrue(success,@"Failed to DELETE the file from S3");
  262. // (Also DELETE the copy we made)
  263. request = [ASIS3ObjectRequest requestWithBucket:bucket key:@"test-copy"];
  264. [request setSecretAccessKey:secretAccessKey];
  265. [request setRequestMethod:@"DELETE"];
  266. [request setAccessKey:accessKey];
  267. [request startSynchronous];
  268. success = [[request responseString] isEqualToString:@""];
  269. GHAssertTrue(success,@"Failed to DELETE the copy from S3");
  270. // Attempt to COPY the file, even though it is no longer there
  271. request = [ASIS3ObjectRequest COPYRequestFromBucket:bucket key:key toBucket:bucket key:@"test-copy"];
  272. [request setSecretAccessKey:secretAccessKey];
  273. [request setAccessKey:accessKey];
  274. [request startSynchronous];
  275. GHAssertNotNil([request error],@"Failed generate an error for what should have been a failed COPY");
  276. success = [[[request error] localizedDescription] isEqualToString:@"The specified key does not exist."];
  277. GHAssertTrue(success, @"Got the wrong error message");
  278. // PUT some data
  279. NSData *data = [@"Hello" dataUsingEncoding:NSUTF8StringEncoding];
  280. request = [ASIS3ObjectRequest PUTRequestForData:data withBucket:bucket key:key];
  281. [request setMimeType:@"text/plain"];
  282. [request setSecretAccessKey:secretAccessKey];
  283. [request setAccessKey:accessKey];
  284. [request startSynchronous];
  285. success = [[request responseString] isEqualToString:@""];
  286. GHAssertTrue(success,@"Failed to PUT data to S3");
  287. // GET the data to check it uploaded properly
  288. request = [ASIS3ObjectRequest requestWithBucket:bucket key:key];
  289. [request setSecretAccessKey:secretAccessKey];
  290. [request setAccessKey:accessKey];
  291. [request startSynchronous];
  292. success = [[request responseString] isEqualToString:@"Hello"];
  293. GHAssertTrue(success,@"Failed to GET the correct data from S3");
  294. // clean up (Delete it)
  295. request = [ASIS3ObjectRequest requestWithBucket:bucket key:key];
  296. [request setSecretAccessKey:secretAccessKey];
  297. [request setRequestMethod:@"DELETE"];
  298. [request setAccessKey:accessKey];
  299. [request startSynchronous];
  300. success = [[request responseString] isEqualToString:@""];
  301. GHAssertTrue(success,@"Failed to DELETE the file from S3");
  302. // Delete the bucket
  303. bucketRequest = [ASIS3BucketRequest DELETERequestWithBucket:bucket];
  304. [bucketRequest setSecretAccessKey:secretAccessKey];
  305. [bucketRequest setAccessKey:accessKey];
  306. [bucketRequest startSynchronous];
  307. GHAssertNil([bucketRequest error],@"Failed to delete a bucket");
  308. }
  309. // Will upload a file to S3, gzipping it before uploading
  310. // The file will be stored deflate, and automatically inflated when downloaded
  311. // This means the file will take up less storage space, and will upload and download faster
  312. // The file should still be accessible by any HTTP client that supports gzipped responses (eg browsers, NSURLConnection, etc)
  313. - (void)testGZippedContent
  314. {
  315. [self createTestBucket];
  316. BOOL success = (![secretAccessKey isEqualToString:@""] && ![accessKey isEqualToString:@""] && ![bucket isEqualToString:@""]);
  317. GHAssertTrue(success,@"You need to supply your S3 access details to run the gzipped put test (see the top of ASIS3RequestTests.m)");
  318. // Create the file
  319. NSString *text = @"This is my content This is my content This is my content This is my content This is my content This is my content";
  320. NSString *filePath = [[self filePathForTemporaryTestFiles] stringByAppendingPathComponent:@"testfile.txt"];
  321. [[text dataUsingEncoding:NSUTF8StringEncoding] writeToFile:filePath atomically:NO];
  322. NSString *key = @"gzipped-data";
  323. ASIS3ObjectRequest *request = [ASIS3ObjectRequest PUTRequestForFile:filePath withBucket:bucket key:key];
  324. [request setSecretAccessKey:secretAccessKey];
  325. [request setAccessKey:accessKey];
  326. [request setShouldCompressRequestBody:YES];
  327. [request setAccessPolicy:ASIS3AccessPolicyPublicRead]; // We'll make it public
  328. [request startSynchronous];
  329. success = [[request responseString] isEqualToString:@""];
  330. GHAssertTrue(success,@"Failed to PUT the gzipped file");
  331. // GET the file
  332. request = [ASIS3ObjectRequest requestWithBucket:bucket key:key];
  333. [request setSecretAccessKey:secretAccessKey];
  334. [request setAccessKey:accessKey];
  335. [request startSynchronous];
  336. success = [[request responseString] isEqualToString:text];
  337. GHAssertTrue(success,@"Failed to GET the correct data from S3");
  338. success = [[[request responseHeaders] valueForKey:@"Content-Encoding"] isEqualToString:@"gzip"];
  339. GHAssertTrue(success,@"Failed to GET the correct data from S3");
  340. // Now grab the data using something other than ASIHTTPRequest to ensure other HTTP clients can parse the gzipped content
  341. NSData *data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://%@.s3.amazonaws.com/gzipped-data",bucket]]] returningResponse:NULL error:NULL];
  342. NSString *string = [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding] autorelease];
  343. success = [string isEqualToString:text];
  344. GHAssertTrue(success,@"Failed to GET the correct data from S3");
  345. // Cleanup
  346. request = [ASIS3ObjectRequest DELETERequestWithBucket:bucket key:key];
  347. [request setSecretAccessKey:secretAccessKey];
  348. [request setAccessKey:accessKey];
  349. [request startSynchronous];
  350. }
  351. - (void)testListRequest
  352. {
  353. [self createTestBucket];
  354. BOOL success = (![secretAccessKey isEqualToString:@""] && ![accessKey isEqualToString:@""] && ![bucket isEqualToString:@""]);
  355. GHAssertTrue(success,@"You need to supply your S3 access details to run the list test (see the top of ASIS3RequestTests.m)");
  356. // Firstly, create and upload 5 files
  357. int i;
  358. for (i=0; i<5; i++) {
  359. NSString *text = [NSString stringWithFormat:@"This is the content of file #%hi",i];
  360. NSString *filePath = [[self filePathForTemporaryTestFiles] stringByAppendingPathComponent:[NSString stringWithFormat:@"%hi.txt",i]];
  361. [[text dataUsingEncoding:NSUTF8StringEncoding] writeToFile:filePath atomically:NO];
  362. NSString *key = [NSString stringWithFormat:@"test-file/%hi",i];
  363. ASIS3ObjectRequest *request = [ASIS3ObjectRequest PUTRequestForFile:filePath withBucket:bucket key:key];
  364. [request setSecretAccessKey:secretAccessKey];
  365. [request setAccessKey:accessKey];
  366. [request startSynchronous];
  367. GHAssertNil([request error],@"Give up on list request test - failed to upload a file");
  368. }
  369. // Test common prefixes
  370. ASIS3BucketRequest *listRequest = [ASIS3BucketRequest requestWithBucket:bucket];
  371. [listRequest setSecretAccessKey:secretAccessKey];
  372. [listRequest setAccessKey:accessKey];
  373. [listRequest setDelimiter:@"/"];
  374. [listRequest startSynchronous];
  375. GHAssertNil([listRequest error],@"Failed to download a list from S3");
  376. success = NO;
  377. for (NSString *prefix in [listRequest commonPrefixes]) {
  378. if ([prefix isEqualToString:@"test-file/"]) {
  379. success = YES;
  380. }
  381. }
  382. GHAssertTrue(success,@"Failed to obtain a list of common prefixes");
  383. // Test truncation
  384. listRequest = [ASIS3BucketRequest requestWithBucket:bucket];
  385. [listRequest setSecretAccessKey:secretAccessKey];
  386. [listRequest setAccessKey:accessKey];
  387. [listRequest setMaxResultCount:1];
  388. [listRequest startSynchronous];
  389. GHAssertTrue([listRequest isTruncated],@"Failed to identify what should be a truncated list of results");
  390. // Test urls are built correctly when requesting a subresource
  391. listRequest = [ASIS3BucketRequest requestWithBucket:bucket subResource:@"acl"];
  392. [listRequest setSecretAccessKey:secretAccessKey];
  393. [listRequest setAccessKey:accessKey];
  394. [listRequest setDelimiter:@"/"];
  395. [listRequest setPrefix:@"foo"];
  396. [listRequest setMarker:@"bar"];
  397. [listRequest setMaxResultCount:5];
  398. [listRequest buildURL];
  399. NSString *expectedURL = [NSString stringWithFormat:@"http://%@.s3.amazonaws.com/?acl&prefix=foo&marker=bar&delimiter=/&max-keys=5",bucket];
  400. success = ([[[listRequest url] absoluteString] isEqualToString:expectedURL]);
  401. GHAssertTrue(success,@"Generated the wrong url when requesting a subresource");
  402. // Now get a list of the files
  403. listRequest = [ASIS3BucketRequest requestWithBucket:bucket];
  404. [listRequest setPrefix:@"test-file"];
  405. [listRequest setSecretAccessKey:secretAccessKey];
  406. [listRequest setAccessKey:accessKey];
  407. [listRequest startSynchronous];
  408. GHAssertNil([listRequest error],@"Failed to download a list from S3");
  409. success = ([[listRequest objects] count] == 5);
  410. GHAssertTrue(success,@"List did not contain all files");
  411. // Please don't use an autoreleased operation queue with waitUntilAllOperationsAreFinished in your own code unless you're writing a test like this one
  412. // (The end result is no better than using synchronous requests) thx - Ben :)
  413. ASINetworkQueue *queue = [[[ASINetworkQueue alloc] init] autorelease];
  414. // Test fetching all the items
  415. [queue setRequestDidFinishSelector:@selector(GETRequestDone:)];
  416. [queue setRequestDidFailSelector:@selector(GETRequestFailed:)];
  417. [queue setDelegate:self];
  418. for (ASIS3BucketObject *object in [listRequest objects]) {
  419. ASIS3ObjectRequest *request = [object GETRequest];
  420. [request setAccessKey:accessKey];
  421. [request setSecretAccessKey:secretAccessKey];
  422. [queue addOperation:request];
  423. }
  424. [queue go];
  425. [queue waitUntilAllOperationsAreFinished];
  426. // Test uploading new files for all the items
  427. [queue setRequestDidFinishSelector:@selector(PUTRequestDone:)];
  428. [queue setRequestDidFailSelector:@selector(PUTRequestFailed:)];
  429. [queue setDelegate:self];
  430. i=0;
  431. // For each one, we'll just upload the same content again
  432. for (ASIS3BucketObject *object in [listRequest objects]) {
  433. NSString *oldFilePath = [[self filePathForTemporaryTestFiles] stringByAppendingPathComponent:[NSString stringWithFormat:@"%hi.txt",i]];;
  434. ASIS3Request *request = [object PUTRequestWithFile:oldFilePath];
  435. [request setAccessKey:accessKey];
  436. [request setSecretAccessKey:secretAccessKey];
  437. [queue addOperation:request];
  438. i++;
  439. }
  440. [queue go];
  441. [queue waitUntilAllOperationsAreFinished];
  442. // Test deleting all the items
  443. [queue setRequestDidFinishSelector:@selector(DELETERequestDone:)];
  444. [queue setRequestDidFailSelector:@selector(DELETERequestFailed:)];
  445. [queue setDelegate:self];
  446. i=0;
  447. for (ASIS3BucketObject *object in [listRequest objects]) {
  448. ASIS3ObjectRequest *request = [object DELETERequest];
  449. [request setAccessKey:accessKey];
  450. [request setSecretAccessKey:secretAccessKey];
  451. [queue addOperation:request];
  452. i++;
  453. }
  454. [queue go];
  455. [queue waitUntilAllOperationsAreFinished];
  456. // Grab the list again, it should be empty now
  457. listRequest = [ASIS3BucketRequest requestWithBucket:bucket];
  458. [listRequest setPrefix:@"test-file"];
  459. [listRequest setSecretAccessKey:secretAccessKey];
  460. [listRequest setAccessKey:accessKey];
  461. [listRequest startSynchronous];
  462. GHAssertNil([listRequest error],@"Failed to download a list from S3");
  463. success = ([[listRequest objects] count] == 0);
  464. GHAssertTrue(success,@"List contained files that should have been deleted");
  465. }
  466. - (void)GETRequestDone:(ASIS3Request *)request
  467. {
  468. NSString *expectedContent = [NSString stringWithFormat:@"This is the content of file #%@",[[[request url] absoluteString] lastPathComponent]];
  469. BOOL success = ([[request responseString] isEqualToString:expectedContent]);
  470. GHAssertTrue(success,@"Got the wrong content when downloading one of the files");
  471. }
  472. - (void)GETRequestFailed:(ASIS3Request *)request
  473. {
  474. GHAssertTrue(NO,@"GET request failed for one of the items in the list");
  475. }
  476. - (void)PUTRequestDone:(ASIS3Request *)request
  477. {
  478. }
  479. - (void)PUTRequestFailed:(ASIS3Request *)request
  480. {
  481. GHAssertTrue(NO,@"PUT request failed for one of the items in the list");
  482. }
  483. - (void)DELETERequestDone:(ASIS3Request *)request
  484. {
  485. }
  486. - (void)DELETERequestFailed:(ASIS3Request *)request
  487. {
  488. GHAssertTrue(NO,@"DELETE request failed for one of the items in the list");
  489. }
  490. // Ensure class convenience constructors return an instance of our subclass
  491. - (void)testSubclasses
  492. {
  493. ASIS3ObjectRequestSubclass *instance = [ASIS3ObjectRequestSubclass requestWithBucket:@"bucket" key:@"key"];
  494. BOOL success = [instance isKindOfClass:[ASIS3ObjectRequestSubclass class]];
  495. GHAssertTrue(success,@"Convenience constructor failed to return an instance of the correct class");
  496. instance = [ASIS3ObjectRequestSubclass PUTRequestForFile:@"/file" withBucket:@"bucket" key:@"key"];
  497. success = [instance isKindOfClass:[ASIS3ObjectRequestSubclass class]];
  498. GHAssertTrue(success,@"Convenience constructor failed to return an instance of the correct class");
  499. instance = [ASIS3ObjectRequestSubclass DELETERequestWithBucket:@"bucket" key:@"key"];
  500. success = [instance isKindOfClass:[ASIS3ObjectRequestSubclass class]];
  501. GHAssertTrue(success,@"Convenience constructor failed to return an instance of the correct class");
  502. instance = [ASIS3ObjectRequestSubclass COPYRequestFromBucket:@"bucket" key:@"key" toBucket:@"bucket" key:@"key2"];
  503. success = [instance isKindOfClass:[ASIS3ObjectRequestSubclass class]];
  504. GHAssertTrue(success,@"Convenience constructor failed to return an instance of the correct class");
  505. instance = [ASIS3ObjectRequestSubclass HEADRequestWithBucket:@"bucket" key:@"key"];
  506. success = [instance isKindOfClass:[ASIS3ObjectRequestSubclass class]];
  507. GHAssertTrue(success,@"Convenience constructor failed to return an instance of the correct class");
  508. ASIS3BucketRequestSubclass *instance2 = [ASIS3BucketRequestSubclass requestWithBucket:@"bucket"];
  509. success = [instance2 isKindOfClass:[ASIS3BucketRequestSubclass class]];
  510. GHAssertTrue(success,@"Convenience constructor failed to return an instance of the correct class");
  511. ASIS3BucketObjectSubclass *instance3 = [ASIS3BucketObjectSubclass objectWithBucket:@"bucket"];
  512. success = [instance3 isKindOfClass:[ASIS3BucketObjectSubclass class]];
  513. GHAssertTrue(success,@"Convenience constructor failed to return an instance of the correct class");
  514. }
  515. - (void)s3RequestFailed:(ASIHTTPRequest *)request
  516. {
  517. GHFail(@"Request failed - cannot continue with test");
  518. [[self networkQueue] cancelAllOperations];
  519. }
  520. - (void)s3QueueFinished:(ASINetworkQueue *)queue
  521. {
  522. // BOOL success = (progress == 1.0);
  523. // GHAssertTrue(success,@"Failed to update progress properly");
  524. }
  525. - (void)testQueueProgress
  526. {
  527. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com/i/logo.png"]];
  528. [request startSynchronous];
  529. NSData *data = [request responseData];
  530. [self createTestBucket];
  531. // Upload objects
  532. progress = 0;
  533. [[self networkQueue] cancelAllOperations];
  534. [self setNetworkQueue:[ASINetworkQueue queue]];
  535. [[self networkQueue] setDelegate:self];
  536. [[self networkQueue] setRequestDidFailSelector:@selector(s3RequestFailed:)];
  537. [[self networkQueue] setQueueDidFinishSelector:@selector(s3QueueFinished:)];
  538. [[self networkQueue] setUploadProgressDelegate:self];
  539. [[self networkQueue] setShowAccurateProgress:YES];
  540. [[self networkQueue] setMaxConcurrentOperationCount:1];
  541. int i;
  542. for (i=0; i<5; i++) {
  543. NSString *key = [NSString stringWithFormat:@"stuff/file%hi.txt",i+1];
  544. ASIS3ObjectRequest *s3Request = [ASIS3ObjectRequest PUTRequestForData:data withBucket:bucket key:key];
  545. [s3Request setSecretAccessKey:secretAccessKey];
  546. [s3Request setAccessKey:accessKey];
  547. [s3Request setTimeOutSeconds:20];
  548. [s3Request setNumberOfTimesToRetryOnTimeout:3];
  549. [s3Request setMimeType:@"image/png"];
  550. [[self networkQueue] addOperation:s3Request];
  551. }
  552. [[self networkQueue] go];
  553. [[self networkQueue] waitUntilAllOperationsAreFinished];
  554. // Download objects
  555. progress = 0;
  556. [[self networkQueue] cancelAllOperations];
  557. [self setNetworkQueue:[ASINetworkQueue queue]];
  558. [[self networkQueue] setDelegate:self];
  559. [[self networkQueue] setRequestDidFailSelector:@selector(s3RequestFailed:)];
  560. [[self networkQueue] setQueueDidFinishSelector:@selector(s3QueueFinished:)];
  561. [[self networkQueue] setDownloadProgressDelegate:self];
  562. [[self networkQueue] setShowAccurateProgress:YES];
  563. for (i=0; i<5; i++) {
  564. NSString *key = [NSString stringWithFormat:@"stuff/file%hi.txt",i+1];
  565. ASIS3ObjectRequest *s3Request = [ASIS3ObjectRequest requestWithBucket:bucket key:key];
  566. [s3Request setSecretAccessKey:secretAccessKey];
  567. [s3Request setAccessKey:accessKey];
  568. NSString *downloadPath = [[self filePathForTemporaryTestFiles] stringByAppendingPathComponent:[NSString stringWithFormat:@"%hi.jpg",i+1]];
  569. [s3Request setDownloadDestinationPath:downloadPath];
  570. [[self networkQueue] addOperation:s3Request];
  571. }
  572. [[self networkQueue] go];
  573. [[self networkQueue] waitUntilAllOperationsAreFinished];
  574. progress = 0;
  575. // Delete objects
  576. progress = 0;
  577. [[self networkQueue] cancelAllOperations];
  578. [self setNetworkQueue:[ASINetworkQueue queue]];
  579. [[self networkQueue] setDelegate:self];
  580. [[self networkQueue] setRequestDidFailSelector:@selector(s3RequestFailed:)];
  581. [[self networkQueue] setShowAccurateProgress:YES];
  582. for (i=0; i<5; i++) {
  583. NSString *key = [NSString stringWithFormat:@"stuff/file%hi.txt",i+1];
  584. ASIS3ObjectRequest *s3Request = [ASIS3ObjectRequest DELETERequestWithBucket:bucket key:key];
  585. [s3Request setSecretAccessKey:secretAccessKey];
  586. [s3Request setAccessKey:accessKey];
  587. [[self networkQueue] addOperation:s3Request];
  588. }
  589. [[self networkQueue] go];
  590. [[self networkQueue] waitUntilAllOperationsAreFinished];
  591. }
  592. // Will be called on Mac OS
  593. - (void)setDoubleValue:(double)newProgress;
  594. {
  595. progress = (float)newProgress;
  596. }
  597. - (void)setProgress:(float)newProgress;
  598. {
  599. progress = newProgress;
  600. }
  601. - (void)testCopy
  602. {
  603. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  604. ASIS3ObjectRequest *request = [ASIS3ObjectRequest requestWithBucket:@"foo" key:@"eep"];
  605. ASIS3ObjectRequest *request2 = [request copy];
  606. GHAssertNotNil(request2,@"Failed to create a copy");
  607. [pool release];
  608. BOOL success = ([request2 retainCount] > 0);
  609. GHAssertTrue(success,@"Failed to create a retained copy");
  610. success = ([request2 isKindOfClass:[ASIS3Request class]]);
  611. GHAssertTrue(success,@"Copy is of wrong class");
  612. [request2 release];
  613. pool = [[NSAutoreleasePool alloc] init];
  614. ASIS3BucketRequest *request3 = [ASIS3BucketRequest requestWithBucket:@"foo"];
  615. ASIS3BucketRequest *request4 = [request3 copy];
  616. GHAssertNotNil(request4,@"Failed to create a copy");
  617. [pool release];
  618. success = ([request4 retainCount] > 0);
  619. GHAssertTrue(success,@"Failed to create a retained copy");
  620. success = ([request4 isKindOfClass:[ASIS3BucketRequest class]]);
  621. GHAssertTrue(success,@"Copy is of wrong class");
  622. [request4 release];
  623. pool = [[NSAutoreleasePool alloc] init];
  624. ASIS3BucketObject *bucketObject = [ASIS3BucketObject objectWithBucket:@"foo"];
  625. ASIS3BucketObject *bucketObject2 = [bucketObject copy];
  626. GHAssertNotNil(bucketObject2,@"Failed to create a copy");
  627. [pool release];
  628. success = ([bucketObject2 retainCount] > 0);
  629. GHAssertTrue(success,@"Failed to create a retained copy");
  630. [bucketObject2 release];
  631. }
  632. - (void)testHTTPS
  633. {
  634. [ASIS3Request setSharedAccessKey:accessKey];
  635. [ASIS3Request setSharedSecretAccessKey:secretAccessKey];
  636. // Create a bucket
  637. ASIS3Request *request = [ASIS3BucketRequest PUTRequestWithBucket:bucket];
  638. [request setRequestScheme:ASIS3RequestSchemeHTTPS];
  639. [request startSynchronous];
  640. GHAssertNil([request error],@"Failed to create a bucket");
  641. // PUT something in it
  642. NSString *key = @"king";
  643. request = [ASIS3ObjectRequest PUTRequestForData:[@"fink" dataUsingEncoding:NSUTF8StringEncoding] withBucket:bucket key:key];
  644. [request setRequestScheme:ASIS3RequestSchemeHTTPS];
  645. [request startSynchronous];
  646. BOOL success = [[request responseString] isEqualToString:@""];
  647. GHAssertTrue(success,@"Failed to PUT some data into S3");
  648. // GET it
  649. request = [ASIS3ObjectRequest requestWithBucket:bucket key:key];
  650. [request setRequestScheme:ASIS3RequestSchemeHTTPS];
  651. [request startSynchronous];
  652. success = [[request responseString] isEqualToString:@"fink"];
  653. GHAssertTrue(success,@"Failed to GET the correct data from S3");
  654. // DELETE it
  655. request = [ASIS3ObjectRequest DELETERequestWithBucket:bucket key:@"king"];
  656. [request setRequestScheme:ASIS3RequestSchemeHTTPS];
  657. [request startSynchronous];
  658. success = [[request responseString] isEqualToString:@""];
  659. GHAssertTrue(success,@"Failed to DELETE the object from S3");
  660. // Delete the bucket
  661. request = [ASIS3BucketRequest DELETERequestWithBucket:bucket];
  662. [request setRequestScheme:ASIS3RequestSchemeHTTPS];
  663. [request startSynchronous];
  664. GHAssertNil([request error],@"Failed to delete a bucket");
  665. [ASIS3Request setSharedAccessKey:nil];
  666. [ASIS3Request setSharedSecretAccessKey:nil];
  667. }
  668. // Ideally this test would actually parse the ACL XML and check it, but for now it just makes sure S3 doesn't return an error
  669. - (void)testCannedACLs
  670. {
  671. [ASIS3Request setSharedAccessKey:accessKey];
  672. [ASIS3Request setSharedSecretAccessKey:secretAccessKey];
  673. // Create a bucket
  674. ASIS3Request *request = [ASIS3BucketRequest PUTRequestWithBucket:bucket];
  675. [request setRequestScheme:ASIS3RequestSchemeHTTPS];
  676. [request startSynchronous];
  677. GHAssertNil([request error],@"Failed to create a bucket");
  678. NSArray *ACLs = [NSArray arrayWithObjects:ASIS3AccessPolicyPrivate,ASIS3AccessPolicyPublicRead,ASIS3AccessPolicyPublicReadWrite,ASIS3AccessPolicyAuthenticatedRead,ASIS3AccessPolicyBucketOwnerRead,ASIS3AccessPolicyBucketOwnerFullControl,nil];
  679. for (NSString *cannedACL in ACLs) {
  680. // PUT object
  681. NSString *key = @"king";
  682. request = [ASIS3ObjectRequest PUTRequestForData:[@"fink" dataUsingEncoding:NSUTF8StringEncoding] withBucket:bucket key:key];
  683. [request setAccessPolicy:cannedACL];
  684. [request startSynchronous];
  685. GHAssertNil([request error],@"Failed to PUT some data into S3");
  686. // GET object ACL
  687. request = [ASIS3ObjectRequest requestWithBucket:bucket key:key subResource:@"acl"];
  688. [request startSynchronous];
  689. GHAssertNil([request error],@"Failed to fetch the object");
  690. }
  691. // DELETE it
  692. request = [ASIS3ObjectRequest DELETERequestWithBucket:bucket key:@"king"];
  693. [request setRequestScheme:ASIS3RequestSchemeHTTPS];
  694. [request startSynchronous];
  695. BOOL success = [[request responseString] isEqualToString:@""];
  696. GHAssertTrue(success,@"Failed to DELETE the object from S3");
  697. // Delete the bucket
  698. request = [ASIS3BucketRequest DELETERequestWithBucket:bucket];
  699. [request setRequestScheme:ASIS3RequestSchemeHTTPS];
  700. [request startSynchronous];
  701. GHAssertNil([request error],@"Failed to delete a bucket");
  702. [ASIS3Request setSharedAccessKey:nil];
  703. [ASIS3Request setSharedSecretAccessKey:nil];
  704. }
  705. @synthesize networkQueue;
  706. @end