| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- //
- // Copyright 2022 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
- #if SWIFT_PACKAGE
- import FirebaseSessionsObjC
- #endif // SWIFT_PACKAGE
- @testable import FirebaseSessions
- final class FirebaseSessionsTestsBase_DataCollection: FirebaseSessionsTestsBase {
- // Ensure that for all subscribers, that the data collection state is correctly set.
- func assertEventDataCollectionCorrect(subscribedSDKs: [SessionsSubscriber]) {
- guard let loggedEvent = mockCoordinator.loggedEvent else {
- XCTFail(
- "Sessions had a successful result, but the mock Coordinator did not have a loggedEvent set"
- )
- return
- }
- let protoDataCollection = loggedEvent.proto.session_data.data_collection_status
- // Look through all possible subscribers, not just the ones subscribed in the test
- for subscriberSDK in allSubscribers {
- // Check if the subscriber was subscribed or not, because non-subscribers should
- // have their data collection state set to UNKNOWN
- let isSubscribed = subscribedSDKs.contains { subscriber in
- subscriber.sessionsSubscriberName == subscriberSDK.sessionsSubscriberName
- }
- switch subscriberSDK.sessionsSubscriberName {
- case .Crashlytics:
- assertEventDataCollectionProtoEqual(
- isDataCollectionEnabled: subscriberSDK.isDataCollectionEnabled,
- isSubscribed: isSubscribed,
- protoState: protoDataCollection.crashlytics
- )
- case .Performance:
- assertEventDataCollectionProtoEqual(
- isDataCollectionEnabled: subscriberSDK.isDataCollectionEnabled,
- isSubscribed: isSubscribed,
- protoState: protoDataCollection.performance
- )
- case .Unknown:
- XCTFail("Sessions subscribed to with 'Unknown' Subscriber Name")
- }
- }
- }
- func assertEventDataCollectionProtoEqual(isDataCollectionEnabled: Bool,
- isSubscribed: Bool,
- protoState: firebase_appquality_sessions_DataCollectionState) {
- if !isSubscribed {
- XCTAssertEqual(
- protoState,
- firebase_appquality_sessions_DataCollectionState_COLLECTION_SDK_NOT_INSTALLED
- )
- } else if isDataCollectionEnabled {
- XCTAssertEqual(
- protoState,
- firebase_appquality_sessions_DataCollectionState_COLLECTION_ENABLED
- )
- } else {
- XCTAssertEqual(
- protoState,
- firebase_appquality_sessions_DataCollectionState_COLLECTION_DISABLED
- )
- }
- }
- // MARK: - Test Data Collection
- func test_subscriberWithDataCollectionEnabled_logsSessionEvent() {
- runSessionsSDK(
- subscriberSDKs: [
- mockCrashlyticsSubscriber,
- ], preSessionsInit: { _ in
- // Nothing
- }, postSessionsInit: {
- sessions.register(subscriber: self.mockCrashlyticsSubscriber)
- // Sessions hasn't logged yet because no Subscriber SDKs have registered
- XCTAssertNil(self.mockCoordinator.loggedEvent)
- }, postLogEvent: { result, subscriberSDKs in
- // Make sure the SDK reported success, we logged an event and
- // Settings fetched new configs
- self.assertSuccess(result: result)
- self.assertEventDataCollectionCorrect(subscribedSDKs: subscriberSDKs)
- XCTAssertTrue(self.mockSettings.updateSettingsCalled)
- XCTAssertNotNil(self.mockCoordinator.loggedEvent)
- }
- )
- }
- func test_subscribersSomeDataCollectionDisabled_logsSessionEvent() {
- runSessionsSDK(
- subscriberSDKs: [
- mockCrashlyticsSubscriber,
- mockPerformanceSubscriber,
- ], preSessionsInit: { _ in
- // Same as above, but this time we've disabled data collection in
- // only one of the subscribers
- self.mockCrashlyticsSubscriber.isDataCollectionEnabled = false
- }, postSessionsInit: {
- // Register the subscribers
- sessions.register(subscriber: self.mockPerformanceSubscriber)
- sessions.register(subscriber: self.mockCrashlyticsSubscriber)
- }, postLogEvent: { result, subscriberSDKs in
- // Make sure the SDK reported success, we logged an event and
- // Settings fetched new configs
- self.assertSuccess(result: result)
- self.assertEventDataCollectionCorrect(subscribedSDKs: subscriberSDKs)
- XCTAssertTrue(self.mockSettings.updateSettingsCalled)
- XCTAssertNotNil(self.mockCoordinator.loggedEvent)
- }
- )
- }
- func test_subscribersAllDataCollectionDisabled_doesNotLogSessionEvent() {
- runSessionsSDK(
- subscriberSDKs: [
- mockCrashlyticsSubscriber,
- mockPerformanceSubscriber,
- ], preSessionsInit: { _ in
- // We've disabled data collection in all our Subscriber SDKs
- self.mockCrashlyticsSubscriber.isDataCollectionEnabled = false
- self.mockPerformanceSubscriber.isDataCollectionEnabled = false
- }, postSessionsInit: {
- // Register the subscribers
- sessions.register(subscriber: self.mockCrashlyticsSubscriber)
- sessions.register(subscriber: self.mockPerformanceSubscriber)
- }, postLogEvent: { result, subscriberSDKs in
- // Make sure we failed with the correct error
- self.assertFailure(result: result, expectedError: .DataCollectionError)
- // Make sure we didn't do any data collection
- XCTAssertFalse(self.mockSettings.updateSettingsCalled)
- XCTAssertNil(self.mockCoordinator.loggedEvent)
- }
- )
- }
- func test_defaultSamplingRate_isSetInProto() {
- runSessionsSDK(
- subscriberSDKs: [
- mockCrashlyticsSubscriber,
- ], preSessionsInit: { _ in
- // Nothing
- }, postSessionsInit: {
- sessions.register(subscriber: self.mockCrashlyticsSubscriber)
- // Nothing
- }, postLogEvent: { result, subscriberSDKs in
- // Make sure we set the sampling rate in the proto
- XCTAssertEqual(
- self.mockCoordinator.loggedEvent?.proto.session_data.data_collection_status
- .session_sampling_rate,
- 1.0
- )
- }
- )
- }
- }
|