public void TestAmbientFileUses() { FileSystem = new PassThroughMutableFileSystem(PathTable); RelativeSourceRoot = System.IO.Path.Combine(TemporaryDirectory, Guid.NewGuid().ToString()); const string Spec = @" // Any change will break Office. const file = f`D:/path/to/a/file.txt`; const filePath = file.path; const fileContent = File.readAllText(f`file.txt`); "; var results = Build() .Spec(Spec) .AddFile("file.txt", "Hello") .EvaluateExpressionsWithNoErrors("file", "filePath", "fileContent"); Assert.IsType <FileArtifact>(results["file"]); Assert.True(((FileArtifact)results["file"]).IsSourceFile); Assert.Equal(CreateAbsolutePath(@"D:\path\to\a\file.txt"), results["filePath"]); Assert.Equal("Hello", results["fileContent"]); }
protected void RestartEngine() { var pathTable = new PathTable(); FileSystem = new PassThroughMutableFileSystem(pathTable); Context = EngineContext.CreateNew(CancellationToken.None, pathTable, FileSystem); MainSourceResolverModules = new List <DiscriminatingUnion <AbsolutePath, IInlineModuleDefinition> >(); var rootPath = AbsolutePath.Create(Context.PathTable, TestRoot); var logsPath = Combine(AbsolutePath.Create(Context.PathTable, TemporaryDirectory), "logs"); Configuration = new CommandLineConfiguration() { DisableDefaultSourceResolver = true, Resolvers = new List <IResolverSettings> { new SourceResolverSettings { Kind = "SourceResolver", Modules = MainSourceResolverModules, }, new SourceResolverSettings { Kind = "SourceResolver", Modules = new List <DiscriminatingUnion <AbsolutePath, IInlineModuleDefinition> > { new DiscriminatingUnion <AbsolutePath, IInlineModuleDefinition>( AbsolutePath.Create(Context.PathTable, Path.Combine(GetTestExecutionLocation(), "Sdk", "Prelude", "package.config.dsc"))), new DiscriminatingUnion <AbsolutePath, IInlineModuleDefinition>( AbsolutePath.Create(Context.PathTable, Path.Combine(GetTestExecutionLocation(), "Sdk", "Transformers", "package.config.dsc"))), new DiscriminatingUnion <AbsolutePath, IInlineModuleDefinition>( AbsolutePath.Create(Context.PathTable, Path.Combine(GetTestExecutionLocation(), "Sdk", "Deployment", "module.config.dsc"))), }, }, }, Layout = { SourceDirectory = rootPath, OutputDirectory = Combine(rootPath, "out"), ObjectDirectory = Combine(rootPath, "obj"), CacheDirectory = Combine(AbsolutePath.Create(Context.PathTable, TemporaryDirectory), "cache"), }, Cache = { CacheSpecs = SpecCachingOption.Disabled, CacheLogFilePath = logsPath.Combine(Context.PathTable,PathAtom.Create(Context.StringTable, "cache.log")), }, Engine = { ReuseEngineState = false, LogStatistics = false, TrackBuildsInUserFolder = false, }, FrontEnd = { MaxFrontEndConcurrency = 1, LogStatistics = false, }, Schedule = { MaxIO = 1, MaxProcesses = 1, }, Sandbox = { FileSystemMode = FileSystemMode.RealAndMinimalPipGraph, OutputReportingMode = OutputReportingMode.FullOutputOnError, }, Logging = { LogsDirectory = logsPath, LogStats = false, LogExecution = false, LogCounters = false, LogMemory = false, StoreFingerprints = false, NoWarnings = { 909, // Disable warnings about experimental feature }, } }; if (TryGetSubstSourceAndTarget(out string substSource, out string substTarget)) { // Directory translation is needed here particularly when the test temporary directory // is inside a directory that is actually a junction to another place. // For example, the temporary directory is D:\src\BuildXL\Out\Object\abc\t_1, but // the path D:\src\BuildXL\Out or D:\src\BuildXL\Out\Object is a junction to K:\Out. // Some tool, like cmd, can access the path in K:\Out, and thus the test will have a DFA // if there's no directory translation. // This problem does not occur when only substs are involved, but no junctions. The method // TryGetSubstSourceAndTarget works to get translations due to substs or junctions. AbsolutePath substSourcePath = AbsolutePath.Create(Context.PathTable, substSource); AbsolutePath substTargetPath = AbsolutePath.Create(Context.PathTable, substTarget); Configuration.Engine.DirectoriesToTranslate.Add( new TranslateDirectoryData(I($"{substSource}<{substTarget}"), substSourcePath, substTargetPath)); } }