| // Copyright 2016 The Tulsi Authors. 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. |
| |
| import XCTest |
| @testable import TulsiGenerator |
| |
| // Note: Rather than test the serializer's output, we make use of the knowledge that |
| // buildSerializerWithRuleEntries modifies a project directly. |
| class PBXTargetGeneratorTests: XCTestCase { |
| let bazelURL = URL(fileURLWithPath: "__BAZEL_BINARY_") |
| let workspaceRootURL = URL(fileURLWithPath: "/workspaceRootURL", isDirectory: true) |
| let stubPlistPaths = StubInfoPlistPaths(resourcesDirectory: "${PROJECT_FILE_PATH}/.tulsi/Resources", |
| defaultStub: "TestInfo.plist", |
| watchOSStub: "TestWatchOS2Info.plist", |
| watchOSAppExStub: "TestWatchOS2AppExInfo.plist") |
| let testTulsiVersion = "9.99.999.9999" |
| var project: PBXProject! = nil |
| var targetGenerator: PBXTargetGenerator! = nil |
| |
| override func setUp() { |
| super.setUp() |
| project = PBXProject(name: "TestProject") |
| targetGenerator = PBXTargetGenerator(bazelURL: bazelURL, |
| bazelBinPath: "bazel-bin", |
| project: project, |
| buildScriptPath: "", |
| stubInfoPlistPaths: stubPlistPaths, |
| tulsiVersion: testTulsiVersion, |
| options: TulsiOptionSet(), |
| localizedMessageLogger: MockLocalizedMessageLogger(), |
| workspaceRootURL: workspaceRootURL) |
| |
| } |
| |
| // MARK: - Tests |
| |
| func testGenerateFileReferenceForSingleBUILDFilePath() { |
| let buildFilePath = "some/path/BUILD" |
| targetGenerator.generateFileReferencesForFilePaths([buildFilePath]) |
| XCTAssertEqual(project.mainGroup.children.count, 1) |
| |
| let fileRef = project.mainGroup.allSources.first! |
| let sourceRelativePath = fileRef.sourceRootRelativePath |
| XCTAssertEqual(sourceRelativePath, buildFilePath) |
| XCTAssertEqual(fileRef.sourceTree, SourceTree.Group, "SourceTree mismatch for generated BUILD file \(buildFilePath)") |
| } |
| |
| func testGenerateFileReferenceForBUILDFilePaths() { |
| let buildFilePaths = ["BUILD", "some/path/BUILD", "somewhere/else/BUILD"] |
| targetGenerator.generateFileReferencesForFilePaths(buildFilePaths) |
| XCTAssertEqual(project.mainGroup.children.count, buildFilePaths.count) |
| |
| for fileRef in project.mainGroup.allSources { |
| XCTAssert(buildFilePaths.contains(fileRef.sourceRootRelativePath), "Path mismatch for generated BUILD file \(String(describing: fileRef.path))") |
| XCTAssertEqual(fileRef.sourceTree, SourceTree.Group, "SourceTree mismatch for generated BUILD file \(String(describing: fileRef.path))") |
| } |
| } |
| |
| func testMainGroupForOutputFolder() { |
| func assertOutputFolder(_ output: String, |
| workspace: String, |
| generatesSourceTree sourceTree: SourceTree, |
| path: String?, |
| line: UInt = #line) { |
| let outputURL = URL(fileURLWithPath: output, isDirectory: true) |
| let workspaceURL = URL(fileURLWithPath: workspace, isDirectory: true) |
| let group = PBXTargetGenerator.mainGroupForOutputFolder(outputURL, |
| workspaceRootURL: workspaceURL) |
| XCTAssertEqual(group.sourceTree, sourceTree, line: line) |
| XCTAssertEqual(group.path, path, line: line) |
| } |
| |
| assertOutputFolder("/", workspace: "/", generatesSourceTree: .SourceRoot, path: nil) |
| assertOutputFolder("/output", workspace: "/output", generatesSourceTree: .SourceRoot, path: nil) |
| assertOutputFolder("/output/", workspace: "/output", generatesSourceTree: .SourceRoot, path: nil) |
| assertOutputFolder("/output", workspace: "/output/", generatesSourceTree: .SourceRoot, path: nil) |
| assertOutputFolder("/", workspace: "/output", generatesSourceTree: .SourceRoot, path: "output") |
| assertOutputFolder("/output", workspace: "/output/workspace", generatesSourceTree: .SourceRoot, path: "workspace") |
| assertOutputFolder("/output/", workspace: "/output/workspace", generatesSourceTree: .SourceRoot, path: "workspace") |
| assertOutputFolder("/output", workspace: "/output/workspace/", generatesSourceTree: .SourceRoot, path: "workspace") |
| assertOutputFolder("/output", workspace: "/output/deep/path/workspace", generatesSourceTree: .SourceRoot, path: "deep/path/workspace") |
| assertOutputFolder("/path/to/workspace/output", workspace: "/path/to/workspace", generatesSourceTree: .SourceRoot, path: "..") |
| assertOutputFolder("/output", workspace: "/", generatesSourceTree: .SourceRoot, path: "..") |
| assertOutputFolder("/output/", workspace: "/", generatesSourceTree: .SourceRoot, path: "..") |
| assertOutputFolder("/path/to/workspace/three/deep/output", workspace: "/path/to/workspace", generatesSourceTree: .SourceRoot, path: "../../..") |
| assertOutputFolder("/path/to/output", workspace: "/elsewhere/workspace", generatesSourceTree: .Absolute, path: "/elsewhere/workspace") |
| } |
| } |
| |
| |
| class PBXTargetGeneratorTestsWithFiles: XCTestCase { |
| let bazelURL = URL(fileURLWithPath: "__BAZEL_BINARY_") |
| let workspaceRootURL = URL(fileURLWithPath: "/workspaceRootURL", isDirectory: true) |
| let sdkRoot = "sdkRoot" |
| let stubPlistPaths = StubInfoPlistPaths(resourcesDirectory:"${PROJECT_ROOT}/asd", |
| defaultStub: "TestInfo.plist", |
| watchOSStub: "TestWatchOS2Info.plist", |
| watchOSAppExStub: "TestWatchOS2AppExInfo.plist") |
| let testTulsiVersion = "9.99.999.9999" |
| |
| var project: PBXProject! = nil |
| var targetGenerator: PBXTargetGenerator! = nil |
| var messageLogger: MockLocalizedMessageLogger! = nil |
| |
| var sourceFileNames = [String]() |
| var pathFilters = Set<String>() |
| var sourceFileReferences = [PBXFileReference]() |
| var pchFile: PBXFileReference! = nil |
| |
| override func setUp() { |
| super.setUp() |
| |
| project = PBXProject(name: "TestProject") |
| sourceFileNames = ["test.swift", "test.cc"] |
| pathFilters = Set<String>([""]) |
| rebuildSourceFileReferences() |
| pchFile = project.mainGroup.getOrCreateFileReferenceBySourceTree(.Group, path: "pch.pch") |
| let options = TulsiOptionSet() |
| messageLogger = MockLocalizedMessageLogger() |
| targetGenerator = PBXTargetGenerator(bazelURL: bazelURL, |
| bazelBinPath: "bazel-bin", |
| project: project, |
| buildScriptPath: "", |
| stubInfoPlistPaths: stubPlistPaths, |
| tulsiVersion: testTulsiVersion, |
| options: options, |
| localizedMessageLogger: messageLogger, |
| workspaceRootURL: workspaceRootURL) |
| } |
| |
| // MARK: - Tests |
| |
| func testGenerateBazelCleanTarget() { |
| let scriptPath = "scriptPath" |
| let workingDirectory = "/directory/of/work" |
| targetGenerator.generateBazelCleanTarget(scriptPath, workingDirectory: workingDirectory) |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| |
| XCTAssertNotNil(targets[PBXTargetGenerator.BazelCleanTarget] as? PBXLegacyTarget) |
| let target = targets[PBXTargetGenerator.BazelCleanTarget] as! PBXLegacyTarget |
| |
| XCTAssertEqual(target.buildToolPath, scriptPath) |
| |
| // The script should launch the test scriptPath with bazelURL's path as the only argument. |
| let expectedScriptArguments = "\"\(bazelURL.path)\" \"bazel-bin\"" |
| XCTAssertEqual(target.buildArgumentsString, expectedScriptArguments) |
| } |
| |
| func testGenerateBazelCleanTargetAppliesToRulesAddedBeforeAndAfter() { |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries([makeTestRuleEntry("before", type: "ios_application", productType: .Application)], ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| |
| targetGenerator.generateBazelCleanTarget("scriptPath") |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries([makeTestRuleEntry("after", type: "ios_application", productType: .Application)], ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 3) |
| |
| XCTAssertNotNil(targets[PBXTargetGenerator.BazelCleanTarget] as? PBXLegacyTarget) |
| let integrationTarget = targets[PBXTargetGenerator.BazelCleanTarget] as! PBXLegacyTarget |
| |
| for target in project.allTargets { |
| if target === integrationTarget { continue } |
| XCTAssertEqual(target.dependencies.count, 1, "Mismatch in dependency count for target added \(target.name)") |
| let targetProxy = target.dependencies[0].targetProxy |
| XCTAssert(targetProxy.containerPortal === project, "Mismatch in container for dependency in target added \(target.name)") |
| XCTAssert(targetProxy.target === integrationTarget, "Mismatch in target dependency for target added \(target.name)") |
| XCTAssertEqual(targetProxy.proxyType, |
| PBXContainerItemProxy.ProxyType.targetReference, |
| "Mismatch in target dependency type for target added \(target.name)") |
| } |
| } |
| |
| func testGenerateTopLevelBuildConfigurations() { |
| targetGenerator.generateTopLevelBuildConfigurations() |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 4) |
| |
| let topLevelBuildSettings = [ |
| "ALWAYS_SEARCH_USER_PATHS": "NO", |
| "CLANG_ENABLE_OBJC_ARC": "YES", |
| "CLANG_WARN_BOOL_CONVERSION": "YES", |
| "CLANG_WARN_CONSTANT_CONVERSION": "YES", |
| "CLANG_WARN_EMPTY_BODY": "YES", |
| "CLANG_WARN_ENUM_CONVERSION": "YES", |
| "CLANG_WARN_INT_CONVERSION": "YES", |
| "CLANG_WARN_UNREACHABLE_CODE": "YES", |
| "CLANG_WARN__DUPLICATE_METHOD_MATCH": "YES", |
| "CODE_SIGNING_REQUIRED": "NO", |
| "CODE_SIGN_IDENTITY": "", |
| "ENABLE_TESTABILITY": "YES", |
| "FRAMEWORK_SEARCH_PATHS": "$(PLATFORM_DIR)/Developer/Library/Frameworks", |
| "GCC_WARN_64_TO_32_BIT_CONVERSION": "YES", |
| "GCC_WARN_ABOUT_RETURN_TYPE": "YES", |
| "GCC_WARN_UNDECLARED_SELECTOR": "YES", |
| "GCC_WARN_UNINITIALIZED_AUTOS": "YES", |
| "GCC_WARN_UNUSED_FUNCTION": "YES", |
| "GCC_WARN_UNUSED_VARIABLE": "YES", |
| "HEADER_SEARCH_PATHS": "$(TULSI_BWRS) $(TULSI_WR)/bazel-bin $(TULSI_WR)/bazel-genfiles " |
| + "$(TULSI_BWRS)/_tulsi-includes/x/x", |
| "ONLY_ACTIVE_ARCH": "YES", |
| "PYTHONIOENCODING": "utf8", |
| "TULSI_VERSION": testTulsiVersion, |
| "TULSI_WR": "$(SRCROOT)", |
| "TULSI_BWRS": "${TULSI_WR}/tulsi-workspace", |
| ] |
| |
| XCTAssertNotNil(topLevelConfigs["Debug"]) |
| XCTAssertEqual(topLevelConfigs["Debug"]!.buildSettings, |
| debugBuildSettingsFromSettings(topLevelBuildSettings)) |
| XCTAssertNotNil(topLevelConfigs["Release"]) |
| XCTAssertEqual(topLevelConfigs["Release"]!.buildSettings, |
| releaseBuildSettingsFromSettings(topLevelBuildSettings)) |
| XCTAssertNotNil(topLevelConfigs["__TulsiTestRunner_Debug"]) |
| XCTAssertEqual(topLevelConfigs["__TulsiTestRunner_Debug"]!.buildSettings, |
| debugTestRunnerBuildSettingsFromSettings(topLevelBuildSettings)) |
| XCTAssertNotNil(topLevelConfigs["__TulsiTestRunner_Release"]) |
| XCTAssertEqual(topLevelConfigs["__TulsiTestRunner_Release"]!.buildSettings, |
| releaseTestRunnerBuildSettingsFromSettings(topLevelBuildSettings)) |
| } |
| |
| func testGenerateTopLevelBuildConfigurationsWithAnSDKROOT() { |
| let projectSDKROOT = "projectSDKROOT" |
| targetGenerator.generateTopLevelBuildConfigurations(["SDKROOT": projectSDKROOT]) |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 4) |
| |
| let topLevelBuildSettings = [ |
| "ALWAYS_SEARCH_USER_PATHS": "NO", |
| "CLANG_ENABLE_OBJC_ARC": "YES", |
| "CLANG_WARN_BOOL_CONVERSION": "YES", |
| "CLANG_WARN_CONSTANT_CONVERSION": "YES", |
| "CLANG_WARN_EMPTY_BODY": "YES", |
| "CLANG_WARN_ENUM_CONVERSION": "YES", |
| "CLANG_WARN_INT_CONVERSION": "YES", |
| "CLANG_WARN_UNREACHABLE_CODE": "YES", |
| "CLANG_WARN__DUPLICATE_METHOD_MATCH": "YES", |
| "CODE_SIGNING_REQUIRED": "NO", |
| "CODE_SIGN_IDENTITY": "", |
| "ENABLE_TESTABILITY": "YES", |
| "FRAMEWORK_SEARCH_PATHS": "$(PLATFORM_DIR)/Developer/Library/Frameworks", |
| "GCC_WARN_64_TO_32_BIT_CONVERSION": "YES", |
| "GCC_WARN_ABOUT_RETURN_TYPE": "YES", |
| "GCC_WARN_UNDECLARED_SELECTOR": "YES", |
| "GCC_WARN_UNINITIALIZED_AUTOS": "YES", |
| "GCC_WARN_UNUSED_FUNCTION": "YES", |
| "GCC_WARN_UNUSED_VARIABLE": "YES", |
| "HEADER_SEARCH_PATHS": "$(TULSI_BWRS) $(TULSI_WR)/bazel-bin $(TULSI_WR)/bazel-genfiles " |
| + "$(TULSI_BWRS)/_tulsi-includes/x/x", |
| "SDKROOT": projectSDKROOT, |
| "ONLY_ACTIVE_ARCH": "YES", |
| "PYTHONIOENCODING": "utf8", |
| "TULSI_VERSION": testTulsiVersion, |
| "TULSI_WR": "$(SRCROOT)", |
| "TULSI_BWRS": "${TULSI_WR}/tulsi-workspace", |
| ] |
| |
| XCTAssertNotNil(topLevelConfigs["Debug"]) |
| XCTAssertEqual(topLevelConfigs["Debug"]!.buildSettings, |
| debugBuildSettingsFromSettings(topLevelBuildSettings)) |
| XCTAssertNotNil(topLevelConfigs["Release"]) |
| XCTAssertEqual(topLevelConfigs["Release"]!.buildSettings, |
| releaseBuildSettingsFromSettings(topLevelBuildSettings)) |
| XCTAssertNotNil(topLevelConfigs["__TulsiTestRunner_Debug"]) |
| XCTAssertEqual(topLevelConfigs["__TulsiTestRunner_Debug"]!.buildSettings, |
| debugTestRunnerBuildSettingsFromSettings(topLevelBuildSettings)) |
| XCTAssertNotNil(topLevelConfigs["__TulsiTestRunner_Release"]) |
| XCTAssertEqual(topLevelConfigs["__TulsiTestRunner_Release"]!.buildSettings, |
| releaseTestRunnerBuildSettingsFromSettings(topLevelBuildSettings)) |
| } |
| |
| func testGenerateTargetsForRuleEntriesWithNoEntries() { |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries([], ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| |
| let targets = project.targetByName |
| XCTAssert(targets.isEmpty) |
| } |
| |
| func testGenerateTargetsForRuleEntries() { |
| let rule1BuildPath = "test/app" |
| let rule1TargetName = "TestApplication" |
| let rule1BuildTarget = "\(rule1BuildPath):\(rule1TargetName)" |
| let rule2BuildPath = "test/objclib" |
| let rule2TargetName = "ObjectiveCLibrary" |
| let rule2BuildTarget = "\(rule2BuildPath):\(rule2TargetName)" |
| let rules = Set([ |
| makeTestRuleEntry(rule1BuildTarget, type: "ios_application", productType: .Application), |
| makeTestRuleEntry(rule2BuildTarget, type: "objc_library"), |
| ]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 0) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 2) |
| |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/app:TestApplication", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_NAME": rule1TargetName, |
| "SDKROOT": "iphoneos", |
| "TULSI_BUILD_PATH": rule1BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule1TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule1BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/objclib:ObjectiveCLibrary", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_NAME": rule2TargetName, |
| "SDKROOT": "iphoneos", |
| "TULSI_BUILD_PATH": rule2BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule2TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule2BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateTargetsForLinkedRuleEntriesWithNoSourcesAndSkylarkUnitTest() { |
| checkGenerateTargetsForLinkedRuleEntriesWithNoSources("apple_unit_test", |
| testProductType: .UnitTest, |
| testHostAttributeName: "test_host") |
| } |
| |
| func checkGenerateTargetsForLinkedRuleEntriesWithNoSources(_ testRuleType: String, |
| testProductType: PBXTarget.ProductType, |
| testHostAttributeName: String) { |
| let rule1BuildPath = "test/app" |
| let rule1TargetName = "TestApplication" |
| let rule1BuildTarget = "\(rule1BuildPath):\(rule1TargetName)" |
| let rule2BuildPath = "test/testbundle" |
| let rule2TargetName = "TestBundle" |
| let rule2BuildTarget = "\(rule2BuildPath):\(rule2TargetName)" |
| let rule2Attributes = [testHostAttributeName: rule1BuildTarget] |
| let rules = Set([ |
| makeTestRuleEntry(rule1BuildTarget, type: "ios_application", productType: .Application), |
| makeTestRuleEntry(rule2BuildTarget, |
| type: testRuleType, |
| attributes: rule2Attributes as [String: AnyObject], |
| productType: testProductType, |
| platformType: "ios", |
| osDeploymentTarget: "8.0"), |
| ]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| XCTAssert(!messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 0) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 2) |
| |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/app:TestApplication", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_NAME": rule1TargetName, |
| "SDKROOT": "iphoneos", |
| "TULSI_BUILD_PATH": rule1BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule1TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule1BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/testbundle:TestBundle", |
| "BUNDLE_LOADER": "$(TEST_HOST)", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "HEADER_SEARCH_PATHS": "$(inherited) $(TULSI_BWRS)/tools/cpp/gcc3", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "IPHONEOS_DEPLOYMENT_TARGET": "8.0", |
| "PRODUCT_NAME": rule2TargetName, |
| "SDKROOT": "iphoneos", |
| "TEST_HOST": "$(BUILT_PRODUCTS_DIR)/\(rule1TargetName).app/\(rule1TargetName)", |
| "TULSI_BUILD_PATH": rule2BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| "TULSI_TEST_RUNNER_ONLY": "YES", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule2TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule2BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateTargetsForLinkedRuleEntriesWithNoSourcesAndSkylarkUITest() { |
| let testRuleType = "apple_ui_test" |
| let testHostAttributeName = "test_host" |
| let rule1BuildPath = "test/app" |
| let rule1TargetName = "TestApplication" |
| let rule1BuildTarget = "\(rule1BuildPath):\(rule1TargetName)" |
| let rule2BuildPath = "test/testbundle" |
| let rule2TargetName = "TestBundle" |
| let rule2BuildTarget = "\(rule2BuildPath):\(rule2TargetName)" |
| let rule2Attributes = [testHostAttributeName: rule1BuildTarget] |
| let rules = Set([ |
| makeTestRuleEntry(rule1BuildTarget, type: "ios_application", productType: .Application), |
| makeTestRuleEntry(rule2BuildTarget, |
| type: testRuleType, |
| attributes: rule2Attributes as [String: AnyObject], |
| productType: .UIUnitTest, |
| platformType: "ios", |
| osDeploymentTarget: "8.0"), |
| ]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| XCTAssert(!messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 0) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 2) |
| |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/app:TestApplication", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_NAME": rule1TargetName, |
| "SDKROOT": "iphoneos", |
| "TULSI_BUILD_PATH": rule1BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule1TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule1BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/testbundle:TestBundle", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "HEADER_SEARCH_PATHS": "$(inherited) $(TULSI_BWRS)/tools/cpp/gcc3", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "IPHONEOS_DEPLOYMENT_TARGET": "8.0", |
| "PRODUCT_NAME": rule2TargetName, |
| "SDKROOT": "iphoneos", |
| "TEST_TARGET_NAME": rule1TargetName, |
| "TULSI_BUILD_PATH": rule2BuildPath, |
| "TULSI_TEST_RUNNER_ONLY": "YES", |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule2TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule2BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateTargetsForLinkedRuleEntriesWithNoSourcesMacOSUnitTests() { |
| let testRuleType = "apple_unit_test" |
| let testHostAttributeName = "test_host" |
| let rule1BuildPath = "test/app" |
| let rule1TargetName = "TestApplication" |
| let rule1BuildTarget = "\(rule1BuildPath):\(rule1TargetName)" |
| let rule2BuildPath = "test/testbundle" |
| let rule2TargetName = "TestBundle" |
| let rule2BuildTarget = "\(rule2BuildPath):\(rule2TargetName)" |
| let rule2Attributes = [testHostAttributeName: rule1BuildTarget] |
| let rules = Set([ |
| makeTestRuleEntry(rule1BuildTarget, |
| type: "macos_application", |
| productType: .Application, |
| platformType: "macos", |
| osDeploymentTarget: "10.11"), |
| makeTestRuleEntry(rule2BuildTarget, |
| type: testRuleType, |
| attributes: rule2Attributes as [String: AnyObject], |
| productType: .UnitTest, |
| platformType: "macos", |
| osDeploymentTarget: "10.11"), |
| ]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| XCTAssert(!messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 0) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 2) |
| |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/app:TestApplication", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "MACOSX_DEPLOYMENT_TARGET": "10.11", |
| "PRODUCT_NAME": rule1TargetName, |
| "SDKROOT": "macosx", |
| "TULSI_BUILD_PATH": rule1BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule1TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule1BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/testbundle:TestBundle", |
| "BUNDLE_LOADER": "$(TEST_HOST)", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "HEADER_SEARCH_PATHS": "$(inherited) $(TULSI_BWRS)/tools/cpp/gcc3", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "MACOSX_DEPLOYMENT_TARGET": "10.11", |
| "PRODUCT_NAME": rule2TargetName, |
| "SDKROOT": "macosx", |
| "TEST_HOST": "$(BUILT_PRODUCTS_DIR)/\(rule1TargetName).app/Contents/MacOS/\(rule1TargetName)", |
| "TULSI_BUILD_PATH": rule2BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| "TULSI_TEST_RUNNER_ONLY": "YES", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule2TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule2BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateTargetsForLinkedRuleEntriesWithNoSourcesMacOSUITests() { |
| let testRuleType = "apple_ui_test" |
| let testHostAttributeName = "test_host" |
| let rule1BuildPath = "test/app" |
| let rule1TargetName = "TestApplication" |
| let rule1BuildTarget = "\(rule1BuildPath):\(rule1TargetName)" |
| let rule2BuildPath = "test/testbundle" |
| let rule2TargetName = "TestBundle" |
| let rule2BuildTarget = "\(rule2BuildPath):\(rule2TargetName)" |
| let rule2Attributes = [testHostAttributeName: rule1BuildTarget] |
| let rules = Set([ |
| makeTestRuleEntry(rule1BuildTarget, |
| type: "macos_application", |
| productType: .Application, |
| platformType: "macos", |
| osDeploymentTarget: "10.11"), |
| makeTestRuleEntry(rule2BuildTarget, |
| type: testRuleType, |
| attributes: rule2Attributes as [String: AnyObject], |
| productType: .UIUnitTest, |
| platformType: "macos", |
| osDeploymentTarget: "10.11"), |
| ]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| XCTAssert(!messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 0) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 2) |
| |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/app:TestApplication", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "MACOSX_DEPLOYMENT_TARGET": "10.11", |
| "PRODUCT_NAME": rule1TargetName, |
| "SDKROOT": "macosx", |
| "TULSI_BUILD_PATH": rule1BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule1TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule1BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/testbundle:TestBundle", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "HEADER_SEARCH_PATHS": "$(inherited) $(TULSI_BWRS)/tools/cpp/gcc3", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "MACOSX_DEPLOYMENT_TARGET": "10.11", |
| "PRODUCT_NAME": rule2TargetName, |
| "SDKROOT": "macosx", |
| "TEST_TARGET_NAME": rule1TargetName, |
| "TULSI_BUILD_PATH": rule2BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| "TULSI_TEST_RUNNER_ONLY": "YES", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule2TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule2BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateTargetWithNoSourcesNoHostMacOSUnitTests() { |
| let testRuleType = "apple_unit_test" |
| let rule1BuildPath = "test/testbundle" |
| let rule1TargetName = "TestBundle" |
| let rule1BuildTarget = "\(rule1BuildPath):\(rule1TargetName)" |
| let rules = Set([ |
| makeTestRuleEntry(rule1BuildTarget, |
| type: testRuleType, |
| productType: .UnitTest, |
| platformType: "macos", |
| osDeploymentTarget: "10.11"), |
| ]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| XCTAssert(!messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 0) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/testbundle:TestBundle", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "HEADER_SEARCH_PATHS": "$(inherited) $(TULSI_BWRS)/tools/cpp/gcc3", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "MACOSX_DEPLOYMENT_TARGET": "10.11", |
| "PRODUCT_NAME": rule1TargetName, |
| "SDKROOT": "macosx", |
| "TULSI_BUILD_PATH": rule1BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| "TULSI_TEST_RUNNER_ONLY": "YES", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule1TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule1BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateTargetWithSourcesNoHostMacOSUnitTests() { |
| let testRuleType = "apple_unit_test" |
| let rule1BuildPath = "test/testbundle" |
| let rule1TargetName = "TestBundle" |
| let rule1BuildTarget = "\(rule1BuildPath):\(rule1TargetName)" |
| let testSources = ["test/src1.m", "test/src2.m"] |
| let rules = Set([ |
| makeTestRuleEntry(rule1BuildTarget, |
| type: testRuleType, |
| sourceFiles: testSources, |
| productType: .UnitTest, |
| platformType: "macos", |
| osDeploymentTarget: "10.11"), |
| ]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| XCTAssert(!messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 0) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/testbundle:TestBundle", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "HEADER_SEARCH_PATHS": "$(inherited) $(TULSI_BWRS)/tools/cpp/gcc3", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "MACOSX_DEPLOYMENT_TARGET": "10.11", |
| "PRODUCT_NAME": rule1TargetName, |
| "SDKROOT": "macosx", |
| "TULSI_BUILD_PATH": rule1BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| "TULSI_TEST_RUNNER_ONLY": "YES", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule1TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule1BuildTarget), |
| SourcesBuildPhaseDefinition(files: testSources, mainGroup: project.mainGroup), |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateTargetsForLinkedRuleEntriesWithSourcesWithSkylarkUnitTest() { |
| checkGenerateTargetsForLinkedRuleEntriesWithSources("apple_unit_test", |
| testProductType: .UnitTest, |
| testHostAttributeName: "test_host") |
| } |
| |
| func checkGenerateTargetsForLinkedRuleEntriesWithSources(_ testRuleType: String, |
| testProductType: PBXTarget.ProductType, |
| testHostAttributeName: String) { |
| let rule1BuildPath = "test/app" |
| let rule1TargetName = "TestHost" |
| let rule1BuildTarget = "\(rule1BuildPath):\(rule1TargetName)" |
| let testRuleBuildPath = "test/testbundle" |
| let testRuleTargetName = "Tests" |
| let testRuleBuildTarget = "\(testRuleBuildPath):\(testRuleTargetName)" |
| let testRuleAttributes = [testHostAttributeName: rule1BuildTarget] |
| let testSources = ["sourceFile1.m", "sourceFile2.mm"] |
| let testRule = makeTestRuleEntry(testRuleBuildTarget, |
| type: testRuleType, |
| attributes: testRuleAttributes as [String: AnyObject], |
| sourceFiles: testSources, |
| productType: testProductType, |
| platformType: "ios", |
| osDeploymentTarget: "8.0") |
| let rules = Set([ |
| makeTestRuleEntry(rule1BuildTarget, type: "ios_application", productType: .Application), |
| testRule, |
| ]) |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| XCTAssert(!messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 2) |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/app:TestHost", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_NAME": rule1TargetName, |
| "SDKROOT": "iphoneos", |
| "TULSI_BUILD_PATH": rule1BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule1TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, |
| buildTarget: rule1BuildTarget), |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/testbundle:Tests", |
| "BUNDLE_LOADER": "$(TEST_HOST)", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "HEADER_SEARCH_PATHS": "$(inherited) $(TULSI_BWRS)/tools/cpp/gcc3", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "IPHONEOS_DEPLOYMENT_TARGET": "8.0", |
| "PRODUCT_NAME": testRuleTargetName, |
| "SDKROOT": "iphoneos", |
| "TEST_HOST": "$(BUILT_PRODUCTS_DIR)/\(rule1TargetName).app/\(rule1TargetName)", |
| "TULSI_BUILD_PATH": testRuleBuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| "TULSI_TEST_RUNNER_ONLY": "YES", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: testRuleTargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| SourcesBuildPhaseDefinition(files: testSources, mainGroup: project.mainGroup), |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, |
| buildTarget: testRuleBuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateTestTargetWithObjectiveCSources() { |
| let testRuleTargetName = "Tests" |
| let testRuleType = "apple_unit_test" |
| let testHostTargetName = "App" |
| let testRulePackage = "test/app" |
| let testSources = ["test/app/Tests.m"] |
| let objcLibraryRuleEntry = makeTestRuleEntry("\(testRulePackage):ObjcLib", |
| type: "objc_library", |
| sourceFiles: testSources) |
| let appleBinaryRuleEntry = makeTestRuleEntry("\(testRulePackage):Tests_test_binary", |
| type: "apple_binary", |
| dependencies: Set([BuildLabel(objcLibraryRuleEntry.label.value)])) |
| let testBundleRuleEntry = makeTestRuleEntry("\(testRulePackage):Tests_test_bundle", |
| type: "ios_test_bundle", |
| attributes: ["binary": appleBinaryRuleEntry.label.value as AnyObject]) |
| let testHostRuleEntry = makeTestRuleEntry("\(testRulePackage):\(testHostTargetName)", |
| type: "ios_application", productType: .Application) |
| let testRuleEntry = makeTestRuleEntry("\(testRulePackage):\(testRuleTargetName)", |
| type: "\(testRuleType)", |
| attributes: ["test_bundle": testBundleRuleEntry.label.value as AnyObject, |
| "test_host": testHostRuleEntry.label.value as AnyObject], |
| sourceFiles: testSources, |
| productType: .UnitTest, |
| platformType: "ios", |
| osDeploymentTarget: "8.0") |
| |
| let ruleEntryMap = makeRuleEntryMap(withRuleEntries: [objcLibraryRuleEntry, |
| appleBinaryRuleEntry, |
| testBundleRuleEntry, |
| testHostRuleEntry, |
| testRuleEntry]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries([testRuleEntry, testHostRuleEntry], |
| ruleEntryMap: ruleEntryMap) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| XCTAssert(!messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 2) |
| |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/app:Tests", |
| "BUNDLE_LOADER": "$(TEST_HOST)", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "HEADER_SEARCH_PATHS": "$(inherited) $(TULSI_BWRS)/tools/cpp/gcc3", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "IPHONEOS_DEPLOYMENT_TARGET": "8.0", |
| "PRODUCT_NAME": testRuleTargetName, |
| "SDKROOT": "iphoneos", |
| "TEST_HOST": "$(BUILT_PRODUCTS_DIR)/\(testHostTargetName).app/\(testHostTargetName)", |
| "TULSI_BUILD_PATH": testRulePackage, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| "TULSI_TEST_RUNNER_ONLY": "YES", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: testRuleTargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| SourcesBuildPhaseDefinition(files: testSources, mainGroup: project.mainGroup), |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, |
| buildTarget: "\(testRulePackage):\(testRuleTargetName)") |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| |
| func testGenerateTestTargetWithSwiftSources() { |
| let testRuleTargetName = "Tests" |
| let testRuleType = "apple_unit_test" |
| let testHostTargetName = "App" |
| let testRulePackage = "test/app" |
| let testSources = ["test/app/Tests.swift"] |
| let swiftLibraryRuleEntry = makeTestRuleEntry("\(testRulePackage):SwiftLib", |
| type: "swift_library", |
| sourceFiles: testSources) |
| let appleBinaryRuleEntry = makeTestRuleEntry("\(testRulePackage):Tests_test_binary", |
| type: "apple_binary", |
| dependencies: Set([BuildLabel(swiftLibraryRuleEntry.label.value)])) |
| let testBundleRuleEntry = makeTestRuleEntry("\(testRulePackage):Tests_test_bundle", |
| type: "ios_test_bundle", |
| attributes: ["binary": appleBinaryRuleEntry.label.value as AnyObject]) |
| let testHostRuleEntry = makeTestRuleEntry("\(testRulePackage):\(testHostTargetName)", |
| type: "ios_application", productType: .Application) |
| let testRuleEntry = makeTestRuleEntry("\(testRulePackage):\(testRuleTargetName)", |
| type: "\(testRuleType)", |
| attributes: ["has_swift_dependency": true as AnyObject, |
| "test_bundle": testBundleRuleEntry.label.value as AnyObject, |
| "test_host": testHostRuleEntry.label.value as AnyObject], |
| sourceFiles: testSources, |
| productType: .UnitTest, |
| platformType: "ios", |
| osDeploymentTarget: "8.0") |
| |
| let ruleEntryMap = makeRuleEntryMap(withRuleEntries: [swiftLibraryRuleEntry, |
| appleBinaryRuleEntry, |
| testBundleRuleEntry, |
| testHostRuleEntry, |
| testRuleEntry]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries([testRuleEntry, testHostRuleEntry], |
| ruleEntryMap: ruleEntryMap) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| XCTAssert(!messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 2) |
| |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/app:Tests", |
| "BUNDLE_LOADER": "$(TEST_HOST)", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "HEADER_SEARCH_PATHS": "$(inherited) $(TULSI_BWRS)/tools/cpp/gcc3", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "IPHONEOS_DEPLOYMENT_TARGET": "8.0", |
| "PRODUCT_NAME": testRuleTargetName, |
| "SDKROOT": "iphoneos", |
| "TEST_HOST": "$(BUILT_PRODUCTS_DIR)/\(testHostTargetName).app/\(testHostTargetName)", |
| "TULSI_BUILD_PATH": testRulePackage, |
| "TULSI_SWIFT_DEPENDENCY": "YES", |
| "TULSI_TEST_RUNNER_ONLY": "YES", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: testRuleTargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| SourcesBuildPhaseDefinition(files: testSources, mainGroup: project.mainGroup), |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, |
| buildTarget: "\(testRulePackage):\(testRuleTargetName)"), |
| SwiftDummyShellScriptBuildPhaseDefinition() |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| |
| private func makeRuleEntryMap(withRuleEntries ruleEntries: [RuleEntry]) -> RuleEntryMap { |
| let ruleEntryMap = RuleEntryMap() |
| for ruleEntry in ruleEntries { |
| ruleEntryMap.insert(ruleEntry: ruleEntry) |
| } |
| return ruleEntryMap |
| } |
| |
| func testGenerateTargetsForLinkedRuleEntriesWithSourcesWithSkylarkUITest() { |
| let testRuleType = "apple_ui_test" |
| let testProductType = PBXTarget.ProductType.UIUnitTest |
| let testHostAttributeName = "test_host" |
| let rule1BuildPath = "test/app" |
| let rule1TargetName = "TestApplication" |
| let rule1BuildTarget = "\(rule1BuildPath):\(rule1TargetName)" |
| let testRuleBuildPath = "test/testbundle" |
| let testRuleTargetName = "TestBundle" |
| let testRuleBuildTarget = "\(testRuleBuildPath):\(testRuleTargetName)" |
| let testRuleAttributes = [testHostAttributeName: rule1BuildTarget] |
| let testSources = ["sourceFile1.m", "sourceFile2.mm"] |
| let testRule = makeTestRuleEntry(testRuleBuildTarget, |
| type: testRuleType, |
| attributes: testRuleAttributes as [String: AnyObject], |
| sourceFiles: testSources, |
| productType: testProductType, |
| platformType: "ios", |
| osDeploymentTarget: "8.0") |
| let rules = Set([ |
| makeTestRuleEntry(rule1BuildTarget, type: "ios_application", productType: .Application), |
| testRule, |
| ]) |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| XCTAssert(!messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 2) |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/app:TestApplication", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_NAME": rule1TargetName, |
| "SDKROOT": "iphoneos", |
| "TULSI_BUILD_PATH": rule1BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: rule1TargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, |
| buildTarget: rule1BuildTarget), |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/testbundle:TestBundle", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "HEADER_SEARCH_PATHS": "$(inherited) $(TULSI_BWRS)/tools/cpp/gcc3", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "IPHONEOS_DEPLOYMENT_TARGET": "8.0", |
| "PRODUCT_NAME": testRuleTargetName, |
| "SDKROOT": "iphoneos", |
| "TEST_TARGET_NAME": rule1TargetName, |
| "TULSI_BUILD_PATH": testRuleBuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| "TULSI_TEST_RUNNER_ONLY": "YES", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: testRuleTargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| SourcesBuildPhaseDefinition(files: testSources, mainGroup: project.mainGroup), |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, |
| buildTarget: testRuleBuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateTargetsForLinkedRuleEntriesWithSameTestHostNameInDifferentPackagesWithSkylarkUnitTest() { |
| checkGenerateTargetsForLinkedRuleEntriesWithSameTestHostNameInDifferentPackages( |
| "apple_unit_test", testProductType: .UnitTest, testHostAttributeName: "test_host") |
| } |
| |
| func testGenerateTargetsForLinkedRuleEntriesWithSameTestHostNameInDifferentPackagesWithSkylarkUITest() { |
| checkGenerateTargetsForLinkedRuleEntriesWithSameTestHostNameInDifferentPackages( |
| "apple_ui_test", testProductType: .UIUnitTest, testHostAttributeName: "test_host") |
| } |
| |
| func checkGenerateTargetsForLinkedRuleEntriesWithSameTestHostNameInDifferentPackages( |
| _ testRuleType: String, testProductType: PBXTarget.ProductType, testHostAttributeName: String) { |
| let hostTargetName = "TestHost" |
| let host1Package = "test/package/1" |
| let host2Package = "test/package/2" |
| let host1Target = "\(host1Package):\(hostTargetName)" |
| let host2Target = "\(host2Package):\(hostTargetName)" |
| |
| let testSources = ["sourceFile1.m", "sourceFile2.mm"] |
| let test1TargetName = "Test_1" |
| let test2TargetName = "Test_2" |
| |
| let test1Target = "\(host1Package):\(test1TargetName)" |
| let test2Target = "\(host2Package):\(test2TargetName)" |
| let test1Rule = makeTestRuleEntry(test1Target, |
| type: testRuleType, |
| attributes: [testHostAttributeName: host1Target as AnyObject], |
| sourceFiles: testSources, |
| productType: testProductType) |
| let test2Rule = makeTestRuleEntry(test2Target, |
| type: testRuleType, |
| attributes: [testHostAttributeName: host2Target as AnyObject], |
| sourceFiles: testSources, |
| productType: testProductType) |
| let rules = Set([ |
| makeTestRuleEntry(host1Target, type: "ios_application", productType: .Application), |
| makeTestRuleEntry(host2Target, type: "ios_application", productType: .Application), |
| test1Rule, |
| test2Rule, |
| ]) |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| XCTAssert(!messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| } |
| |
| func testGenerateTargetsForLinkedRuleEntriesWithoutIncludingTheHostWarnsWithSkylarkUnitTest() { |
| checkGenerateTargetsForLinkedRuleEntriesWithoutIncludingTheHostWarns( |
| "apple_unit_test", testHostAttributeName: "test_host") |
| } |
| |
| func testGenerateTargetsForLinkedRuleEntriesWithoutIncludingTheHostWarnsWithSkylarkUITest() { |
| checkGenerateTargetsForLinkedRuleEntriesWithoutIncludingTheHostWarns( |
| "apple_ui_test", testHostAttributeName: "test_host") |
| } |
| |
| func checkGenerateTargetsForLinkedRuleEntriesWithoutIncludingTheHostWarns( |
| _ testRuleType: String, testHostAttributeName: String) { |
| let rule1BuildPath = "test/app" |
| let rule1TargetName = "TestApplication" |
| let rule1BuildTarget = "\(rule1BuildPath):\(rule1TargetName)" |
| let testRuleBuildPath = "test/testbundle" |
| let testRuleTargetName = "TestBundle" |
| let testRuleBuildTarget = "\(testRuleBuildPath):\(testRuleTargetName)" |
| let testRuleAttributes = [testHostAttributeName: rule1BuildTarget] |
| let testSources = ["sourceFile1.m", "sourceFile2.mm"] |
| let testRule = makeTestRuleEntry(testRuleBuildTarget, |
| type: testRuleType, |
| attributes: testRuleAttributes as [String: AnyObject], |
| sourceFiles: testSources, |
| productType: .Application) |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries([testRule], ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| return |
| } |
| |
| XCTAssert(messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/testbundle:TestBundle", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_NAME": testRuleTargetName, |
| "SDKROOT": "iphoneos", |
| "TULSI_BUILD_PATH": testRuleBuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| var testRunnerExpectedBuildSettings = expectedBuildSettings |
| testRunnerExpectedBuildSettings["DEBUG_INFORMATION_FORMAT"] = "dwarf" |
| testRunnerExpectedBuildSettings["ONLY_ACTIVE_ARCH"] = "YES" |
| testRunnerExpectedBuildSettings["OTHER_CFLAGS"] = "-help" |
| testRunnerExpectedBuildSettings["OTHER_LDFLAGS"] = "-help" |
| let expectedTarget = TargetDefinition( |
| name: testRuleTargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, |
| buildTarget: testRuleBuildTarget), |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateTargetsForRuleEntriesWithTheSameName() { |
| let targetName = "SameName" |
| let rule1BuildPath = "test/test1" |
| let rule1BuildTarget = "\(rule1BuildPath):\(targetName)" |
| let rule2BuildPath = "test/test2" |
| let rule2BuildTarget = "\(rule2BuildPath):\(targetName)" |
| let rules = Set([ |
| makeTestRuleEntry(rule1BuildTarget, type: "ios_application", productType: .Application), |
| makeTestRuleEntry(rule2BuildTarget, type: "ios_application", productType: .Application), |
| ]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 0) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 2) |
| |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/test1:\(targetName)", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_NAME": "test-test1-SameName", |
| "SDKROOT": "iphoneos", |
| "TULSI_BUILD_PATH": rule1BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: "test-test1-SameName", |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule1BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": "test/test2:\(targetName)", |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_NAME": "test-test2-SameName", |
| "SDKROOT": "iphoneos", |
| "TULSI_BUILD_PATH": rule2BuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: "test-test2-SameName", |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: rule2BuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateTargetWithBundleID() { |
| let targetName = "targetName" |
| let buildPath = "test/test1" |
| let buildTarget = "\(buildPath):\(targetName)" |
| let bundleID = "bundleID" |
| let rules = Set([ |
| makeTestRuleEntry(buildTarget, |
| type: "ios_application", |
| bundleID: bundleID, |
| productType: .Application), |
| ]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 0) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": buildTarget, |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_BUNDLE_IDENTIFIER": bundleID, |
| "PRODUCT_NAME": targetName, |
| "SDKROOT": "iphoneos", |
| "TULSI_BUILD_PATH": buildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: targetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: buildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateTargetWithBundleName() { |
| let targetName = "targetName" |
| let buildPath = "test/test1" |
| let buildTarget = "\(buildPath):\(targetName)" |
| let bundleName = "bundleName" |
| let rules = Set([ |
| makeTestRuleEntry(buildTarget, |
| type: "ios_application", |
| bundleName: bundleName, |
| productType: .Application), |
| ]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 0) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": buildTarget, |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_NAME": bundleName, |
| "SDKROOT": "iphoneos", |
| "TULSI_BUILD_PATH": buildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: targetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: buildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| |
| } |
| |
| func testGenerateWatchOSTarget() { |
| let appTargetName = "targetName" |
| let appBuildPath = "test/app" |
| let appBuildTarget = "\(appBuildPath):\(appTargetName)" |
| let watchAppTargetName = "watchAppTargetName" |
| let watchAppBuildPath = "test/watchapp" |
| let watchAppBuildTarget = "\(watchAppBuildPath):\(watchAppTargetName)" |
| let watchExtTargetName = "watchExtTargetName" |
| let watchExtBuildPath = "test/watchext" |
| let watchExtBuildTarget = "\(watchExtBuildPath):\(watchExtTargetName)" |
| |
| let appBundleID = "appBundleID" |
| let watchAppBundleID = "watchAppBundleID" |
| let watchExtBundleID = "watchAppExtBundleID" |
| let rules = Set([ |
| makeTestRuleEntry(appBuildTarget, |
| type: "ios_application", |
| extensions: Set([BuildLabel(watchAppBuildTarget)]), |
| bundleID: appBundleID, |
| productType: .Application, |
| platformType: "ios", |
| osDeploymentTarget: "9.0"), |
| makeTestRuleEntry(watchAppBuildTarget, |
| type: "watchos_application", |
| extensions: Set([BuildLabel(watchExtBuildTarget)]), |
| bundleID: watchAppBundleID, |
| productType: .Watch2App, |
| extensionBundleID: watchExtBundleID, |
| platformType: "watchos", |
| osDeploymentTarget: "2.0"), |
| makeTestRuleEntry(watchExtBuildTarget, |
| type: "watchos_extension", |
| bundleID: watchExtBundleID, |
| productType: .Watch2Extension, |
| platformType: "watchos", |
| osDeploymentTarget: "2.0") |
| ]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 0) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 3) |
| |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": appBuildTarget, |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_BUNDLE_IDENTIFIER": appBundleID, |
| "PRODUCT_NAME": appTargetName, |
| "SDKROOT": "iphoneos", |
| "IPHONEOS_DEPLOYMENT_TARGET": "9.0", |
| "TULSI_BUILD_PATH": appBuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: appTargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: appBuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": watchAppBuildTarget, |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.watchOSStub, |
| "PRODUCT_BUNDLE_IDENTIFIER": watchAppBundleID, |
| "PRODUCT_NAME": watchAppTargetName, |
| "SDKROOT": "watchos", |
| "WATCHOS_DEPLOYMENT_TARGET": "2.0", |
| "TULSI_BUILD_PATH": watchAppBuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: watchAppTargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: watchAppBuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": watchExtBuildTarget, |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.watchOSAppExStub, |
| "PRODUCT_BUNDLE_IDENTIFIER": watchExtBundleID, |
| "PRODUCT_NAME": watchExtTargetName, |
| "SDKROOT": "watchos", |
| "WATCHOS_DEPLOYMENT_TARGET": "2.0", |
| "TULSI_BUILD_PATH": watchExtBuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: watchExtTargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: watchExtBuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateMacOSTarget() { |
| let appTargetName = "targetName" |
| let appBuildPath = "test/app" |
| let appBuildTarget = "\(appBuildPath):\(appTargetName)" |
| let macCLIAppTargetName = "macCLIAppTargetName" |
| let macCLIAppBuildPath = "test/maclicapp" |
| let macCLIAppBuildTarget = "\(macCLIAppBuildPath):\(macCLIAppTargetName)" |
| let macAppExtTargetName = "macExtTargetName" |
| let macAppExtBuildPath = "test/macappext" |
| let macAppExtBuildTarget = "\(macAppExtBuildPath):\(macAppExtTargetName)" |
| |
| let appBundleID = "appBundleID" |
| let macCLIAppBundleID = "macCLIAppBundleID" |
| let macAppExtBundleID = "macAppExtBundleID" |
| let rules = Set([ |
| makeTestRuleEntry(appBuildTarget, |
| type: "macos_application", |
| extensions: Set([BuildLabel(macAppExtBuildTarget)]), |
| bundleID: appBundleID, |
| productType: .Application, |
| platformType: "macos", |
| osDeploymentTarget: "10.12"), |
| makeTestRuleEntry(macAppExtBuildTarget, |
| type: "macos_extension", |
| bundleID: macAppExtBundleID, |
| productType: .AppExtension, |
| platformType: "macos", |
| osDeploymentTarget: "10.12"), |
| makeTestRuleEntry(macCLIAppBuildTarget, |
| type: "macos_command_line_application", |
| bundleID: macCLIAppBundleID, |
| productType: .Tool, |
| platformType: "macos", |
| osDeploymentTarget: "10.12") |
| ]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries(rules, ruleEntryMap: RuleEntryMap()) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| |
| let topLevelConfigs = project.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(topLevelConfigs.count, 0) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 3) |
| |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": appBuildTarget, |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": stubPlistPaths.defaultStub, |
| "PRODUCT_BUNDLE_IDENTIFIER": appBundleID, |
| "PRODUCT_NAME": appTargetName, |
| "SDKROOT": "macosx", |
| "MACOSX_DEPLOYMENT_TARGET": "10.12", |
| "TULSI_BUILD_PATH": appBuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: appTargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: appBuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": macAppExtBuildTarget, |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": "${PROJECT_ROOT}/asd/Stub_test-macappext-macExtTargetName.plist", |
| "PRODUCT_BUNDLE_IDENTIFIER": macAppExtBundleID, |
| "PRODUCT_NAME": macAppExtTargetName, |
| "SDKROOT": "macosx", |
| "MACOSX_DEPLOYMENT_TARGET": "10.12", |
| "TULSI_BUILD_PATH": macAppExtBuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: macAppExtTargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: macAppExtBuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| do { |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": macCLIAppBuildTarget, |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": "TestInfo.plist", |
| "PRODUCT_BUNDLE_IDENTIFIER": macCLIAppBundleID, |
| "PRODUCT_NAME": macCLIAppTargetName, |
| "SDKROOT": "macosx", |
| "MACOSX_DEPLOYMENT_TARGET": "10.12", |
| "TULSI_BUILD_PATH": macCLIAppBuildPath, |
| "TULSI_SWIFT_DEPENDENCY": "NO", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: macCLIAppTargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: macCLIAppBuildTarget) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| } |
| |
| func testGenerateIndexerWithNoSources() { |
| let ruleEntry = makeTestRuleEntry("test/app:TestApp", type: "ios_application") |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| let targets = project.targetByName |
| XCTAssert(targets.isEmpty) |
| } |
| |
| func testGenerateIndexerWithNoPCHFile() { |
| let buildLabel = BuildLabel("test/app:TestApp") |
| let ruleEntry = makeTestRuleEntry(buildLabel, |
| type: "ios_application", |
| sourceFiles: sourceFileNames) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| let indexerTargetName = String(format: "_idx_TestApp_%08X_ios_min9.0", buildLabel.hashValue) |
| |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| validateIndexerTarget(indexerTargetName, sourceFileNames: sourceFileNames, inTargets: targets) |
| } |
| |
| func testGenerateIndexer() { |
| let buildLabel = BuildLabel("test/app:TestApp") |
| let ruleEntry = makeTestRuleEntry("test/app:TestApp", |
| type: "ios_application", |
| attributes: ["pch": ["path": pchFile.path!, "src": true] as AnyObject], |
| sourceFiles: sourceFileNames) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| let indexerTargetName = String(format: "_idx_TestApp_%08X_ios_min9.0", buildLabel.hashValue) |
| |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| validateIndexerTarget(indexerTargetName, sourceFileNames: sourceFileNames, pchFile: pchFile, inTargets: targets) |
| } |
| |
| func testGenerateIndexerWithBridgingHeader() { |
| let bridgingHeaderFilePath = "some/place/bridging-header.h" |
| let ruleAttributes = ["bridging_header": ["path": bridgingHeaderFilePath, "src": true]] |
| |
| let buildLabel = BuildLabel("test/app:TestApp") |
| let ruleEntry = makeTestRuleEntry(buildLabel, |
| type: "ios_binary", |
| attributes: ruleAttributes as [String : AnyObject], |
| sourceFiles: sourceFileNames) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| let indexerTargetName = String(format: "_idx_TestApp_%08X_ios_min9.0", buildLabel.hashValue) |
| |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| validateIndexerTarget(indexerTargetName, |
| sourceFileNames: sourceFileNames, |
| bridgingHeader: "$(TULSI_BWRS)/\(bridgingHeaderFilePath)", |
| inTargets: targets) |
| } |
| |
| func testGenerateIndexerWithGeneratedBridgingHeader() { |
| let bridgingHeaderFilePath = "some/place/bridging-header.h" |
| let bridgingHeaderInfo = ["path": bridgingHeaderFilePath, |
| "root": "bazel-genfiles", |
| "src": false] as [String : Any] |
| let ruleAttributes = ["bridging_header": bridgingHeaderInfo] |
| |
| let buildLabel = BuildLabel("test/app:TestApp") |
| let ruleEntry = makeTestRuleEntry(buildLabel, |
| type: "ios_binary", |
| attributes: ruleAttributes as [String : AnyObject], |
| sourceFiles: sourceFileNames) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| let indexerTargetName = String(format: "_idx_TestApp_%08X_ios_min9.0", buildLabel.hashValue) |
| |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| validateIndexerTarget(indexerTargetName, |
| sourceFileNames: sourceFileNames, |
| bridgingHeader: "$(TULSI_WR)/bazel-genfiles/\(bridgingHeaderFilePath)", |
| inTargets: targets) |
| } |
| |
| func testGenerateIndexerWithXCDataModel() { |
| let dataModel = "test.xcdatamodeld" |
| let ruleAttributes = ["datamodels": [["path": "\(dataModel)/v1.xcdatamodel", "src": true], |
| ["path": "\(dataModel)/v2.xcdatamodel", "src": true]]] |
| |
| let buildLabel = BuildLabel("test/app:TestApp") |
| let ruleEntry = makeTestRuleEntry(buildLabel, |
| type: "ios_binary", |
| attributes: ruleAttributes as [String : AnyObject], |
| sourceFiles: sourceFileNames) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| let indexerTargetName = String(format: "_idx_TestApp_%08X_ios_min9.0", buildLabel.hashValue) |
| |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters.union(Set([dataModel])), |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| var allSourceFiles = sourceFileNames |
| allSourceFiles.append(dataModel) |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| validateIndexerTarget(indexerTargetName, |
| sourceFileNames: allSourceFiles, |
| inTargets: targets) |
| } |
| |
| func testGenerateIndexerWithSourceFilter() { |
| sourceFileNames.append("this/file/should/appear.m") |
| pathFilters.insert("this/file/should") |
| rebuildSourceFileReferences() |
| |
| var allSourceFiles = sourceFileNames |
| allSourceFiles.append("filtered/file.m") |
| allSourceFiles.append("this/file/should/not/appear.m") |
| |
| let buildLabel = BuildLabel("test/app:TestApp") |
| let ruleEntry = makeTestRuleEntry(buildLabel, |
| type: "ios_application", |
| sourceFiles: allSourceFiles) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| let indexerTargetName = String(format: "_idx_TestApp_%08X_ios_min9.0", buildLabel.hashValue) |
| |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| validateIndexerTarget(indexerTargetName, sourceFileNames: sourceFileNames, inTargets: targets) |
| } |
| |
| func testGenerateIndexerWithRecursiveSourceFilter() { |
| sourceFileNames.append("this/file/should/appear.m") |
| sourceFileNames.append("this/file/should/also/appear.m") |
| pathFilters.insert("this/file/should/...") |
| rebuildSourceFileReferences() |
| |
| var allSourceFiles = sourceFileNames |
| allSourceFiles.append("filtered/file.m") |
| |
| let buildLabel = BuildLabel("test/app:TestApp") |
| let ruleEntry = makeTestRuleEntry(buildLabel, |
| type: "ios_application", |
| sourceFiles: allSourceFiles) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| let indexerTargetName = String(format: "_idx_TestApp_%08X_ios_min9.0", buildLabel.hashValue) |
| |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| validateIndexerTarget(indexerTargetName, sourceFileNames: sourceFileNames, inTargets: targets) |
| } |
| |
| func testGenerateBUILDRefsWithoutSourceFilter() { |
| let buildFilePath = "this/file/should/not/BUILD" |
| pathFilters.insert("this/file/should") |
| let buildLabel = BuildLabel("test/app:TestApp") |
| let ruleEntry = makeTestRuleEntry(buildLabel, |
| type: "ios_application", |
| sourceFiles: sourceFileNames, |
| buildFilePath: buildFilePath) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| XCTAssertNil(fileRefForPath(buildFilePath)) |
| } |
| |
| func testGenerateBUILDRefsWithSourceFilter() { |
| let buildFilePath = "this/file/should/BUILD" |
| pathFilters.insert("this/file/should") |
| let buildLabel = BuildLabel("test/app:TestApp") |
| let ruleEntry = makeTestRuleEntry(buildLabel, |
| type: "ios_application", |
| sourceFiles: sourceFileNames, |
| buildFilePath: buildFilePath) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| XCTAssertNotNil(fileRefForPath(buildFilePath)) |
| } |
| |
| func testGenerateBUILDRefsWithRecursiveSourceFilter() { |
| let buildFilePath = "this/file/should/BUILD" |
| pathFilters.insert("this/file/...") |
| let buildLabel = BuildLabel("test/app:TestApp") |
| let ruleEntry = makeTestRuleEntry(buildLabel, |
| type: "ios_application", |
| sourceFiles: sourceFileNames, |
| buildFilePath: buildFilePath) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| XCTAssertNotNil(fileRefForPath(buildFilePath)) |
| } |
| |
| func testMergesCompatibleIndexers() { |
| let sourceFiles1 = ["1.swift", "1.cc"] |
| let buildLabel1 = BuildLabel("test/app:TestBinary") |
| |
| let ruleEntry1 = makeTestRuleEntry(buildLabel1, |
| type: "ios_binary", |
| attributes: ["pch": ["path": pchFile.path!, "src": true] as AnyObject], |
| sourceFiles: sourceFiles1) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry1, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| |
| let sourceFiles2 = ["2.swift"] |
| let buildLabel2 = BuildLabel("test/app:TestLibrary") |
| let ruleEntry2 = makeTestRuleEntry(buildLabel2, |
| type: "objc_library", |
| attributes: ["pch": ["path": pchFile.path!, "src": true] as AnyObject], |
| sourceFiles: sourceFiles2) |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry2, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| |
| let indexerTargetName = String(format: "_idx_TestLibrary_TestBinary_%08X_ios_min9.0", |
| buildLabel1.hashValue &+ buildLabel2.hashValue) |
| validateIndexerTarget(indexerTargetName, |
| sourceFileNames: sourceFiles1 + sourceFiles2, |
| pchFile: pchFile, |
| inTargets: targets) |
| } |
| |
| func testIndexerCharacterLimit() { |
| let sourceFiles1 = ["1.swift", "1.cc"] |
| let buildTargetName1 = String(repeating: "A", count: 300) |
| let buildLabel1 = BuildLabel("test/app:" + buildTargetName1) |
| let ruleEntry1 = makeTestRuleEntry(buildLabel1, |
| type: "ios_binary", |
| attributes: ["pch": ["path": pchFile.path!, "src": true] as AnyObject], |
| sourceFiles: sourceFiles1) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry1, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| |
| let resultingTarget = targets.values.first! |
| XCTAssertLessThan(resultingTarget.name.count, 255) |
| |
| validateIndexerTarget(resultingTarget.name, |
| sourceFileNames: sourceFiles1, |
| pchFile: pchFile, |
| inTargets: targets) |
| } |
| |
| func testCompatibleIndexersMergeCharacterLimit() { |
| let sourceFiles1 = ["1.swift", "1.cc"] |
| let buildTargetName1 = String(repeating: "A", count: 200) |
| let buildLabel1 = BuildLabel("test/app:" + buildTargetName1) |
| let ruleEntry1 = makeTestRuleEntry(buildLabel1, |
| type: "ios_binary", |
| attributes: ["pch": ["path": pchFile.path!, "src": true] as AnyObject], |
| sourceFiles: sourceFiles1) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry1, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| |
| let sourceFiles2 = ["2.swift"] |
| let buildTargetName2 = String(repeating: "B", count: 255) |
| let buildLabel2 = BuildLabel("test/app:" + buildTargetName2) |
| let ruleEntry2 = makeTestRuleEntry(buildLabel2, |
| type: "objc_library", |
| attributes: ["pch": ["path": pchFile.path!, "src": true] as AnyObject], |
| sourceFiles: sourceFiles2) |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry2, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| |
| let resultingTarget = targets.values.first! |
| XCTAssertLessThan(resultingTarget.name.count, 255) |
| |
| validateIndexerTarget(resultingTarget.name, |
| sourceFileNames: sourceFiles1 + sourceFiles2, |
| pchFile: pchFile, |
| inTargets: targets) |
| } |
| |
| func testDoesNotMergeIndexerWithPCHMismatch() { |
| let buildLabel1 = BuildLabel("test/app:TestBinary") |
| let ruleEntry1 = makeTestRuleEntry(buildLabel1, |
| type: "ios_binary", |
| attributes: ["pch": ["path": pchFile.path!, "src": true] as AnyObject], |
| sourceFiles: sourceFileNames) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| let indexer1TargetName = String(format: "_idx_TestBinary_%08X_ios_min9.0", buildLabel1.hashValue) |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry1, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| |
| let buildLabel2 = BuildLabel("test/app:TestLibrary") |
| let ruleEntry2 = makeTestRuleEntry(buildLabel2, |
| type: "objc_library", |
| attributes: [:], |
| sourceFiles: sourceFileNames) |
| let indexer2TargetName = String(format: "_idx_TestLibrary_%08X_ios_min9.0", buildLabel2.hashValue) |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry2, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 2) |
| validateIndexerTarget(indexer1TargetName, |
| sourceFileNames: sourceFileNames, |
| pchFile: pchFile, |
| inTargets: targets) |
| validateIndexerTarget(indexer2TargetName, |
| sourceFileNames: sourceFileNames, |
| inTargets: targets) |
| } |
| |
| func testDoesNotMergeIndexerWithGeneratedBridgingHeaderMismatch() { |
| let bridgingHeaderFilePath = "some/place/bridging-header.h" |
| let bridgingHeaderInfo = ["path": bridgingHeaderFilePath, |
| "root": "bazel-genfiles", |
| "src": false] as [String : Any] |
| let ruleAttributes1 = ["bridging_header": bridgingHeaderInfo] |
| |
| let buildLabel1 = BuildLabel("test/app:TestBinary") |
| let ruleEntry1 = makeTestRuleEntry(buildLabel1, |
| type: "ios_binary", |
| attributes: ruleAttributes1 as [String : AnyObject], |
| sourceFiles: sourceFileNames) |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| let indexer1TargetName = String(format: "_idx_TestBinary_%08X_ios_min9.0", buildLabel1.hashValue) |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry1, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| |
| let buildLabel2 = BuildLabel("test/app:TestLibrary") |
| let ruleEntry2 = makeTestRuleEntry(buildLabel2, |
| type: "objc_library", |
| attributes: [:], |
| sourceFiles: sourceFileNames) |
| let indexer2TargetName = String(format: "_idx_TestLibrary_%08X_ios_min9.0", buildLabel2.hashValue) |
| targetGenerator.registerRuleEntryForIndexer(ruleEntry2, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 2) |
| validateIndexerTarget(indexer1TargetName, |
| sourceFileNames: sourceFileNames, |
| bridgingHeader: "$(TULSI_WR)/bazel-genfiles/\(bridgingHeaderFilePath)", |
| inTargets: targets) |
| validateIndexerTarget(indexer2TargetName, |
| sourceFileNames: sourceFileNames, |
| inTargets: targets) |
| } |
| |
| func testSwiftTargetsGeneratedSYMBundles() { |
| let targetName = "TestTarget" |
| let package = "test/package" |
| let target = "\(package):\(targetName)" |
| let targetType = "ios_application" |
| |
| let swiftTargetName = "SwiftTarget" |
| let swiftTarget = "\(package):\(swiftTargetName)" |
| |
| let testRule = makeTestRuleEntry(target, |
| type: targetType, |
| attributes: ["has_swift_dependency": true as AnyObject], |
| dependencies: Set([BuildLabel(swiftTarget)]), |
| productType: .Application) |
| let swiftLibraryRule = makeTestRuleEntry(swiftTarget, type: "swift_library") |
| let ruleEntryMap = makeRuleEntryMap(withRuleEntries: [swiftLibraryRule]) |
| |
| do { |
| try targetGenerator.generateBuildTargetsForRuleEntries([testRule], |
| ruleEntryMap: ruleEntryMap) |
| } catch let e as NSError { |
| XCTFail("Failed to generate build targets with error \(e.localizedDescription)") |
| } |
| XCTAssert(!messageLogger.warningMessageKeys.contains("MissingTestHost")) |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| |
| let expectedBuildSettings = [ |
| "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME": "Stub Launch Image", |
| "BAZEL_TARGET": target, |
| "DEBUG_INFORMATION_FORMAT": "dwarf", |
| "INFOPLIST_FILE": "TestInfo.plist", |
| "PRODUCT_NAME": targetName, |
| "SDKROOT": "iphoneos", |
| "TULSI_BUILD_PATH": package, |
| "TULSI_SWIFT_DEPENDENCY": "YES", |
| ] |
| let expectedTarget = TargetDefinition( |
| name: "TestTarget", |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Debug", |
| expectedBuildSettings: debugTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "__TulsiTestRunner_Release", |
| expectedBuildSettings: releaseTestRunnerBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| ], |
| expectedBuildPhases: [ |
| BazelShellScriptBuildPhaseDefinition(bazelURL: bazelURL, buildTarget: target) |
| ] |
| ) |
| assertTarget(expectedTarget, inTargets: targets) |
| } |
| |
| func testSwiftTargetIndexerCompilerFlags() { |
| let package = "test/package" |
| |
| let swiftTargetName = "SwiftTarget" |
| let swiftTargetBuildLabel = BuildLabel("\(package):\(swiftTargetName)") |
| let swiftTargetOpts = ["-I/include/foobar", "-DCOMPILER_DEFINE"] as AnyObject |
| |
| let swiftLibraryRule = makeTestRuleEntry(swiftTargetBuildLabel, |
| type: "swift_library", |
| attributes: ["swiftc_opts": swiftTargetOpts, |
| "has_swift_info": true as AnyObject], |
| sourceFiles: sourceFileNames) |
| |
| var proccessedEntries = [RuleEntry: (NSOrderedSet)]() |
| let indexerTargetName = String(format: "_idx_\(swiftTargetName)_%08X_ios_min9.0", swiftTargetBuildLabel.hashValue) |
| targetGenerator.registerRuleEntryForIndexer(swiftLibraryRule, |
| ruleEntryMap: RuleEntryMap(), |
| pathFilters: pathFilters, |
| processedEntries: &proccessedEntries) |
| targetGenerator.generateIndexerTargets() |
| |
| let targets = project.targetByName |
| XCTAssertEqual(targets.count, 1) |
| validateIndexerTarget(indexerTargetName, |
| sourceFileNames: sourceFileNames, |
| swiftIncludePaths: "$(inherited) /include/foobar", |
| otherSwiftFlags: "$(inherited) -DCOMPILER_DEFINE", |
| isSwift: true, |
| inTargets: targets) |
| } |
| |
| // MARK: - Helper methods |
| |
| private func debugBuildSettingsFromSettings(_ settings: [String: String]) -> [String: String] { |
| var newSettings = settings |
| newSettings["GCC_PREPROCESSOR_DEFINITIONS"] = "DEBUG=1" |
| return newSettings |
| } |
| |
| private func releaseBuildSettingsFromSettings(_ settings: [String: String], |
| indexerSettingsOnly: Bool = false) -> [String: String] { |
| var newSettings = settings |
| newSettings["GCC_PREPROCESSOR_DEFINITIONS"] = "NDEBUG=1" |
| if !indexerSettingsOnly { |
| newSettings["TULSI_MUST_USE_DSYM"] = "YES" |
| } |
| return newSettings |
| } |
| |
| private func debugTestRunnerBuildSettingsFromSettings(_ settings: [String: String]) -> [String: String] { |
| let testRunnerSettings = addTestRunnerSettings(settings) |
| return debugBuildSettingsFromSettings(testRunnerSettings) |
| } |
| |
| private func releaseTestRunnerBuildSettingsFromSettings(_ settings: [String: String]) -> [String: String] { |
| let testRunnerSettings = addTestRunnerSettings(settings) |
| return releaseBuildSettingsFromSettings(testRunnerSettings) |
| } |
| |
| private func addTestRunnerSettings(_ settings: [String: String]) -> [String: String] { |
| var testRunnerSettings = settings |
| if let _ = testRunnerSettings["DEBUG_INFORMATION_FORMAT"] { |
| testRunnerSettings["DEBUG_INFORMATION_FORMAT"] = "dwarf" |
| } |
| testRunnerSettings["ONLY_ACTIVE_ARCH"] = "YES" |
| testRunnerSettings["OTHER_CFLAGS"] = "-help" |
| testRunnerSettings["OTHER_LDFLAGS"] = "-help" |
| testRunnerSettings["OTHER_SWIFT_FLAGS"] = "-help" |
| testRunnerSettings["SWIFT_OBJC_INTERFACE_HEADER_NAME"] = "$(PRODUCT_NAME).h" |
| testRunnerSettings["SWIFT_INSTALL_OBJC_HEADER"] = "NO" |
| |
| testRunnerSettings["FRAMEWORK_SEARCH_PATHS"] = "" |
| testRunnerSettings["HEADER_SEARCH_PATHS"] = "" |
| return testRunnerSettings |
| } |
| |
| private func rebuildSourceFileReferences() { |
| sourceFileReferences = [] |
| for file in sourceFileNames { |
| sourceFileReferences.append(project.mainGroup.getOrCreateFileReferenceBySourceTree(.Group, path: file)) |
| } |
| } |
| |
| private func makeTestRuleEntry(_ label: String, |
| type: String, |
| attributes: [String: AnyObject] = [:], |
| artifacts: [String] = [], |
| sourceFiles: [String] = [], |
| dependencies: Set<BuildLabel> = Set(), |
| extensions: Set<BuildLabel>? = nil, |
| bundleID: String? = nil, |
| bundleName: String? = nil, |
| productType: PBXTarget.ProductType? = nil, |
| extensionBundleID: String? = nil, |
| platformType: String? = nil, |
| osDeploymentTarget: String? = nil, |
| buildFilePath: String? = nil, |
| swiftLanguageVersion: String? = nil) -> RuleEntry { |
| return makeTestRuleEntry(BuildLabel(label), |
| type: type, |
| attributes: attributes, |
| artifacts: artifacts, |
| sourceFiles: sourceFiles, |
| dependencies: dependencies, |
| extensions: extensions, |
| bundleID: bundleID, |
| bundleName: bundleName, |
| productType: productType, |
| extensionBundleID: extensionBundleID, |
| platformType: platformType, |
| osDeploymentTarget: osDeploymentTarget, |
| buildFilePath: buildFilePath, |
| swiftLanguageVersion: swiftLanguageVersion) |
| } |
| |
| private class TestBazelFileInfo : BazelFileInfo { |
| init(fullPath: String) { |
| super.init(rootPath: "", subPath: fullPath, isDirectory: false, targetType: .sourceFile) |
| } |
| } |
| |
| private func makeTestRuleEntry(_ label: BuildLabel, |
| type: String, |
| attributes: [String: AnyObject] = [:], |
| artifacts: [String] = [], |
| sourceFiles: [String] = [], |
| dependencies: Set<BuildLabel> = Set(), |
| extensions: Set<BuildLabel>? = nil, |
| bundleID: String? = nil, |
| bundleName: String? = nil, |
| productType: PBXTarget.ProductType? = nil, |
| extensionBundleID: String? = nil, |
| platformType: String? = nil, |
| osDeploymentTarget: String? = nil, |
| buildFilePath: String? = nil, |
| swiftLanguageVersion: String? = nil) -> RuleEntry { |
| let artifactInfos = artifacts.map() { TestBazelFileInfo(fullPath: $0) } |
| let sourceInfos = sourceFiles.map() { TestBazelFileInfo(fullPath: $0) } |
| return RuleEntry(label: label, |
| type: type, |
| attributes: attributes, |
| artifacts: artifactInfos, |
| sourceFiles: sourceInfos, |
| dependencies: dependencies, |
| extensions: extensions, |
| bundleID: bundleID, |
| bundleName: bundleName, |
| productType: productType, |
| extensionBundleID: extensionBundleID, |
| platformType: platformType, |
| osDeploymentTarget: osDeploymentTarget, |
| buildFilePath: buildFilePath, |
| swiftLanguageVersion: swiftLanguageVersion) |
| } |
| |
| private struct TargetDefinition { |
| let name: String |
| let buildConfigurations: [BuildConfigurationDefinition] |
| let expectedBuildPhases: [BuildPhaseDefinition] |
| } |
| |
| private struct BuildConfigurationDefinition { |
| let name: String |
| let expectedBuildSettings: Dictionary<String, String>? |
| } |
| |
| private class BuildPhaseDefinition { |
| let isa: String |
| let files: [String] |
| let fileSet: Set<String> |
| let mainGroup: PBXReference? |
| let mnemonic: String |
| |
| init (isa: String, files: [String], mainGroup: PBXReference? = nil, mnemonic: String = "") { |
| self.isa = isa |
| self.files = files |
| self.fileSet = Set(files) |
| self.mainGroup = mainGroup |
| self.mnemonic = mnemonic |
| } |
| |
| func validate(_ phase: PBXBuildPhase, line: UInt = #line) { |
| // Validate the file set. |
| XCTAssertEqual(phase.files.count, |
| fileSet.count, |
| "Mismatch in file count in build phase:\n\(phase.files)\n\(fileSet)", |
| line: line) |
| for buildFile in phase.files { |
| guard let fileRef = buildFile.fileRef as? PBXFileReference else { |
| continue |
| } |
| let path = fileRef.sourceRootRelativePath |
| XCTAssert(fileSet.contains(path), |
| "Found unexpected file '\(path)' in build phase", |
| line: line) |
| } |
| XCTAssertEqual(phase.mnemonic, mnemonic, "Mismatch in mnemonics") |
| } |
| } |
| |
| private class SourcesBuildPhaseDefinition: BuildPhaseDefinition { |
| let settings: [String: String]? |
| |
| init(files: [String], mainGroup: PBXReference, settings: [String: String]? = nil) { |
| self.settings = settings |
| super.init(isa: "PBXSourcesBuildPhase", |
| files: files, |
| mainGroup: mainGroup, |
| mnemonic: "CompileSources") |
| } |
| |
| override func validate(_ phase: PBXBuildPhase, line: UInt = #line) { |
| super.validate(phase, line: line) |
| |
| for buildFile in phase.files { |
| if settings != nil { |
| XCTAssertNotNil(buildFile.settings, "Settings for file \(buildFile) must == \(String(describing: settings))", |
| line: line) |
| if buildFile.settings != nil { |
| XCTAssertEqual(buildFile.settings!, settings!, line: line) |
| } |
| } else { |
| XCTAssertNil(buildFile.settings, "Settings for file \(buildFile) must be nil", |
| line: line) |
| } |
| } |
| } |
| } |
| |
| private class BazelShellScriptBuildPhaseDefinition: BuildPhaseDefinition { |
| let bazelURL: URL |
| let buildTarget: String |
| |
| init(bazelURL: URL, buildTarget: String) { |
| self.bazelURL = bazelURL |
| self.buildTarget = buildTarget |
| super.init(isa: "PBXShellScriptBuildPhase", files: [], mnemonic: "BazelBuild") |
| } |
| |
| override func validate(_ phase: PBXBuildPhase, line: UInt = #line) { |
| super.validate(phase, line: line) |
| |
| // Guaranteed by the test infrastructure below, failing this indicates a programming error in |
| // the test fixture, not in the code being tested. |
| let scriptBuildPhase = phase as! PBXShellScriptBuildPhase |
| |
| let script = scriptBuildPhase.shellScript |
| |
| XCTAssert(script.contains(bazelURL.path), |
| "Build script does not contain \(bazelURL.path)", |
| line: line) |
| XCTAssert(script.contains(buildTarget), |
| "Build script does not contain build target \(buildTarget)", |
| line: line) |
| } |
| } |
| |
| private class SwiftDummyShellScriptBuildPhaseDefinition: BuildPhaseDefinition { |
| init() { |
| super.init(isa: "PBXShellScriptBuildPhase", files: [], mnemonic: "SwiftDummy") |
| } |
| |
| override func validate(_ phase: PBXBuildPhase, line: UInt = #line) { |
| super.validate(phase, line: line) |
| |
| // Guaranteed by the test infrastructure below, failing this indicates a programming error in |
| // the test fixture, not in the code being tested. |
| let scriptBuildPhase = phase as! PBXShellScriptBuildPhase |
| |
| let script = scriptBuildPhase.shellScript |
| XCTAssert(script.contains("touch"), "Build script does not contain 'touch'.", |
| line: line) |
| } |
| } |
| |
| private func fileRefForPath(_ path: String) -> PBXReference? { |
| let components = path.components(separatedBy: "/") |
| var node = project.mainGroup |
| componentLoop: for component in components { |
| for child in node.children { |
| if child.name == component { |
| if let childGroup = child as? PBXGroup { |
| node = childGroup |
| continue componentLoop |
| } else if component == components.last! { |
| return child |
| } else { |
| return nil |
| } |
| } |
| } |
| } |
| return nil |
| } |
| |
| private func validateIndexerTarget(_ indexerTargetName: String, |
| sourceFileNames: [String]?, |
| pchFile: PBXFileReference? = nil, |
| bridgingHeader: String? = nil, |
| swiftLanguageVersion: String? = nil, |
| swiftIncludePaths: String? = nil, |
| otherSwiftFlags: String? = nil, |
| isSwift: Bool = false, |
| inTargets targets: Dictionary<String, PBXTarget> = Dictionary<String, PBXTarget>(), |
| line: UInt = #line) { |
| var expectedBuildSettings = [ |
| "HEADER_SEARCH_PATHS": "$(inherited) $(TULSI_BWRS)/tools/cpp/gcc3 ", |
| "PRODUCT_NAME": indexerTargetName, |
| "SDKROOT": "iphoneos", |
| "IPHONEOS_DEPLOYMENT_TARGET": "9.0", |
| ] |
| if !isSwift { |
| expectedBuildSettings["USER_HEADER_SEARCH_PATHS"] = "$(TULSI_WR)" |
| } |
| if let pchFile = pchFile { |
| expectedBuildSettings["GCC_PREFIX_HEADER"] = "$(TULSI_BWRS)/\(pchFile.path!)" |
| } |
| if let bridgingHeader = bridgingHeader { |
| expectedBuildSettings["SWIFT_OBJC_BRIDGING_HEADER"] = bridgingHeader |
| } |
| if let swiftLanguageVersion = swiftLanguageVersion { |
| expectedBuildSettings["SWIFT_VERSION"] = swiftLanguageVersion |
| } |
| if let swiftIncludePaths = swiftIncludePaths { |
| expectedBuildSettings["SWIFT_INCLUDE_PATHS"] = swiftIncludePaths |
| } |
| if let otherSwiftFlags = otherSwiftFlags { |
| expectedBuildSettings["OTHER_SWIFT_FLAGS"] = otherSwiftFlags |
| } |
| |
| var expectedBuildPhases = [BuildPhaseDefinition]() |
| if sourceFileNames != nil { |
| expectedBuildPhases.append(SourcesBuildPhaseDefinition(files: sourceFileNames!, |
| mainGroup: project.mainGroup)) |
| } |
| |
| let expectedTarget = TargetDefinition( |
| name: indexerTargetName, |
| buildConfigurations: [ |
| BuildConfigurationDefinition( |
| name: "Debug", |
| expectedBuildSettings: debugBuildSettingsFromSettings(expectedBuildSettings) |
| ), |
| BuildConfigurationDefinition( |
| name: "Release", |
| expectedBuildSettings: releaseBuildSettingsFromSettings(expectedBuildSettings, |
| indexerSettingsOnly: true) |
| ), |
| ], |
| expectedBuildPhases: expectedBuildPhases |
| ) |
| assertTarget(expectedTarget, inTargets: targets, line: line) |
| } |
| |
| private func assertTarget(_ targetDef: TargetDefinition, |
| inTargets targets: Dictionary<String, PBXTarget>, |
| line: UInt = #line) { |
| guard let target = targets[targetDef.name] else { |
| XCTFail("Missing expected target '\(targetDef.name)'", line: line) |
| return |
| } |
| |
| let buildConfigs = target.buildConfigurationList.buildConfigurations |
| XCTAssertEqual(buildConfigs.count, |
| targetDef.buildConfigurations.count, |
| "Build config mismatch in target '\(targetDef.name)'", |
| line: line) |
| |
| for buildConfigDef in targetDef.buildConfigurations { |
| guard let config = buildConfigs[buildConfigDef.name] else { |
| XCTFail("Missing expected build configuration '\(buildConfigDef.name)' in target '\(targetDef.name)'", |
| line: line) |
| continue |
| } |
| |
| if buildConfigDef.expectedBuildSettings != nil { |
| XCTAssertEqual(config.buildSettings, |
| buildConfigDef.expectedBuildSettings!, |
| "Build config mismatch for configuration '\(buildConfigDef.name)' in target '\(targetDef.name)'", |
| line: line) |
| } else { |
| XCTAssert(config.buildSettings.isEmpty, line: line) |
| } |
| } |
| |
| validateExpectedBuildPhases(targetDef.expectedBuildPhases, |
| inTarget: target, |
| line: line) |
| } |
| |
| private func validateExpectedBuildPhases(_ phaseDefs: [BuildPhaseDefinition], |
| inTarget target: PBXTarget, |
| line: UInt = #line) { |
| let buildPhases = target.buildPhases |
| XCTAssertEqual(buildPhases.count, |
| phaseDefs.count, |
| "Build phase count mismatch in target '\(target.name)'", |
| line: line) |
| |
| var validationCount = 0 |
| for phaseDef in phaseDefs { |
| for phase in buildPhases { |
| if phase.isa != phaseDef.isa || phase.mnemonic != phaseDef.mnemonic { |
| continue |
| } |
| phaseDef.validate(phase, line: line) |
| validationCount += 1 |
| } |
| } |
| XCTAssertEqual(validationCount, |
| buildPhases.count, |
| "Validation count mismatch in target '\(target.name)'") |
| } |
| } |
| |
| |