| // 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 BazelIntegrationTestCase |
| @testable import TulsiEndToEndTestBase |
| @testable import TulsiGenerator |
| |
| // End to end test that generates the Buttons project and runs its unit tests. |
| class ButtonsEndToEndTest: TulsiEndToEndTest { |
| fileprivate let buttonsProjectPath = |
| "src/TulsiEndToEndTests/Resources/Buttons.tulsiproj" |
| |
| override func setUp() { |
| super.setUp() |
| |
| if !copyDataToFakeWorkspace("src/TulsiEndToEndTests/Resources") { |
| XCTFail("Failed to copy Buttons files to fake execroot.") |
| } |
| } |
| |
| func testButtons() throws { |
| let xcodeProjectURL = generateXcodeProject( |
| tulsiProject: buttonsProjectPath, |
| config: "Buttons") |
| XCTAssert( |
| fileManager.fileExists(atPath: xcodeProjectURL.path), "Xcode project was not generated.") |
| |
| testXcodeProject(xcodeProjectURL, scheme: "ButtonsTests") |
| |
| let installingDsymBundlesOutput = "Installing dSYM bundles completed" |
| |
| let releaseBuildOutput = buildXcodeTarget( |
| xcodeProjectURL, target: "Buttons", configuration: "Release") |
| XCTAssert(releaseBuildOutput.contains(installingDsymBundlesOutput)) |
| |
| let debugBuildOutput = buildXcodeTarget( |
| xcodeProjectURL, target: "Buttons", configuration: "Debug") |
| XCTAssertFalse(debugBuildOutput.contains(installingDsymBundlesOutput)) |
| } |
| |
| func indexXcodeScheme(_ xcodeProjectURL: URL, _ scheme: String) { |
| let completionInfo = ProcessRunner.launchProcessSync( |
| "/usr/bin/xcrun", |
| arguments: [ |
| "xcindex-test", |
| "-project", |
| xcodeProjectURL.path, |
| "--", |
| "create-build-description", |
| "-scheme", |
| scheme, |
| "--", |
| "index-files", |
| "-targets-of-scheme", |
| scheme, |
| "-destination", |
| "platform=iOS Simulator,name=iPhone 12", |
| "--", |
| "quit", |
| ]) |
| |
| let stdout = String(data: completionInfo.stdout, encoding: .utf8) ?? "" |
| let stderr = String(data: completionInfo.stderr, encoding: .utf8) ?? "" |
| print("Index exit code \(completionInfo.terminationStatus), output:\n\(stdout)\nerror:\n\(stderr)") |
| if (completionInfo.terminationStatus != 0) { |
| XCTFail("Indexing operation failed for \(xcodeProjectURL):\(scheme).") |
| } |
| } |
| |
| /// Verifies that all of the indexer targets in the project can be indexed. |
| func testIndexingTargetsIndexInvocations() throws { |
| let xcodeProjectURL = generateXcodeProject( |
| tulsiProject: buttonsProjectPath, |
| config: "Buttons") |
| XCTAssert( |
| fileManager.fileExists(atPath: xcodeProjectURL.path), "Xcode project was not generated.") |
| let targets = targetsOfXcodeProject(xcodeProjectURL) |
| let indexTargets = targets.filter { $0.hasPrefix("_idx_") } |
| XCTAssertEqual(indexTargets.count, 5) |
| indexXcodeScheme(xcodeProjectURL, "_idx_Scheme") |
| } |
| |
| func testInvalidConfig() throws { |
| let xcodeProjectURL = generateXcodeProject( |
| tulsiProject: buttonsProjectPath, |
| config: "InvalidConfig") |
| XCTAssertFalse( |
| fileManager.fileExists(atPath: xcodeProjectURL.path), |
| "Xcode project was generated despite invalid config.") |
| } |
| } |