diff --git a/CHANGELOG.md b/CHANGELOG.md index f2b91586..d639ebeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Unreleased - Fix `EXC_BAD_ACCESS` crash in `GDTCORLogAssert` when a user's project path contains `%` characters. ([#16455](https://github.com/firebase/firebase-ios-sdk/issues/16455)) +- Fix test flakiness in `GDTCCTIntegrationTest` and `GDTCCTUploaderTest` related to background task cancellation. - Cancel upload operation when background task expires. - Log error when handling directory enumeration. diff --git a/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploadOperation.m b/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploadOperation.m index 0b85840a..90991970 100644 --- a/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploadOperation.m +++ b/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploadOperation.m @@ -630,6 +630,10 @@ - (void)finishOperation { } - (void)start { + if (self.isCancelled) { + [self finishOperation]; + return; + } [self startOperation]; GDTCORLogDebug(@"Upload operation started: %@", self); diff --git a/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploader.m b/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploader.m index c436ed31..1c778908 100644 --- a/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploader.m +++ b/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploader.m @@ -28,7 +28,9 @@ @interface GDTCCTUploader () +#if !GDT_TEST @property(nonatomic, readonly) NSOperationQueue *uploadOperationQueue; +#endif @property(nonatomic, readonly) dispatch_queue_t uploadQueue; @property(nonatomic, readonly) diff --git a/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploader.h b/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploader.h index 36934c68..ca7a414b 100644 --- a/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploader.h +++ b/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploader.h @@ -33,6 +33,9 @@ NS_ASSUME_NONNULL_BEGIN /** An upload URL used across all targets. For testing only. */ @property(class, nullable, nonatomic) NSURL *testServerURL; +/** The queue on which upload operations run. For testing only. */ +@property(nonatomic, readonly) NSOperationQueue *uploadOperationQueue; + /** Spins runloop until upload finishes or timeout. * @return YES if upload finishes, NO in the case of timeout. */ diff --git a/GoogleDataTransport/GDTCCTTests/Integration/GDTCCTIntegrationTest.m b/GoogleDataTransport/GDTCCTTests/Integration/GDTCCTIntegrationTest.m index 3880f14a..9a1c8051 100644 --- a/GoogleDataTransport/GDTCCTTests/Integration/GDTCCTIntegrationTest.m +++ b/GoogleDataTransport/GDTCCTTests/Integration/GDTCCTIntegrationTest.m @@ -64,6 +64,10 @@ @interface GDTCCTIntegrationTest : XCTestCase @implementation GDTCCTIntegrationTest - (void)setUp { + // Cancel pending operations from previous tests and wait for them to finish. + [[GDTCCTUploader sharedInstance].uploadOperationQueue cancelAllOperations]; + [[GDTCCTUploader sharedInstance] waitForUploadFinishedWithTimeout:5]; + // Make sure clean storage state before start. [[GDTCORFlatFileStorage sharedInstance] reset];