blob: 6b69e2bc9228f31ac8f71630f5075511d0dfccb4 [file] [log] [blame]
// Copyright 2018 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 Foundation
import XCTest
import TulsiGenerator
class BazelFakeWorkspace {
let resourcesPathBase = "src/TulsiGeneratorIntegrationTests/Resources"
var runfilesURL: URL
var runfilesWorkspaceURL: URL
var fakeExecroot: URL
var workspaceRootURL: URL
var bazelURL: URL
var canaryBazelURL: URL?
var pathsToCleanOnTeardown = Set<URL>()
init(runfilesURL: URL, tempDirURL: URL) {
self.runfilesURL = runfilesURL
self.runfilesWorkspaceURL = runfilesURL.appendingPathComponent("__main__", isDirectory: true)
self.fakeExecroot = tempDirURL.appendingPathComponent("fake_execroot", isDirectory: true)
self.workspaceRootURL = fakeExecroot.appendingPathComponent("__main__", isDirectory: true)
self.bazelURL = BazelLocator.bazelURL!
}
private func addExportsFiles(buildFilePath: String,
exportedFile: String) throws {
try createDummyFile(path: "\(buildFilePath)/BUILD",
content: "exports_files([\"\(exportedFile)\"])\n")
}
private func addFilegroup(buildFilePath: String,
filegroup: String) throws {
try createDummyFile(path: "\(buildFilePath)/BUILD",
content: """
filegroup(
name = "\(filegroup)",
visibility = ["//visibility:public"],
)
"""
)
}
private func createDummyFile(path: String,
content: String) throws {
let fileURL = workspaceRootURL.appendingPathComponent(path)
let fileManager = FileManager.default
let containingDirectory = fileURL.deletingLastPathComponent()
if !fileManager.fileExists(atPath: containingDirectory.path) {
try fileManager.createDirectory(at: containingDirectory,
withIntermediateDirectories: true,
attributes: nil)
}
if fileManager.fileExists(atPath: fileURL.path) {
try fileManager.removeItem(at: fileURL)
}
try content.write(to: fileURL,
atomically: false,
encoding: String.Encoding.utf8)
}
private func installWorkspaceFile() {
do {
try FileManager.default.createDirectory(at: workspaceRootURL,
withIntermediateDirectories: true,
attributes: nil)
do {
let fileManager = FileManager.default
if fileManager.fileExists(atPath: fakeExecroot.path) {
try fileManager.removeItem(at: fakeExecroot)
}
try fileManager.copyItem(at: runfilesURL, to: fakeExecroot)
pathsToCleanOnTeardown.insert(workspaceRootURL)
} catch let e as NSError {
XCTFail("Failed to copy workspace '\(runfilesURL)' to '\(workspaceRootURL)' for test. Error: \(e.localizedDescription)")
return
}
} catch let e as NSError {
XCTFail("Failed to create temp directory '\(workspaceRootURL.path)' for test. Error: \(e.localizedDescription)")
}
}
func setup() -> BazelFakeWorkspace? {
installWorkspaceFile()
do {
try createDummyFile(path: "tools/objc/objc_dummy.mm", content: "")
try addExportsFiles(buildFilePath: "tools/objc", exportedFile: "objc_dummy.mm")
} catch let e as NSError {
XCTFail("Failed to set up fake workspace. Error: \(e.localizedDescription)")
}
return self
}
}