// 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


// End to end tests that generate xcodeproj bundles and validate them against golden versions.
class EndToEndGenerationTests: EndToEndIntegrationTestCase {
  func test_SimpleProject() throws {
    let testDir = "tulsi_e2e_simple"
    installBUILDFile("Simple", intoSubdirectory: testDir)
    makeTestXCDataModel("SimpleDataModelsTestv1",
                        inSubdirectory: "\(testDir)/SimpleTest.xcdatamodeld")
    makeTestXCDataModel("SimpleDataModelsTestv2",
                        inSubdirectory: "\(testDir)/SimpleTest.xcdatamodeld")
    makePlistFileNamed(".xccurrentversion",
                       withContent: ["_XCCurrentVersionName": "SimpleDataModelsTestv1.xcdatamodel"],
                       inSubdirectory: "\(testDir)/SimpleTest.xcdatamodeld")

    let appLabel = BuildLabel("//\(testDir):Application")
    let targetLabel = BuildLabel("//\(testDir):TargetApplication")
    let hostLabels = Set<BuildLabel>([appLabel])
    let buildTargets = [RuleInfo(label: appLabel,
                                 type: "ios_application",
                                 linkedTargetLabels: []),
                        RuleInfo(label: targetLabel,
                                 type: "ios_application",
                                 linkedTargetLabels: []),
                        RuleInfo(label: BuildLabel("//\(testDir):XCTest"),
                                 type: "apple_unit_test",
                                 linkedTargetLabels: hostLabels)]
    let additionalFilePaths = ["\(testDir)/BUILD"]

    let projectName = "SimpleProject"

    let options = TulsiOptionSet()
    options.options[.BazelContinueBuildingAfterError]?.projectValue = "YES"

    options.options[.CommandlineArguments]?.projectValue = "--project-flag"
    options.options[.CommandlineArguments]?.targetValues?[targetLabel.value] = "--target-specific-test-flag"

    options.options[.EnvironmentVariables]?.projectValue = "projectKey=projectValue"
    options.options[.EnvironmentVariables]?.targetValues?[targetLabel.value] =
        "targetKey1=targetValue1\ntargetKey2=targetValue2=\ntargetKey3="

    options.options[.BuildActionPreActionScript]?.projectValue = "This is a build pre action script"
    options.options[.BuildActionPreActionScript]?.targetValues?[targetLabel.value] = "This is a target specific build pre action script"
    options.options[.BuildActionPostActionScript]?.projectValue = "This is a build post action script"
    options.options[.BuildActionPostActionScript]?.targetValues?[targetLabel.value] = "This is a target specific build post action script"

    options.options[.LaunchActionPreActionScript]?.projectValue = "This is a lauch pre action script"
    options.options[.LaunchActionPreActionScript]?.targetValues?[targetLabel.value] = "This is a target specific launch pre action script"
    options.options[.LaunchActionPostActionScript]?.projectValue = "This is a launch post action script"
    options.options[.LaunchActionPostActionScript]?.targetValues?[targetLabel.value] = "This is a target specific launch post action script"

    options.options[.TestActionPreActionScript]?.projectValue = "This is a test pre action script"
    options.options[.TestActionPreActionScript]?.targetValues?[targetLabel.value] = "This is a target specific test pre action script"
    options.options[.TestActionPostActionScript]?.projectValue = "This is a test post action script"
    options.options[.TestActionPostActionScript]?.targetValues?[targetLabel.value] = "This is a target specific test post action script"

    let projectURL = try generateProjectNamed(projectName,
                                              buildTargets: buildTargets,
                                              pathFilters: ["\(testDir)/..."],
                                              additionalFilePaths: additionalFilePaths,
                                              outputDir: "tulsi_e2e_output",
                                              options: options)

    let diffLines = diffProjectAt(projectURL, againstGoldenProject: projectName)
    validateDiff(diffLines)
  }

