Files
firebase-ios-sdk/FirebasePerformance/Tests/Unit/Loggers/FPRGDTLoggerTest.m
T
Jeremy JiangandPaul Beusterien ec193d0150 Add Performance Support for Swift Package Manager (#8412)
* Create NanoPb code generation scripts (#8336)

* Create NanoPb code generation scripts

* Fix style and add README

* Fix copyright

* Update proto_generator.py

* Update README.md

* Create nanopb options file. (#8371)

* Create NanoPb code generation scripts

* Fix style and add README

* Fix copyright

* Update perf_metrics.options

* Update options with map

* Add generated proto files.

* Update imports.

* Convert Objective-C Classes to Nanopb (#8387)

* Convert all traces to nanopb

* Refactor for loop.

* Add set has_application_info to true.

* Incorporated comments.

* Fix style

* Create NanoPb code generation scripts (#8336)

* Create NanoPb code generation scripts

* Fix style and add README

* Fix copyright

* Update proto_generator.py

* Update README.md

* Create nanopb options file. (#8371)

* Create NanoPb code generation scripts

* Fix style and add README

* Fix copyright

* Update perf_metrics.options

* Update options with map

* Add generated proto files.

* Update imports.

* Convert Objective-C Classes to Nanopb (#8387)

* Convert all traces to nanopb

* Refactor for loop.

* Add set has_application_info to true.

* Incorporated comments.

* Fix style

* Fix style

* Convert nanopb struct to GDTCOREventDataObject and update the source code to use nanopb struct. (#8439)

* Convert all traces to nanopb

* Refactor for loop.

* WIP: nanopb conversion in FPRClient and FPREvent

* Update FPRClientTest.m

* Update FPRClient.m

* Update FPRClientTest.m

* Add set has_application_info to true.

* Remove proto imports.

* Set has_fields to be true in FPRTestUtils.m

* Completed GDTEvent conversion.

* Fix sampler tests.

* Fix style

* Refactor nanopb struct setter

* Fix style

* Fix pod-lib-lint failures.

* Update FPRClient with decoded string

* Set some "_has" fields to true.

* Add prefix to extern methods.

* Fix style.

* Update FPRClient to use trace.name without FPRDecodeString

* Fix style

* Incorporate comments.

* Integrate Performance with SPM (#8476)

* Convert all traces to nanopb

* Refactor for loop.

* WIP: nanopb conversion in FPRClient and FPREvent

* Update FPRClientTest.m

* Update FPRClient.m

* Update FPRClientTest.m

* Add set has_application_info to true.

* Remove proto imports.

* Set has_fields to be true in FPRTestUtils.m

* Completed GDTEvent conversion.

* Fix sampler tests.

* Fix style

* Refactor nanopb struct setter

* Fix style

* Fix pod-lib-lint failures.

* Update FPRClient with decoded string

* Set some "_has" fields to true.

* Add prefix to extern methods.

* Fix style.

* Update FPRClient to use trace.name without FPRDecodeString

* Fix style

* Update Package.swift

* Update Package.swift

* Update Package.swift

* Made SDK and unit tests buildable.

* Made all unit tests passing.

* Update keyWindow style.

* Add Performance to workflow.

* Update FPRUIViewControllerInstrument.h

* Incorporate comments.

* Add Performance to SwiftPMTests.

* Update style.

* Fix Unit tests and update workflow.

* Add FirebasePerformance wrapper

* Update import statement.

* Update style.

* Update performance.yml

* Create PerformanceUnit.xcscheme

* Update objc-module.m

* Update objc-module.m

* Updae objc-header.m

* Update objc-header.m

* Incorporate feedback.

* Update objc-header.m

* Organize folder structure to fix the spm tests.

* Update public import path

* Delete xcodebuild.log

* Update workflow files

* Fix failing swift-test for Perf SPM (#8507)

* Fix UIKit import

* Update FPRNetworkTraceTest.m

* Exclude TARGET_OS_MACCATALYST from objc header test

* Update main.swift

* Update main.swift

Co-authored-by: Paul Beusterien <paulbeusterien@google.com>

* Remove Protobuf dependency  (#8511)

* Remove protobuf dependency

* Update FirebasePerformance.podspec

* Incorporate comments.

* Update UIKit import

Co-authored-by: Paul Beusterien <paulbeusterien@google.com>
2021-08-10 13:41:18 -04:00

193 lines
7.1 KiB
Objective-C

// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#import <XCTest/XCTest.h>
#import "FirebasePerformance/Sources/FPRNanoPbUtils.h"
#import "FirebasePerformance/Sources/Loggers/FPRGDTLogSampler.h"
#import "FirebasePerformance/Sources/Loggers/FPRGDTLogger.h"
#import "FirebasePerformance/Sources/Loggers/FPRGDTLogger_Private.h"
#import "FirebasePerformance/Sources/Loggers/FPRGDTRateLimiter.h"
#import "FirebasePerformance/Tests/Unit/FPRTestUtils.h"
#import <GoogleDataTransport/GoogleDataTransport.h>
#import "GoogleDataTransport/GDTCORLibrary/Private/GDTCORTransport_Private.h"
#import "SharedTestUtilities/GDTCORTransportFake.h"
@interface FPRGDTLoggerTest : XCTestCase
/** Fll logger used to dispatch events to Fll using Google Data Transport. */
@property(nonatomic) FPRGDTLogger *logger;
/** A fake for the GDTCORTransport for FLL. */
@property(nonatomic) GDTCORTransportFake *transportFLLFake;
/** The log source for the FPRGDTLogger to be used. */
@property(nonatomic) NSInteger logSource;
/** The target backend of the GDTCORTransport - FLL. */
@property(nonatomic) NSInteger targetFL;
@end
@implementation FPRGDTLoggerTest
- (void)setUp {
[super setUp];
self.logSource = 1;
self.targetFL = kGDTCORTargetFLL; // FLL
self.logger = [[FPRGDTLogger alloc] initWithLogSource:self.logSource];
self.logger.isSimulator = YES;
// Set up for Fake logging.
self.transportFLLFake =
[[GDTCORTransportFake alloc] initWithMappingID:@(self.logSource).stringValue
transformers:nil
target:self.targetFL];
self.logger.gdtfllTransport = self.transportFLLFake;
}
- (void)tearDown {
[self.transportFLLFake reset];
[super tearDown];
}
/** Tests the designated initializer. */
- (void)testInitWithLogSource {
NSInteger randomLogSource = 1;
FPRGDTLogger *logger = [[FPRGDTLogger alloc] initWithLogSource:randomLogSource];
XCTAssertNotNil(logger);
XCTAssertEqual(logger.logSource, randomLogSource);
XCTAssertNotNil(logger.gdtfllTransport);
}
/** Tests the GDTLogger is generated with designated transformers. */
- (void)testInitWithTransformers {
NSInteger randomLogSource = 1;
FPRGDTLogger *logger = [[FPRGDTLogger alloc] initWithLogSource:randomLogSource];
XCTAssertNotNil(logger);
XCTAssertNotNil(logger.gdtfllTransport);
// GDT logger tests
XCTAssertEqual(logger.gdtfllTransport.transformers.count, 2);
XCTAssertTrue(
[logger.gdtfllTransport.transformers.firstObject isKindOfClass:[FPRGDTLogSampler class]]);
XCTAssertTrue(
[logger.gdtfllTransport.transformers.lastObject isKindOfClass:[FPRGDTRateLimiter class]]);
}
/** Validate all the required fields are set when logging an Event. */
- (void)testValidateEventFieldsToBeLogged {
// Log the event.
firebase_perf_v1_PerfMetric event = [FPRTestUtils createRandomPerfMetric:@"t1"];
event.application_info.app_instance_id = FPREncodeString(@"abc");
[self.logger logEvent:event];
// Note: Refer "dispatch_async issue" in "testLogMultipleEvents".
dispatch_sync(self.logger.queue, ^{
// Fetch the logged event.
NSArray<GDTCOREvent *> *gdtCorEventArray = [self.transportFLLFake logEvents];
GDTCOREvent *gdtCorEvent = gdtCorEventArray.firstObject;
// Validate that only 1 event is logged.
XCTAssertEqual(gdtCorEventArray.count, 1);
// Validate that the corresponding GDTEvent to be logged is not nil.
XCTAssertNotNil(gdtCorEvent.dataObject);
// Validate that the mapping ID is correctly associated.
XCTAssertEqual(gdtCorEvent.mappingID, @(self.logSource).stringValue);
// Validate that the target is correctly associated.
XCTAssertEqual(gdtCorEvent.target, self.targetFL);
// Validate that the QoS is set to GDTCOREventQoSFast in debug mode.
XCTAssertEqual(gdtCorEvent.qosTier, GDTCOREventQoSFast);
});
}
/** Validate that multiple events are logged correctly. */
- (void)testLogMultipleEvents {
// Log the events.
int logCount = 3;
for (int i = 1; i <= logCount; i++) {
NSString *traceName = [NSString stringWithFormat:@"t%d", i];
firebase_perf_v1_PerfMetric event = [FPRTestUtils createRandomPerfMetric:traceName];
event.application_info.app_instance_id = FPREncodeString(@"abc");
[self.logger logEvent:event];
}
// Note: "dispatch_async issue"
//
// There's a race condition between we checking the logEvents property on the "transportFake"
// and writing to that property using the "logEvent" method from the "logger" class
// because we are dispatching that event in a "dispatch_async" queue.
//
// To mitigate this we want that block to finish executing, so we call "dispatch_sync"
// on the same "queue" and perform all the validations inside that block.
//
// This is because it will block the current thread until all queued blocks are done.
dispatch_sync(self.logger.queue, ^{
// Fetch the logged events.
NSArray<GDTCOREvent *> *gdtCorEventArray = [self.transportFLLFake logEvents];
// Validate that the count of logged events is what is expected.
XCTAssertEqual(gdtCorEventArray.count, logCount);
});
}
/** Validate events' QoS are set to GDTCOREventQoSFast when running in Simulator. */
- (void)testEventsSimulatorQoS {
self.logger.isSimulator = YES;
// Log the event.
firebase_perf_v1_PerfMetric event = [FPRTestUtils createRandomPerfMetric:@"t1"];
event.application_info.app_instance_id = FPREncodeString(@"abc");
[self.logger logEvent:event];
// Note: Refer "dispatch_async issue" in "testLogMultipleEvents".
dispatch_sync(self.logger.queue, ^{
// Fetch the logged event.
NSArray<GDTCOREvent *> *gdtCorEventArray = [self.transportFLLFake logEvents];
GDTCOREvent *gdtCorEvent = gdtCorEventArray.firstObject;
// Validate that the QoS is set to GDTCOREventQoSFast.
XCTAssertEqual(gdtCorEvent.qosTier, GDTCOREventQoSFast);
});
}
/** Validate events' QoS are set to GDTCOREventQosDefault in actual device. */
- (void)testEventsRealDeviceQoS {
self.logger.isSimulator = NO;
// Log the event.
firebase_perf_v1_PerfMetric event = [FPRTestUtils createRandomPerfMetric:@"t1"];
event.application_info.app_instance_id = FPREncodeString(@"abc");
[self.logger logEvent:event];
// Note: Refer "dispatch_async issue" in "testLogMultipleEvents".
dispatch_sync(self.logger.queue, ^{
// Fetch the logged event.
NSArray<GDTCOREvent *> *gdtCorEventArray = [self.transportFLLFake logEvents];
GDTCOREvent *gdtCorEvent = gdtCorEventArray.firstObject;
// Validate that the QoS is set to GDTCOREventQosDefault.
XCTAssertEqual(gdtCorEvent.qosTier, GDTCOREventQosDefault);
});
}
@end