FIRCLSReportUploaderTests.m 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. // Copyright 2019 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 <XCTest/XCTest.h>
  15. #import "FIRCLSReportUploader_Private.h"
  16. #import "FABMockApplicationIdentifierModel.h"
  17. #import "FIRCLSApplication.h"
  18. #include "FIRCLSConstants.h"
  19. #include "FIRCLSDataCollectionToken.h"
  20. #include "FIRCLSDefines.h"
  21. #include "FIRCLSFileManager.h"
  22. #include "FIRCLSInternalReport.h"
  23. #include "FIRCLSMockNetworkClient.h"
  24. #include "FIRCLSMockSettings.h"
  25. #include "FIRCLSSettings.h"
  26. #include "FIRCLSTempMockFileManager.h"
  27. #include "FIRMockGDTCoreTransport.h"
  28. NSString *const TestEndpoint = @"https://reports.crashlytics.com";
  29. @interface FIRCLSReportUploaderTests
  30. : XCTestCase <FIRCLSReportUploaderDelegate, FIRCLSReportUploaderDataSource>
  31. @property(nonatomic, strong) FIRCLSReportUploader *uploader;
  32. @property(nonatomic, strong) FIRCLSTempMockFileManager *fileManager;
  33. @property(nonatomic, strong) NSOperationQueue *queue;
  34. @property(nonatomic, strong) FIRCLSMockNetworkClient *networkClient;
  35. // Add mock prefix to names as there are naming conflicts with FIRCLSReportUploaderDelegate
  36. @property(nonatomic, strong) FIRMockGDTCORTransport *mockDataTransport;
  37. @property(nonatomic, strong) FIRCLSMockSettings *mockSettings;
  38. @end
  39. @implementation FIRCLSReportUploaderTests
  40. - (void)setUp {
  41. [super setUp];
  42. FABMockApplicationIdentifierModel *appIDModel = [[FABMockApplicationIdentifierModel alloc] init];
  43. self.queue = [NSOperationQueue new];
  44. self.mockSettings = [[FIRCLSMockSettings alloc] initWithFileManager:self.fileManager
  45. appIDModel:appIDModel];
  46. self.mockSettings.fetchedBundleID = self.bundleIdentifier;
  47. self.networkClient = [[FIRCLSMockNetworkClient alloc] initWithQueue:self.queue
  48. fileManager:self.fileManager
  49. delegate:nil];
  50. self.fileManager = [[FIRCLSTempMockFileManager alloc] init];
  51. self.uploader = [[FIRCLSReportUploader alloc] initWithQueue:self.queue
  52. delegate:self
  53. dataSource:self
  54. client:self.networkClient
  55. fileManager:self.fileManager
  56. analytics:nil];
  57. self.mockDataTransport = [[FIRMockGDTCORTransport alloc] initWithMappingID:@"mappingID"
  58. transformers:nil
  59. target:1206];
  60. }
  61. - (void)tearDown {
  62. self.uploader = nil;
  63. [super tearDown];
  64. }
  65. #pragma mark - Tests
  66. - (void)testURLGeneration {
  67. NSString *urlString =
  68. [NSString stringWithFormat:@"%@/sdk-api/v1/platforms/%@/apps/%@/reports", TestEndpoint,
  69. FIRCLSApplicationGetPlatform(), self.bundleIdentifier];
  70. NSURL *url = [NSURL URLWithString:urlString];
  71. XCTAssertEqualObjects([self.uploader reportURL], url);
  72. }
  73. - (void)testPrepareReport {
  74. NSString *path = [self.fileManager.activePath stringByAppendingPathComponent:@"pkg_uuid"];
  75. FIRCLSInternalReport *report = [[FIRCLSInternalReport alloc] initWithPath:path];
  76. self.mockSettings.orgID = @"orgID";
  77. self.mockSettings.shouldUseNewReportEndpoint = YES;
  78. self.fileManager.moveItemAtPathResult = [NSNumber numberWithInt:1];
  79. [self.uploader prepareAndSubmitReport:report
  80. dataCollectionToken:FIRCLSDataCollectionToken.validToken
  81. asUrgent:YES
  82. withProcessing:YES];
  83. // Verify with the last move operation is from processing -> prepared
  84. XCTAssertTrue(
  85. [self.fileManager.moveItemAtPath_destDir containsString:self.fileManager.preparedPath]);
  86. }
  87. - (void)testPrepareLegacyReport {
  88. NSString *path = [self.fileManager.activePath stringByAppendingPathComponent:@"pkg_uuid"];
  89. FIRCLSInternalReport *report = [[FIRCLSInternalReport alloc] initWithPath:path];
  90. self.mockSettings.orgID = @"orgID";
  91. self.mockSettings.shouldUseNewReportEndpoint = NO;
  92. self.fileManager.moveItemAtPathResult = [NSNumber numberWithInt:1];
  93. [self.uploader prepareAndSubmitReport:report
  94. dataCollectionToken:FIRCLSDataCollectionToken.validToken
  95. asUrgent:YES
  96. withProcessing:YES];
  97. // Verify with the last move operation is from active -> processing for the legacy workflow
  98. // FIRCLSPackageReportOperation will then move the report from processing -> prepared-legacy
  99. XCTAssertTrue(
  100. [self.fileManager.moveItemAtPath_destDir containsString:self.fileManager.processingPath]);
  101. }
  102. - (void)testUploadPackagedReportWithPath {
  103. [self runUploadPackagedReportWithUrgency:NO];
  104. }
  105. - (void)testUploadPackagedReportWithLegacyPath {
  106. [self runUploadPackagedReportLegacyWithUrgency:NO];
  107. }
  108. - (void)testUrgentUploadPackagedReportWithPath {
  109. [self runUploadPackagedReportWithUrgency:YES];
  110. }
  111. - (void)testUrgentUploadPackagedReportWithLegacyPath {
  112. [self runUploadPackagedReportLegacyWithUrgency:YES];
  113. }
  114. - (void)testUploadPackagedReportWithMismatchPathAndSettings {
  115. [self setUpForLegacyUpload];
  116. BOOL success = [self.uploader uploadPackagedReportAtPath:[self packagePath]
  117. dataCollectionToken:FIRCLSDataCollectionToken.validToken
  118. asUrgent:NO];
  119. XCTAssertFalse(success);
  120. XCTAssertNil(self.mockDataTransport.sendDataEvent_event);
  121. XCTAssertNil(self.networkClient.startUploadRequest);
  122. }
  123. - (void)testUploadPackagedReportWithoutDataCollectionToken {
  124. [self setUpForUpload];
  125. BOOL success = [self.uploader uploadPackagedReportAtPath:[self packagePath]
  126. dataCollectionToken:nil
  127. asUrgent:NO];
  128. XCTAssertFalse(success);
  129. XCTAssertNil(self.mockDataTransport.sendDataEvent_event);
  130. XCTAssertNil(self.networkClient.startUploadRequest);
  131. }
  132. - (void)testUploadPackagedReportNotGDTWritten {
  133. [self setUpForUpload];
  134. self.mockDataTransport.sendDataEvent_wasWritten = NO;
  135. [self.uploader uploadPackagedReportAtPath:[self packagePath] dataCollectionToken:nil asUrgent:NO];
  136. // Did not delete report
  137. XCTAssertNil(self.fileManager.removedItemAtPath_path);
  138. }
  139. - (void)testUploadPackagedReportGDTError {
  140. [self setUpForUpload];
  141. self.mockDataTransport.sendDataEvent_error = [[NSError alloc] initWithDomain:@"domain"
  142. code:1
  143. userInfo:nil];
  144. [self.uploader uploadPackagedReportAtPath:[self packagePath] dataCollectionToken:nil asUrgent:NO];
  145. // Did not delete report
  146. XCTAssertNil(self.fileManager.removedItemAtPath_path);
  147. }
  148. #pragma mark - Helper functions
  149. - (NSString *)packagePath {
  150. return [self.fileManager.preparedPath stringByAppendingPathComponent:@"pkg_uuid"];
  151. }
  152. - (void)runUploadPackagedReportWithUrgency:(BOOL)urgent {
  153. [self setUpForUpload];
  154. BOOL success = [self.uploader uploadPackagedReportAtPath:[self packagePath]
  155. dataCollectionToken:FIRCLSDataCollectionToken.validToken
  156. asUrgent:urgent];
  157. XCTAssertTrue(success);
  158. XCTAssertNotNil(self.mockDataTransport.sendDataEvent_event);
  159. XCTAssertNil(self.networkClient.startUploadRequest);
  160. XCTAssertEqualObjects(self.fileManager.removedItemAtPath_path, [self packagePath]);
  161. }
  162. - (void)runUploadPackagedReportLegacyWithUrgency:(BOOL)urgent {
  163. NSString *packagePath =
  164. [self.fileManager.legacyPreparedPath stringByAppendingPathComponent:@"pkg_uuid"];
  165. [self setUpForLegacyUpload];
  166. BOOL success = [self.uploader uploadPackagedReportAtPath:packagePath
  167. dataCollectionToken:FIRCLSDataCollectionToken.validToken
  168. asUrgent:urgent];
  169. XCTAssertTrue(success);
  170. XCTAssertNil(self.mockDataTransport.sendDataEvent_event);
  171. XCTAssertNotNil(self.networkClient.startUploadRequest);
  172. }
  173. - (void)setUpForUpload {
  174. self.mockSettings.shouldUseNewReportEndpoint = YES;
  175. self.mockDataTransport.sendDataEvent_wasWritten = YES;
  176. }
  177. - (void)setUpForLegacyUpload {
  178. self.mockSettings.shouldUseNewReportEndpoint = NO;
  179. self.mockDataTransport.sendDataEvent_wasWritten = YES;
  180. self.fileManager.fileSizeAtPathResult = [NSNumber numberWithInt:1];
  181. }
  182. #pragma mark - FIRCLSReportUploaderDelegate
  183. - (void)didCompletePackageSubmission:(NSString *)path
  184. dataCollectionToken:(FIRCLSDataCollectionToken *)token
  185. error:(NSError *)error {
  186. }
  187. #pragma mark - FIRCLSReportUploaderDataSource
  188. - (NSString *)bundleIdentifier {
  189. return @"com.test.TestApp";
  190. }
  191. - (NSString *)googleAppID {
  192. return @"someGoogleAppId";
  193. }
  194. - (GDTCORTransport *)googleTransport {
  195. return self.mockDataTransport;
  196. }
  197. - (FIRCLSSettings *)settings {
  198. return self.mockSettings;
  199. }
  200. - (void)didCompleteAllSubmissions {
  201. }
  202. @end