  func test_BrokenSourceBUILD() {
    let aspectLogExpectation = expectation(description:
      "Should see a statement that Bazel aspect info is being printed to our logs."
    )
    let observerName = NSNotification.Name(rawValue: TulsiMessageNotification)
    let observer = NotificationCenter.default.addObserver(forName: observerName,
                                                          object: nil,
                                                          queue: nil) {
      notification in
      guard let item = LogMessage(notification: notification),
          item.message == "Log of Bazel aspect info output follows:" &&
          item.level == .Info else {
        return
      }
      aspectLogExpectation.fulfill()
    }
    defer { NotificationCenter.default.removeObserver(observer) }

    let testDir = "tulsi_e2e_broken_build"
    installBUILDFile("SimpleBad", intoSubdirectory: testDir)

    let appLabel = BuildLabel("//\(testDir):Application")
    let buildTargets = [RuleInfo(label: appLabel,
                                 type: "ios_application",
                                 linkedTargetLabels: [])]

    do {
      _ = try generateProjectNamed("BrokenSourceBuildProject",
                                   buildTargets: buildTargets,
                                   pathFilters: ["\(testDir)/...",
                                                 "blaze-bin/...",
                                                 "blaze-genfiles/..."],
                                   outputDir: "tulsi_e2e_output")
    } catch Error.projectGenerationFailure(let info) {
      // Expected failure on malformed BUILD file.
      XCTAssertEqual(info, "General failure: Bazel aspects could not be built.")
      waitForExpectations(timeout: 0.0, handler: nil)
      return
    } catch Error.testSubdirectoryNotCreated {
      XCTFail("Failed to create output folder, aborting test.")
    } catch let error {
      XCTFail("Unexpected failure: \(error)")
    }
    XCTFail("Expected exception of type 'BazelAspectInfoExtractor.ExtractorError.buildFailed' " +
      "to be thrown for bazel aspect build error.")
  }

  func test_ComplexSingleProject() throws {
    let testDir = "tulsi_e2e_complex"
    installBUILDFile("ComplexSingle", intoSubdirectory: testDir)
    makeTestXCDataModel("DataModelsTestv1", inSubdirectory: "\(testDir)/Test.xcdatamodeld")
    makeTestXCDataModel("DataModelsTestv2", inSubdirectory: "\(testDir)/Test.xcdatamodeld")
    makePlistFileNamed(".xccurrentversion",
                       withContent: ["_XCCurrentVersionName": "DataModelsTestv2.xcdatamodel"],
                       inSubdirectory: "\(testDir)/Test.xcdatamodeld")
    // iOS extension's Info.plist is generated by the Aspect after reading the infoplists listed in
    // the attribute, so we'll need to generate them otherwise extraction will fail.
    makePlistFileNamed("Plist1.plist",
                       withContent: ["NSExtension": ["NSExtensionPointIdentifier": "com.apple.extension-foo"],
                                     "CFBundleVersion": "1.0",
                                     "CFBundleShortVersionString": "1.0"],
                       inSubdirectory: "\(testDir)/TodayExtension")

    let appLabel = BuildLabel("//\(testDir):Application")
    let hostLabels = Set<BuildLabel>([appLabel])
    let buildTargets = [RuleInfo(label: appLabel,
                                 type: "ios_application",
                                 linkedTargetLabels: []),
                        RuleInfo(label: BuildLabel("//\(testDir):XCTest"),
                                 type: "apple_unit_test",
                                 linkedTargetLabels: hostLabels)]
    let additionalFilePaths = ["\(testDir)/BUILD"]

    let projectName = "ComplexSingleProject"

    let projectOptions = TulsiOptionSet()
    projectOptions[.IncludeBuildSources].projectValue = "YES"
    let projectURL = try generateProjectNamed(projectName,
                                              buildTargets: buildTargets,
                                              pathFilters: ["\(testDir)/...",
                                                            "blaze-bin/...",
                                                            "blaze-genfiles/..."],
                                              additionalFilePaths: additionalFilePaths,
                                              outputDir: "tulsi_e2e_output",
                                              options: projectOptions)

    let diffLines = diffProjectAt(projectURL, againstGoldenProject: projectName)
    validateDiff(diffLines)
  }

  func test_SwiftProject() throws {
    let testDir = "tulsi_e2e_swift"
    installBUILDFile("Swift", intoSubdirectory: testDir)

    let appLabel = BuildLabel("//\(testDir):Application")
    let buildTargets = [RuleInfo(label: appLabel,
                                 type: "ios_application",
                                 linkedTargetLabels: [])]
    let additionalFilePaths = ["\(testDir)/BUILD"]

    let projectName = "SwiftProject"
    let projectURL = try generateProjectNamed(projectName,
                                              buildTargets: buildTargets,
                                              pathFilters: ["\(testDir)/...",
                                                            "blaze-bin/...",
                                                            "blaze-genfiles/..."],
                                              additionalFilePaths: additionalFilePaths,
                                              outputDir: "tulsi_e2e_output")

    let diffLines = diffProjectAt(projectURL, againstGoldenProject: projectName)
    validateDiff(diffLines)
  }

