Skip to content

Commit 65def81

Browse files
authored
Generate network_connection_info and add tests (#4944)
* Populate network_connection_info and add test * Wrap build-in api in GDTCORPlatform and other changes * Set GDT_VERBOSE_LOGGING back to 0 * Add several check points for nil value * tiny change import of nanopbhelper.m * comments and typos
1 parent a7eaac4 commit 65def81

File tree

8 files changed

+203
-4
lines changed

8 files changed

+203
-4
lines changed

GoogleDataTransport/GDTCORLibrary/GDTCOREvent.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ - (void)encodeWithCoder:(NSCoder *)aCoder {
186186
[aCoder encodeInteger:_qosTier forKey:qosTierKey];
187187
[aCoder encodeObject:_clockSnapshot forKey:clockSnapshotKey];
188188
[aCoder encodeObject:_fileURL forKey:fileURLKey];
189+
[aCoder encodeObject:_customPrioritizationParams forKey:customPrioritizationParams];
189190
}
190191

191192
@end

GoogleDataTransport/GDTCORLibrary/GDTCORPlatform.m

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#import <GoogleDataTransport/GDTCORAssert.h>
2020
#import <GoogleDataTransport/GDTCORConsoleLogger.h>
21+
#import <GoogleDataTransport/GDTCORReachability.h>
2122

2223
#import "GDTCORLibrary/Private/GDTCORRegistrar_Private.h"
2324

@@ -49,6 +50,40 @@ BOOL GDTCORReachabilityFlagsContainWWAN(SCNetworkReachabilityFlags flags) {
4950
}
5051
#endif // !TARGET_OS_WATCH
5152

53+
GDTCORNetworkMobileSubtype GDTCORNetworkMobileSubTypeMessage() {
54+
#if TARGET_OS_IOS
55+
static NSDictionary<NSString *, NSNumber *> *CTRadioAccessTechnologyToNetworkSubTypeMessage;
56+
static CTTelephonyNetworkInfo *networkInfo;
57+
static dispatch_once_t onceToken;
58+
dispatch_once(&onceToken, ^{
59+
CTRadioAccessTechnologyToNetworkSubTypeMessage = @{
60+
CTRadioAccessTechnologyGPRS : @(GDTCORNetworkMobileSubtypeGPRS),
61+
CTRadioAccessTechnologyEdge : @(GDTCORNetworkMobileSubtypeEdge),
62+
CTRadioAccessTechnologyWCDMA : @(GDTCORNetworkMobileSubtypeWCDMA),
63+
CTRadioAccessTechnologyHSDPA : @(GDTCORNetworkMobileSubtypeHSDPA),
64+
CTRadioAccessTechnologyHSUPA : @(GDTCORNetworkMobileSubtypeHSUPA),
65+
CTRadioAccessTechnologyCDMA1x : @(GDTCORNetworkMobileSubtypeCDMA1x),
66+
CTRadioAccessTechnologyCDMAEVDORev0 : @(GDTCORNetworkMobileSubtypeCDMAEVDORev0),
67+
CTRadioAccessTechnologyCDMAEVDORevA : @(GDTCORNetworkMobileSubtypeCDMAEVDORevA),
68+
CTRadioAccessTechnologyCDMAEVDORevB : @(GDTCORNetworkMobileSubtypeCDMAEVDORevB),
69+
CTRadioAccessTechnologyeHRPD : @(GDTCORNetworkMobileSubtypeHRPD),
70+
CTRadioAccessTechnologyLTE : @(GDTCORNetworkMobileSubtypeLTE),
71+
};
72+
networkInfo = [[CTTelephonyNetworkInfo alloc] init];
73+
});
74+
NSString *networkCurrentRadioAccessTechnology = networkInfo.currentRadioAccessTechnology;
75+
if (networkCurrentRadioAccessTechnology) {
76+
NSNumber *networkMobileSubtype =
77+
CTRadioAccessTechnologyToNetworkSubTypeMessage[networkCurrentRadioAccessTechnology];
78+
return networkMobileSubtype.intValue;
79+
} else {
80+
return GDTCORNetworkMobileSubtypeUNKNOWN;
81+
}
82+
#else
83+
return GDTCORNetworkMobileSubtypeUNKNOWN;
84+
#endif
85+
}
86+
5287
@interface GDTCORApplication ()
5388
/**
5489
Private flag to match the existing `readonly` public flag. This will be accurate for all platforms,

GoogleDataTransport/GDTCORLibrary/Public/GDTCORPlatform.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525
#import <AppKit/AppKit.h>
2626
#endif // TARGET_OS_IOS || TARGET_OS_TV
2727

28+
#if TARGET_OS_IOS
29+
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
30+
#endif
31+
2832
NS_ASSUME_NONNULL_BEGIN
2933

3034
/** The GoogleDataTransport library version. */
@@ -39,6 +43,22 @@ FOUNDATION_EXPORT NSString *const kGDTCORApplicationWillEnterForegroundNotificat
3943
/** A notification sent out if the app is terminating. */
4044
FOUNDATION_EXPORT NSString *const kGDTCORApplicationWillTerminateNotification;
4145

46+
/** The different possible network connection mobile subtype. */
47+
typedef NS_ENUM(NSInteger, GDTCORNetworkMobileSubtype) {
48+
GDTCORNetworkMobileSubtypeUNKNOWN = 0,
49+
GDTCORNetworkMobileSubtypeGPRS = 1,
50+
GDTCORNetworkMobileSubtypeEdge = 2,
51+
GDTCORNetworkMobileSubtypeWCDMA = 3,
52+
GDTCORNetworkMobileSubtypeHSDPA = 4,
53+
GDTCORNetworkMobileSubtypeHSUPA = 5,
54+
GDTCORNetworkMobileSubtypeCDMA1x = 6,
55+
GDTCORNetworkMobileSubtypeCDMAEVDORev0 = 7,
56+
GDTCORNetworkMobileSubtypeCDMAEVDORevA = 8,
57+
GDTCORNetworkMobileSubtypeCDMAEVDORevB = 9,
58+
GDTCORNetworkMobileSubtypeHRPD = 10,
59+
GDTCORNetworkMobileSubtypeLTE = 11,
60+
};
61+
4262
#if !TARGET_OS_WATCH
4363
/** Compares flags with the WWAN reachability flag, if available, and returns YES if present.
4464
*
@@ -48,6 +68,13 @@ FOUNDATION_EXPORT NSString *const kGDTCORApplicationWillTerminateNotification;
4868
BOOL GDTCORReachabilityFlagsContainWWAN(SCNetworkReachabilityFlags flags);
4969
#endif
5070

71+
/** Generates an enum message GDTCORNetworkMobileSubtype representing Network connection mobile
72+
* subtype.
73+
*
74+
* @return A GDTCORNetworkMobileSubtype representing network connection mobile subtype.
75+
*/
76+
GDTCORNetworkMobileSubtype GDTCORNetworkMobileSubTypeMessage(void);
77+
5178
/** A typedef identify background identifiers. */
5279
typedef volatile NSUInteger GDTCORBackgroundIdentifier;
5380

GoogleDataTransportCCTSupport/GDTCCTLibrary/GDTCCTNanopbHelpers.m

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,18 @@
2222
#import <AppKit/AppKit.h>
2323
#endif // TARGET_OS_IOS || TARGET_OS_TV
2424

25+
#import <GoogleDataTransport/GDTCORClock.h>
2526
#import <GoogleDataTransport/GDTCORConsoleLogger.h>
2627
#import <GoogleDataTransport/GDTCOREvent.h>
28+
#import <GoogleDataTransport/GDTCORPlatform.h>
2729

2830
#import <nanopb/pb.h>
2931
#import <nanopb/pb_decode.h>
3032
#import <nanopb/pb_encode.h>
3133

32-
#import "GDTCCTLibrary/Private/GDTCCTPrioritizer.h"
34+
NSString *const GDTCCTNeedsNetworkConnectionInfo = @"needs_network_connection_info";
35+
36+
NSString *const GDTCCTNetworkConnectionInfo = @"network_connection_info";
3337

3438
#pragma mark - General purpose encoders
3539

@@ -136,8 +140,13 @@ gdt_cct_LogEvent GDTCCTConstructLogEvent(GDTCOREvent *event) {
136140
logEvent.has_event_uptime_ms = 1;
137141
logEvent.timezone_offset_seconds = event.clockSnapshot.timezoneOffsetSeconds;
138142
logEvent.has_timezone_offset_seconds = 1;
139-
// TODO: Read network_connection_info from the custom params dict.
140-
143+
if (event.customPrioritizationParams[GDTCCTNetworkConnectionInfo]) {
144+
NSData *networkConnectionInfoData =
145+
event.customPrioritizationParams[GDTCCTNetworkConnectionInfo];
146+
[networkConnectionInfoData getBytes:&logEvent.network_connection_info
147+
length:networkConnectionInfoData.length];
148+
logEvent.has_network_connection_info = 1;
149+
}
141150
NSError *error;
142151
NSData *extensionBytes = [NSData dataWithContentsOfURL:event.fileURL options:0 error:&error];
143152
if (error) {
@@ -188,6 +197,72 @@ gdt_cct_IosClientInfo GDTCCTConstructiOSClientInfo() {
188197
return iOSClientInfo;
189198
}
190199

200+
NSData *GDTCCTConstructNetworkConnectionInfoData() {
201+
gdt_cct_NetworkConnectionInfo networkConnectionInfo = gdt_cct_NetworkConnectionInfo_init_default;
202+
SCNetworkReachabilityFlags reachabilityFlags = [GDTCORReachability currentFlags];
203+
if ((reachabilityFlags & kSCNetworkReachabilityFlagsReachable) ==
204+
kSCNetworkReachabilityFlagsReachable) {
205+
networkConnectionInfo.network_type = GDTCCTNetworkConnectonInfoNetworkType(reachabilityFlags);
206+
if (networkConnectionInfo.network_type != gdt_cct_NetworkConnectionInfo_NetworkType_NONE) {
207+
networkConnectionInfo.has_network_type = 1;
208+
if (networkConnectionInfo.network_type == gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE) {
209+
networkConnectionInfo.mobile_subtype = GDTCCTNetworkConnectionInfoNetworkMobileSubtype();
210+
if (networkConnectionInfo.mobile_subtype !=
211+
gdt_cct_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE) {
212+
networkConnectionInfo.has_mobile_subtype = 1;
213+
}
214+
}
215+
}
216+
}
217+
NSData *networkConnectionInfoData = [NSData dataWithBytes:&networkConnectionInfo
218+
length:sizeof(networkConnectionInfo)];
219+
return networkConnectionInfoData;
220+
}
221+
222+
gdt_cct_NetworkConnectionInfo_NetworkType GDTCCTNetworkConnectonInfoNetworkType(
223+
SCNetworkReachabilityFlags flags) {
224+
gdt_cct_NetworkConnectionInfo_NetworkType networkType =
225+
gdt_cct_NetworkConnectionInfo_NetworkType_NONE;
226+
if (GDTCORReachabilityFlagsContainWWAN(flags)) {
227+
networkType = gdt_cct_NetworkConnectionInfo_NetworkType_MOBILE;
228+
GDTCORLogDebug(@"%@", @"Event captured that it occurred whilst using mobile data.");
229+
} else {
230+
networkType = gdt_cct_NetworkConnectionInfo_NetworkType_WIFI;
231+
GDTCORLogDebug(@"%@", @"Event captured that it occurred whilst using wifi data.");
232+
}
233+
return networkType;
234+
}
235+
236+
gdt_cct_NetworkConnectionInfo_MobileSubtype GDTCCTNetworkConnectionInfoNetworkMobileSubtype() {
237+
NSNumber *networkMobileSubtypeMessage = @(GDTCORNetworkMobileSubTypeMessage());
238+
if (!networkMobileSubtypeMessage.intValue) {
239+
return gdt_cct_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE;
240+
}
241+
static NSDictionary<NSNumber *, NSNumber *> *MessageToNetworkSubTypeMessage;
242+
static dispatch_once_t onceToken;
243+
dispatch_once(&onceToken, ^{
244+
MessageToNetworkSubTypeMessage = @{
245+
@(GDTCORNetworkMobileSubtypeGPRS) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_GPRS),
246+
@(GDTCORNetworkMobileSubtypeEdge) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_EDGE),
247+
@(GDTCORNetworkMobileSubtypeWCDMA) :
248+
@(gdt_cct_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE),
249+
@(GDTCORNetworkMobileSubtypeHSDPA) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_HSDPA),
250+
@(GDTCORNetworkMobileSubtypeHSUPA) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_HSUPA),
251+
@(GDTCORNetworkMobileSubtypeCDMA1x) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_CDMA),
252+
@(GDTCORNetworkMobileSubtypeCDMAEVDORev0) :
253+
@(gdt_cct_NetworkConnectionInfo_MobileSubtype_EVDO_0),
254+
@(GDTCORNetworkMobileSubtypeCDMAEVDORevA) :
255+
@(gdt_cct_NetworkConnectionInfo_MobileSubtype_EVDO_A),
256+
@(GDTCORNetworkMobileSubtypeCDMAEVDORevB) :
257+
@(gdt_cct_NetworkConnectionInfo_MobileSubtype_EVDO_B),
258+
@(GDTCORNetworkMobileSubtypeHRPD) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_EHRPD),
259+
@(GDTCORNetworkMobileSubtypeLTE) : @(gdt_cct_NetworkConnectionInfo_MobileSubtype_LTE),
260+
};
261+
});
262+
NSNumber *networkMobileSubtype = MessageToNetworkSubTypeMessage[networkMobileSubtypeMessage];
263+
return networkMobileSubtype.intValue;
264+
}
265+
191266
#pragma mark - CCT Object decoders
192267

