From ea27540bd0713d2baa94f51abec730f6092d6782 Mon Sep 17 00:00:00 2001 From: Austin Benoit Date: Tue, 2 Dec 2025 14:13:20 -0500 Subject: [PATCH 1/6] fix: add in test for the DLL --- analytics/integration_test/CMakeLists.txt | 1 + .../integration_test/src/integration_test.cc | 9 ++++++ analytics/src/analytics_android.cc | 3 ++ analytics/src/analytics_desktop.cc | 11 +++++++ analytics/src/analytics_internal.h | 32 +++++++++++++++++++ analytics/src/analytics_ios.mm | 3 ++ scripts/gha/build_testapps.py | 2 +- 7 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 analytics/src/analytics_internal.h diff --git a/analytics/integration_test/CMakeLists.txt b/analytics/integration_test/CMakeLists.txt index 3a91d28c84..fbb7313163 100644 --- a/analytics/integration_test/CMakeLists.txt +++ b/analytics/integration_test/CMakeLists.txt @@ -83,6 +83,7 @@ set(FIREBASE_INTEGRATION_TEST_SRCS # The include directory for the testapp. include_directories(src) +include_directories(${FIREBASE_CPP_SDK_DIR}) # Firebase C++ SDK requires C++14. set (CMAKE_CXX_STANDARD 14) diff --git a/analytics/integration_test/src/integration_test.cc b/analytics/integration_test/src/integration_test.cc index 81ad49466b..6f0f29c268 100644 --- a/analytics/integration_test/src/integration_test.cc +++ b/analytics/integration_test/src/integration_test.cc @@ -27,6 +27,7 @@ #include "firebase/analytics/user_property_names.h" #include "firebase/app.h" #include "firebase/util.h" +#include "analytics/src/analytics_internal.h" #include "firebase_test_framework.h" // NOLINT // The TO_STRING macro is useful for command line defined strings as the quotes @@ -353,4 +354,12 @@ TEST_F(FirebaseAnalyticsTest, TestSetConsent) { did_test_setconsent_ = true; } +TEST_F(FirebaseAnalyticsTest, TestIsAnalyticsDllLoaded) { +#if defined(_WIN32) + EXPECT_TRUE(firebase::analytics::internal::IsAnalyticsDllLoaded()); +#else + GTEST_SKIP(); +#endif // defined(_WIN32) +} + } // namespace firebase_testapp_automated diff --git a/analytics/src/analytics_android.cc b/analytics/src/analytics_android.cc index e170f91beb..6c559603f6 100644 --- a/analytics/src/analytics_android.cc +++ b/analytics/src/analytics_android.cc @@ -23,6 +23,7 @@ #include "analytics/src/analytics_common.h" #include "analytics/src/include/firebase/analytics.h" +#include "analytics/src/analytics_internal.h" #include "app/src/assert.h" #include "app/src/include/firebase/app.h" #include "app/src/include/firebase/version.h" @@ -165,6 +166,8 @@ namespace internal { // Determine whether the analytics module is initialized. bool IsInitialized() { return g_app != nullptr; } +bool IsAnalyticsDllLoaded() { return false; } + } // namespace internal // Clean up the API. diff --git a/analytics/src/analytics_desktop.cc b/analytics/src/analytics_desktop.cc index 08b2b090cb..2dd9a9ab27 100644 --- a/analytics/src/analytics_desktop.cc +++ b/analytics/src/analytics_desktop.cc @@ -25,6 +25,7 @@ #include "app/src/include/firebase/future.h" #include "app/src/include/firebase/variant.h" #include "app/src/log.h" +#include "analytics/src/analytics_internal.h" #if defined(_WIN32) #include @@ -41,6 +42,16 @@ namespace analytics { static HMODULE g_analytics_module = 0; #endif // defined(_WIN32) +namespace internal { +bool IsAnalyticsDllLoaded() { +#if defined(_WIN32) + return g_analytics_module != 0; +#else + return false; +#endif // defined(_WIN32) +} +} // namespace internal + // Future data for analytics. // This is initialized in `Initialize()` and cleaned up in `Terminate()`. static bool g_initialized = false; diff --git a/analytics/src/analytics_internal.h b/analytics/src/analytics_internal.h new file mode 100644 index 0000000000..986d723e2a --- /dev/null +++ b/analytics/src/analytics_internal.h @@ -0,0 +1,32 @@ +// Copyright 2025 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. + +#ifndef FIREBASE_ANALYTICS_SRC_ANALYTICS_INTERNAL_H_ +#define FIREBASE_ANALYTICS_SRC_ANALYTICS_INTERNAL_H_ + +namespace firebase { +namespace analytics { +namespace internal { + +// Checks if the Analytics DLL is loaded. +// Returns true if the DLL is loaded and functions are available. +// Returns false otherwise (e.g. on non-Windows desktop platforms or if loading +// failed). +bool IsAnalyticsDllLoaded(); + +} // namespace internal +} // namespace analytics +} // namespace firebase + +#endif // FIREBASE_ANALYTICS_SRC_ANALYTICS_INTERNAL_H_ diff --git a/analytics/src/analytics_ios.mm b/analytics/src/analytics_ios.mm index 3ca93d9326..9341cd49cf 100644 --- a/analytics/src/analytics_ios.mm +++ b/analytics/src/analytics_ios.mm @@ -23,6 +23,7 @@ #include "analytics/src/include/firebase/analytics.h" #include "analytics/src/analytics_common.h" +#include "analytics/src/analytics_internal.h" #include "app/src/assert.h" #include "app/src/include/firebase/internal/mutex.h" #include "app/src/include/firebase/version.h" @@ -133,6 +134,8 @@ void Initialize(const ::firebase::App& app) { // Determine whether the analytics module is initialized. bool IsInitialized() { return g_initialized; } +bool IsAnalyticsDllLoaded() { return false; } + } // namespace internal // Terminate the API. diff --git a/scripts/gha/build_testapps.py b/scripts/gha/build_testapps.py index 867202f71e..8564ade7c1 100644 --- a/scripts/gha/build_testapps.py +++ b/scripts/gha/build_testapps.py @@ -627,7 +627,7 @@ def _build_apple( "--XCodeCPP.frameworks", ",".join(framework_paths) ] # Internal integration tests require the SDK root as an include path. - if repo_dir and api_config.internal_testapp_path: + if repo_dir: xcode_patcher_args.extend(("--XCodeCPP.include", repo_dir)) if os.path.isfile(entitlements_path): # Not all testapps require entitlements logging.info("Entitlements file detected.") From 71746cf8bbdff5efde2627de521abf8aced0e56c Mon Sep 17 00:00:00 2001 From: Austin Benoit Date: Tue, 2 Dec 2025 20:48:47 -0500 Subject: [PATCH 2/6] Add in the DLL copy to the workflow --- .github/workflows/integration_tests.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index f7784c6156..5a75b23e9f 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -356,6 +356,11 @@ jobs: --gha_build \ --arch ${{ matrix.arch }} \ ${additional_flags[*]} + - name: Copy Analytics DLL to test folders (Windows) + if: startsWith(matrix.os, 'windows') + shell: bash + run: | + find "testapps-desktop-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.ssl_variant }}" -name integration_test.exe -exec dirname {} \; | while read dir; do cp analytics/windows/analytics_win.dll "$dir/"; done - name: Upload Desktop Cmake uses: actions/upload-artifact@v4 if: ${{ !cancelled() }} From 64aa94f53d1800753552c9ba5dc16271cd3464c7 Mon Sep 17 00:00:00 2001 From: Austin Benoit Date: Wed, 3 Dec 2025 09:58:42 -0500 Subject: [PATCH 3/6] Fix formatting --- analytics/integration_test/src/integration_test.cc | 2 +- analytics/src/analytics_android.cc | 2 +- analytics/src/analytics_desktop.cc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/analytics/integration_test/src/integration_test.cc b/analytics/integration_test/src/integration_test.cc index 6f0f29c268..63f1bdc9c9 100644 --- a/analytics/integration_test/src/integration_test.cc +++ b/analytics/integration_test/src/integration_test.cc @@ -20,6 +20,7 @@ #include #include +#include "analytics/src/analytics_internal.h" #include "app_framework.h" // NOLINT #include "firebase/analytics.h" #include "firebase/analytics/event_names.h" @@ -27,7 +28,6 @@ #include "firebase/analytics/user_property_names.h" #include "firebase/app.h" #include "firebase/util.h" -#include "analytics/src/analytics_internal.h" #include "firebase_test_framework.h" // NOLINT // The TO_STRING macro is useful for command line defined strings as the quotes diff --git a/analytics/src/analytics_android.cc b/analytics/src/analytics_android.cc index 6c559603f6..9a4118c3cc 100644 --- a/analytics/src/analytics_android.cc +++ b/analytics/src/analytics_android.cc @@ -22,8 +22,8 @@ #include #include "analytics/src/analytics_common.h" -#include "analytics/src/include/firebase/analytics.h" #include "analytics/src/analytics_internal.h" +#include "analytics/src/include/firebase/analytics.h" #include "app/src/assert.h" #include "app/src/include/firebase/app.h" #include "app/src/include/firebase/version.h" diff --git a/analytics/src/analytics_desktop.cc b/analytics/src/analytics_desktop.cc index 2dd9a9ab27..c9535722fb 100644 --- a/analytics/src/analytics_desktop.cc +++ b/analytics/src/analytics_desktop.cc @@ -19,13 +19,13 @@ #include "analytics/src/analytics_common.h" #include "analytics/src/analytics_desktop_dynamic.h" +#include "analytics/src/analytics_internal.h" #include "analytics/src/include/firebase/analytics.h" #include "app/src/future_manager.h" // For FutureData #include "app/src/include/firebase/app.h" #include "app/src/include/firebase/future.h" #include "app/src/include/firebase/variant.h" #include "app/src/log.h" -#include "analytics/src/analytics_internal.h" #if defined(_WIN32) #include From 904187b8f591b8e04958042e05eecf4d025c6919 Mon Sep 17 00:00:00 2001 From: Austin Benoit Date: Wed, 3 Dec 2025 10:18:51 -0500 Subject: [PATCH 4/6] Consolidate the internal namespace on the analytics_desktop file --- analytics/src/analytics_desktop.cc | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/analytics/src/analytics_desktop.cc b/analytics/src/analytics_desktop.cc index c9535722fb..3e9d22fb52 100644 --- a/analytics/src/analytics_desktop.cc +++ b/analytics/src/analytics_desktop.cc @@ -42,16 +42,6 @@ namespace analytics { static HMODULE g_analytics_module = 0; #endif // defined(_WIN32) -namespace internal { -bool IsAnalyticsDllLoaded() { -#if defined(_WIN32) - return g_analytics_module != 0; -#else - return false; -#endif // defined(_WIN32) -} -} // namespace internal - // Future data for analytics. // This is initialized in `Initialize()` and cleaned up in `Terminate()`. static bool g_initialized = false; @@ -135,6 +125,14 @@ void Initialize(const App& app) { namespace internal { +bool IsAnalyticsDllLoaded() { +#if defined(_WIN32) + return g_analytics_module != 0; +#else + return false; +#endif // defined(_WIN32) +} + // Determine whether the analytics module is initialized. bool IsInitialized() { return g_initialized; } From 3cc127e916c4d5fc136f3dc70dd486c11ccfc1d5 Mon Sep 17 00:00:00 2001 From: Austin Benoit Date: Wed, 3 Dec 2025 16:54:36 -0500 Subject: [PATCH 5/6] Revert "fix: add in test for the DLL" This reverts commit ea27540bd0713d2baa94f51abec730f6092d6782. --- analytics/integration_test/CMakeLists.txt | 1 - .../integration_test/src/integration_test.cc | 8 ----- analytics/src/analytics_android.cc | 3 -- analytics/src/analytics_internal.h | 32 ------------------- analytics/src/analytics_ios.mm | 3 -- scripts/gha/build_testapps.py | 2 +- 6 files changed, 1 insertion(+), 48 deletions(-) delete mode 100644 analytics/src/analytics_internal.h diff --git a/analytics/integration_test/CMakeLists.txt b/analytics/integration_test/CMakeLists.txt index fbb7313163..3a91d28c84 100644 --- a/analytics/integration_test/CMakeLists.txt +++ b/analytics/integration_test/CMakeLists.txt @@ -83,7 +83,6 @@ set(FIREBASE_INTEGRATION_TEST_SRCS # The include directory for the testapp. include_directories(src) -include_directories(${FIREBASE_CPP_SDK_DIR}) # Firebase C++ SDK requires C++14. set (CMAKE_CXX_STANDARD 14) diff --git a/analytics/integration_test/src/integration_test.cc b/analytics/integration_test/src/integration_test.cc index 63f1bdc9c9..ef7ed9bcad 100644 --- a/analytics/integration_test/src/integration_test.cc +++ b/analytics/integration_test/src/integration_test.cc @@ -354,12 +354,4 @@ TEST_F(FirebaseAnalyticsTest, TestSetConsent) { did_test_setconsent_ = true; } -TEST_F(FirebaseAnalyticsTest, TestIsAnalyticsDllLoaded) { -#if defined(_WIN32) - EXPECT_TRUE(firebase::analytics::internal::IsAnalyticsDllLoaded()); -#else - GTEST_SKIP(); -#endif // defined(_WIN32) -} - } // namespace firebase_testapp_automated diff --git a/analytics/src/analytics_android.cc b/analytics/src/analytics_android.cc index 9a4118c3cc..e170f91beb 100644 --- a/analytics/src/analytics_android.cc +++ b/analytics/src/analytics_android.cc @@ -22,7 +22,6 @@ #include #include "analytics/src/analytics_common.h" -#include "analytics/src/analytics_internal.h" #include "analytics/src/include/firebase/analytics.h" #include "app/src/assert.h" #include "app/src/include/firebase/app.h" @@ -166,8 +165,6 @@ namespace internal { // Determine whether the analytics module is initialized. bool IsInitialized() { return g_app != nullptr; } -bool IsAnalyticsDllLoaded() { return false; } - } // namespace internal // Clean up the API. diff --git a/analytics/src/analytics_internal.h b/analytics/src/analytics_internal.h deleted file mode 100644 index 986d723e2a..0000000000 --- a/analytics/src/analytics_internal.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2025 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. - -#ifndef FIREBASE_ANALYTICS_SRC_ANALYTICS_INTERNAL_H_ -#define FIREBASE_ANALYTICS_SRC_ANALYTICS_INTERNAL_H_ - -namespace firebase { -namespace analytics { -namespace internal { - -// Checks if the Analytics DLL is loaded. -// Returns true if the DLL is loaded and functions are available. -// Returns false otherwise (e.g. on non-Windows desktop platforms or if loading -// failed). -bool IsAnalyticsDllLoaded(); - -} // namespace internal -} // namespace analytics -} // namespace firebase - -#endif // FIREBASE_ANALYTICS_SRC_ANALYTICS_INTERNAL_H_ diff --git a/analytics/src/analytics_ios.mm b/analytics/src/analytics_ios.mm index 9341cd49cf..3ca93d9326 100644 --- a/analytics/src/analytics_ios.mm +++ b/analytics/src/analytics_ios.mm @@ -23,7 +23,6 @@ #include "analytics/src/include/firebase/analytics.h" #include "analytics/src/analytics_common.h" -#include "analytics/src/analytics_internal.h" #include "app/src/assert.h" #include "app/src/include/firebase/internal/mutex.h" #include "app/src/include/firebase/version.h" @@ -134,8 +133,6 @@ void Initialize(const ::firebase::App& app) { // Determine whether the analytics module is initialized. bool IsInitialized() { return g_initialized; } -bool IsAnalyticsDllLoaded() { return false; } - } // namespace internal // Terminate the API. diff --git a/scripts/gha/build_testapps.py b/scripts/gha/build_testapps.py index 8564ade7c1..867202f71e 100644 --- a/scripts/gha/build_testapps.py +++ b/scripts/gha/build_testapps.py @@ -627,7 +627,7 @@ def _build_apple( "--XCodeCPP.frameworks", ",".join(framework_paths) ] # Internal integration tests require the SDK root as an include path. - if repo_dir: + if repo_dir and api_config.internal_testapp_path: xcode_patcher_args.extend(("--XCodeCPP.include", repo_dir)) if os.path.isfile(entitlements_path): # Not all testapps require entitlements logging.info("Entitlements file detected.") From 7b81abfdd2ef134623b1500e6fba1cdb4385b15f Mon Sep 17 00:00:00 2001 From: Austin Benoit Date: Wed, 3 Dec 2025 17:14:07 -0500 Subject: [PATCH 6/6] Revert the last of the changes to test dll if is there --- analytics/integration_test/src/integration_test.cc | 1 - analytics/src/analytics_desktop.cc | 9 --------- 2 files changed, 10 deletions(-) diff --git a/analytics/integration_test/src/integration_test.cc b/analytics/integration_test/src/integration_test.cc index ef7ed9bcad..81ad49466b 100644 --- a/analytics/integration_test/src/integration_test.cc +++ b/analytics/integration_test/src/integration_test.cc @@ -20,7 +20,6 @@ #include #include -#include "analytics/src/analytics_internal.h" #include "app_framework.h" // NOLINT #include "firebase/analytics.h" #include "firebase/analytics/event_names.h" diff --git a/analytics/src/analytics_desktop.cc b/analytics/src/analytics_desktop.cc index 3e9d22fb52..08b2b090cb 100644 --- a/analytics/src/analytics_desktop.cc +++ b/analytics/src/analytics_desktop.cc @@ -19,7 +19,6 @@ #include "analytics/src/analytics_common.h" #include "analytics/src/analytics_desktop_dynamic.h" -#include "analytics/src/analytics_internal.h" #include "analytics/src/include/firebase/analytics.h" #include "app/src/future_manager.h" // For FutureData #include "app/src/include/firebase/app.h" @@ -125,14 +124,6 @@ void Initialize(const App& app) { namespace internal { -bool IsAnalyticsDllLoaded() { -#if defined(_WIN32) - return g_analytics_module != 0; -#else - return false; -#endif // defined(_WIN32) -} - // Determine whether the analytics module is initialized. bool IsInitialized() { return g_initialized; }