  func test_watchProject() throws {
    let testDir = "tulsi_e2e_watch"
    installBUILDFile("Watch", intoSubdirectory: testDir)

    let appLabel = BuildLabel("//\(testDir):Application")
    let buildTargets = [RuleInfo(label: appLabel,
                                 type: "ios_application",
                                 linkedTargetLabels: [])]
    let additionalFilePaths = ["\(testDir)/BUILD"]

    let projectName = "WatchProject"
    let projectURL = try generateProjectNamed(projectName,
                                              buildTargets: buildTargets,
                                              pathFilters: ["\(testDir)/...",
                                                            "blaze-bin/...",
                                                            "blaze-genfiles/..."],
                                              additionalFilePaths: additionalFilePaths,
                                              outputDir: "tulsi_e2e_output")

    let diffLines = diffProjectAt(projectURL, againstGoldenProject: projectName)
    validateDiff(diffLines)
  }

  func test_tvOSProject() throws {
    let testDir = "tulsi_e2e_tvos_project"
    installBUILDFile("ComplexSingle", intoSubdirectory: testDir)

    let appLabel = BuildLabel("//\(testDir):tvOSApplication")
    let buildTargets = [RuleInfo(label: appLabel,
                                 type: "tvos_application",
                                 linkedTargetLabels: [])
    ]
    let additionalFilePaths = ["\(testDir)/BUILD"]

    let projectURL = try generateProjectNamed("SkylarkBundlingProject",
                                              buildTargets: buildTargets,
                                              pathFilters: ["\(testDir)/...",
                                                            "blaze-bin/\(testDir)/...",
                                                            "blaze-genfiles/\(testDir)/..."],
                                              additionalFilePaths: additionalFilePaths,
                                              outputDir: "tulsi_e2e_output")

    let diffLines = diffProjectAt(projectURL, againstGoldenProject: "SkylarkBundlingProject")
    validateDiff(diffLines)
  }

  func test_macProject() throws {
    let testDir = "tulsi_e2e_mac"
    installBUILDFile("Mac", intoSubdirectory: testDir)

    let appLabel = BuildLabel("//\(testDir):MyMacOSApp")
    let commandLineAppLabel = BuildLabel("//\(testDir):MyCommandLineApp")
    let buildTargets = [RuleInfo(label: appLabel,
                                 type: "macos_application",
                                 linkedTargetLabels: []),
                        RuleInfo(label: commandLineAppLabel,
                                 type: "macos_command_line_application",
                                 linkedTargetLabels: [])]
    let additionalFilePaths = ["\(testDir)/BUILD"]

    let projectName = "MacOSProject"
    let projectURL = try generateProjectNamed(projectName,
                                              buildTargets: buildTargets,
                                              pathFilters: ["\(testDir)/...",
                                                            "blaze-bin/...",
                                                            "blaze-genfiles/..."],
                                              additionalFilePaths: additionalFilePaths,
                                              outputDir: "tulsi_e2e_output")

    let diffLines = diffProjectAt(projectURL, againstGoldenProject: projectName)
    validateDiff(diffLines)
  }

  func test_macTestsProject() throws {
    let testDir = "tulsi_e2e_mac"
    installBUILDFile("Mac", intoSubdirectory: testDir)

    let appLabel = BuildLabel("//\(testDir):MyMacOSApp")
    let unitTestsLabel = BuildLabel("//\(testDir):UnitTests")
    let unitTestsNoHostLabel = BuildLabel("//\(testDir):UnitTestsNoHost")
    let uiTestsLabel = BuildLabel("//\(testDir):UITests")
    let hostLabels = Set<BuildLabel>([appLabel])
    let buildTargets = [RuleInfo(label: unitTestsLabel,
                                 type: "apple_unit_test",
                                 linkedTargetLabels: hostLabels),
                        RuleInfo(label: unitTestsNoHostLabel,
                                 type: "apple_unit_test",
                                 linkedTargetLabels: []),
                        RuleInfo(label: uiTestsLabel,
                                 type: "apple_ui_test",
                                 linkedTargetLabels: hostLabels)]
    let additionalFilePaths = ["\(testDir)/BUILD"]

    let projectName = "MacOSTestsProject"
    let projectURL = try generateProjectNamed(projectName,
                                              buildTargets: buildTargets,
                                              pathFilters: ["\(testDir)/...",
                                                            "blaze-bin/...",
                                                            "blaze-genfiles/..."],
                                              additionalFilePaths: additionalFilePaths,
                                              outputDir: "tulsi_e2e_output")

    let diffLines = diffProjectAt(projectURL, againstGoldenProject: projectName)
    validateDiff(diffLines)
  }

