diff --git a/Android/firebase_dependencies.gradle b/Android/firebase_dependencies.gradle index 4f09733b17..e4b182892f 100644 --- a/Android/firebase_dependencies.gradle +++ b/Android/firebase_dependencies.gradle @@ -77,6 +77,9 @@ class Dependencies { def getAnalytics() { libSet.add('analytics') } + def getAppCheck() { + libSet.add('app_check') + } def getAuth() { libSet.add('auth') } diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 6fc3472ba2..a12d42b2c6 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -493,6 +493,13 @@ if (IOS) ${analytics_generated_headers_dir}/event_names.h ${analytics_generated_headers_dir}/parameter_names.h ${analytics_generated_headers_dir}/user_property_names.h) + set(app_check_HDRS + ${FIREBASE_SOURCE_DIR}/app_check/src/include/firebase/app_check.h + ${FIREBASE_SOURCE_DIR}/app_check/src/include/firebase/app_check/app_attest_provider.h + ${FIREBASE_SOURCE_DIR}/app_check/src/include/firebase/app_check/debug_provider.h + ${FIREBASE_SOURCE_DIR}/app_check/src/include/firebase/app_check/device_check_provider.h + ${FIREBASE_SOURCE_DIR}/app_check/src/include/firebase/app_check/play_integrity_provider.h + ${FIREBASE_SOURCE_DIR}/app_check/src/include/firebase/app_check/safety_net_provider.h) set(auth_HDRS ${FIREBASE_SOURCE_DIR}/auth/src/include/firebase/auth.h ${FIREBASE_SOURCE_DIR}/auth/src/include/firebase/auth/credential.h @@ -565,6 +572,7 @@ if (IOS) src/include/firebase/internal/platform.h ${admob_HDRS} ${analytics_HDRS} + ${app_check_HDRS} ${auth_HDRS} ${database_HDRS} ${dynamic_links_HDRS} diff --git a/app_check/integration_test/AndroidManifest.xml b/app_check/integration_test/AndroidManifest.xml new file mode 100644 index 0000000000..1882a20b62 --- /dev/null +++ b/app_check/integration_test/AndroidManifest.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_check/integration_test/CMakeLists.txt b/app_check/integration_test/CMakeLists.txt new file mode 100644 index 0000000000..d78a43e09f --- /dev/null +++ b/app_check/integration_test/CMakeLists.txt @@ -0,0 +1,227 @@ +# 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. + +# Cmake file for a single C++ integration test build. + +cmake_minimum_required(VERSION 2.8) + +set(FIREBASE_PYTHON_EXECUTABLE "python" CACHE FILEPATH + "The Python interpreter to use, such as one from a venv") + +# User settings for Firebase integration tests. +# Path to Firebase SDK. +# Try to read the path to the Firebase C++ SDK from an environment variable. +if (NOT "$ENV{FIREBASE_CPP_SDK_DIR}" STREQUAL "") + set(DEFAULT_FIREBASE_CPP_SDK_DIR "$ENV{FIREBASE_CPP_SDK_DIR}") +else() + if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/../../cpp_sdk_version.json") + set(DEFAULT_FIREBASE_CPP_SDK_DIR "${CMAKE_CURRENT_LIST_DIR}/../..") + else() + set(DEFAULT_FIREBASE_CPP_SDK_DIR "firebase_cpp_sdk") + endif() +endif() +if ("${FIREBASE_CPP_SDK_DIR}" STREQUAL "") + set(FIREBASE_CPP_SDK_DIR ${DEFAULT_FIREBASE_CPP_SDK_DIR}) +endif() +if(NOT EXISTS ${FIREBASE_CPP_SDK_DIR}) + message(FATAL_ERROR "The Firebase C++ SDK directory does not exist: ${FIREBASE_CPP_SDK_DIR}. See the readme.md for more information") +endif() + +# Copy all prerequisite files for integration tests to run. +if(NOT ANDROID) + if (EXISTS ${CMAKE_CURRENT_LIST_DIR}/../../setup_integration_tests.py) + # If this is running from inside the SDK directory, run the setup script. + execute_process(COMMAND ${FIREBASE_PYTHON_EXECUTABLE} "${CMAKE_CURRENT_LIST_DIR}/../../setup_integration_tests.py" "${CMAKE_CURRENT_LIST_DIR}") + endif() +endif() + +# Windows runtime mode, either MD or MT depending on whether you are using +# /MD or /MT. For more information see: +# https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx +set(MSVC_RUNTIME_MODE MD) + +project(firebase_testapp) + +# Integration test source files. +set(FIREBASE_APP_FRAMEWORK_SRCS + src/app_framework.cc + src/app_framework.h +) + +set(FIREBASE_TEST_FRAMEWORK_SRCS + src/firebase_test_framework.h + src/firebase_test_framework.cc +) + +set(FIREBASE_INTEGRATION_TEST_SRCS + src/integration_test.cc +) + +# The include directory for the testapp. +include_directories(src) + +# Integration test uses some features that require C++ 11, such as lambdas. +set (CMAKE_CXX_STANDARD 11) + +# Download and unpack googletest (and googlemock) at configure time +set(GOOGLETEST_ROOT ${CMAKE_CURRENT_LIST_DIR}/external/googletest) +# Note: Once googletest is downloaded once, it won't be updated or +# downloaded again unless you delete the "external/googletest" +# directory. +if (NOT EXISTS ${GOOGLETEST_ROOT}/src/googletest/src/gtest-all.cc) + configure_file(googletest.cmake + ${CMAKE_CURRENT_LIST_DIR}/external/googletest/CMakeLists.txt COPYONLY) + execute_process(COMMAND ${CMAKE_COMMAND} . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/external/googletest ) + if(result) + message(FATAL_ERROR "CMake step for googletest failed: ${result}") + endif() + execute_process(COMMAND ${CMAKE_COMMAND} --build . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/external/googletest ) + if(result) + message(FATAL_ERROR "Build step for googletest failed: ${result}") + endif() +endif() + +if(ANDROID) + # Build an Android application. + + # Source files used for the Android build. + set(FIREBASE_APP_FRAMEWORK_ANDROID_SRCS + src/android/android_app_framework.cc + ) + + # Source files used for the Android build. + set(FIREBASE_TEST_FRAMEWORK_ANDROID_SRCS + src/android/android_firebase_test_framework.cc + ) + + # Build native_app_glue as a static lib + add_library(native_app_glue STATIC + ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c) + + # Export ANativeActivity_onCreate(), + # Refer to: https://github.com/android-ndk/ndk/issues/381. + set(CMAKE_SHARED_LINKER_FLAGS + "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate") + + add_library(gtest STATIC + ${GOOGLETEST_ROOT}/src/googletest/src/gtest-all.cc) + target_include_directories(gtest + PRIVATE ${GOOGLETEST_ROOT}/src/googletest + PUBLIC ${GOOGLETEST_ROOT}/src/googletest/include) + add_library(gmock STATIC + ${GOOGLETEST_ROOT}/src/googlemock/src/gmock-all.cc) + target_include_directories(gmock + PRIVATE ${GOOGLETEST_ROOT}/src/googletest + PRIVATE ${GOOGLETEST_ROOT}/src/googlemock + PUBLIC ${GOOGLETEST_ROOT}/src/googletest/include + PUBLIC ${GOOGLETEST_ROOT}/src/googlemock/include) + + # Define the target as a shared library, as that is what gradle expects. + set(integration_test_target_name "android_integration_test_main") + add_library(${integration_test_target_name} SHARED + ${FIREBASE_APP_FRAMEWORK_SRCS} + ${FIREBASE_APP_FRAMEWORK_ANDROID_SRCS} + ${FIREBASE_INTEGRATION_TEST_SRCS} + ${FIREBASE_TEST_FRAMEWORK_SRCS} + ${FIREBASE_TEST_FRAMEWORK_ANDROID_SRCS} + ) + + target_include_directories(${integration_test_target_name} PRIVATE + ${ANDROID_NDK}/sources/android/native_app_glue) + + set(ADDITIONAL_LIBS log android atomic native_app_glue) +else() + # Build a desktop application. + add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) + + # Prevent overriding the parent project's compiler/linker + # settings on Windows + set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + + # Add googletest directly to our build. This defines + # the gtest and gtest_main targets. + add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/external/googletest/src + ${CMAKE_CURRENT_LIST_DIR}/external/googletest/build + EXCLUDE_FROM_ALL) + + # The gtest/gtest_main targets carry header search path + # dependencies automatically when using CMake 2.8.11 or + # later. Otherwise we have to add them here ourselves. + if (CMAKE_VERSION VERSION_LESS 2.8.11) + include_directories("${gtest_SOURCE_DIR}/include") + include_directories("${gmock_SOURCE_DIR}/include") + endif() + + # Windows runtime mode, either MD or MT depending on whether you are using + # /MD or /MT. For more information see: + # https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx + set(MSVC_RUNTIME_MODE MD) + + # Platform abstraction layer for the desktop integration test. + set(FIREBASE_APP_FRAMEWORK_DESKTOP_SRCS + src/desktop/desktop_app_framework.cc + ) + + set(integration_test_target_name "integration_test") + add_executable(${integration_test_target_name} + ${FIREBASE_APP_FRAMEWORK_SRCS} + ${FIREBASE_APP_FRAMEWORK_DESKTOP_SRCS} + ${FIREBASE_TEST_FRAMEWORK_SRCS} + ${FIREBASE_INTEGRATION_TEST_SRCS} + ) + + if(APPLE) + set(ADDITIONAL_LIBS + gssapi_krb5 + pthread + "-framework CoreFoundation" + "-framework Foundation" + "-framework GSS" + "-framework Security" + ) + elseif(MSVC) + set(ADDITIONAL_LIBS advapi32 ws2_32 crypt32 iphlpapi psapi userenv shell32) + else() + set(ADDITIONAL_LIBS pthread) + endif() + + # If a config file is present, copy it into the binary location so that it's + # possible to create the default Firebase app. + set(FOUND_JSON_FILE FALSE) + foreach(config "google-services-desktop.json" "google-services.json") + if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/${config}") + add_custom_command( + TARGET ${integration_test_target_name} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + "${CMAKE_CURRENT_LIST_DIR}/${config}" $) + set(FOUND_JSON_FILE TRUE) + break() + endif() + endforeach() + if(NOT FOUND_JSON_FILE) + message(WARNING "Failed to find either google-services-desktop.json or google-services.json. See the readme.md for more information.") + endif() +endif() + +# Add the Firebase libraries to the target using the function from the SDK. +add_subdirectory(${FIREBASE_CPP_SDK_DIR} bin/ EXCLUDE_FROM_ALL) +# Note that firebase_app needs to be last in the list. +set(firebase_libs firebase_app_check firebase_database firebase_auth firebase_app) +set(gtest_libs gtest gmock) +target_link_libraries(${integration_test_target_name} ${firebase_libs} + ${gtest_libs} ${ADDITIONAL_LIBS}) diff --git a/app_check/integration_test/Images.xcassets/AppIcon.appiconset/Contents.json b/app_check/integration_test/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..d8db8d65fd --- /dev/null +++ b/app_check/integration_test/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/app_check/integration_test/Images.xcassets/LaunchImage.launchimage/Contents.json b/app_check/integration_test/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000000..6f870a4629 --- /dev/null +++ b/app_check/integration_test/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,51 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "subtype" : "retina4", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/app_check/integration_test/Info.plist b/app_check/integration_test/Info.plist new file mode 100644 index 0000000000..2b065a657b --- /dev/null +++ b/app_check/integration_test/Info.plist @@ -0,0 +1,40 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + google + CFBundleURLSchemes + + REPLACE_WITH_REVERSED_CLIENT_ID + firebase-game-loop + + + + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + + diff --git a/app_check/integration_test/LaunchScreen.storyboard b/app_check/integration_test/LaunchScreen.storyboard new file mode 100644 index 0000000000..673e0f7e68 --- /dev/null +++ b/app_check/integration_test/LaunchScreen.storyboard @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app_check/integration_test/LibraryManifest.xml b/app_check/integration_test/LibraryManifest.xml new file mode 100644 index 0000000000..d6e23c7191 --- /dev/null +++ b/app_check/integration_test/LibraryManifest.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/app_check/integration_test/Podfile b/app_check/integration_test/Podfile new file mode 100644 index 0000000000..d499882e54 --- /dev/null +++ b/app_check/integration_test/Podfile @@ -0,0 +1,24 @@ +source 'https://github.com/CocoaPods/Specs.git' +# Firebase App Check test application. +use_frameworks! :linkage => :static + +target 'integration_test' do + platform :ios, '11.0' + pod 'Firebase/AppCheck', '10.0.0' + pod 'Firebase/Database', '10.0.0' + pod 'Firebase/Auth', '10.0.0' +end + +target 'integration_test_tvos' do + platform :tvos, '12.0' + pod 'Firebase/AppCheck', '10.0.0' + pod 'Firebase/Database', '10.0.0' + pod 'Firebase/Auth', '10.0.0' +end + +post_install do |installer| + # If this is running from inside the SDK directory, run the setup script. + system("if [[ -r ../../setup_integration_tests.py ]]; then python3 ../../setup_integration_tests.py .; fi") + system("python3 ./download_googletest.py") +end + diff --git a/app_check/integration_test/build.gradle b/app_check/integration_test/build.gradle new file mode 100644 index 0000000000..a98a0ffb87 --- /dev/null +++ b/app_check/integration_test/build.gradle @@ -0,0 +1,100 @@ +// 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. + +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + mavenLocal() + maven { url 'https://maven.google.com' } + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.3.3' + classpath 'com.google.gms:google-services:4.0.1' + } +} + +allprojects { + repositories { + mavenLocal() + maven { url 'https://maven.google.com' } + mavenCentral() + } +} + +apply plugin: 'com.android.application' + +android { + compileOptions { + sourceCompatibility 1.8 + targetCompatibility 1.8 + } + compileSdkVersion 28 + buildToolsVersion '28.0.3' + + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src/android/java'] + res.srcDirs = ['res'] + } + } + + defaultConfig { + applicationId 'com.google.firebase.cpp.appcheck.testapp' + minSdkVersion 19 + targetSdkVersion 28 + versionCode 1 + versionName '1.0' + externalNativeBuild.cmake { + arguments "-DFIREBASE_CPP_SDK_DIR=$gradle.firebase_cpp_sdk_dir", + "-DFIREBASE_INCLUDE_LIBRARY_DEFAULT=OFF", + "-DFIREBASE_INCLUDE_APP_CHECK=ON", + "-DFIREBASE_INCLUDE_AUTH=ON", + "-DFIREBASE_INCLUDE_DATABASE=ON" + } + } + externalNativeBuild.cmake { + path 'CMakeLists.txt' + } + buildTypes { + release { + minifyEnabled true + proguardFile getDefaultProguardFile('proguard-android.txt') + proguardFile file('proguard.pro') + } + } +} + +apply from: "$gradle.firebase_cpp_sdk_dir/Android/firebase_dependencies.gradle" +firebaseCpp.dependencies { + appCheck + auth + database +} + +apply plugin: 'com.google.gms.google-services' + +task copyIntegrationTestFiles(type:Exec) { + // If this is running form inside the SDK directory, run the setup script. + if (project.file('../../setup_integration_tests.py').exists()) { + commandLine 'python', '../../setup_integration_tests.py', project.projectDir.toString() + } + else { + commandLine 'echo', '' + } +} + +build.dependsOn(copyIntegrationTestFiles) diff --git a/app_check/integration_test/googletest.cmake b/app_check/integration_test/googletest.cmake new file mode 100644 index 0000000000..5efa28280b --- /dev/null +++ b/app_check/integration_test/googletest.cmake @@ -0,0 +1,35 @@ +# 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. + +# Download GoogleTest from GitHub as an external project. +# Pin to 1.11.0 because we touch internal GoogleTest structures that could change in the future. + +# This CMake file is taken from: +# https://github.com/google/googletest/blob/master/googletest/README.md#incorporating-into-an-existing-cmake-project + +cmake_minimum_required(VERSION 2.8.2) + +project(googletest-download NONE) + +include(ExternalProject) +ExternalProject_Add(googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG "release-1.11.0" + SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/src" + BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/build" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" +) diff --git a/app_check/integration_test/gradle/wrapper/gradle-wrapper.jar b/app_check/integration_test/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..8c0fb64a86 Binary files /dev/null and b/app_check/integration_test/gradle/wrapper/gradle-wrapper.jar differ diff --git a/app_check/integration_test/gradle/wrapper/gradle-wrapper.properties b/app_check/integration_test/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..9e09cdb6ad --- /dev/null +++ b/app_check/integration_test/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Nov 27 14:03:45 PST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https://services.gradle.org/distributions/gradle-5.6.4-all.zip diff --git a/app_check/integration_test/gradlew b/app_check/integration_test/gradlew new file mode 100755 index 0000000000..9df5d1e6cc --- /dev/null +++ b/app_check/integration_test/gradlew @@ -0,0 +1,178 @@ +#!/usr/bin/env bash +# +# 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. + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/app_check/integration_test/gradlew.bat b/app_check/integration_test/gradlew.bat new file mode 100644 index 0000000000..182682e3ee --- /dev/null +++ b/app_check/integration_test/gradlew.bat @@ -0,0 +1,104 @@ +@rem Copyright 2022 Google LLC +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem http://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/app_check/integration_test/integration_test.xcodeproj/project.pbxproj b/app_check/integration_test/integration_test.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..16cbe44041 --- /dev/null +++ b/app_check/integration_test/integration_test.xcodeproj/project.pbxproj @@ -0,0 +1,605 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 520BC0391C869159008CFBC3 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 520BC0381C869159008CFBC3 /* GoogleService-Info.plist */; }; + 529226D61C85F68000C89379 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 529226D51C85F68000C89379 /* Foundation.framework */; }; + 529226D81C85F68000C89379 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 529226D71C85F68000C89379 /* CoreGraphics.framework */; }; + 529226DA1C85F68000C89379 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 529226D91C85F68000C89379 /* UIKit.framework */; }; + 9F2ABA30267A4720001A35CE /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9F2ABA2E267A4720001A35CE /* Main.storyboard */; }; + 9F2ABA35267A4721001A35CE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9F2ABA33267A4721001A35CE /* LaunchScreen.storyboard */; }; + 9F2ABA3C267A4744001A35CE /* gmock-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = D62CCBBF22F367140099BE9F /* gmock-all.cc */; }; + 9F2ABA3E267A4747001A35CE /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = D67D355622BABD2100292C1D /* gtest-all.cc */; }; + 9F2ABA3F267A474A001A35CE /* app_framework.cc in Sources */ = {isa = PBXBuildFile; fileRef = D6C179EF22CB32A000C2651A /* app_framework.cc */; }; + 9F2ABA40267A474D001A35CE /* firebase_test_framework.cc in Sources */ = {isa = PBXBuildFile; fileRef = D6C179EC22CB323300C2651A /* firebase_test_framework.cc */; }; + 9F2ABA41267A474F001A35CE /* integration_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = D61C5F9222BABAD100A79141 /* integration_test.cc */; }; + 9F4C472E267A4DB6001E25DA /* ios_app_framework.mm in Sources */ = {isa = PBXBuildFile; fileRef = D6C179E722CB322900C2651A /* ios_app_framework.mm */; }; + 9F4C472F267A4DC0001E25DA /* ios_firebase_test_framework.mm in Sources */ = {isa = PBXBuildFile; fileRef = D6C179E822CB322900C2651A /* ios_firebase_test_framework.mm */; }; + BCF6A94C2682C02800578FDD /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 520BC0381C869159008CFBC3 /* GoogleService-Info.plist */; }; + BCF6A94E2682C02E00578FDD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF6A94D2682C02E00578FDD /* Foundation.framework */; }; + BCF6A9502682C03300578FDD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF6A94F2682C03300578FDD /* CoreGraphics.framework */; }; + BCF6A9522682C03700578FDD /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF6A9512682C03700578FDD /* UIKit.framework */; }; + D61C5F8E22BABA9C00A79141 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D61C5F8C22BABA9B00A79141 /* Images.xcassets */; }; + D61C5F9622BABAD200A79141 /* integration_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = D61C5F9222BABAD100A79141 /* integration_test.cc */; }; + D61DACA92819C7610022DDC4 /* empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = D61DACA82819C7610022DDC4 /* empty.swift */; }; + D61DACAA2819C7610022DDC4 /* empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = D61DACA82819C7610022DDC4 /* empty.swift */; }; + D62CCBC022F367140099BE9F /* gmock-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = D62CCBBF22F367140099BE9F /* gmock-all.cc */; }; + D66B16871CE46E8900E5638A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D66B16861CE46E8900E5638A /* LaunchScreen.storyboard */; }; + D67D355822BABD2200292C1D /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = D67D355622BABD2100292C1D /* gtest-all.cc */; }; + D6C179E922CB322900C2651A /* ios_app_framework.mm in Sources */ = {isa = PBXBuildFile; fileRef = D6C179E722CB322900C2651A /* ios_app_framework.mm */; }; + D6C179EA22CB322900C2651A /* ios_firebase_test_framework.mm in Sources */ = {isa = PBXBuildFile; fileRef = D6C179E822CB322900C2651A /* ios_firebase_test_framework.mm */; }; + D6C179EE22CB323300C2651A /* firebase_test_framework.cc in Sources */ = {isa = PBXBuildFile; fileRef = D6C179EC22CB323300C2651A /* firebase_test_framework.cc */; }; + D6C179F022CB32A000C2651A /* app_framework.cc in Sources */ = {isa = PBXBuildFile; fileRef = D6C179EF22CB32A000C2651A /* app_framework.cc */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 520BC0381C869159008CFBC3 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 529226D21C85F68000C89379 /* integration_test.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = integration_test.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 529226D51C85F68000C89379 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 529226D71C85F68000C89379 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 529226D91C85F68000C89379 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 529226EE1C85F68000C89379 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 9F2ABA26267A4720001A35CE /* integration_test_tvos.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = integration_test_tvos.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 9F2ABA2F267A4720001A35CE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 9F2ABA34267A4721001A35CE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + BCF6A94D2682C02E00578FDD /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS14.5.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + BCF6A94F2682C03300578FDD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS14.5.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + BCF6A9512682C03700578FDD /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS14.5.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + D61C5F8C22BABA9B00A79141 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + D61C5F8D22BABA9C00A79141 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D61C5F9222BABAD100A79141 /* integration_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = integration_test.cc; path = src/integration_test.cc; sourceTree = ""; }; + D61DACA82819C7610022DDC4 /* empty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = empty.swift; path = src/empty.swift; sourceTree = ""; }; + D62CCBBF22F367140099BE9F /* gmock-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gmock-all.cc"; path = "external/googletest/src/googlemock/src/gmock-all.cc"; sourceTree = ""; }; + D62CCBC122F367320099BE9F /* gmock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gmock.h; path = external/googletest/src/googlemock/include/gmock/gmock.h; sourceTree = ""; }; + D66B16861CE46E8900E5638A /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; + D67D355622BABD2100292C1D /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gtest-all.cc"; path = "external/googletest/src/googletest/src/gtest-all.cc"; sourceTree = ""; }; + D67D355722BABD2100292C1D /* gtest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gtest.h; path = external/googletest/src/googletest/include/gtest/gtest.h; sourceTree = ""; }; + D6C179E722CB322900C2651A /* ios_app_framework.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ios_app_framework.mm; path = src/ios/ios_app_framework.mm; sourceTree = ""; }; + D6C179E822CB322900C2651A /* ios_firebase_test_framework.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ios_firebase_test_framework.mm; path = src/ios/ios_firebase_test_framework.mm; sourceTree = ""; }; + D6C179EB22CB323300C2651A /* firebase_test_framework.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = firebase_test_framework.h; path = src/firebase_test_framework.h; sourceTree = ""; }; + D6C179EC22CB323300C2651A /* firebase_test_framework.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = firebase_test_framework.cc; path = src/firebase_test_framework.cc; sourceTree = ""; }; + D6C179ED22CB323300C2651A /* app_framework.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = app_framework.h; path = src/app_framework.h; sourceTree = ""; }; + D6C179EF22CB32A000C2651A /* app_framework.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = app_framework.cc; path = src/app_framework.cc; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 529226CF1C85F68000C89379 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 529226D81C85F68000C89379 /* CoreGraphics.framework in Frameworks */, + 529226DA1C85F68000C89379 /* UIKit.framework in Frameworks */, + 529226D61C85F68000C89379 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9F2ABA23267A4720001A35CE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BCF6A9522682C03700578FDD /* UIKit.framework in Frameworks */, + BCF6A9502682C03300578FDD /* CoreGraphics.framework in Frameworks */, + BCF6A94E2682C02E00578FDD /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 529226C91C85F68000C89379 = { + isa = PBXGroup; + children = ( + D61C5F8C22BABA9B00A79141 /* Images.xcassets */, + D61C5F8D22BABA9C00A79141 /* Info.plist */, + D66B16861CE46E8900E5638A /* LaunchScreen.storyboard */, + 520BC0381C869159008CFBC3 /* GoogleService-Info.plist */, + 5292271D1C85FB5500C89379 /* src */, + 9F2ABA27267A4720001A35CE /* integration_test_tvos */, + 529226D41C85F68000C89379 /* Frameworks */, + 529226D31C85F68000C89379 /* Products */, + ); + sourceTree = ""; + }; + 529226D31C85F68000C89379 /* Products */ = { + isa = PBXGroup; + children = ( + 529226D21C85F68000C89379 /* integration_test.app */, + 9F2ABA26267A4720001A35CE /* integration_test_tvos.app */, + ); + name = Products; + sourceTree = ""; + }; + 529226D41C85F68000C89379 /* Frameworks */ = { + isa = PBXGroup; + children = ( + BCF6A9512682C03700578FDD /* UIKit.framework */, + BCF6A94F2682C03300578FDD /* CoreGraphics.framework */, + 529226D51C85F68000C89379 /* Foundation.framework */, + BCF6A94D2682C02E00578FDD /* Foundation.framework */, + 529226D71C85F68000C89379 /* CoreGraphics.framework */, + 529226D91C85F68000C89379 /* UIKit.framework */, + 529226EE1C85F68000C89379 /* XCTest.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 5292271D1C85FB5500C89379 /* src */ = { + isa = PBXGroup; + children = ( + D61DACA82819C7610022DDC4 /* empty.swift */, + D62CCBC122F367320099BE9F /* gmock.h */, + D62CCBBF22F367140099BE9F /* gmock-all.cc */, + D67D355622BABD2100292C1D /* gtest-all.cc */, + D67D355722BABD2100292C1D /* gtest.h */, + D6C179EF22CB32A000C2651A /* app_framework.cc */, + D6C179ED22CB323300C2651A /* app_framework.h */, + D6C179EC22CB323300C2651A /* firebase_test_framework.cc */, + D6C179EB22CB323300C2651A /* firebase_test_framework.h */, + D61C5F9222BABAD100A79141 /* integration_test.cc */, + 5292271E1C85FB5B00C89379 /* ios */, + ); + name = src; + sourceTree = ""; + }; + 5292271E1C85FB5B00C89379 /* ios */ = { + isa = PBXGroup; + children = ( + D6C179E722CB322900C2651A /* ios_app_framework.mm */, + D6C179E822CB322900C2651A /* ios_firebase_test_framework.mm */, + ); + name = ios; + sourceTree = ""; + }; + 9F2ABA27267A4720001A35CE /* integration_test_tvos */ = { + isa = PBXGroup; + children = ( + 9F2ABA2E267A4720001A35CE /* Main.storyboard */, + 9F2ABA33267A4721001A35CE /* LaunchScreen.storyboard */, + ); + path = integration_test_tvos; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 529226D11C85F68000C89379 /* integration_test */ = { + isa = PBXNativeTarget; + buildConfigurationList = 529226F91C85F68000C89379 /* Build configuration list for PBXNativeTarget "integration_test" */; + buildPhases = ( + 529226CE1C85F68000C89379 /* Sources */, + 529226CF1C85F68000C89379 /* Frameworks */, + 529226D01C85F68000C89379 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = integration_test; + productName = testapp; + productReference = 529226D21C85F68000C89379 /* integration_test.app */; + productType = "com.apple.product-type.application"; + }; + 9F2ABA25267A4720001A35CE /* integration_test_tvos */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9F2ABA3B267A4721001A35CE /* Build configuration list for PBXNativeTarget "integration_test_tvos" */; + buildPhases = ( + 9F2ABA22267A4720001A35CE /* Sources */, + 9F2ABA23267A4720001A35CE /* Frameworks */, + 9F2ABA24267A4720001A35CE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = integration_test_tvos; + productName = integration_test_tvos; + productReference = 9F2ABA26267A4720001A35CE /* integration_test_tvos.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 529226CA1C85F68000C89379 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0640; + ORGANIZATIONNAME = Google; + TargetAttributes = { + 529226D11C85F68000C89379 = { + CreatedOnToolsVersion = 6.4; + DevelopmentTeam = EQHXZ8M8AV; + LastSwiftMigration = 1320; + ProvisioningStyle = Automatic; + }; + 9F2ABA25267A4720001A35CE = { + CreatedOnToolsVersion = 12.5; + LastSwiftMigration = 1320; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 529226CD1C85F68000C89379 /* Build configuration list for PBXProject "integration_test" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + Base, + ); + mainGroup = 529226C91C85F68000C89379; + productRefGroup = 529226D31C85F68000C89379 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 529226D11C85F68000C89379 /* integration_test */, + 9F2ABA25267A4720001A35CE /* integration_test_tvos */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 529226D01C85F68000C89379 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D61C5F8E22BABA9C00A79141 /* Images.xcassets in Resources */, + D66B16871CE46E8900E5638A /* LaunchScreen.storyboard in Resources */, + 520BC0391C869159008CFBC3 /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9F2ABA24267A4720001A35CE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BCF6A94C2682C02800578FDD /* GoogleService-Info.plist in Resources */, + 9F2ABA35267A4721001A35CE /* LaunchScreen.storyboard in Resources */, + 9F2ABA30267A4720001A35CE /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 529226CE1C85F68000C89379 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D67D355822BABD2200292C1D /* gtest-all.cc in Sources */, + D62CCBC022F367140099BE9F /* gmock-all.cc in Sources */, + D6C179EA22CB322900C2651A /* ios_firebase_test_framework.mm in Sources */, + D61C5F9622BABAD200A79141 /* integration_test.cc in Sources */, + D6C179E922CB322900C2651A /* ios_app_framework.mm in Sources */, + D61DACA92819C7610022DDC4 /* empty.swift in Sources */, + D6C179F022CB32A000C2651A /* app_framework.cc in Sources */, + D6C179EE22CB323300C2651A /* firebase_test_framework.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9F2ABA22267A4720001A35CE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9F2ABA41267A474F001A35CE /* integration_test.cc in Sources */, + 9F4C472F267A4DC0001E25DA /* ios_firebase_test_framework.mm in Sources */, + 9F2ABA3C267A4744001A35CE /* gmock-all.cc in Sources */, + 9F4C472E267A4DB6001E25DA /* ios_app_framework.mm in Sources */, + 9F2ABA3F267A474A001A35CE /* app_framework.cc in Sources */, + D61DACAA2819C7610022DDC4 /* empty.swift in Sources */, + 9F2ABA3E267A4747001A35CE /* gtest-all.cc in Sources */, + 9F2ABA40267A474D001A35CE /* firebase_test_framework.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 9F2ABA2E267A4720001A35CE /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 9F2ABA2F267A4720001A35CE /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 9F2ABA33267A4721001A35CE /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 9F2ABA34267A4721001A35CE /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 529226F71C85F68000C89379 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 529226F81C85F68000C89379 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 529226FA1C85F68000C89379 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "\"$(SRCROOT)/src\"", + "\"$(SRCROOT)/external/googletest/src/googletest/include\"", + "\"$(SRCROOT)/external/googletest/src/googlemock/include\"", + "\"$(SRCROOT)/external/googletest/src/googletest\"", + "\"$(SRCROOT)/external/googletest/src/googlemock\"", + ); + INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.cpp.appcheck.testapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 529226FB1C85F68000C89379 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "\"$(SRCROOT)/src\"", + "\"$(SRCROOT)/external/googletest/src/googletest/include\"", + "\"$(SRCROOT)/external/googletest/src/googlemock/include\"", + "\"$(SRCROOT)/external/googletest/src/googletest\"", + "\"$(SRCROOT)/external/googletest/src/googlemock\"", + ); + INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.cpp.appcheck.testapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + 9F2ABA39267A4721001A35CE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + GCC_C_LANGUAGE_STANDARD = gnu11; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "\"$(SRCROOT)/src\"", + "\"$(SRCROOT)/external/googletest/src/googletest/include\"", + "\"$(SRCROOT)/external/googletest/src/googlemock/include\"", + "\"$(SRCROOT)/external/googletest/src/googletest\"", + "\"$(SRCROOT)/external/googletest/src/googlemock\"", + ); + INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.cpp.appcheck.testapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 10.1; + }; + name = Debug; + }; + 9F2ABA3A267A4721001A35CE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + GCC_C_LANGUAGE_STANDARD = gnu11; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "\"$(SRCROOT)/src\"", + "\"$(SRCROOT)/external/googletest/src/googletest/include\"", + "\"$(SRCROOT)/external/googletest/src/googlemock/include\"", + "\"$(SRCROOT)/external/googletest/src/googletest\"", + "\"$(SRCROOT)/external/googletest/src/googlemock\"", + ); + INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.cpp.appcheck.testapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 10.1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 529226CD1C85F68000C89379 /* Build configuration list for PBXProject "integration_test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 529226F71C85F68000C89379 /* Debug */, + 529226F81C85F68000C89379 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 529226F91C85F68000C89379 /* Build configuration list for PBXNativeTarget "integration_test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 529226FA1C85F68000C89379 /* Debug */, + 529226FB1C85F68000C89379 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9F2ABA3B267A4721001A35CE /* Build configuration list for PBXNativeTarget "integration_test_tvos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9F2ABA39267A4721001A35CE /* Debug */, + 9F2ABA3A267A4721001A35CE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 529226CA1C85F68000C89379 /* Project object */; +} diff --git a/app_check/integration_test/integration_test.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/app_check/integration_test/integration_test.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..919434a625 --- /dev/null +++ b/app_check/integration_test/integration_test.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/app_check/integration_test/integration_test.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/app_check/integration_test/integration_test.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/app_check/integration_test/integration_test.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/app_check/integration_test/integration_test_tvos/Base.lproj/LaunchScreen.storyboard b/app_check/integration_test/integration_test_tvos/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000000..660ba53de4 --- /dev/null +++ b/app_check/integration_test/integration_test_tvos/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_check/integration_test/integration_test_tvos/Base.lproj/Main.storyboard b/app_check/integration_test/integration_test_tvos/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..a5c40f1968 --- /dev/null +++ b/app_check/integration_test/integration_test_tvos/Base.lproj/Main.storyboard @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_check/integration_test/proguard.pro b/app_check/integration_test/proguard.pro new file mode 100644 index 0000000000..2d04b8a9a5 --- /dev/null +++ b/app_check/integration_test/proguard.pro @@ -0,0 +1,2 @@ +-ignorewarnings +-keep,includedescriptorclasses public class com.google.firebase.example.LoggingUtils { * ; } diff --git a/app_check/integration_test/res/layout/main.xml b/app_check/integration_test/res/layout/main.xml new file mode 100644 index 0000000000..a21f04272f --- /dev/null +++ b/app_check/integration_test/res/layout/main.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/app_check/integration_test/res/values/strings.xml b/app_check/integration_test/res/values/strings.xml new file mode 100644 index 0000000000..11edebbab2 --- /dev/null +++ b/app_check/integration_test/res/values/strings.xml @@ -0,0 +1,20 @@ + + + + Firebase App Check Integration Test + diff --git a/app_check/integration_test/settings.gradle b/app_check/integration_test/settings.gradle new file mode 100644 index 0000000000..5d33554481 --- /dev/null +++ b/app_check/integration_test/settings.gradle @@ -0,0 +1,39 @@ +// 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. + +def firebase_cpp_sdk_dir = System.getProperty('firebase_cpp_sdk.dir') +if (firebase_cpp_sdk_dir == null || firebase_cpp_sdk_dir.isEmpty()) { + firebase_cpp_sdk_dir = System.getenv('FIREBASE_CPP_SDK_DIR') + if (firebase_cpp_sdk_dir == null || firebase_cpp_sdk_dir.isEmpty()) { + if ((new File('../../cpp_sdk_version.json')).exists()) { + firebase_cpp_sdk_dir = new File('../..').absolutePath + } + else if ((new File('firebase_cpp_sdk')).exists()) { + firebase_cpp_sdk_dir = 'firebase_cpp_sdk' + } else { + throw new StopActionException( + 'firebase_cpp_sdk.dir property or the FIREBASE_CPP_SDK_DIR ' + + 'environment variable must be set to reference the Firebase C++ ' + + 'SDK install directory. This is used to configure static library ' + + 'and C/C++ include paths for the SDK.') + } + } +} +if (!(new File(firebase_cpp_sdk_dir)).exists()) { + throw new StopActionException( + sprintf('Firebase C++ SDK directory %s does not exist', + firebase_cpp_sdk_dir)) +} +gradle.ext.firebase_cpp_sdk_dir = "$firebase_cpp_sdk_dir" +includeBuild "$firebase_cpp_sdk_dir" diff --git a/app_check/integration_test/src/integration_test.cc b/app_check/integration_test/src/integration_test.cc new file mode 100644 index 0000000000..9034954fa4 --- /dev/null +++ b/app_check/integration_test/src/integration_test.cc @@ -0,0 +1,500 @@ +// Copyright 2022 Google Inc. All rights reserved. +// +// 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. + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "app_framework.h" // NOLINT +#include "firebase/app.h" +#include "firebase/app_check.h" +#include "firebase/app_check/app_attest_provider.h" +#include "firebase/app_check/debug_provider.h" +#include "firebase/app_check/device_check_provider.h" +#include "firebase/app_check/play_integrity_provider.h" +#include "firebase/app_check/safety_net_provider.h" +#include "firebase/auth.h" +#include "firebase/database.h" +#include "firebase/internal/platform.h" +#include "firebase/util.h" +#include "firebase_test_framework.h" // NOLINT + +// The TO_STRING macro is useful for command line defined strings as the quotes +// get stripped. +#define TO_STRING_EXPAND(X) #X +#define TO_STRING(X) TO_STRING_EXPAND(X) + +// Path to the Firebase config file to load. +#ifdef FIREBASE_CONFIG +#define FIREBASE_CONFIG_STRING TO_STRING(FIREBASE_CONFIG) +#else +#define FIREBASE_CONFIG_STRING "" +#endif // FIREBASE_CONFIG + +namespace firebase_testapp_automated { + +using app_framework::LogDebug; +using app_framework::LogError; +using app_framework::LogInfo; + +using app_framework::ProcessEvents; +using firebase_test_framework::FirebaseTest; + +using testing::Pair; +using testing::UnorderedElementsAre; + +const char kIntegrationTestRootPath[] = "integration_test_data"; + +class FirebaseAppCheckTest : public FirebaseTest { + public: + FirebaseAppCheckTest(); + ~FirebaseAppCheckTest() override; + + // Called after each test. + void TearDown() override; + + protected: + // Initialize App Check with the Debug provider. + void InitializeAppCheckWithDebug(); + // Shut down App Check. + void TerminateAppCheck(); + + // Initialize Firebase App. + void InitializeApp(); + // Shut down Firebase App. + void TerminateApp(); + + // Initialize Firebase Auth. + void InitializeAuth(); + // Shut down Firebase Auth. + void TerminateAuth(); + + // Sign in an anonymous user. + void SignIn(); + // Sign out the current user, if applicable. + // If this is an anonymous user, deletes the user instead, + // to avoid polluting the user list. + void SignOut(); + + // Initialize Firebase Database. + void InitializeDatabase(); + // Shut down Firebase Database. + void TerminateDatabase(); + + // Initialize everything needed for Database tests. + void InitializeAppAuthDatabase(); + + firebase::database::DatabaseReference CreateWorkingPath( + bool suppress_cleanup = false); + + firebase::App* app_; + firebase::auth::Auth* auth_; + + bool initialized_; + firebase::database::Database* database_; + + std::vector cleanup_paths_; +}; + +// Initialization flow looks like this: +// - For each test: +// - Optionally initialize App Check. +// - Initialize App, and any additional products. +// - Run tests. +// - TearDown: Shutdowns down everything automatically. + +void FirebaseAppCheckTest::InitializeAppCheckWithDebug() { + LogDebug("Initialize Firebase App Check with Debug Provider"); + + firebase::app_check::AppCheck::SetAppCheckProviderFactory( + firebase::app_check::DebugAppCheckProviderFactory::GetInstance()); +} + +void FirebaseAppCheckTest::TerminateAppCheck() {} + +void FirebaseAppCheckTest::InitializeApp() { + LogDebug("Initialize Firebase App."); + + FindFirebaseConfig(FIREBASE_CONFIG_STRING); + +#if defined(__ANDROID__) + app_ = ::firebase::App::Create(app_framework::GetJniEnv(), + app_framework::GetActivity()); +#else + app_ = ::firebase::App::Create(); +#endif // defined(__ANDROID__) + + ASSERT_NE(app_, nullptr); + + firebase::SetLogLevel(firebase::kLogLevelVerbose); +} + +void FirebaseAppCheckTest::TerminateApp() { + if (app_) { + LogDebug("Shutdown App."); + delete app_; + app_ = nullptr; + } +} + +FirebaseAppCheckTest::FirebaseAppCheckTest() + : initialized_(false), + app_(nullptr), + auth_(nullptr), + database_(nullptr), + cleanup_paths_() { + FindFirebaseConfig(FIREBASE_CONFIG_STRING); +} + +FirebaseAppCheckTest::~FirebaseAppCheckTest() { + // Must be cleaned up on exit. + assert(app_ == nullptr); +} + +void FirebaseAppCheckTest::TearDown() { + // Teardown all the products + TerminateDatabase(); + TerminateAuth(); + TerminateApp(); + TerminateAppCheck(); + FirebaseTest::TearDown(); +} + +void FirebaseAppCheckTest::InitializeAuth() { + LogDebug("Initializing Auth."); + + ::firebase::ModuleInitializer initializer; + initializer.Initialize(app_, &auth_, [](::firebase::App* app, void* target) { + LogDebug("Attempting to initialize Firebase Auth."); + ::firebase::InitResult result; + *reinterpret_cast(target) = + ::firebase::auth::Auth::GetAuth(app, &result); + return result; + }); + + WaitForCompletion(initializer.InitializeLastResult(), "InitializeAuth"); + + ASSERT_EQ(initializer.InitializeLastResult().error(), 0) + << initializer.InitializeLastResult().error_message(); + + LogDebug("Successfully initialized Auth."); + + ASSERT_NE(auth_, nullptr); + + // Sign in anonymously. + SignIn(); +} + +void FirebaseAppCheckTest::TerminateAuth() { + if (auth_) { + LogDebug("Signing out."); + SignOut(); + LogDebug("Shutdown Auth."); + delete auth_; + auth_ = nullptr; + } +} + +void FirebaseAppCheckTest::InitializeDatabase() { + LogDebug("Initializing Firebase Database."); + + ::firebase::ModuleInitializer initializer; + initializer.Initialize( + app_, &database_, [](::firebase::App* app, void* target) { + LogDebug("Attempting to initialize Firebase Database."); + ::firebase::InitResult result; + *reinterpret_cast(target) = + firebase::database::Database::GetInstance(app, &result); + return result; + }); + + WaitForCompletion(initializer.InitializeLastResult(), "InitializeDatabase"); + + ASSERT_EQ(initializer.InitializeLastResult().error(), 0) + << initializer.InitializeLastResult().error_message(); + + LogDebug("Successfully initialized Firebase Database."); + + initialized_ = true; +} + +void FirebaseAppCheckTest::TerminateDatabase() { + if (!initialized_) return; + + if (database_) { + if (!cleanup_paths_.empty() && database_ && app_) { + LogDebug("Cleaning up..."); + std::vector> cleanups; + cleanups.reserve(cleanup_paths_.size()); + for (int i = 0; i < cleanup_paths_.size(); ++i) { + cleanups.push_back(cleanup_paths_[i].RemoveValue()); + } + for (int i = 0; i < cleanups.size(); ++i) { + std::string cleanup_name = "Cleanup (" + cleanup_paths_[i].url() + ")"; + WaitForCompletion(cleanups[i], cleanup_name.c_str()); + } + cleanup_paths_.clear(); + } + + LogDebug("Shutdown the Database library."); + delete database_; + database_ = nullptr; + } + initialized_ = false; + + ProcessEvents(100); +} + +void FirebaseAppCheckTest::InitializeAppAuthDatabase() { + InitializeApp(); + InitializeAuth(); + InitializeDatabase(); +} + +void FirebaseAppCheckTest::SignIn() { + if (auth_->current_user() != nullptr) { + // Already signed in. + return; + } + LogDebug("Signing in."); + firebase::Future sign_in_future = + auth_->SignInAnonymously(); + WaitForCompletion(sign_in_future, "SignInAnonymously"); + if (sign_in_future.error() != 0) { + FAIL() << "Ensure your application has the Anonymous sign-in provider " + "enabled in Firebase Console."; + } + ProcessEvents(100); +} + +void FirebaseAppCheckTest::SignOut() { + if (auth_ == nullptr) { + // Auth is not set up. + return; + } + if (auth_->current_user() == nullptr) { + // Already signed out. + return; + } + if (auth_->current_user()->is_anonymous()) { + // If signed in anonymously, delete the anonymous user. + WaitForCompletion(auth_->current_user()->Delete(), "DeleteAnonymousUser"); + // If there was a problem deleting the user, try to sign out at least. + if (auth_->current_user()) { + auth_->SignOut(); + } + } else { + // If not signed in anonymously (e.g. if the tests were modified to sign in + // as an actual user), just sign out normally. + auth_->SignOut(); + + // Wait for the sign-out to finish. + while (auth_->current_user() != nullptr) { + if (ProcessEvents(100)) break; + } + } + EXPECT_EQ(auth_->current_user(), nullptr); +} + +firebase::database::DatabaseReference FirebaseAppCheckTest::CreateWorkingPath( + bool suppress_cleanup) { + auto ref = database_->GetReference(kIntegrationTestRootPath).PushChild(); + if (!suppress_cleanup) { + cleanup_paths_.push_back(ref); + } + return ref; +} + +// Test cases below. +TEST_F(FirebaseAppCheckTest, TestInitializeAndTerminate) { + InitializeAppCheckWithDebug(); + InitializeApp(); +} + +TEST_F(FirebaseAppCheckTest, TestSignIn) { + InitializeAppCheckWithDebug(); + InitializeApp(); + InitializeAuth(); + EXPECT_NE(auth_->current_user(), nullptr); +} + +TEST_F(FirebaseAppCheckTest, TestAppAttestProvider) { + firebase::app_check::AppAttestProviderFactory* factory = + firebase::app_check::AppAttestProviderFactory::GetInstance(); +#if FIREBASE_PLATFORM_IOS + EXPECT_NE(factory, nullptr); + InitializeApp(); + firebase::app_check::AppCheckProvider* provider = + factory->CreateProvider(app_); + EXPECT_NE(provider, nullptr); +#else + EXPECT_EQ(factory, nullptr); +#endif +} + +TEST_F(FirebaseAppCheckTest, TestDeviceCheckProvider) { + firebase::app_check::DeviceCheckProviderFactory* factory = + firebase::app_check::DeviceCheckProviderFactory::GetInstance(); +#if FIREBASE_PLATFORM_IOS + EXPECT_NE(factory, nullptr); + InitializeApp(); + firebase::app_check::AppCheckProvider* provider = + factory->CreateProvider(app_); + EXPECT_NE(provider, nullptr); +#else + EXPECT_EQ(factory, nullptr); +#endif +} + +TEST_F(FirebaseAppCheckTest, TestPlayIntegrityProvider) { + firebase::app_check::PlayIntegrityProviderFactory* factory = + firebase::app_check::PlayIntegrityProviderFactory::GetInstance(); +#if FIREBASE_PLATFORM_ANDROID + EXPECT_NE(factory, nullptr); + InitializeApp(); + firebase::app_check::AppCheckProvider* provider = + factory->CreateProvider(app_); + EXPECT_NE(provider, nullptr); +#else + EXPECT_EQ(factory, nullptr); +#endif +} + +TEST_F(FirebaseAppCheckTest, TestSafetyNetProvider) { + firebase::app_check::SafetyNetProviderFactory* factory = + firebase::app_check::SafetyNetProviderFactory::GetInstance(); +#if FIREBASE_PLATFORM_ANDROID + EXPECT_NE(factory, nullptr); + InitializeApp(); + firebase::app_check::AppCheckProvider* provider = + factory->CreateProvider(app_); + EXPECT_NE(provider, nullptr); +#else + EXPECT_EQ(factory, nullptr); +#endif +} + +// Disabling the database tests for now, since they are crashing or hanging. +TEST_F(FirebaseAppCheckTest, DISABLED_TestDatabaseFailure) { + // Don't initialize App Check this time. Database should fail. + InitializeAppAuthDatabase(); + firebase::database::DatabaseReference ref = CreateWorkingPath(); + const char* test_name = test_info_->name(); + firebase::Future f = ref.Child(test_name).SetValue("test"); + // It is unclear if this should fail, or hang, so disabled for now. + WaitForCompletion(f, "SetString"); +} + +TEST_F(FirebaseAppCheckTest, DISABLED_TestDatabaseCreateWorkingPath) { + InitializeAppCheckWithDebug(); + InitializeAppAuthDatabase(); + firebase::database::DatabaseReference working_path = CreateWorkingPath(); + LogInfo("Database URL: %s", working_path.url().c_str()); + EXPECT_TRUE(working_path.is_valid()); + EXPECT_FALSE(working_path.url().empty()); + EXPECT_EQ(working_path.url().find(database_->GetReference().url()), 0) + << "Working path URL (" << working_path.url() + << ") does not begin with root URL (" << database_->GetReference().url() + << ")"; +} + +static const char kSimpleString[] = "Some simple string"; + +TEST_F(FirebaseAppCheckTest, DISABLED_TestDatabaseSetAndGet) { + InitializeAppCheckWithDebug(); + InitializeAppAuthDatabase(); + + const char* test_name = test_info_->name(); + firebase::database::DatabaseReference ref = CreateWorkingPath(); + + { + LogDebug("Setting value."); + firebase::Future f1 = + ref.Child(test_name).Child("String").SetValue(kSimpleString); + WaitForCompletion(f1, "SetSimpleString"); + } + + // Get the values that we just set, and confirm that they match what we + // set them to. + { + LogDebug("Getting value."); + firebase::Future f1 = + ref.Child(test_name).Child("String").GetValue(); + WaitForCompletion(f1, "GetSimpleString"); + + EXPECT_EQ(f1.result()->value().AsString(), kSimpleString); + } +} + +TEST_F(FirebaseAppCheckTest, DISABLED_TestRunTransaction) { + InitializeAppCheckWithDebug(); + InitializeAppAuthDatabase(); + + const char* test_name = test_info_->name(); + + firebase::database::DatabaseReference ref = CreateWorkingPath(); + + // Test running a transaction. This will call RunTransaction and set + // some values, including incrementing the player's score. + firebase::Future transaction_future; + static const int kInitialScore = 500; + // Set an initial score of 500 points. + WaitForCompletion( + ref.Child(test_name).Child("player_score").SetValue(kInitialScore), + "SetInitialScoreValue"); + // The transaction will set the player's item and class, and increment + // their score by 100 points. + int score_delta = 100; + transaction_future = ref.Child(test_name).RunTransaction( + [](firebase::database::MutableData* data, void* score_delta_void) { + LogDebug(" Transaction function executing."); + data->Child("player_item").set_value("Fire sword"); + data->Child("player_class").set_value("Warrior"); + // Increment the current score by 100. + int64_t score = + data->Child("player_score").value().AsInt64().int64_value(); + data->Child("player_score") + .set_value(score + *reinterpret_cast(score_delta_void)); + return firebase::database::kTransactionResultSuccess; + }, + &score_delta); + WaitForCompletion(transaction_future, "RunTransaction"); + + // If the transaction succeeded, let's read back the values that were + // written to confirm they match. + if (transaction_future.error() == firebase::database::kErrorNone) { + firebase::Future read_future = + ref.Child(test_name).GetValue(); + WaitForCompletion(read_future, "ReadTransactionResults"); + + const firebase::database::DataSnapshot& read_result = *read_future.result(); + EXPECT_EQ(read_result.children_count(), 3); + EXPECT_TRUE(read_result.HasChild("player_item")); + EXPECT_EQ(read_result.Child("player_item").value(), "Fire sword"); + EXPECT_TRUE(read_result.HasChild("player_class")); + EXPECT_EQ(read_result.Child("player_class").value(), "Warrior"); + EXPECT_TRUE(read_result.HasChild("player_score")); + EXPECT_EQ(read_result.Child("player_score").value().AsInt64(), + kInitialScore + score_delta); + EXPECT_EQ(read_result.value(), transaction_future.result()->value()); + } +} + +} // namespace firebase_testapp_automated diff --git a/ios_pod/Podfile b/ios_pod/Podfile index f4a234df28..2c994e734a 100644 --- a/ios_pod/Podfile +++ b/ios_pod/Podfile @@ -7,6 +7,7 @@ target 'GetPods' do pod 'Google-Mobile-Ads-SDK', '9.11.0.1' pod 'Firebase/Analytics', '10.0.0' + pod 'Firebase/AppCheck', '10.0.0' pod 'Firebase/Auth', '10.0.0' pod 'Firebase/Crashlytics', '10.0.0' pod 'Firebase/Database', '10.0.0' diff --git a/scripts/gha-encrypted/app_check/GoogleService-Info.plist.gpg b/scripts/gha-encrypted/app_check/GoogleService-Info.plist.gpg new file mode 100644 index 0000000000..a1df2ac0c8 Binary files /dev/null and b/scripts/gha-encrypted/app_check/GoogleService-Info.plist.gpg differ diff --git a/scripts/gha-encrypted/app_check/google-services.json.gpg b/scripts/gha-encrypted/app_check/google-services.json.gpg new file mode 100644 index 0000000000..c69f5d33d0 --- /dev/null +++ b/scripts/gha-encrypted/app_check/google-services.json.gpg @@ -0,0 +1,2 @@ +�  ��!�ׂ���4R� �*������M�n��"���ZЂ��!64A56W�A�X��rL1kD��^��3�,�v~T�`9���?,󡖢���R�S�`3�v��p汭Cv�}�Φ�苄5�X��{/��1+)e}&˶�4��.�HG �Ӏ����wRW�z\����V�V%�� )C�PW"�Df�6���8j�{}HX�g�MM��NQ�U�J��,�� �D3B �ET~X�S�f��1��Ⱦ1LL��x�X�N�衅˳ƪ�'�B���r�� �4���+��Gp~�*�o�_S�c+�q16]{�H��za����!%5=�'u$�e����1�4�sN� aEq��6,�{^-�G�����mR��Q��Y������ �q-9%�+���S�bu�$��-�SO*�����l�Q�Gm�0tB�� +�N�EΦ����ϫَע��.��{z垺:TV�&��[!a^W��e($1�^3L!� �d��[ [��DP:=M������E�1�;�� \ No newline at end of file diff --git a/scripts/gha/build_ios_tvos.py b/scripts/gha/build_ios_tvos.py index a43dee8316..4c6a88c670 100644 --- a/scripts/gha/build_ios_tvos.py +++ b/scripts/gha/build_ios_tvos.py @@ -48,7 +48,7 @@ # Configuration for supported os's, and platforms. CONFIG = { 'ios': { - 'supported_targets' : ('firebase_admob', 'firebase_analytics', + 'supported_targets' : ('firebase_admob', 'firebase_analytics', 'firebase_app_check', 'firebase_auth', 'firebase_database', 'firebase_dynamic_links', 'firebase_firestore', 'firebase_functions', 'firebase_gma', @@ -65,7 +65,7 @@ }, 'tvos': { - 'supported_targets' : ('firebase_auth', 'firebase_analytics', + 'supported_targets' : ('firebase_auth', 'firebase_analytics', 'firebase_app_check', 'firebase_database', 'firebase_firestore', 'firebase_functions', 'firebase_installations', 'firebase_messaging', 'firebase_remote_config', diff --git a/scripts/gha/integration_testing/build_testapps.json b/scripts/gha/integration_testing/build_testapps.json index 7adaaa1f80..81ccc09846 100755 --- a/scripts/gha/integration_testing/build_testapps.json +++ b/scripts/gha/integration_testing/build_testapps.json @@ -39,6 +39,21 @@ ], "provision": "Google_Development.mobileprovision" }, + { + "name": "app_check", + "full_name": "FirebaseAppCheck", + "bundle_id": "com.google.firebase.cpp.appcheck.testapp", + "ios_target": "integration_test", + "tvos_target": "integration_test_tvos", + "testapp_path": "app_check/integration_test", + "frameworks": [ + "firebase_app_check.xcframework", + "firebase_auth.xcframework", + "firebase_database.xcframework", + "firebase.xcframework" + ], + "provision": "Firebase_Dev_Wildcard.mobileprovision" + }, { "name": "auth", "full_name": "FirebaseAuth", @@ -248,6 +263,7 @@ "'admob' : ['com.google.firebase:firebase-ads:[0,)',", "'com.google.android.gms:play-services-measurement-sdk-api:[0,)'],", "'analytics' : ['com.google.firebase:firebase-analytics:[0,)'],", + "'app_check' : ['com.google.firebase:firebase-appcheck:[0,)'],", "'auth' : ['com.google.firebase:firebase-auth:[0,)'],", "'database' : ['com.google.firebase:firebase-database:[0,)'],", "'dynamic_links' : ['com.google.firebase:firebase-dynamic-links:[0,)'],",