FIRStorageMetadataTests.m 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. // Copyright 2017 Google
  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 <FirebaseStorage/FIRStorageMetadata.h>
  15. #import <XCTest/XCTest.h>
  16. #import "FIRStorageMetadata.h"
  17. #import "FIRStorageMetadata_Private.h"
  18. #import "FIRStorageUtils.h"
  19. @interface FIRStorageMetadataTests : XCTestCase
  20. @end
  21. @implementation FIRStorageMetadataTests
  22. - (void)testInitialzeNoMetadata {
  23. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:@{}];
  24. XCTAssertNotNil(metadata);
  25. }
  26. - (void)testInitialzeFullMetadata {
  27. NSDictionary *metaDict = @{
  28. kFIRStorageMetadataBucket : @"bucket",
  29. kFIRStorageMetadataCacheControl : @"max-age=3600, no-cache",
  30. kFIRStorageMetadataContentDisposition : @"inline",
  31. kFIRStorageMetadataContentEncoding : @"gzip",
  32. kFIRStorageMetadataContentLanguage : @"en-us",
  33. kFIRStorageMetadataContentType : @"application/octet-stream",
  34. kFIRStorageMetadataCustomMetadata : @{@"foo" : @{@"bar" : @"baz"}},
  35. kFIRStorageMetadataDownloadTokens : @"1234567890",
  36. kFIRStorageMetadataGeneration : @"12345",
  37. kFIRStorageMetadataMetageneration : @"67890",
  38. kFIRStorageMetadataName : @"path/to/object",
  39. kFIRStorageMetadataTimeCreated : @"1992-08-07T17:22:53.108Z",
  40. kFIRStorageMetadataUpdated : @"2016-03-01T20:16:01.673Z",
  41. kFIRStorageMetadataMd5Hash : @"d41d8cd98f00b204e9800998ecf8427e",
  42. kFIRStorageMetadataSize : @1337
  43. };
  44. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  45. XCTAssertNotNil(metadata);
  46. XCTAssertEqualObjects(metadata.bucket, metaDict[kFIRStorageMetadataBucket]);
  47. XCTAssertEqualObjects(metadata.cacheControl, metaDict[kFIRStorageMetadataCacheControl]);
  48. XCTAssertEqualObjects(metadata.contentDisposition,
  49. metaDict[kFIRStorageMetadataContentDisposition]);
  50. XCTAssertEqualObjects(metadata.contentEncoding, metaDict[kFIRStorageMetadataContentEncoding], );
  51. XCTAssertEqualObjects(metadata.contentType, metaDict[kFIRStorageMetadataContentType]);
  52. XCTAssertEqualObjects(metadata.customMetadata, metaDict[kFIRStorageMetadataCustomMetadata]);
  53. XCTAssertEqualObjects(metadata.md5Hash, metaDict[kFIRStorageMetadataMd5Hash]);
  54. NSString *URLFormat = @"https://firebasestorage.googleapis.com/v0/b/%@/o/%@?alt=media&token=%@";
  55. NSString *URLString = [NSString
  56. stringWithFormat:URLFormat, metaDict[kFIRStorageMetadataBucket],
  57. [FIRStorageUtils GCSEscapedString:metaDict[kFIRStorageMetadataName]],
  58. metaDict[kFIRStorageMetadataDownloadTokens]];
  59. XCTAssertEqualObjects([metadata.downloadURL description], URLString);
  60. NSString *generation = [NSString stringWithFormat:@"%lld", metadata.generation];
  61. XCTAssertEqualObjects(generation, metaDict[kFIRStorageMetadataGeneration]);
  62. NSString *metageneration = [NSString stringWithFormat:@"%lld", metadata.metageneration];
  63. XCTAssertEqualObjects(metageneration, metaDict[kFIRStorageMetadataMetageneration]);
  64. XCTAssertEqualObjects(metadata.path, metaDict[kFIRStorageMetadataName]);
  65. XCTAssertEqualObjects([metadata RFC3339StringFromDate:metadata.timeCreated],
  66. metaDict[kFIRStorageMetadataTimeCreated]);
  67. XCTAssertEqualObjects([metadata RFC3339StringFromDate:metadata.updated],
  68. metaDict[kFIRStorageMetadataUpdated]);
  69. NSNumber *size = [NSNumber numberWithLongLong:metadata.size];
  70. XCTAssertEqualObjects(size, metaDict[kFIRStorageMetadataSize]);
  71. }
  72. - (void)testDictionaryRepresentation {
  73. NSDictionary *metaDict = @{
  74. kFIRStorageMetadataBucket : @"bucket",
  75. kFIRStorageMetadataCacheControl : @"max-age=3600, no-cache",
  76. kFIRStorageMetadataContentDisposition : @"inline",
  77. kFIRStorageMetadataContentEncoding : @"gzip",
  78. kFIRStorageMetadataContentLanguage : @"en-us",
  79. kFIRStorageMetadataContentType : @"application/octet-stream",
  80. kFIRStorageMetadataCustomMetadata : @{@"foo" : @{@"bar" : @"baz"}},
  81. kFIRStorageMetadataDownloadTokens : @"1234567890",
  82. kFIRStorageMetadataGeneration : @"12345",
  83. kFIRStorageMetadataMetageneration : @"67890",
  84. kFIRStorageMetadataName : @"path/to/object",
  85. kFIRStorageMetadataTimeCreated : @"1992-08-07T17:22:53.108Z",
  86. kFIRStorageMetadataUpdated : @"2016-03-01T20:16:01.673Z",
  87. kFIRStorageMetadataMd5Hash : @"d41d8cd98f00b204e9800998ecf8427e",
  88. kFIRStorageMetadataSize : @1337
  89. };
  90. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  91. NSDictionary *dictRepresentation = [metadata dictionaryRepresentation];
  92. XCTAssertNotEqual(dictRepresentation, nil);
  93. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataBucket],
  94. metaDict[kFIRStorageMetadataBucket]);
  95. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataCacheControl],
  96. metaDict[kFIRStorageMetadataCacheControl]);
  97. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataContentDisposition],
  98. metaDict[kFIRStorageMetadataContentDisposition]);
  99. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataContentEncoding],
  100. metaDict[kFIRStorageMetadataContentEncoding]);
  101. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataContentLanguage],
  102. metaDict[kFIRStorageMetadataContentLanguage]);
  103. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataContentType],
  104. metaDict[kFIRStorageMetadataContentType]);
  105. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataCustomMetadata],
  106. metaDict[kFIRStorageMetadataCustomMetadata]);
  107. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataDownloadTokens],
  108. metaDict[kFIRStorageMetadataDownloadTokens]);
  109. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataGeneration],
  110. metaDict[kFIRStorageMetadataGeneration]);
  111. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataMetageneration],
  112. metaDict[kFIRStorageMetadataMetageneration]);
  113. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataName],
  114. metaDict[kFIRStorageMetadataName]);
  115. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataTimeCreated],
  116. metaDict[kFIRStorageMetadataTimeCreated]);
  117. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataUpdated],
  118. metaDict[kFIRStorageMetadataUpdated]);
  119. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataSize],
  120. metaDict[kFIRStorageMetadataSize]);
  121. XCTAssertEqualObjects(dictRepresentation[kFIRStorageMetadataMd5Hash],
  122. metaDict[kFIRStorageMetadataMd5Hash]);
  123. }
  124. - (void)testInitialzeNoDownloadTokensGetToken {
  125. NSDictionary *metaDict = @{
  126. kFIRStorageMetadataBucket : @"bucket",
  127. kFIRStorageMetadataName : @"path/to/object",
  128. };
  129. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  130. XCTAssertNotNil(metadata);
  131. XCTAssertEqual(metadata.downloadURL, nil);
  132. XCTAssertEqual(metadata.downloadURLs, nil);
  133. }
  134. - (void)testInitialzeMultipleDownloadTokensGetToken {
  135. NSDictionary *metaDict = @{
  136. kFIRStorageMetadataBucket : @"bucket",
  137. kFIRStorageMetadataDownloadTokens : @"12345,67890",
  138. kFIRStorageMetadataName : @"path/to/object",
  139. };
  140. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  141. XCTAssertNotNil(metadata);
  142. NSString *URLformat = @"https://firebasestorage.googleapis.com/v0/b/%@/o/%@?alt=media&token=%@";
  143. NSString *URLString0 = [NSString
  144. stringWithFormat:URLformat, metaDict[kFIRStorageMetadataBucket],
  145. [FIRStorageUtils GCSEscapedString:metaDict[kFIRStorageMetadataName]],
  146. @"12345"];
  147. NSString *URLString1 = [NSString
  148. stringWithFormat:URLformat, metaDict[kFIRStorageMetadataBucket],
  149. [FIRStorageUtils GCSEscapedString:metaDict[kFIRStorageMetadataName]],
  150. @"67890"];
  151. XCTAssertEqualObjects([metadata.downloadURL absoluteString], URLString0);
  152. XCTAssertEqualObjects([metadata.downloadURLs[0] absoluteString], URLString0);
  153. XCTAssertEqualObjects([metadata.downloadURLs[1] absoluteString], URLString1);
  154. }
  155. - (void)testMultipleDownloadURLsGetToken {
  156. NSDictionary *metaDict = @{
  157. kFIRStorageMetadataBucket : @"bucket",
  158. kFIRStorageMetadataName : @"path/to/object",
  159. };
  160. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  161. NSString *URLformat = @"https://firebasestorage.googleapis.com/v0/b/%@/o/%@?alt=media&token=%@";
  162. NSString *URLString0 = [NSString
  163. stringWithFormat:URLformat, metaDict[kFIRStorageMetadataBucket],
  164. [FIRStorageUtils GCSEscapedString:metaDict[kFIRStorageMetadataName]],
  165. @"12345"];
  166. NSString *URLString1 = [NSString
  167. stringWithFormat:URLformat, metaDict[kFIRStorageMetadataBucket],
  168. [FIRStorageUtils GCSEscapedString:metaDict[kFIRStorageMetadataName]],
  169. @"67890"];
  170. NSURL *URL0 = [NSURL URLWithString:URLString0];
  171. NSURL *URL1 = [NSURL URLWithString:URLString1];
  172. NSArray *downloadURLs = @[ URL0, URL1 ];
  173. [metadata setValue:downloadURLs forKey:@"downloadURLs"];
  174. NSDictionary *newMetaDict = metadata.dictionaryRepresentation;
  175. XCTAssertEqualObjects(newMetaDict[kFIRStorageMetadataDownloadTokens], @"12345,67890");
  176. }
  177. - (void)testInitialzeMetadataWithFile {
  178. NSDictionary *metaDict = @{
  179. kFIRStorageMetadataBucket : @"bucket",
  180. kFIRStorageMetadataName : @"path/to/file",
  181. };
  182. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  183. [metadata setType:FIRStorageMetadataTypeFile];
  184. XCTAssertEqual(metadata.isFile, YES);
  185. XCTAssertEqual(metadata.isFolder, NO);
  186. }
  187. - (void)testInitialzeMetadataWithFolder {
  188. NSDictionary *metaDict = @{
  189. kFIRStorageMetadataBucket : @"bucket",
  190. kFIRStorageMetadataName : @"path/to/folder/",
  191. };
  192. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  193. [metadata setType:FIRStorageMetadataTypeFolder];
  194. XCTAssertEqual(metadata.isFolder, YES);
  195. XCTAssertEqual(metadata.isFile, NO);
  196. }
  197. - (void)testReflexiveMetadataEquality {
  198. NSDictionary *metaDict = @{
  199. kFIRStorageMetadataBucket : @"bucket",
  200. kFIRStorageMetadataName : @"path/to/object",
  201. };
  202. FIRStorageMetadata *metadata0 = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  203. FIRStorageMetadata *metadata1 = metadata0;
  204. XCTAssertEqual(metadata0, metadata1);
  205. XCTAssertEqualObjects(metadata0, metadata1);
  206. }
  207. - (void)testNonsenseMetadataEquality {
  208. NSDictionary *metaDict = @{
  209. kFIRStorageMetadataBucket : @"bucket",
  210. kFIRStorageMetadataName : @"path/to/object",
  211. };
  212. FIRStorageMetadata *metadata0 = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  213. XCTAssertNotEqualObjects(metadata0, @"I'm not object metadata!");
  214. }
  215. - (void)testMetadataEquality {
  216. NSDictionary *metaDict = @{
  217. kFIRStorageMetadataBucket : @"bucket",
  218. kFIRStorageMetadataName : @"path/to/object",
  219. kFIRStorageMetadataMd5Hash : @"d41d8cd98f00b204e9800998ecf8427e",
  220. };
  221. FIRStorageMetadata *metadata0 = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  222. FIRStorageMetadata *metadata1 = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  223. XCTAssertNotEqual(metadata0, metadata1);
  224. XCTAssertEqualObjects(metadata0, metadata1);
  225. }
  226. - (void)testMetadataMd5Inequality {
  227. NSDictionary *firstDict = @{
  228. kFIRStorageMetadataMd5Hash : @"d41d8cd98f00b204e9800998ecf8427e",
  229. };
  230. NSDictionary *secondDict = @{
  231. kFIRStorageMetadataMd5Hash : @"foo",
  232. };
  233. FIRStorageMetadata *firstMetadata = [[FIRStorageMetadata alloc] initWithDictionary:firstDict];
  234. FIRStorageMetadata *secondMetadata = [[FIRStorageMetadata alloc] initWithDictionary:secondDict];
  235. XCTAssertNotEqualObjects(firstMetadata, secondMetadata);
  236. }
  237. - (void)testMetadataCopy {
  238. NSDictionary *metaDict = @{
  239. kFIRStorageMetadataBucket : @"bucket",
  240. kFIRStorageMetadataName : @"path/to/object",
  241. kFIRStorageMetadataMd5Hash : @"d41d8cd98f00b204e9800998ecf8427e",
  242. };
  243. FIRStorageMetadata *metadata0 = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  244. FIRStorageMetadata *metadata1 = [metadata0 copy];
  245. XCTAssertNotEqual(metadata0, metadata1);
  246. XCTAssertEqualObjects(metadata0, metadata1);
  247. }
  248. - (void)testUpdatedMetadata {
  249. NSDictionary *oldMetadata = @{
  250. kFIRStorageMetadataContentLanguage : @"old",
  251. kFIRStorageMetadataCustomMetadata : @{@"foo" : @"old", @"bar" : @"old"}
  252. };
  253. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:oldMetadata];
  254. metadata.contentLanguage = @"new";
  255. metadata.customMetadata = @{@"foo" : @"new", @"bar" : @"old"};
  256. NSDictionary *update = [metadata updatedMetadata];
  257. NSDictionary *expectedUpdate = @{
  258. kFIRStorageMetadataContentLanguage : @"new",
  259. kFIRStorageMetadataCustomMetadata : @{@"foo" : @"new"}
  260. };
  261. XCTAssertEqualObjects(update, expectedUpdate);
  262. }
  263. - (void)testUpdatedMetadataWithEmptyUpdate {
  264. NSDictionary *oldMetadata = @{
  265. kFIRStorageMetadataContentLanguage : @"old",
  266. kFIRStorageMetadataCustomMetadata : @{@"foo" : @"old", @"bar" : @"old"}
  267. };
  268. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:oldMetadata];
  269. NSDictionary *update = [metadata updatedMetadata];
  270. NSDictionary *expectedUpdate = @{ kFIRStorageMetadataCustomMetadata : @{} };
  271. XCTAssertEqualObjects(update, expectedUpdate);
  272. }
  273. - (void)testUpdatedMetadataWithDelete {
  274. NSDictionary *oldMetadata = @{
  275. kFIRStorageMetadataContentLanguage : @"old",
  276. kFIRStorageMetadataCustomMetadata : @{@"foo" : @"old", @"bar" : @"old"}
  277. };
  278. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:oldMetadata];
  279. metadata.contentLanguage = nil;
  280. metadata.customMetadata = @{@"foo" : @"old"};
  281. NSDictionary *update = [metadata updatedMetadata];
  282. NSDictionary *expectedUpdate = @{
  283. kFIRStorageMetadataContentLanguage : [NSNull null],
  284. kFIRStorageMetadataCustomMetadata : @{@"bar" : [NSNull null]}
  285. };
  286. XCTAssertEqualObjects(update, expectedUpdate);
  287. }
  288. - (void)testMetadataHashEquality {
  289. NSDictionary *metaDict = @{
  290. kFIRStorageMetadataBucket : @"bucket",
  291. kFIRStorageMetadataName : @"path/to/object",
  292. };
  293. FIRStorageMetadata *metadata0 = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  294. FIRStorageMetadata *metadata1 = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  295. XCTAssertNotEqual(metadata0, metadata1);
  296. XCTAssertEqual([metadata0 hash], [metadata1 hash]);
  297. }
  298. - (void)testZuluTimeOffset {
  299. NSDictionary *metaDict = @{kFIRStorageMetadataTimeCreated : @"1992-08-07T17:22:53.108Z"};
  300. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  301. XCTAssertNotNil(metadata.timeCreated);
  302. }
  303. - (void)testZuluZeroTimeOffset {
  304. NSDictionary *metaDict = @{kFIRStorageMetadataTimeCreated : @"1992-08-07T17:22:53.108+0000"};
  305. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  306. XCTAssertNotNil(metadata.timeCreated);
  307. }
  308. - (void)testGoogleStandardTimeOffset {
  309. NSDictionary *metaDict = @{kFIRStorageMetadataTimeCreated : @"1992-08-07T17:22:53.108-0700"};
  310. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  311. XCTAssertNotNil(metadata.timeCreated);
  312. }
  313. - (void)testUnspecifiedTimeOffset {
  314. NSDictionary *metaDict = @{kFIRStorageMetadataTimeCreated : @"1992-08-07T17:22:53.108-0000"};
  315. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  316. XCTAssertNotNil(metadata.timeCreated);
  317. }
  318. - (void)testNoTimeOffset {
  319. NSDictionary *metaDict = @{kFIRStorageMetadataTimeCreated : @"1992-08-07T17:22:53.108"};
  320. FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:metaDict];
  321. XCTAssertNil(metadata.timeCreated);
  322. }
  323. @end