Skip to content

Commit fe53dd3

Browse files
authored
Create a log wrapper and better test GDLLogWriter (#2190)
* Add logTarget as a property to GDLLogEvent and connect the logger to the writer. * Create a log wrapper for use with GULLogger. * GDLLogTransformer should inherit <NSObject> and require transform: * Protect against doesNotRespond exceptions and expand tests * Style and a missing @param. * Update a comment
1 parent cd67dae commit fe53dd3

File tree

10 files changed

+141
-14
lines changed

10 files changed

+141
-14
lines changed

GoogleDataLogger.podspec

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ Shared library for iOS SDK data logging needs.
2727
s.source_files = 'GoogleDataLogger/GoogleDataLogger/**/*'
2828
s.public_header_files = 'GoogleDataLogger/GoogleDataLogger/Classes/Public/*.h'
2929

30+
s.dependency 'GoogleUtilities/Logger'
31+
3032
s.pod_target_xcconfig = {
3133
'GCC_C_LANGUAGE_STANDARD' => 'c99'
3234
}

GoogleDataLogger/GoogleDataLogger/Classes/GDLLogEvent.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ typedef NS_ENUM(NSInteger, GDLLogQoS) {
4444
/** The log map identifier, to allow backends to map the extension property to a proto. */
4545
@property(readonly, nonatomic) NSString *logMapID;
4646

47+
/** The identifier for the backend this log will eventually be sent to. */
48+
@property(readonly, nonatomic) NSInteger logTarget;
49+
4750
/** The log object itself, encapsulated in the transport of your choice, as long as it implements
4851
* the GDLLogProto protocol. */
4952
@property(nonatomic) id<GDLLogProto> extension;
@@ -60,9 +63,11 @@ typedef NS_ENUM(NSInteger, GDLLogQoS) {
6063
/** Initializes an instance using the given logMapID.
6164
*
6265
* @param logMapID The log map identifier.
66+
* @param logTarget The log's target identifier.
6367
* @return An instance of this class.
6468
*/
65-
- (instancetype)initWithLogMapID:(NSString *)logMapID NS_DESIGNATED_INITIALIZER;
69+
- (instancetype)initWithLogMapID:(NSString *)logMapID
70+
logTarget:(NSInteger)logTarget NS_DESIGNATED_INITIALIZER;
6671

6772
@end
6873

GoogleDataLogger/GoogleDataLogger/Classes/GDLLogEvent.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818

1919
@implementation GDLLogEvent
2020

21-
- (instancetype)initWithLogMapID:(NSString *)logMapID {
21+
- (instancetype)initWithLogMapID:(NSString *)logMapID logTarget:(NSInteger)logTarget {
2222
NSAssert(logMapID.length > 0, @"Please give a valid log map ID");
23+
NSAssert(logTarget > 0, @"A log target cannot be negative or 0");
2324
self = [super init];
2425
if (self) {
2526
_logMapID = logMapID;
27+
_logTarget = logTarget;
2628
}
2729
return self;
2830
}

GoogleDataLogger/GoogleDataLogger/Classes/GDLLogWriter.m

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#import <GoogleDataLogger/GDLLogTransformer.h>
2121

22+
#import "GDLConsoleLogger.h"
2223
#import "GDLLogStorage.h"
2324

2425
@implementation GDLLogWriter
@@ -48,8 +49,14 @@ - (void)writeLog:(GDLLogEvent *)log
4849
dispatch_async(_logWritingQueue, ^{
4950
GDLLogEvent *transformedLog = log;
5051
for (id<GDLLogTransformer> transformer in logTransformers) {
51-
transformedLog = [transformer transform:transformedLog];
52-
if (!transformedLog) {
52+
if ([transformer respondsToSelector:@selector(transform:)]) {
53+
transformedLog = [transformer transform:transformedLog];
54+
if (!transformedLog) {
55+
return;
56+
}
57+
} else {
58+
GDLLogWarning(GDLMCWTransformerDoesntImplementTransform,
59+
@"Transformer doesn't implement transform: %@", transformer);
5360
return;
5461
}
5562
}

GoogleDataLogger/GoogleDataLogger/Classes/GDLLogger.m

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#import "GDLLogger.h"
1818

1919
#import "GDLLogEvent.h"
20+
#import "GDLLogWriter.h"
2021

2122
@interface GDLLogger ()
2223

@@ -49,18 +50,16 @@ - (instancetype)initWithLogMapID:(NSString *)logMapID
4950

5051
- (void)logTelemetryEvent:(GDLLogEvent *)logEvent {
5152
NSAssert(logEvent, @"You can't log a nil event");
52-
53-
// TODO(mikehaney24): Implement.
53+
[[GDLLogWriter sharedInstance] writeLog:logEvent afterApplyingTransformers:_logTransformers];
5454
}
5555

5656
- (void)logDataEvent:(GDLLogEvent *)logEvent {
5757
NSAssert(logEvent, @"You can't log a nil event");
58-
59-
// TODO(mikehaney24): Implement.
58+
[[GDLLogWriter sharedInstance] writeLog:logEvent afterApplyingTransformers:_logTransformers];
6059
}
6160

6261
- (GDLLogEvent *)newEvent {
63-
return [[GDLLogEvent alloc] initWithLogMapID:_logMapID];
62+
return [[GDLLogEvent alloc] initWithLogMapID:_logMapID logTarget:_logTarget];
6463
}
6564

6665
@end

GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogTransformer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
@class GDLLogEvent;
2020

2121
/** Defines the API that log transformers must adopt. */
22-
@protocol GDLLogTransformer
22+
@protocol GDLLogTransformer <NSObject>
23+
24+
@required
2325

2426
/** Transforms a log by applying some logic to it. Logs returned can be nil, for example, in
2527
* instances where the log should be sampled.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright 2018 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+
17+
#import "GULLogger.h"
18+
19+
/** The console logger prefix. */
20+
static GULLoggerService kGDLConsoleLogger = @"[GoogleDataLogger]";
21+
22+
/** A list of message codes to print in the logger that help to correspond printed messages with
23+
* code locations.
24+
*
25+
* Prefixes:
26+
* - MCW => MessageCodeWarning
27+
*/
28+
typedef NS_ENUM(NSInteger, GDLMessageCode) {
29+
30+
/** For warning messages concerning transform: not being implemented by a log transformer. */
31+
GDLMCWTransformerDoesntImplementTransform = 1
32+
};
33+
34+
/** */
35+
FOUNDATION_EXTERN NSString *GDLMessageCodeEnumToString(GDLMessageCode code);
36+
37+
/** Logs the warningMessage string to the console at the warning level.
38+
*
39+
* @param warningMessageFormat The format string to log to the console.
40+
*/
41+
FOUNDATION_EXTERN void GDLLogWarning(GDLMessageCode messageCode,
42+
NSString *warningMessageFormat,
43+
...) NS_FORMAT_FUNCTION(2, 3);
44+
45+
// A define to wrap GULLogWarning with slightly more convenient usage.
46+
#define GDLLogWarning(MESSAGE_CODE, MESSAGE_FORMAT, ...) \
47+
GULLogWarning(kGDLConsoleLogger, YES, GDLMessageCodeEnumToString(MESSAGE_CODE), MESSAGE_FORMAT, \
48+
__VA_ARGS__);
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright 2018 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+
17+
#import "GDLConsoleLogger.h"
18+
19+
NSString* GDLMessageCodeEnumToString(GDLMessageCode code) {
20+
return [[NSString alloc] initWithFormat:@"I-GDL%06ld", (long)code];
21+
}

GoogleDataLogger/Tests/GDLLogEventTest.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ @interface GDLLogEventTest : XCTestCase
2525
@implementation GDLLogEventTest
2626

2727
- (void)testInit {
28-
XCTAssertNotNil([[GDLLogEvent alloc] initWithLogMapID:@"1"]);
29-
XCTAssertThrows([[GDLLogEvent alloc] initWithLogMapID:@""]);
28+
XCTAssertNotNil([[GDLLogEvent alloc] initWithLogMapID:@"1" logTarget:1]);
29+
XCTAssertThrows([[GDLLogEvent alloc] initWithLogMapID:@"" logTarget:1]);
3030
}
3131

3232
@end

GoogleDataLogger/Tests/GDLLogWriterTest.m

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,18 @@ - (GDLLogEvent *)transform:(GDLLogEvent *)logEvent {
3434

3535
@end
3636

37+
@interface GDLLogWriterTestNewLogTransformer : NSObject <GDLLogTransformer>
38+
39+
@end
40+
41+
@implementation GDLLogWriterTestNewLogTransformer
42+
43+
- (GDLLogEvent *)transform:(GDLLogEvent *)logEvent {
44+
return [[GDLLogEvent alloc] initWithLogMapID:@"new" logTarget:1];
45+
}
46+
47+
@end
48+
3749
@interface GDLLogWriterTest : XCTestCase
3850

3951
@end
@@ -50,18 +62,20 @@ - (void)testSharedInstance {
5062
XCTAssertEqual([GDLLogWriter sharedInstance], [GDLLogWriter sharedInstance]);
5163
}
5264

65+
/** Tests writing a log without a transformer. */
5366
- (void)testWriteLogWithoutTransformers {
5467
GDLLogWriter *writer = [GDLLogWriter sharedInstance];
55-
GDLLogEvent *log = [[GDLLogEvent alloc] initWithLogMapID:@"1"];
68+
GDLLogEvent *log = [[GDLLogEvent alloc] initWithLogMapID:@"1" logTarget:1];
5669
XCTAssertNoThrow([writer writeLog:log afterApplyingTransformers:nil]);
5770
dispatch_sync(writer.logWritingQueue, ^{
5871
// TODO(mikehaney24): Assert that storage contains the log.
5972
});
6073
}
6174

75+
/** Tests writing a log with a transformer that nils out the log. */
6276
- (void)testWriteLogWithTransformersThatNilTheLog {
6377
GDLLogWriter *writer = [GDLLogWriter sharedInstance];
64-
GDLLogEvent *log = [[GDLLogEvent alloc] initWithLogMapID:@"2"];
78+
GDLLogEvent *log = [[GDLLogEvent alloc] initWithLogMapID:@"2" logTarget:1];
6579
NSArray<id<GDLLogTransformer>> *transformers =
6680
@[ [[GDLLogWriterTestNilingTransformer alloc] init] ];
6781
XCTAssertNoThrow([writer writeLog:log afterApplyingTransformers:transformers]);
@@ -70,4 +84,31 @@ - (void)testWriteLogWithTransformersThatNilTheLog {
7084
});
7185
}
7286

87+
/** Tests writing a log with a transformer that creates a new log. */
88+
- (void)testWriteLogWithTransformersThatCreateANewLog {
89+
GDLLogWriter *writer = [GDLLogWriter sharedInstance];
90+
GDLLogEvent *log = [[GDLLogEvent alloc] initWithLogMapID:@"2" logTarget:1];
91+
NSArray<id<GDLLogTransformer>> *transformers =
92+
@[ [[GDLLogWriterTestNewLogTransformer alloc] init] ];
93+
XCTAssertNoThrow([writer writeLog:log afterApplyingTransformers:transformers]);
94+
dispatch_sync(writer.logWritingQueue, ^{
95+
// TODO(mikehaney24): Assert that storage contains the new log.
96+
});
97+
}
98+
99+
/** Tests that using a transformer without transform: implemented throws. */
100+
- (void)testWriteLogWithBadTransformer {
101+
GDLLogWriter *writer = [GDLLogWriter sharedInstance];
102+
GDLLogEvent *log = [[GDLLogEvent alloc] initWithLogMapID:@"2" logTarget:1];
103+
NSArray *transformers = @[ [[NSObject alloc] init] ];
104+
@try {
105+
dispatch_sync(writer.logWritingQueue, ^{
106+
// TODO(mikehaney24): Assert that storage contains the new log.
107+
[writer writeLog:log afterApplyingTransformers:transformers];
108+
});
109+
} @catch (NSException *exception) {
110+
NSLog(@"");
111+
}
112+
}
113+
73114
@end

0 commit comments

Comments
 (0)