From 442efb874e6959fd8e4523acdb5905b4a3ff19a7 Mon Sep 17 00:00:00 2001 From: Sam Edson Date: Thu, 15 Dec 2022 13:55:31 -0500 Subject: [PATCH] [Sessions] Add Swift Package Manager tests for Sessions (#10572) --- .github/workflows/sessions.yml | 36 ++++----- FirebaseSessions.podspec | 4 +- .../Sources/ApplicationInfo.swift | 11 ++- .../Development/DevEventConsoleLogger.swift | 4 + .../NanoPB+CustomStringConvertible.swift | 4 + FirebaseSessions/Sources/NetworkInfo.swift | 10 ++- .../Sources/SessionInitiator.swift | 4 +- .../Sources/SessionStartEvent.swift | 11 ++- .../Sources/SettingsDownloadClient.swift | 6 +- .../NanoPB/FIRSESNanoPBHelpers.h | 2 + .../NanoPB/FIRSESNanoPBHelpers.m | 4 +- .../Protogen/nanopb/sessions.nanopb.c | 2 +- .../Protogen/nanopb/sessions.nanopb.h | 0 .../Unit/Mocks/MockApplicationInfo.swift | 6 +- .../Mocks/MockInstallationsProtocol.swift | 2 +- .../Tests/Unit/Mocks/MockNetworkInfo.swift | 6 +- .../Tests/Unit/SessionStartEventTests.swift | 10 ++- .../Tests/Unit/TestNanoPBHelpers.swift | 4 + FirebaseSessions/generate_protos.sh | 4 +- Package.swift | 67 +++++++++++++++- SwiftPMTests/swift-test/all-imports.swift | 1 + .../FirebaseSessionsUnit.xcscheme | 77 +++++++++++++++++++ 22 files changed, 238 insertions(+), 37 deletions(-) rename FirebaseSessions/{Sources => SourcesObjC}/NanoPB/FIRSESNanoPBHelpers.h (99%) rename FirebaseSessions/{Sources => SourcesObjC}/NanoPB/FIRSESNanoPBHelpers.m (97%) rename FirebaseSessions/{ => SourcesObjC}/Protogen/nanopb/sessions.nanopb.c (99%) rename FirebaseSessions/{ => SourcesObjC}/Protogen/nanopb/sessions.nanopb.h (100%) create mode 100644 scripts/spm_test_schemes/FirebaseSessionsUnit.xcscheme diff --git a/.github/workflows/sessions.yml b/.github/workflows/sessions.yml index 9bd711f3a7..2b007cbf27 100644 --- a/.github/workflows/sessions.yml +++ b/.github/workflows/sessions.yml @@ -35,26 +35,22 @@ jobs: run: | scripts/third_party/travis/retry.sh scripts/pod_lib_lint.rb FirebaseSessions.podspec --platforms=${{ matrix.target }} - # - # Uncomment below when Swift Package Manager is implemented - # - # spm: - # # Don't run on private repo unless it is a PR. - # if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' - # runs-on: macos-12 - # strategy: - # matrix: - # target: [iOS, tvOS, macOS, catalyst, watchOS] - # steps: - # - uses: actions/checkout@v3 - # - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126 - # with: - # cache_key: ${{ matrix.os }} - # - name: Initialize xcodebuild - # run: scripts/setup_spm_tests.sh - # - name: Unit Tests - # run: scripts/third_party/travis/retry.sh ./scripts/build.sh FirebaseSessions ${{ matrix.target }} spmbuildonly - + spm: + # Don't run on private repo unless it is a PR. + if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' + runs-on: macos-12 + strategy: + matrix: + target: [iOS, tvOS, macOS, catalyst, watchOS] + steps: + - uses: actions/checkout@v3 + - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126 + with: + cache_key: ${{ matrix.os }} + - name: Initialize xcodebuild + run: scripts/setup_spm_tests.sh + - name: Unit Tests + run: scripts/third_party/travis/retry.sh ./scripts/build.sh FirebaseSessionsUnit ${{ matrix.target }} spm catalyst: # Don't run on private repo unless it is a PR. diff --git a/FirebaseSessions.podspec b/FirebaseSessions.podspec index 663d48c2aa..b0392e0fe5 100644 --- a/FirebaseSessions.podspec +++ b/FirebaseSessions.podspec @@ -35,8 +35,8 @@ Pod::Spec.new do |s| base_dir = "FirebaseSessions/" s.source_files = [ - base_dir + 'Sources/**/*.{swift,h,m}', - base_dir + 'Protogen/**/*.{c,h,m,mm}', + base_dir + 'Sources/**/*.{swift}', + base_dir + 'SourcesObjC/**/*.{c,h,m,mm}', ] s.dependency 'FirebaseCore', '~> 10.0' diff --git a/FirebaseSessions/Sources/ApplicationInfo.swift b/FirebaseSessions/Sources/ApplicationInfo.swift index 448d1089f1..2aae94c3e9 100644 --- a/FirebaseSessions/Sources/ApplicationInfo.swift +++ b/FirebaseSessions/Sources/ApplicationInfo.swift @@ -16,7 +16,16 @@ import Foundation @_implementationOnly import FirebaseCore -@_implementationOnly import GoogleUtilities + +#if SWIFT_PACKAGE + import FirebaseSessionsObjC +#endif // SWIFT_PACKAGE + +#if SWIFT_PACKAGE + @_implementationOnly import GoogleUtilities_Environment +#else + @_implementationOnly import GoogleUtilities +#endif // SWIFT_PACKAGE /// Development environment for the application. enum DevEnvironment: String { diff --git a/FirebaseSessions/Sources/Development/DevEventConsoleLogger.swift b/FirebaseSessions/Sources/Development/DevEventConsoleLogger.swift index 7b99ba3214..135203e663 100644 --- a/FirebaseSessions/Sources/Development/DevEventConsoleLogger.swift +++ b/FirebaseSessions/Sources/Development/DevEventConsoleLogger.swift @@ -15,6 +15,10 @@ import Foundation +#if SWIFT_PACKAGE + import FirebaseSessionsObjC +#endif // SWIFT_PACKAGE + class DevEventConsoleLogger: EventGDTLoggerProtocol { private let commandLineArgument = "-FIRSessionsDebugEvents" diff --git a/FirebaseSessions/Sources/Development/NanoPB+CustomStringConvertible.swift b/FirebaseSessions/Sources/Development/NanoPB+CustomStringConvertible.swift index 36cf9801b5..d2c4914f3d 100644 --- a/FirebaseSessions/Sources/Development/NanoPB+CustomStringConvertible.swift +++ b/FirebaseSessions/Sources/Development/NanoPB+CustomStringConvertible.swift @@ -15,6 +15,10 @@ import Foundation +#if SWIFT_PACKAGE + import FirebaseSessionsObjC +#endif // SWIFT_PACKAGE + /// /// These extensions allows us to console log properties of our Session Events /// proto for development and debugging purposes without having to call decode diff --git a/FirebaseSessions/Sources/NetworkInfo.swift b/FirebaseSessions/Sources/NetworkInfo.swift index 36f9e50541..ea9b858383 100644 --- a/FirebaseSessions/Sources/NetworkInfo.swift +++ b/FirebaseSessions/Sources/NetworkInfo.swift @@ -15,7 +15,15 @@ import Foundation -@_implementationOnly import GoogleUtilities +#if SWIFT_PACKAGE + import FirebaseSessionsObjC +#endif // SWIFT_PACKAGE + +#if SWIFT_PACKAGE + @_implementationOnly import GoogleUtilities_Environment +#else + @_implementationOnly import GoogleUtilities +#endif // SWIFT_PACKAGE protocol NetworkInfoProtocol { var mobileCountryCode: String? { get } diff --git a/FirebaseSessions/Sources/SessionInitiator.swift b/FirebaseSessions/Sources/SessionInitiator.swift index c85ac4e9ec..3f2aef9c1d 100644 --- a/FirebaseSessions/Sources/SessionInitiator.swift +++ b/FirebaseSessions/Sources/SessionInitiator.swift @@ -13,7 +13,9 @@ // limitations under the License. import Foundation -#if os(macOS) +#if os(iOS) || os(tvOS) + import UIKit +#elseif os(macOS) import Cocoa import AppKit #elseif os(watchOS) diff --git a/FirebaseSessions/Sources/SessionStartEvent.swift b/FirebaseSessions/Sources/SessionStartEvent.swift index 65988d5773..df14635a06 100644 --- a/FirebaseSessions/Sources/SessionStartEvent.swift +++ b/FirebaseSessions/Sources/SessionStartEvent.swift @@ -16,7 +16,16 @@ import Foundation @_implementationOnly import GoogleDataTransport -@_implementationOnly import GoogleUtilities + +#if SWIFT_PACKAGE + import FirebaseSessionsObjC +#endif // SWIFT_PACKAGE + +#if SWIFT_PACKAGE + @_implementationOnly import GoogleUtilities_Environment +#else + @_implementationOnly import GoogleUtilities +#endif // SWIFT_PACKAGE /// /// SessionStartEvent is responsible for: diff --git a/FirebaseSessions/Sources/SettingsDownloadClient.swift b/FirebaseSessions/Sources/SettingsDownloadClient.swift index a1b987453d..acb89f49b9 100644 --- a/FirebaseSessions/Sources/SettingsDownloadClient.swift +++ b/FirebaseSessions/Sources/SettingsDownloadClient.swift @@ -15,7 +15,11 @@ import Foundation -@_implementationOnly import GoogleUtilities +#if SWIFT_PACKAGE + @_implementationOnly import GoogleUtilities_Environment +#else + @_implementationOnly import GoogleUtilities +#endif // SWIFT_PACKAGE protocol SettingsDownloadClient { func fetch(completion: @escaping (Result<[String: Any], Error>) -> Void) diff --git a/FirebaseSessions/Sources/NanoPB/FIRSESNanoPBHelpers.h b/FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.h similarity index 99% rename from FirebaseSessions/Sources/NanoPB/FIRSESNanoPBHelpers.h rename to FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.h index 65c750caff..fb8c6411b3 100644 --- a/FirebaseSessions/Sources/NanoPB/FIRSESNanoPBHelpers.h +++ b/FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.h @@ -16,6 +16,8 @@ #ifndef FIRSESNanoPBHelpers_h #define FIRSESNanoPBHelpers_h +#import + #import #if __has_include("CoreTelephony/CTTelephonyNetworkInfo.h") && !TARGET_OS_MACCATALYST && \ !TARGET_OS_OSX && !TARGET_OS_TV diff --git a/FirebaseSessions/Sources/NanoPB/FIRSESNanoPBHelpers.m b/FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.m similarity index 97% rename from FirebaseSessions/Sources/NanoPB/FIRSESNanoPBHelpers.m rename to FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.m index a39c631e85..f45a8d198d 100644 --- a/FirebaseSessions/Sources/NanoPB/FIRSESNanoPBHelpers.m +++ b/FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.m @@ -17,9 +17,9 @@ #import -#import "FirebaseSessions/Sources/NanoPB/FIRSESNanoPBHelpers.h" +#import "FirebaseSessions/SourcesObjC/NanoPB/FIRSESNanoPBHelpers.h" -#import "FirebaseSessions/Protogen/nanopb/sessions.nanopb.h" +#import "FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.h" #import #import diff --git a/FirebaseSessions/Protogen/nanopb/sessions.nanopb.c b/FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.c similarity index 99% rename from FirebaseSessions/Protogen/nanopb/sessions.nanopb.c rename to FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.c index 38cb06da06..aaa1db6f5c 100644 --- a/FirebaseSessions/Protogen/nanopb/sessions.nanopb.c +++ b/FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.c @@ -17,7 +17,7 @@ /* Automatically generated nanopb constant definitions */ /* Generated by nanopb-0.3.9.9 */ -#include "sessions.nanopb.h" +#include "FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.h" /* @@protoc_insertion_point(includes) */ #if PB_PROTO_HEADER_VERSION != 30 diff --git a/FirebaseSessions/Protogen/nanopb/sessions.nanopb.h b/FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.h similarity index 100% rename from FirebaseSessions/Protogen/nanopb/sessions.nanopb.h rename to FirebaseSessions/SourcesObjC/Protogen/nanopb/sessions.nanopb.h diff --git a/FirebaseSessions/Tests/Unit/Mocks/MockApplicationInfo.swift b/FirebaseSessions/Tests/Unit/Mocks/MockApplicationInfo.swift index 4eb60ed645..3b6a4bfcee 100644 --- a/FirebaseSessions/Tests/Unit/Mocks/MockApplicationInfo.swift +++ b/FirebaseSessions/Tests/Unit/Mocks/MockApplicationInfo.swift @@ -15,7 +15,11 @@ import Foundation -@_implementationOnly import GoogleUtilities +#if SWIFT_PACKAGE + @_implementationOnly import GoogleUtilities_Environment +#else + @_implementationOnly import GoogleUtilities +#endif // SWIFT_PACKAGE @testable import FirebaseSessions diff --git a/FirebaseSessions/Tests/Unit/Mocks/MockInstallationsProtocol.swift b/FirebaseSessions/Tests/Unit/Mocks/MockInstallationsProtocol.swift index dd524df3e8..0abfdaf244 100644 --- a/FirebaseSessions/Tests/Unit/Mocks/MockInstallationsProtocol.swift +++ b/FirebaseSessions/Tests/Unit/Mocks/MockInstallationsProtocol.swift @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import FirebaseInstallations +@_implementationOnly import FirebaseInstallations @testable import FirebaseSessions diff --git a/FirebaseSessions/Tests/Unit/Mocks/MockNetworkInfo.swift b/FirebaseSessions/Tests/Unit/Mocks/MockNetworkInfo.swift index 5f5b71e7fd..2a8380dfbf 100644 --- a/FirebaseSessions/Tests/Unit/Mocks/MockNetworkInfo.swift +++ b/FirebaseSessions/Tests/Unit/Mocks/MockNetworkInfo.swift @@ -15,7 +15,11 @@ import Foundation -@_implementationOnly import GoogleUtilities +#if SWIFT_PACKAGE + @_implementationOnly import GoogleUtilities_Environment +#else + @_implementationOnly import GoogleUtilities +#endif // SWIFT_PACKAGE @testable import FirebaseSessions diff --git a/FirebaseSessions/Tests/Unit/SessionStartEventTests.swift b/FirebaseSessions/Tests/Unit/SessionStartEventTests.swift index efd038dc44..600e7f6b3f 100644 --- a/FirebaseSessions/Tests/Unit/SessionStartEventTests.swift +++ b/FirebaseSessions/Tests/Unit/SessionStartEventTests.swift @@ -15,7 +15,15 @@ import XCTest -@_implementationOnly import GoogleUtilities +#if SWIFT_PACKAGE + import FirebaseSessionsObjC +#endif // SWIFT_PACKAGE + +#if SWIFT_PACKAGE + @_implementationOnly import GoogleUtilities_Environment +#else + @_implementationOnly import GoogleUtilities +#endif // SWIFT_PACKAGE @testable import FirebaseSessions diff --git a/FirebaseSessions/Tests/Unit/TestNanoPBHelpers.swift b/FirebaseSessions/Tests/Unit/TestNanoPBHelpers.swift index 3b7184beec..9dacb8390c 100644 --- a/FirebaseSessions/Tests/Unit/TestNanoPBHelpers.swift +++ b/FirebaseSessions/Tests/Unit/TestNanoPBHelpers.swift @@ -15,6 +15,10 @@ import XCTest +#if SWIFT_PACKAGE + import FirebaseSessionsObjC +#endif // SWIFT_PACKAGE + @testable import FirebaseSessions // The file and line fields in this function capture the file and line of the diff --git a/FirebaseSessions/generate_protos.sh b/FirebaseSessions/generate_protos.sh index 49d1f5aa5b..f1b31829bd 100755 --- a/FirebaseSessions/generate_protos.sh +++ b/FirebaseSessions/generate_protos.sh @@ -19,7 +19,7 @@ readonly DIR="$( git rev-parse --show-toplevel )" readonly LIBRARY_DIR="${DIR}/FirebaseSessions/Sources/" readonly PROTO_DIR="${DIR}/FirebaseSessions/ProtoSupport/Protos/" -readonly PROTOGEN_DIR="${DIR}/FirebaseSessions/Protogen/" -readonly INCLUDE_PREFIX="FirebaseSessions/Protogen/nanopb/" +readonly PROTOGEN_DIR="${DIR}/FirebaseSessions/SourcesObjC/Protogen/" +readonly INCLUDE_PREFIX="FirebaseSessions/SourcesObjC/Protogen/nanopb/" ./scripts/nanopb/generate_protos.sh "$PROTO_DIR" "$PROTOGEN_DIR" "$INCLUDE_PREFIX" diff --git a/Package.swift b/Package.swift index e83ee9953b..4674ff8f04 100644 --- a/Package.swift +++ b/Package.swift @@ -160,7 +160,7 @@ let package = Package( .package( name: "GoogleUtilities", url: "https://github.com/google/GoogleUtilities.git", - "7.9.0" ..< "8.0.0" + "7.10.0" ..< "8.0.0" ), .package( name: "GTMSessionFetcher", @@ -1080,6 +1080,70 @@ let package = Package( ] ), + // MARK: - Firebase Sessions + + .target( + name: "FirebaseSessions", + dependencies: [ + "FirebaseCore", + "FirebaseInstallations", + "FirebaseCoreExtension", + "FirebaseSessionsObjC", + .product(name: "GoogleDataTransport", package: "GoogleDataTransport"), + .product(name: "GULEnvironment", package: "GoogleUtilities"), + ], + path: "FirebaseSessions/Sources", + cSettings: [ + .headerSearchPath(".."), + .define("DISPLAY_VERSION", to: firebaseVersion), + .define("PB_FIELD_32BIT", to: "1"), + .define("PB_NO_PACKED_STRUCTS", to: "1"), + .define("PB_ENABLE_MALLOC", to: "1"), + ], + linkerSettings: [ + .linkedFramework("Security"), + .linkedFramework("SystemConfiguration", .when(platforms: [.iOS, .macOS, .tvOS])), + ] + ), + // The Sessions SDK is Swift-first with Objective-C code to support + // nanopb. Because Swift Package Manager doesn't support mixed + // language targets, the ObjC code has been extracted out into + // a separate target. + .target( + name: "FirebaseSessionsObjC", + dependencies: [ + .product(name: "GULEnvironment", package: "GoogleUtilities"), + .product(name: "nanopb", package: "nanopb"), + ], + path: "FirebaseSessions", + exclude: [ + "README.md", + "Sources/", + "Tests/", + "ProtoSupport/", + "generate_project.sh", + "generate_protos.sh", + "generate_testapp.sh", + ], + publicHeadersPath: "SourcesObjC", + cSettings: [ + .headerSearchPath(".."), + .define("DISPLAY_VERSION", to: firebaseVersion), + .define("PB_FIELD_32BIT", to: "1"), + .define("PB_NO_PACKED_STRUCTS", to: "1"), + .define("PB_ENABLE_MALLOC", to: "1"), + ], + linkerSettings: [ + .linkedFramework("Security"), + .linkedFramework("SystemConfiguration", .when(platforms: [.iOS, .macOS, .tvOS])), + ] + ), + .testTarget( + name: "FirebaseSessionsUnit", + dependencies: ["FirebaseSessions"], + path: "FirebaseSessions/Tests/Unit" + ), + // MARK: - Firebase Storage .target( @@ -1146,6 +1210,7 @@ let package = Package( .target(name: "FirebasePerformance", condition: .when(platforms: [.iOS, .tvOS])), "FirebaseRemoteConfig", + "FirebaseSessions", "FirebaseStorage", .product(name: "nanopb", package: "nanopb"), ], diff --git a/SwiftPMTests/swift-test/all-imports.swift b/SwiftPMTests/swift-test/all-imports.swift index 72434b8e5b..0996dec53d 100644 --- a/SwiftPMTests/swift-test/all-imports.swift +++ b/SwiftPMTests/swift-test/all-imports.swift @@ -38,6 +38,7 @@ import FirebaseMessaging import FirebasePerformance #endif import FirebaseRemoteConfig +import FirebaseSessions import FirebaseStorage import GoogleDataTransport import GoogleUtilities_AppDelegateSwizzler diff --git a/scripts/spm_test_schemes/FirebaseSessionsUnit.xcscheme b/scripts/spm_test_schemes/FirebaseSessionsUnit.xcscheme new file mode 100644 index 0000000000..e21757f9b3 --- /dev/null +++ b/scripts/spm_test_schemes/FirebaseSessionsUnit.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +