GDTCORUploadPackageTest.m 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * Copyright 2019 Google
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #import "GDTCORTests/Unit/GDTCORTestCase.h"
  17. #import <GoogleDataTransport/GDTCORClock.h>
  18. #import <GoogleDataTransport/GDTCORRegistrar.h>
  19. #import <GoogleDataTransport/GDTCORUploadPackage.h>
  20. #import "GDTCORLibrary/Private/GDTCORUploadPackage_Private.h"
  21. #import "GDTCORTests/Unit/Helpers/GDTCOREventGenerator.h"
  22. #import "GDTCORTests/Unit/Helpers/GDTCORTestPrioritizer.h"
  23. #import "GDTCORTests/Unit/Helpers/GDTCORTestUploadPackage.h"
  24. #import "GDTCORTests/Unit/Helpers/GDTCORTestUploader.h"
  25. @interface GDTCORUploadPackageTest : GDTCORTestCase <NSSecureCoding, GDTCORUploadPackageProtocol>
  26. /** If YES, -packageDelivered:successful was called. */
  27. @property(nonatomic) BOOL packageDeliveredCalledSuccessful;
  28. /** If YES, -packageDeliveryFailed: was called. */
  29. @property(nonatomic) BOOL packageDeliveredCalledFailed;
  30. /** If YES, -packageExpired: was called. */
  31. @property(nonatomic) BOOL packageExpiredCalled;
  32. @end
  33. @implementation GDTCORUploadPackageTest
  34. - (void)setUp {
  35. [super setUp];
  36. _packageExpiredCalled = NO;
  37. _packageDeliveredCalledFailed = NO;
  38. _packageDeliveredCalledSuccessful = NO;
  39. }
  40. - (void)packageDelivered:(GDTCORUploadPackage *)package successful:(BOOL)successful {
  41. if (successful) {
  42. self.packageDeliveredCalledSuccessful = YES;
  43. } else {
  44. self.packageDeliveredCalledFailed = YES;
  45. }
  46. }
  47. - (void)packageExpired:(GDTCORUploadPackage *)package {
  48. self.packageExpiredCalled = YES;
  49. }
  50. + (BOOL)supportsSecureCoding {
  51. return YES;
  52. }
  53. - (void)encodeWithCoder:(nonnull NSCoder *)aCoder {
  54. }
  55. - (nullable instancetype)initWithCoder:(nonnull NSCoder *)aDecoder {
  56. return [[[self class] alloc] init];
  57. }
  58. /** Tests the default initializer. */
  59. - (void)testInit {
  60. XCTAssertNotNil([[GDTCORUploadPackage alloc] initWithTarget:kGDTCORTargetTest]);
  61. }
  62. /** Tests copying indicates that the underlying sets of events can't be changed from underneath. */
  63. - (void)testRegisterUpload {
  64. GDTCORUploadPackage *uploadPackage =
  65. [[GDTCORUploadPackage alloc] initWithTarget:kGDTCORTargetTest];
  66. GDTCORUploadPackage *uploadPackageCopy = [uploadPackage copy];
  67. XCTAssertNotEqual(uploadPackage, uploadPackageCopy);
  68. XCTAssertEqualObjects(uploadPackage.events, uploadPackageCopy.events);
  69. XCTAssertEqualObjects(uploadPackage, uploadPackageCopy);
  70. uploadPackage.events = [NSSet set];
  71. uploadPackageCopy = [uploadPackage copy];
  72. XCTAssertNotEqual(uploadPackage, uploadPackageCopy);
  73. XCTAssertEqualObjects(uploadPackage.events, uploadPackageCopy.events);
  74. XCTAssertEqualObjects(uploadPackage, uploadPackageCopy);
  75. NSMutableSet<GDTCORStoredEvent *> *set = [GDTCOREventGenerator generate3StoredEvents];
  76. uploadPackage.events = set;
  77. uploadPackageCopy = [uploadPackage copy];
  78. XCTAssertNotEqual(uploadPackage, uploadPackageCopy);
  79. GDTCORStoredEvent *newEvent = [[GDTCOREventGenerator generate3StoredEvents] anyObject];
  80. [set addObject:newEvent];
  81. XCTAssertFalse([uploadPackageCopy.events containsObject:newEvent]);
  82. XCTAssertNotEqualObjects(uploadPackage.events, uploadPackageCopy.events);
  83. XCTAssertNotEqualObjects(uploadPackage, uploadPackageCopy);
  84. [set removeObject:newEvent];
  85. XCTAssertEqualObjects(uploadPackage.events, uploadPackageCopy.events);
  86. XCTAssertEqualObjects(uploadPackage, uploadPackageCopy);
  87. }
  88. - (void)testEncoding {
  89. GDTCORUploadPackage *uploadPackage =
  90. [[GDTCORUploadPackage alloc] initWithTarget:kGDTCORTargetTest];
  91. NSMutableSet<GDTCORStoredEvent *> *set = [GDTCOREventGenerator generate3StoredEvents];
  92. uploadPackage.events = set;
  93. uploadPackage.handler = self;
  94. GDTCORUploadPackage *recreatedPackage;
  95. NSError *error;
  96. if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
  97. NSData *packageData = [NSKeyedArchiver archivedDataWithRootObject:uploadPackage
  98. requiringSecureCoding:YES
  99. error:&error];
  100. recreatedPackage = [NSKeyedUnarchiver unarchivedObjectOfClass:[GDTCORUploadPackage class]
  101. fromData:packageData
  102. error:&error];
  103. XCTAssertNil(error);
  104. } else {
  105. #if !TARGET_OS_MACCATALYST
  106. NSData *packageData = [NSKeyedArchiver archivedDataWithRootObject:uploadPackage];
  107. recreatedPackage = [NSKeyedUnarchiver unarchiveObjectWithData:packageData];
  108. #endif
  109. }
  110. XCTAssertEqualObjects(uploadPackage, recreatedPackage);
  111. }
  112. - (void)testExpiration {
  113. XCTAssertFalse(self.packageExpiredCalled);
  114. GDTCORUploadPackage *uploadPackage =
  115. [[GDTCORUploadPackage alloc] initWithTarget:kGDTCORTargetTest];
  116. uploadPackage.deliverByTime = [GDTCORClock clockSnapshotInTheFuture:1000];
  117. uploadPackage.handler = self;
  118. NSPredicate *pred =
  119. [NSPredicate predicateWithBlock:^BOOL(id _Nullable evaluatedObject,
  120. NSDictionary<NSString *, id> *_Nullable bindings) {
  121. return self.packageExpiredCalled;
  122. }];
  123. XCTestExpectation *expectation = [self expectationForPredicate:pred
  124. evaluatedWithObject:self
  125. handler:nil];
  126. [self waitForExpectations:@[ expectation ] timeout:30];
  127. }
  128. @end