Ver código fonte

Add a travis cron job for CocoaPod symbol collision testing (#2154)

Paul Beusterien 7 anos atrás
pai
commit
522f0121b1

+ 9 - 0
.travis.yml

@@ -112,6 +112,15 @@ jobs:
         # The travis_wait is necessary because the command takes more than 10 minutes.
         - travis_wait ./scripts/if_cron.sh ./scripts/pod_lib_lint.sh FirebaseFirestore.podspec --use-libraries --allow-warnings --no-subspecs
 
+    # Daily test for symbol collisions between Firebase and CocoaPods.
+    - stage: test
+      env:
+        - PROJECT=SymbolCollision PLATFORM=iOS METHOD=xcodebuild
+      before_install:
+        - ./scripts/if_cron.sh ./scripts/install_prereqs.sh
+      script:
+        - ./scripts/if_cron.sh ./scripts/build.sh $PROJECT $PLATFORM $METHOD
+
     # Alternative platforms
 
     # Xcode 9

+ 4 - 0
Releases/update-versions.py

@@ -158,11 +158,15 @@ def UpdatePodfiles(git_root, version):
   """
   firebase_podfile = os.path.join(git_root, 'Example', 'Podfile')
   firestore_podfile = os.path.join(git_root, 'Firestore', 'Example', 'Podfile')
+  collision_podfile = os.path.join(git_root, 'SymbolCollisionTest', 'Podfile')
 
   sed_command = ("sed -i.bak -e \"s#\\(pod "
                  "'Firebase/CoreOnly',[[:space:]]*'\\).*'#\\1{}'#\" {}")
   os.system(sed_command.format(version, firebase_podfile))
   os.system(sed_command.format(version, firestore_podfile))
+  sed_command = ("sed -i.bak -e \"s#\\(pod "
+                 "'Firebase',[[:space:]]*'\\).*'#\\1{}'#\" {}")
+  os.system(sed_command.format(version, collision_podfile))
 
 
 def UpdateTags(version_data, firebase_version, first=False):

+ 73 - 0
SymbolCollisionTest/Podfile

@@ -0,0 +1,73 @@
+# Uncomment the next line to define a global platform for your project
+# platform :ios, '9.0'
+
+target 'SymbolCollisionTest' do
+  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
+  # use_frameworks!
+
+  # Firebase Pods
+    pod 'Firebase', '5.14.0'
+    pod 'FirebaseAnalytics'
+    pod 'FirebaseAuth'
+    pod 'FirebaseCore'
+    pod 'FirebaseCrash'
+    pod 'FirebaseDatabase'
+    pod 'FirebaseDynamicLinks'
+    pod 'FirebaseFirestore'
+    pod 'FirebaseFunctions'
+    pod 'FirebaseInAppMessaging'
+    pod 'FirebaseInstanceID'
+    pod 'FirebaseMessaging'
+    pod 'FirebaseMLCommon'
+    pod 'FirebaseMLModelInterpreter'
+    pod 'FirebaseMLVision'
+    pod 'FirebaseMLVisionBarcodeModel'
+    pod 'FirebaseMLVisionFaceModel'
+    pod 'FirebaseMLVisionLabelModel'
+    pod 'FirebaseMLVisionTextModel'
+    pod 'FirebasePerformance'
+    pod 'FirebaseRemoteConfig'
+    pod 'FirebaseStorage'
+#    pod 'FirebaseUI'. - requires use_frameworks!
+
+  # Other Google Pods
+#    pod 'Blockly' This is a Swift Pod and requires usage of use_frameworks!
+    pod 'Crashlytics'
+    pod 'DigitsMigrationHelper'
+    pod 'EarlGrey'
+    pod 'GeoFire'
+    pod 'google-cast-sdk'
+    pod 'Google-Mobile-Ads-SDK'
+    pod 'GoogleAnalytics'
+    pod 'GoogleAppIndexing'
+    pod 'GoogleAppUtilities'
+    pod 'GoogleAuthUtilities'
+    pod 'GoogleConversionTracking'
+    pod 'GoogleIDFASupport'
+    pod 'GoogleInterchangeUtilities'
+    pod 'GoogleMaps'
+    pod 'GoogleMobileVision'
+    pod 'GoogleNetworkingUtilities'
+    pod 'GoogleParsingUtilities'
+    pod 'GooglePlacePicker'
+    pod 'GooglePlaces'
+    pod 'GooglePlusUtilities'
+    pod 'GoogleSignIn'
+    pod 'GoogleSymbolUtilities'
+    pod 'GoogleTagManager'
+    pod 'GoogleToolboxForMac'
+    pod 'GoogleUtilities'
+    pod 'GTMAppAuth'
+#    pod 'GTMHTTPFetcher' - conflicts with GTMSessionFetcher
+    pod 'GTMSessionFetcher'
+    pod 'GVRSDK'
+    pod 'leveldb-library'
+#    pod 'MDFTextAccessibility' - conflicts with GVRSDK
+    pod 'nanopb'
+#    pod 'NearbyMessages' # - conflicts with google-cast-sdk
+    pod 'Protobuf'
+    pod 'TensorFlow-experimental'
+
+  # Non-Google Pods
+
+end

+ 32 - 0
SymbolCollisionTest/README.md

@@ -0,0 +1,32 @@
+# Symbol Collision Tests
+
+## Introduction
+
+This directory provides a project that is used to test a set of CocoaPods for symbol
+collisions daily.  It's controlled by the cron functionality in
+[.travis.ml](../.travis.yml).
+
+## Run Locally
+
+* `git clone git@github.com:firebase/firebase-ios-sdk.git`
+* `cd firebase-ios-sdk/SymbolCollisionTest`
+* Optionally make any changes to the Podfile
+* `pod install`
+* `open SymbolCollisionTest.xcworkspace`
+* Build
+
+## Contributing
+
+If you'd like to add a CocoaPod to the tests, add it to the
+[Podfile](Podfile), test that it builds locally and then send a PR.
+
+## Future
+
+Currently the tests primarily test static libraries and static frameworks.
+`use_frameworks!` and
+[`use_module_headers!`](http://blog.cocoapods.org/CocoaPods-1.5.0/) can be
+added for better dynamic library and Swift pod testing.
+
+Currently, this is testing released CocoaPods. It could be changed to support
+pre-releases by changing the Podfile to point to source pods and/or setting up
+a public staging Specs repo and adding a `source` in the Podfile.

+ 342 - 0
SymbolCollisionTest/SymbolCollisionTest.xcodeproj/project.pbxproj

@@ -0,0 +1,342 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 50;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		DE26C60121B884BA00DE141A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DE26C60021B884BA00DE141A /* AppDelegate.m */; };
+		DE26C60421B884BA00DE141A /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DE26C60321B884BA00DE141A /* ViewController.m */; };
+		DE26C60721B884BA00DE141A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DE26C60521B884BA00DE141A /* Main.storyboard */; };
+		DE26C60921B884BB00DE141A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DE26C60821B884BB00DE141A /* Assets.xcassets */; };
+		DE26C60C21B884BB00DE141A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DE26C60A21B884BB00DE141A /* LaunchScreen.storyboard */; };
+		DE26C60F21B884BB00DE141A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DE26C60E21B884BB00DE141A /* main.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		DE26C5FC21B884BA00DE141A /* SymbolCollisionTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SymbolCollisionTest.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		DE26C5FF21B884BA00DE141A /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+		DE26C60021B884BA00DE141A /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+		DE26C60221B884BA00DE141A /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
+		DE26C60321B884BA00DE141A /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
+		DE26C60621B884BA00DE141A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+		DE26C60821B884BB00DE141A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		DE26C60B21B884BB00DE141A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+		DE26C60D21B884BB00DE141A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		DE26C60E21B884BB00DE141A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		DE26C5F921B884BA00DE141A /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		DE26C5F321B884BA00DE141A = {
+			isa = PBXGroup;
+			children = (
+				DE26C5FE21B884BA00DE141A /* SymbolCollisionTest */,
+				DE26C5FD21B884BA00DE141A /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		DE26C5FD21B884BA00DE141A /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				DE26C5FC21B884BA00DE141A /* SymbolCollisionTest.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		DE26C5FE21B884BA00DE141A /* SymbolCollisionTest */ = {
+			isa = PBXGroup;
+			children = (
+				DE26C5FF21B884BA00DE141A /* AppDelegate.h */,
+				DE26C60021B884BA00DE141A /* AppDelegate.m */,
+				DE26C60221B884BA00DE141A /* ViewController.h */,
+				DE26C60321B884BA00DE141A /* ViewController.m */,
+				DE26C60521B884BA00DE141A /* Main.storyboard */,
+				DE26C60821B884BB00DE141A /* Assets.xcassets */,
+				DE26C60A21B884BB00DE141A /* LaunchScreen.storyboard */,
+				DE26C60D21B884BB00DE141A /* Info.plist */,
+				DE26C60E21B884BB00DE141A /* main.m */,
+			);
+			path = SymbolCollisionTest;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		DE26C5FB21B884BA00DE141A /* SymbolCollisionTest */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = DE26C61221B884BB00DE141A /* Build configuration list for PBXNativeTarget "SymbolCollisionTest" */;
+			buildPhases = (
+				DE26C5F821B884BA00DE141A /* Sources */,
+				DE26C5F921B884BA00DE141A /* Frameworks */,
+				DE26C5FA21B884BA00DE141A /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = SymbolCollisionTest;
+			productName = SymbolCollisionTest;
+			productReference = DE26C5FC21B884BA00DE141A /* SymbolCollisionTest.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		DE26C5F421B884BA00DE141A /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 1010;
+				ORGANIZATIONNAME = "Paul Beusterien";
+				TargetAttributes = {
+					DE26C5FB21B884BA00DE141A = {
+						CreatedOnToolsVersion = 10.1;
+					};
+				};
+			};
+			buildConfigurationList = DE26C5F721B884BA00DE141A /* Build configuration list for PBXProject "SymbolCollisionTest" */;
+			compatibilityVersion = "Xcode 9.3";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = DE26C5F321B884BA00DE141A;
+			productRefGroup = DE26C5FD21B884BA00DE141A /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				DE26C5FB21B884BA00DE141A /* SymbolCollisionTest */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		DE26C5FA21B884BA00DE141A /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				DE26C60C21B884BB00DE141A /* LaunchScreen.storyboard in Resources */,
+				DE26C60921B884BB00DE141A /* Assets.xcassets in Resources */,
+				DE26C60721B884BA00DE141A /* Main.storyboard in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		DE26C5F821B884BA00DE141A /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				DE26C60421B884BA00DE141A /* ViewController.m in Sources */,
+				DE26C60F21B884BB00DE141A /* main.m in Sources */,
+				DE26C60121B884BA00DE141A /* AppDelegate.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+		DE26C60521B884BA00DE141A /* Main.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				DE26C60621B884BA00DE141A /* Base */,
+			);
+			name = Main.storyboard;
+			sourceTree = "<group>";
+		};
+		DE26C60A21B884BB00DE141A /* LaunchScreen.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				DE26C60B21B884BB00DE141A /* Base */,
+			);
+			name = LaunchScreen.storyboard;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		DE26C61021B884BB00DE141A /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				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 = 12.1;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+			};
+			name = Debug;
+		};
+		DE26C61121B884BB00DE141A /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				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 = 12.1;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				MTL_FAST_MATH = YES;
+				SDKROOT = iphoneos;
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		DE26C61321B884BB00DE141A /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = 4ANB9W7R3P;
+				INFOPLIST_FILE = SymbolCollisionTest/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.google.test.SymbolCollisionTest;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		DE26C61421B884BB00DE141A /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = 4ANB9W7R3P;
+				INFOPLIST_FILE = SymbolCollisionTest/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.google.test.SymbolCollisionTest;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		DE26C5F721B884BA00DE141A /* Build configuration list for PBXProject "SymbolCollisionTest" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				DE26C61021B884BB00DE141A /* Debug */,
+				DE26C61121B884BB00DE141A /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		DE26C61221B884BB00DE141A /* Build configuration list for PBXNativeTarget "SymbolCollisionTest" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				DE26C61321B884BB00DE141A /* Debug */,
+				DE26C61421B884BB00DE141A /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = DE26C5F421B884BA00DE141A /* Project object */;
+}

+ 21 - 0
SymbolCollisionTest/SymbolCollisionTest/AppDelegate.h

@@ -0,0 +1,21 @@
+// Copyright 2018 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property(strong, nonatomic) UIWindow *window;
+
+@end

+ 59 - 0
SymbolCollisionTest/SymbolCollisionTest/AppDelegate.m

@@ -0,0 +1,59 @@
+// Copyright 2018 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import "AppDelegate.h"
+
+@interface AppDelegate ()
+
+@end
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application
+    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+  // Override point for customization after application launch.
+  return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application {
+  // Sent when the application is about to move from active to inactive state. This can occur for
+  // certain types of temporary interruptions (such as an incoming phone call or SMS message) or
+  // when the user quits the application and it begins the transition to the background state. Use
+  // this method to pause ongoing tasks, disable timers, and invalidate graphics rendering
+  // callbacks. Games should use this method to pause the game.
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application {
+  // Use this method to release shared resources, save user data, invalidate timers, and store
+  // enough application state information to restore your application to its current state in case
+  // it is terminated later. If your application supports background execution, this method is
+  // called instead of applicationWillTerminate: when the user quits.
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application {
+  // Called as part of the transition from the background to the active state; here you can undo
+  // many of the changes made on entering the background.
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application {
+  // Restart any tasks that were paused (or not yet started) while the application was inactive. If
+  // the application was previously in the background, optionally refresh the user interface.
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application {
+  // Called when the application is about to terminate. Save data if appropriate. See also
+  // applicationDidEnterBackground:.
+}
+
+@end

+ 98 - 0
SymbolCollisionTest/SymbolCollisionTest/Assets.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"
+  }
+}

+ 6 - 0
SymbolCollisionTest/SymbolCollisionTest/Assets.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 25 - 0
SymbolCollisionTest/SymbolCollisionTest/Base.lproj/LaunchScreen.storyboard

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="EHf-IW-A2E">
+            <objects>
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="53" y="375"/>
+        </scene>
+    </scenes>
+</document>

+ 24 - 0
SymbolCollisionTest/SymbolCollisionTest/Base.lproj/Main.storyboard

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="tne-QT-ifu">
+            <objects>
+                <viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
+            </objects>
+        </scene>
+    </scenes>
+</document>

+ 45 - 0
SymbolCollisionTest/SymbolCollisionTest/Info.plist

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>UILaunchStoryboardName</key>
+	<string>LaunchScreen</string>
+	<key>UIMainStoryboardFile</key>
+	<string>Main</string>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>armv7</string>
+	</array>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+</dict>
+</plist>

+ 19 - 0
SymbolCollisionTest/SymbolCollisionTest/ViewController.h

@@ -0,0 +1,19 @@
+// Copyright 2018 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import <UIKit/UIKit.h>
+
+@interface ViewController : UIViewController
+
+@end

+ 28 - 0
SymbolCollisionTest/SymbolCollisionTest/ViewController.m

@@ -0,0 +1,28 @@
+// Copyright 2018 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import "ViewController.h"
+
+@interface ViewController ()
+
+@end
+
+@implementation ViewController
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+  // Do any additional setup after loading the view, typically from a nib.
+}
+
+@end

+ 22 - 0
SymbolCollisionTest/SymbolCollisionTest/main.m

@@ -0,0 +1,22 @@
+// Copyright 2018 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import <UIKit/UIKit.h>
+#import "AppDelegate.h"
+
+int main(int argc, char* argv[]) {
+  @autoreleasepool {
+    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+  }
+}

+ 9 - 0
scripts/build.sh

@@ -28,6 +28,7 @@ product can be one of:
   Firebase
   Firestore
   InAppMessagingDisplay
+  SymbolCollision
 
 platform can be one of:
   iOS (default)
@@ -317,6 +318,14 @@ case "$product-$method-$platform" in
     (cd build; env CTEST_OUTPUT_ON_FAILURE=1 make -j $cpus test)
     ;;
 
+  SymbolCollision-xcodebuild-*)
+    RunXcodebuild \
+        -workspace 'SymbolCollisionTest/SymbolCollisionTest.xcworkspace' \
+        -scheme "SymbolCollisionTest" \
+        "${xcb_flags[@]}" \
+        build
+    ;;
+
   *)
     echo "Don't know how to build this product-platform-method combination" 1>&2
     echo "  product=$product" 1>&2

+ 5 - 0
scripts/install_prereqs.sh

@@ -67,6 +67,11 @@ case "$PROJECT-$PLATFORM-$METHOD" in
     pip install six
     ;;
 
+  SymbolCollision-*-xcodebuild)
+    gem install xcpretty
+    bundle exec pod install --project-directory=SymbolCollisionTest --repo-update
+    ;;
+
   *)
     echo "Unknown project-platform-method combo" 1>&2
     echo "  PROJECT=$PROJECT" 1>&2