Skip to content

Commit 781c8b8

Browse files
Expose upload URLs so that perf can stop instrumenting these URLs. (#7064)
* Expose upload URLs. * Remove code duplication. * Fix style. * Make url dictionary local static and dispatch once. * Fix style. * Add a local dictionary and return value from it. * Update CHANGELOG.md * Update CHANGELOG.md
1 parent ad9e237 commit 781c8b8

File tree

4 files changed

+132
-39
lines changed

4 files changed

+132
-39
lines changed

GoogleDataTransport/CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
# v8.0.2
1+
# Unreleased (v8.1.0)
2+
- Expose upload URLs which FirebasePerformance will depend upon.
23
- Fix out-of-memory crash for a big amount of pending events. (#6995)
34

45
# v8.0.1

GoogleDataTransport/GDTCCTLibrary/GDTCCTUploader.m

Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ @interface GDTCCTUploader () <NSURLSessionDelegate>
8181
@implementation GDTCCTUploader
8282

8383
@synthesize uploaderSession = _uploaderSession;
84+
static NSURL *_testServerURL = nil;
8485

8586
+ (void)load {
8687
GDTCCTUploader *uploader = [GDTCCTUploader sharedInstance];
@@ -99,28 +100,15 @@ + (instancetype)sharedInstance {
99100
return sharedInstance;
100101
}
101102

102-
- (instancetype)init {
103-
self = [super init];
104-
if (self) {
105-
_uploaderQueue = dispatch_queue_create("com.google.GDTCCTUploader", DISPATCH_QUEUE_SERIAL);
106-
}
107-
return self;
103+
+ (void)setTestServerURL:(NSURL *_Nullable)serverURL {
104+
_testServerURL = serverURL;
108105
}
109106

110-
- (NSURLSession *)uploaderSession {
111-
if (_uploaderSession == nil) {
112-
NSURLSessionConfiguration *config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
113-
_uploaderSession = [NSURLSession sessionWithConfiguration:config
114-
delegate:self
115-
delegateQueue:nil];
116-
}
117-
return _uploaderSession;
107+
+ (NSURL *_Nullable)testServerURL {
108+
return _testServerURL;
118109
}
119110

120-
/**
121-
*
122-
*/
123-
- (nullable NSURL *)serverURLForTarget:(GDTCORTarget)target {
111+
+ (NSDictionary<NSNumber *, NSURL *> *)uploadURLs {
124112
// These strings should be interleaved to construct the real URL. This is just to (hopefully)
125113
// fool github URL scanning bots.
126114
static NSURL *CCTServerURL;
@@ -170,31 +158,46 @@ - (nullable NSURL *)serverURLForTarget:(GDTCORTarget)target {
170158
p2[31], p1[32], p2[32], p1[33], p2[33], p1[34], p2[34], p1[35], '\0'};
171159
CSHServerURL = [NSURL URLWithString:[NSString stringWithUTF8String:URL]];
172160
});
161+
static NSDictionary<NSNumber *, NSURL *> *uploadURLs;
162+
static dispatch_once_t URLOnceToken;
163+
dispatch_once(&URLOnceToken, ^{
164+
uploadURLs = @{
165+
@(kGDTCORTargetCCT) : CCTServerURL,
166+
@(kGDTCORTargetFLL) : FLLServerURL,
167+
@(kGDTCORTargetCSH) : CSHServerURL,
168+
@(kGDTCORTargetINT) : [NSURL URLWithString:kINTServerURL]
169+
};
170+
});
171+
return uploadURLs;
172+
}
173173

174+
+ (nullable NSURL *)serverURLForTarget:(GDTCORTarget)target {
174175
#if !NDEBUG
175176
if (_testServerURL) {
176177
return _testServerURL;
177178
}
178179
#endif // !NDEBUG
179180

180-
switch (target) {
181-
case kGDTCORTargetCCT:
182-
return CCTServerURL;
183-
184-
case kGDTCORTargetFLL:
185-
return FLLServerURL;
186-
187-
case kGDTCORTargetCSH:
188-
return CSHServerURL;
181+
NSDictionary<NSNumber *, NSURL *> *uploadURLs = [self uploadURLs];
182+
return uploadURLs[@(target)];
183+
}
189184

190-
case kGDTCORTargetINT:
191-
return [NSURL URLWithString:kINTServerURL];
185+
- (instancetype)init {
186+
self = [super init];
187+
if (self) {
188+
_uploaderQueue = dispatch_queue_create("com.google.GDTCCTUploader", DISPATCH_QUEUE_SERIAL);
189+
}
190+
return self;
191+
}
192192

193-
default:
194-
GDTCORLogDebug(@"GDTCCTUploader doesn't support target %ld", (long)target);
195-
return nil;
196-
break;
193+
- (NSURLSession *)uploaderSession {
194+
if (_uploaderSession == nil) {
195+
NSURLSessionConfiguration *config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
196+
_uploaderSession = [NSURLSession sessionWithConfiguration:config
197+
delegate:self
198+
delegateQueue:nil];
197199
}
200+
return _uploaderSession;
198201
}
199202

200203
- (NSString *)FLLAndCSHandINTAPIKey {
@@ -597,7 +600,7 @@ - (nullable NSURLRequest *)constructRequestForTarget:(GDTCORTarget)target data:(
597600
GDTCORLogDebug(@"There was no data to construct a request for target %ld.", (long)target);
598601
return nil;
599602
}
600-
NSURL *URL = [self serverURLForTarget:target];
603+
NSURL *URL = [[self class] serverURLForTarget:target];
601604
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
602605
NSString *targetString;
603606
switch (target) {
@@ -709,7 +712,7 @@ - (void)URLSession:(NSURLSession *)session
709712
return;
710713
}
711714
if (response.statusCode == 302 || response.statusCode == 301) {
712-
if ([request.URL isEqual:[self serverURLForTarget:kGDTCORTargetFLL]]) {
715+
if ([request.URL isEqual:[[self class] serverURLForTarget:kGDTCORTargetFLL]]) {
713716
NSURLRequest *newRequest = [self constructRequestForTarget:kGDTCORTargetCCT
714717
data:task.originalRequest.HTTPBody];
715718
completionHandler(newRequest);

GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploader.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ extern NSNotificationName const GDTCCTUploadCompleteNotification;
2828
/** Class capable of uploading events to the CCT backend. */
2929
@interface GDTCCTUploader : NSObject <GDTCORUploader>
3030

31+
/** Returns the server URL for target.*/
32+
// TODO: create a separate public header (e.g. GDTCCTUploadURL.h) to make it a public API.
33+
+ (NSDictionary<NSNumber *, NSURL *> *)uploadURLs;
34+
3135
/** The queue on which all CCT uploading will occur. */
3236
@property(nonatomic, readonly) dispatch_queue_t uploaderQueue;
3337

@@ -45,7 +49,7 @@ extern NSNotificationName const GDTCCTUploadCompleteNotification;
4549

4650
#if !NDEBUG
4751
/** An upload URL used across all targets. For testing only. */
48-
@property(nullable, nonatomic) NSURL *testServerURL;
52+
@property(class, nullable, nonatomic) NSURL *testServerURL;
4953

5054
#endif // !NDEBUG
5155

GoogleDataTransport/GDTCCTTests/Unit/GDTCCTUploaderTest.m

Lines changed: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ - (void)setUp {
6060
XCTAssertTrue(self.testServer.isRunning);
6161

6262
self.uploader = [[GDTCCTUploader alloc] init];
63-
self.uploader.testServerURL = [self.testServer.serverURL URLByAppendingPathComponent:@"logBatch"];
63+
GDTCCTUploader.testServerURL =
64+
[self.testServer.serverURL URLByAppendingPathComponent:@"logBatch"];
6465
}
6566

6667
- (void)tearDown {
@@ -72,6 +73,17 @@ - (void)tearDown {
7273

7374
#pragma mark - Upload flow tests
7475

76+
- (void)testUploadURLsAreCorrect {
77+
GDTCCTUploader.testServerURL = nil;
78+
NSDictionary<NSNumber *, NSURL *> *URLs = GDTCCTUploader.uploadURLs;
79+
XCTAssertEqualObjects(URLs[@(kGDTCORTargetCCT)], [self serverURLForTarget:kGDTCORTargetCCT]);
80+
XCTAssertEqualObjects(URLs[@(kGDTCORTargetFLL)], [self serverURLForTarget:kGDTCORTargetFLL]);
81+
XCTAssertEqualObjects(URLs[@(kGDTCORTargetCSH)], [self serverURLForTarget:kGDTCORTargetCSH]);
82+
XCTAssertEqualObjects(URLs[@(kGDTCORTargetINT)], [self serverURLForTarget:kGDTCORTargetINT]);
83+
GDTCCTUploader.testServerURL =
84+
[self.testServer.serverURL URLByAppendingPathComponent:@"logBatch"];
85+
}
86+
7587
- (void)testUploadTargetWhenThereAreEventsToUpload {
7688
// 0. Generate test events.
7789
id<GDTCORStorageProtocol> storage = GDTCORStorageInstanceForTarget(kGDTCORTargetTest);
@@ -283,7 +295,8 @@ - (void)testUploadTarget_WhenThereAreBothStoredBatchAndEvents_ThenRemoveBatchAnd
283295
}
284296

285297
- (void)testUploadTarget_WhenThereAreNoEventsFirstThenEventsAdded_ThenUploadNewEvent {
286-
self.uploader.testServerURL = [self.testServer.serverURL URLByAppendingPathComponent:@"logBatch"];
298+
GDTCCTUploader.testServerURL =
299+
[self.testServer.serverURL URLByAppendingPathComponent:@"logBatch"];
287300

288301
// 1. Test stored batch upload.
289302
// 1.1. Set up expectations.
@@ -710,4 +723,76 @@ - (void)assertUploadTargetRespectsNextRequestWaitTime:(NSTimeInterval)nextReques
710723
[self waitForUploadOperationsToFinish:self.uploader];
711724
}
712725

726+
- (nullable NSURL *)serverURLForTarget:(GDTCORTarget)target {
727+
// These strings should be interleaved to construct the real URL. This is just to (hopefully)
728+
// fool github URL scanning bots.
729+
static NSURL *CCTServerURL;
730+
static NSString *const kINTServerURL =
731+
@"https://dummyapiverylong-dummy.dummy.com/dummy/api/very/long";
732+
static dispatch_once_t CCTOnceToken;
733+
dispatch_once(&CCTOnceToken, ^{
734+
const char *p1 = "hts/frbslgiggolai.o/0clgbth";
735+
const char *p2 = "tp:/ieaeogn.ogepscmvc/o/ac";
736+
const char URL[54] = {p1[0], p2[0], p1[1], p2[1], p1[2], p2[2], p1[3], p2[3], p1[4],
737+
p2[4], p1[5], p2[5], p1[6], p2[6], p1[7], p2[7], p1[8], p2[8],
738+
p1[9], p2[9], p1[10], p2[10], p1[11], p2[11], p1[12], p2[12], p1[13],
739+
p2[13], p1[14], p2[14], p1[15], p2[15], p1[16], p2[16], p1[17], p2[17],
740+
p1[18], p2[18], p1[19], p2[19], p1[20], p2[20], p1[21], p2[21], p1[22],
741+
p2[22], p1[23], p2[23], p1[24], p2[24], p1[25], p2[25], p1[26], '\0'};
742+
CCTServerURL = [NSURL URLWithString:[NSString stringWithUTF8String:URL]];
743+
});
744+
745+
static NSURL *FLLServerURL;
746+
static dispatch_once_t FLLOnceToken;
747+
dispatch_once(&FLLOnceToken, ^{
748+
const char *p1 = "hts/frbslgigp.ogepscmv/ieo/eaybtho";
749+
const char *p2 = "tp:/ieaeogn-agolai.o/1frlglgc/aclg";
750+
const char URL[69] = {p1[0], p2[0], p1[1], p2[1], p1[2], p2[2], p1[3], p2[3], p1[4],
751+
p2[4], p1[5], p2[5], p1[6], p2[6], p1[7], p2[7], p1[8], p2[8],
752+
p1[9], p2[9], p1[10], p2[10], p1[11], p2[11], p1[12], p2[12], p1[13],
753+
p2[13], p1[14], p2[14], p1[15], p2[15], p1[16], p2[16], p1[17], p2[17],
754+
p1[18], p2[18], p1[19], p2[19], p1[20], p2[20], p1[21], p2[21], p1[22],
755+
p2[22], p1[23], p2[23], p1[24], p2[24], p1[25], p2[25], p1[26], p2[26],
756+
p1[27], p2[27], p1[28], p2[28], p1[29], p2[29], p1[30], p2[30], p1[31],
757+
p2[31], p1[32], p2[32], p1[33], p2[33], '\0'};
758+
FLLServerURL = [NSURL URLWithString:[NSString stringWithUTF8String:URL]];
759+
});
760+
761+
static NSURL *CSHServerURL;
762+
static dispatch_once_t CSHOnceToken;
763+
dispatch_once(&CSHOnceToken, ^{
764+
// These strings should be interleaved to construct the real URL. This is just to (hopefully)
765+
// fool github URL scanning bots.
766+
const char *p1 = "hts/cahyiseot-agolai.o/1frlglgc/aclg";
767+
const char *p2 = "tp:/rsltcrprsp.ogepscmv/ieo/eaybtho";
768+
const char URL[72] = {p1[0], p2[0], p1[1], p2[1], p1[2], p2[2], p1[3], p2[3], p1[4],
769+
p2[4], p1[5], p2[5], p1[6], p2[6], p1[7], p2[7], p1[8], p2[8],
770+
p1[9], p2[9], p1[10], p2[10], p1[11], p2[11], p1[12], p2[12], p1[13],
771+
p2[13], p1[14], p2[14], p1[15], p2[15], p1[16], p2[16], p1[17], p2[17],
772+
p1[18], p2[18], p1[19], p2[19], p1[20], p2[20], p1[21], p2[21], p1[22],
773+
p2[22], p1[23], p2[23], p1[24], p2[24], p1[25], p2[25], p1[26], p2[26],
774+
p1[27], p2[27], p1[28], p2[28], p1[29], p2[29], p1[30], p2[30], p1[31],
775+
p2[31], p1[32], p2[32], p1[33], p2[33], p1[34], p2[34], p1[35], '\0'};
776+
CSHServerURL = [NSURL URLWithString:[NSString stringWithUTF8String:URL]];
777+
});
778+
779+
switch (target) {
780+
case kGDTCORTargetCCT:
781+
return CCTServerURL;
782+
783+
case kGDTCORTargetFLL:
784+
return FLLServerURL;
785+
786+
case kGDTCORTargetCSH:
787+
return CSHServerURL;
788+
789+
case kGDTCORTargetINT:
790+
return [NSURL URLWithString:kINTServerURL];
791+
792+
default:
793+
return nil;
794+
break;
795+
}
796+
}
797+
713798
@end

0 commit comments

Comments
 (0)