193268
gdt_cct_LogResponse GDTCCTDecodeLogResponse(NSData *data, NSError **error) {

GoogleDataTransportCCTSupport/GDTCCTLibrary/GDTCCTPrioritizer.m

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#import <GoogleDataTransport/GDTCORRegistrar.h>
2222
#import <GoogleDataTransport/GDTCORTargets.h>
2323

24+
#import "GDTCCTLibrary/Private/GDTCCTNanopbHelpers.h"
25+
2426
const static int64_t kMillisPerDay = 8.64e+7;
2527

2628
@implementation GDTCCTPrioritizer
@@ -55,6 +57,12 @@ - (instancetype)init {
5557
#pragma mark - GDTCORPrioritizer Protocol
5658

5759
- (void)prioritizeEvent:(GDTCOREvent *)event {
60+
if (event.customPrioritizationParams[GDTCCTNeedsNetworkConnectionInfo]) {
61+
NSData *networkInfoData = GDTCCTConstructNetworkConnectionInfoData();
62+
if (networkInfoData) {
63+
event.customPrioritizationParams = @{GDTCCTNetworkConnectionInfo : networkInfoData};
64+
}
65+
}
5866
dispatch_async(_queue, ^{
5967
switch (event.target) {
6068
case kGDTCORTargetCCT:
@@ -70,7 +78,7 @@ - (void)prioritizeEvent:(GDTCOREvent *)event {
7078
break;
7179

7280
default:
73-
GDTCORLogDebug("GDTCCTPrioritizer doesn't support target %d", event.target);
81+
GDTCORLogDebug("GDTCCTPrioritizer doesn't support target %ld", (long)event.target);
7482
break;
7583
}
7684
});

GoogleDataTransportCCTSupport/GDTCCTLibrary/Private/GDTCCTNanopbHelpers.h

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,22 @@
1717
#import <Foundation/Foundation.h>
1818

1919
#import <GoogleDataTransport/GDTCOREvent.h>
20+
#import <GoogleDataTransport/GDTCORReachability.h>
2021

2122
#import "GDTCCTLibrary/Protogen/nanopb/cct.nanopb.h"
2223

2324
NS_ASSUME_NONNULL_BEGIN
2425

26+
/** A string sets in customPrioritizationParams as a key paired to @YES if current event needs to
27+
* populate network connection info data, @NO otherwise.
28+
*/
29+
FOUNDATION_EXPORT NSString *const GDTCCTNeedsNetworkConnectionInfo;
30+
31+
/** A string sets in customPrioritizationParams as a key paired to the network connection info data
32+
* of current event.
33+
*/
34+
FOUNDATION_EXPORT NSString *const GDTCCTNetworkConnectionInfo;
35+
2536
#pragma mark - General purpose encoders
2637

2738
/** Converts an NSString* to a pb_bytes_array_t*.
@@ -96,6 +107,29 @@ gdt_cct_ClientInfo GDTCCTConstructClientInfo(void);
96107
FOUNDATION_EXPORT
97108
gdt_cct_IosClientInfo GDTCCTConstructiOSClientInfo(void);
98109

110+
/** Constructs the data of a gdt_cct_NetworkConnectionInfo representing the client nework connection
111+
* information.
112+
*
113+
* @return The data of a gdt_cct_NetworkConnectionInfo object.
114+
*/
115+
FOUNDATION_EXPORT
116+
NSData *GDTCCTConstructNetworkConnectionInfoData(void);
117+
118+
/** Return a gdt_cct_NetworkConnectionInfo_NetworkType representing the cilent network type.
119+
*
120+
* @return The gdt_cct_NetworkConnectionInfo_NetworkType.
121+
*/
122+
FOUNDATION_EXPORT
123+
gdt_cct_NetworkConnectionInfo_NetworkType GDTCCTNetworkConnectonInfoNetworkType(
124+
SCNetworkReachabilityFlags flags);
125+
126+
/** Return a gdt_cct_NetworkConnectionInfo_MobileSubtype representing the client
127+
*
128+
* @return The gdt_cct_NetworkConnectionInfo_MobileSubtype.
129+
*/
130+
FOUNDATION_EXPORT
131+
gdt_cct_NetworkConnectionInfo_MobileSubtype GDTCCTNetworkConnectionInfoNetworkMobileSubtype(void);
132+
99133
#pragma mark - CCT object decoders
100134

101135
/** Decodes a gdt_cct_LogResponse given proto bytes.

GoogleDataTransportCCTSupport/GDTCCTTestApp/viewcontroller.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public extension ViewController {
3939
]
4040
testMessage.root.subMessage.repeatedSubMessage[0].samplingPercentage = 13.37
4141
event.dataObject = testMessage
42+
event.customPrioritizationParams = ["needs_network_connection_info": true]
4243
transportToUse.sendDataEvent(event)
4344
}
4445

@@ -53,6 +54,7 @@ public extension ViewController {
5354
SubMessageTwo(),
5455
]
5556
event.dataObject = testMessage
57+
event.customPrioritizationParams = ["needs_network_connection_info": true]
5658
transportToUse.sendTelemetryEvent(event)
5759
}
5860

@@ -66,6 +68,7 @@ public extension ViewController {
6668
testMessage.root.warriorChampionships = 1337
6769
event.qosTier = GDTCOREventQoS.qoSFast
6870
event.dataObject = testMessage
71+
event.customPrioritizationParams = ["needs_network_connection_info": true]
6972
transportToUse.sendDataEvent(event)
7073
}
7174

@@ -77,6 +80,7 @@ public extension ViewController {
7780
testMessage.root.identifier = "ios_test_app_wifi_only_event"
7881
event.qosTier = GDTCOREventQoS.qoSWifiOnly
7982
event.dataObject = testMessage
83+
event.customPrioritizationParams = ["needs_network_connection_info": true]
8084
transportToUse.sendDataEvent(event)
8185
}
8286

@@ -95,6 +99,7 @@ public extension ViewController {
9599
testMessage.root.subMessage.repeatedSubMessage[0].samplingPercentage = 100.0
96100
event.qosTier = GDTCOREventQoS.qoSDaily
97101
event.dataObject = testMessage
102+
event.customPrioritizationParams = ["needs_network_connection_info": true]
98103
transportToUse.sendDataEvent(event)
99104
}
100105

GoogleDataTransportCCTSupport/GDTCCTTests/Unit/GDTCCTPrioritizerTest.m

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#import "GDTCCTTests/Unit/Helpers/GDTCCTEventGenerator.h"
2020

21+
#import "GDTCCTLibrary/Private/GDTCCTNanopbHelpers.h"
2122
#import "GDTCCTLibrary/Private/GDTCCTPrioritizer.h"
2223

2324
@interface GDTCCTPrioritizerTest : XCTestCase
@@ -167,4 +168,17 @@ - (void)testDailyUpload {
167168
XCTAssertTrue([package.events containsObject:telemetryEvent]);
168169
}
169170

171+
/** Tests updating events generated network_connection_info. */
172+
- (void)testNetworkConnectionInfo {
173+
GDTCCTPrioritizer *prioritizer = [[GDTCCTPrioritizer alloc] init];
174+
GDTCOREvent *event = [_CCTGenerator generateEvent:GDTCOREventQosDefault];
175+
event.customPrioritizationParams = @{GDTCCTNeedsNetworkConnectionInfo : @YES};
176+
[prioritizer prioritizeEvent:event];
177+
XCTAssertNotNil(event.customPrioritizationParams[GDTCCTNetworkConnectionInfo]);
178+
NSData *networkConnectionInfoData = event.customPrioritizationParams[GDTCCTNetworkConnectionInfo];
179+
gdt_cct_NetworkConnectionInfo info;
180+
[networkConnectionInfoData getBytes:&info length:networkConnectionInfoData.length];
181+
XCTAssertNotEqual(info.network_type, gdt_cct_NetworkConnectionInfo_NetworkType_NONE);
182+
}
183+
170184
@end

0 commit comments

Comments
 (0)