def _GenerateTestRootForXcuitest(self): """Generates the test root for XCUITest. The approach constructs xctestrun.plist and uitest runner app from Xcode. Then copies app under test, test bundle, xctestrun.plist and uitest runner app to test root directory. """ platform_library_path = os.path.join( xcode_info_util.GetSdkPlatformPath(self._sdk), 'Developer/Library') uitest_runner_app = self._GetUitestRunnerAppFromXcode( platform_library_path) runner_app_frameworks_dir = os.path.join(uitest_runner_app, 'Frameworks') os.mkdir(runner_app_frameworks_dir) xctest_framework = os.path.join(runner_app_frameworks_dir, 'XCTest.framework') shutil.copytree( os.path.join(platform_library_path, 'Frameworks/XCTest.framework'), xctest_framework) if xcode_info_util.GetXcodeVersionNumber() >= 900: xct_automation_framework = os.path.join( runner_app_frameworks_dir, 'XCTAutomationSupport.framework') shutil.copytree( os.path.join( platform_library_path, 'PrivateFrameworks/XCTAutomationSupport.framework'), xct_automation_framework) self._PrepareUitestInRunerApp(uitest_runner_app) if self._on_device: runner_app_embedded_provision = os.path.join( uitest_runner_app, 'embedded.mobileprovision') use_customized_provision = False if self._signing_options: customized_runner_app_provision = self._signing_options.get( 'xctrunner_app_provisioning_profile') if customized_runner_app_provision: shutil.copyfile(customized_runner_app_provision, runner_app_embedded_provision) use_customized_provision = True if self._signing_options.get( 'xctrunner_app_enable_ui_file_sharing'): try: # Don't resign the uitest runner app here since it will be resigned # with passing entitlements and identity later. bundle_util.EnableUIFileSharing(uitest_runner_app, resigning=False) except ios_errors.BundleError as e: logging.warning(str(e)) # If customized runner app provision is not provided, runner app will # use app under test's embedded provision as embedded provision. if not use_customized_provision: app_under_test_embedded_provision = os.path.join( self._app_under_test_dir, 'embedded.mobileprovision') shutil.copyfile(app_under_test_embedded_provision, runner_app_embedded_provision) test_bundle_team_id = bundle_util.GetDevelopmentTeam( self._test_bundle_dir) full_test_bundle_id = '%s.%s' % (test_bundle_team_id, bundle_util.GetBundleId( self._test_bundle_dir)) entitlements_dict = { 'application-identifier': full_test_bundle_id, 'com.apple.developer.team-identifier': test_bundle_team_id, 'get-task-allow': True, 'keychain-access-groups': [full_test_bundle_id], } entitlements_plist_path = os.path.join(uitest_runner_app, 'RunnerEntitlements.plist') plist_util.Plist(entitlements_plist_path).SetPlistField( None, entitlements_dict) test_bundle_signing_identity = bundle_util.GetCodesignIdentity( self._test_bundle_dir) bundle_util.CodesignBundle(xctest_framework, identity=test_bundle_signing_identity) if xcode_info_util.GetXcodeVersionNumber() >= 900: bundle_util.CodesignBundle( xct_automation_framework, identity=test_bundle_signing_identity) bundle_util.CodesignBundle( uitest_runner_app, entitlements_plist_path=entitlements_plist_path, identity=test_bundle_signing_identity) bundle_util.CodesignBundle(self._test_bundle_dir) bundle_util.CodesignBundle(self._app_under_test_dir) platform_name = 'iPhoneOS' if self._on_device else 'iPhoneSimulator' test_envs = { 'DYLD_FRAMEWORK_PATH': '__TESTROOT__:__PLATFORMS__/%s.platform/Developer/' 'Library/Frameworks' % platform_name, 'DYLD_LIBRARY_PATH': '__TESTROOT__:__PLATFORMS__/%s.platform/Developer/' 'Library/Frameworks' % platform_name } self._xctestrun_dict = { 'IsUITestBundle': True, 'SystemAttachmentLifetime': 'keepNever', 'TestBundlePath': self._test_bundle_dir, 'TestHostPath': uitest_runner_app, 'UITargetAppPath': self._app_under_test_dir, 'UserAttachmentLifetime': 'keepNever', 'TestingEnvironmentVariables': test_envs }
def _GenerateTestRootForXcuitest(self): """Generates the test root for XCUITest. The approach constructs xctestrun.plist and uitest runner app from Xcode. Then copies app under test, test bundle, xctestrun.plist and uitest runner app to test root directory. """ platform_path = xcode_info_util.GetSdkPlatformPath(self._sdk) platform_library_path = os.path.join(platform_path, 'Developer/Library') uitest_runner_app = self._GetUitestRunnerAppFromXcode( platform_library_path) self._PrepareUitestInRunerApp(uitest_runner_app) if self._on_device: runner_app_embedded_provision = os.path.join( uitest_runner_app, 'embedded.mobileprovision') use_customized_provision = False if self._signing_options: customized_runner_app_provision = self._signing_options.get( 'xctrunner_app_provisioning_profile') if customized_runner_app_provision: shutil.copyfile(customized_runner_app_provision, runner_app_embedded_provision) use_customized_provision = True if self._signing_options.get( 'xctrunner_app_enable_ui_file_sharing'): try: # Don't resign the uitest runner app here since it will be resigned # with passing entitlements and identity later. bundle_util.EnableUIFileSharing(uitest_runner_app, resigning=False) except ios_errors.BundleError as e: logging.warning(str(e)) # If customized runner app provision is not provided, runner app will # use app under test's embedded provision as embedded provision. if not use_customized_provision: app_under_test_embedded_provision = os.path.join( self._app_under_test_dir, 'embedded.mobileprovision') shutil.copyfile(app_under_test_embedded_provision, runner_app_embedded_provision) test_bundle_team_id = bundle_util.GetDevelopmentTeam( self._test_bundle_dir) full_test_bundle_id = '%s.%s' % (test_bundle_team_id, bundle_util.GetBundleId( self._test_bundle_dir)) entitlements_dict = { 'application-identifier': full_test_bundle_id, 'com.apple.developer.team-identifier': test_bundle_team_id, 'get-task-allow': True, 'keychain-access-groups': [full_test_bundle_id], } entitlements_plist_path = os.path.join(uitest_runner_app, 'RunnerEntitlements.plist') plist_util.Plist(entitlements_plist_path).SetPlistField( None, entitlements_dict) test_bundle_signing_identity = bundle_util.GetCodesignIdentity( self._test_bundle_dir) runner_app_frameworks_dir = os.path.join(uitest_runner_app, 'Frameworks') os.mkdir(runner_app_frameworks_dir) _CopyAndSignFramework( os.path.join(platform_library_path, 'Frameworks/XCTest.framework'), runner_app_frameworks_dir, test_bundle_signing_identity) xcode_version_num = xcode_info_util.GetXcodeVersionNumber() if xcode_version_num >= 900: _CopyAndSignFramework( os.path.join( platform_library_path, 'PrivateFrameworks/XCTAutomationSupport.framework'), runner_app_frameworks_dir, test_bundle_signing_identity) if xcode_version_num >= 1100: _CopyAndSignLibFile( os.path.join(platform_path, _LIB_XCTEST_SWIFT_RELATIVE_PATH), runner_app_frameworks_dir, test_bundle_signing_identity) bundle_util.CodesignBundle( uitest_runner_app, entitlements_plist_path=entitlements_plist_path, identity=test_bundle_signing_identity) bundle_util.CodesignBundle(self._test_bundle_dir) bundle_util.CodesignBundle(self._app_under_test_dir) platform_name = 'iPhoneOS' if self._on_device else 'iPhoneSimulator' developer_path = '__PLATFORMS__/%s.platform/Developer' % platform_name test_envs = { 'DYLD_FRAMEWORK_PATH': '__TESTROOT__:{developer}/Library/Frameworks:' '{developer}/Library/PrivateFrameworks'.format( developer=developer_path), 'DYLD_LIBRARY_PATH': '__TESTROOT__:%s/usr/lib' % developer_path } # Fixes failures for UI test targets that depend on Swift libraries when running with Xcode 11 # on pre-iOS 12.2 simulators. # Example failure message this resolves: "The bundle couldn’t be loaded because it is damaged # or missing necessary resources." swift5FallbackLibsDir = xcode_info_util.GetSwift5FallbackLibsDir() if swift5FallbackLibsDir: test_envs["DYLD_FALLBACK_LIBRARY_PATH"] = swift5FallbackLibsDir self._xctestrun_dict = { 'IsUITestBundle': True, 'SystemAttachmentLifetime': 'keepAlways', 'TestBundlePath': self._test_bundle_dir, 'TestHostPath': uitest_runner_app, 'UITargetAppPath': self._app_under_test_dir, 'UserAttachmentLifetime': 'keepAlways', 'TestingEnvironmentVariables': test_envs, 'DependentProductPaths': [self._app_under_test_dir, self._test_bundle_dir], }