  func test_simpleCCProject() throws {
    let testDir = "tulsi_e2e_ccsimple"
    let appLabel = BuildLabel("//\(testDir):ccBinary")
    installBUILDFile("Simple", intoSubdirectory: testDir)
    let buildTargets = [RuleInfo(label: appLabel,
                                 type: "cc_binary",
                                 linkedTargetLabels: [])]
    let additionalFilePaths = ["\(testDir)/BUILD"]

    let projectName = "SimpleCCProject"
    let projectURL = try generateProjectNamed(projectName,
                                              buildTargets: buildTargets,
                                              pathFilters: ["\(testDir)/..."],
                                              additionalFilePaths: additionalFilePaths,
                                              outputDir: "tulsi_e2e_output")

    let diffLines = diffProjectAt(projectURL, againstGoldenProject: projectName)
    validateDiff(diffLines)
  }
}

// End to end tests that generate xcodeproj bundles and validate them against golden versions.
class TestSuiteEndToEndGenerationTests: EndToEndIntegrationTestCase {
  let testDir = "TestSuite"
  let appRule = RuleInfo(label: BuildLabel("//TestSuite:TestApplication"),
                         type: "ios_application",
                         linkedTargetLabels: [])

  override func setUp() {
    super.setUp()

    installBUILDFile("TestSuiteRoot",
                     intoSubdirectory: testDir,
                     fromResourceDirectory: "TestSuite")
    installBUILDFile("TestOne",
                     intoSubdirectory: "\(testDir)/One",
                     fromResourceDirectory: "TestSuite/One")
    installBUILDFile("TestTwo",
                     intoSubdirectory: "\(testDir)/Two",
                     fromResourceDirectory: "TestSuite/Two")
    installBUILDFile("TestThree",
                     intoSubdirectory: "\(testDir)/Three",
                     fromResourceDirectory: "TestSuite/Three")
  }

  func test_ExplicitXCTestsProject() throws {
    let buildTargets = [
        appRule,
        RuleInfo(label: BuildLabel("//\(testDir):explicit_XCTests"),
                 type: "test_suite",
                 linkedTargetLabels: []),
    ]

    let projectName = "TestSuiteExplicitXCTestsProject"
    let projectURL = try generateProjectNamed(projectName,
                                              buildTargets: buildTargets,
                                              pathFilters: ["\(testDir)/..."],
                                              outputDir: "tulsi_e2e_output")

    let diffLines = diffProjectAt(projectURL,
                                  againstGoldenProject: projectName)
    validateDiff(diffLines)
  }

  func test_TestSuiteLocalTaggedTestsProject() throws {
    let buildTargets = [
        appRule,
        RuleInfo(label: BuildLabel("//\(testDir):local_tagged_tests"),
                 type: "test_suite",
                 linkedTargetLabels: []),
    ]

    let projectName = "TestSuiteLocalTaggedTestsProject"
    let options = TulsiOptionSet()
    let projectURL = try generateProjectNamed(projectName,
                                              buildTargets: buildTargets,
                                              pathFilters: ["\(testDir)/..."],
                                              outputDir: "tulsi_e2e_output",
                                              options: options)

    let diffLines = diffProjectAt(projectURL,
                                  againstGoldenProject: projectName)
    validateDiff(diffLines)
  }

  func test_TestSuiteRecursiveTestSuiteProject() throws {
    let buildTargets = [
        appRule,
        RuleInfo(label: BuildLabel("//\(testDir):recursive_test_suite"),
                 type: "test_suite",
                 linkedTargetLabels: []),
    ]

    let projectName = "TestSuiteRecursiveTestSuiteProject"
    let options = TulsiOptionSet()
    let projectURL = try generateProjectNamed(projectName,
                                              buildTargets: buildTargets,
                                              pathFilters: ["\(testDir)/..."],
                                              outputDir: "tulsi_e2e_output",
                                              options: options)

    let diffLines = diffProjectAt(projectURL,
                                  againstGoldenProject: projectName)
    validateDiff(diffLines)
  }
}
