private void ComparePipData(string expected, string objectToSerialize, string quoteChar = "\'") { var result = Build().AddSpec("const obj = " + objectToSerialize + ";").EvaluateExpressionWithNoErrors("obj") as ObjectLiteral; Assert.True(result != null, "Expected to receive an ObjectLiteral from evaluation the data"); var renderer = new PipFragmentRenderer( absPath => { var path = absPath.ToString(PathTable, PathFormat.Script); var testRoot = TestRoot.Replace('\\', '/') + "/"; if (path.StartsWith(testRoot, StringComparison.OrdinalIgnoreCase)) { return("##" + path.Substring(testRoot.Length) + "##"); } return("##" + path + "##"); }, StringTable, x => "@@" + x + "@@"); var pipData = AmbientJson.CreatePipData(StringTable, result, quoteChar, new PipDataBuilder(StringTable)); var canonicalPipData = pipData.ToString(renderer).Replace("\r\n", "\n").Replace("/", "\\\\"); var canonicalExpected = expected.Replace("\r\n", "\n").Replace("/", "\\\\"); Assert.Equal(canonicalExpected, canonicalPipData); }
/// <summary> /// Gets the effective environment variables, taking into account default and machine-specific values /// </summary> public IBuildParameters GetEffectiveEnvironmentVariables(Process pip, PipFragmentRenderer pipFragmentRenderer, IReadOnlyList <string> globalUnsafePassthroughEnvironmentVariables = null) { Contract.Requires(pipFragmentRenderer != null); Contract.Requires(pip != null); Contract.Ensures(Contract.Result <IBuildParameters>() != null); var trackedEnv = pip.EnvironmentVariables.Where(envVar => !envVar.IsPassThrough); var passThroughEnvNames = pip.EnvironmentVariables.Where(envVar => envVar.IsPassThrough).Select(envVar => pipFragmentRenderer.Render(envVar.Name)); // Append any passthrough environment variables if they're specified passThroughEnvNames = globalUnsafePassthroughEnvironmentVariables != null?passThroughEnvNames.Union(globalUnsafePassthroughEnvironmentVariables) : passThroughEnvNames; IBuildParameters fullEnvironmentForPassThrough = MasterEnvironmentVariables != null? // We first look at the env variables from the worker, // then if the pass through variable is unset, we look at the env variables from the master. // That's why, if MasterEnvironmentVariables is not null, it is overridden by the current environment variables. GetFactory(ReportDuplicateVariable).PopulateFromDictionary(MasterEnvironmentVariables).Override(FullEnvironmentVariables.ToDictionary()) : FullEnvironmentVariables; return(m_baseEnvironmentVariables .Override(trackedEnv.ToDictionary( envVar => pipFragmentRenderer.Render(envVar.Name), envVar => envVar.Value.ToString(pipFragmentRenderer))) .Override(fullEnvironmentForPassThrough.Select(passThroughEnvNames).ToDictionary())); }
private void DoTestRenderer(PathTable pathTable, PipFragmentRenderer renderer, string expectedHash) { // StringId var strValue = "my string"; XAssert.AreEqual(strValue, renderer.Render(PipFragment.FromString(strValue, pathTable.StringTable))); var pathStr = A("t", "file1.txt"); var path = AbsolutePath.Create(pathTable, pathStr); var srcFile = FileArtifact.CreateSourceFile(path); var outFile = FileArtifact.CreateOutputFile(srcFile); var rwFile = outFile.CreateNextWrittenVersion(); var rw2File = rwFile.CreateNextWrittenVersion(); var opaqueDir = DirectoryArtifact.CreateDirectoryArtifactForTesting(path, 0); var sharedDir = new DirectoryArtifact(path, 1, isSharedOpaque: true); // AbsolutePath XAssert.AreEqual(pathStr, renderer.Render(PipFragment.FromAbsolutePathForTesting(path))); XAssert.AreEqual(pathStr, renderer.Render(PipFragment.FromAbsolutePathForTesting(srcFile))); XAssert.AreEqual(pathStr, renderer.Render(PipFragment.FromAbsolutePathForTesting(outFile))); XAssert.AreEqual(pathStr, renderer.Render(PipFragment.FromAbsolutePathForTesting(rwFile))); XAssert.AreEqual(pathStr, renderer.Render(PipFragment.FromAbsolutePathForTesting(rw2File))); // VsoHash XAssert.AreEqual(expectedHash, renderer.Render(PipFragment.VsoHashFromFileForTesting(srcFile))); XAssert.AreEqual(expectedHash, renderer.Render(PipFragment.VsoHashFromFileForTesting(outFile))); XAssert.AreEqual(expectedHash, renderer.Render(PipFragment.VsoHashFromFileForTesting(rwFile))); XAssert.AreEqual(expectedHash, renderer.Render(PipFragment.VsoHashFromFileForTesting(rw2File))); XAssert.AreEqual(DirectoryId.ToString(opaqueDir), renderer.Render(PipFragment.DirectoryIdForTesting(opaqueDir))); XAssert.AreEqual(DirectoryId.ToString(sharedDir), renderer.Render(PipFragment.DirectoryIdForTesting(sharedDir))); }
/// <summary> /// Gets the effective environment variables, taking into account default and machine-specific values /// </summary> public IBuildParameters GetEffectiveEnvironmentVariables(Process pip, PipFragmentRenderer pipFragmentRenderer, int currentUserRetryCount, IReadOnlyList <string> globalUnsafePassthroughEnvironmentVariables = null) { Contract.Requires(pipFragmentRenderer != null); Contract.Requires(pip != null); Contract.Requires(currentUserRetryCount >= 0); var trackedEnv = pip.EnvironmentVariables.Where(envVar => !envVar.IsPassThrough); var passThroughEnvNames = pip.EnvironmentVariables.Where(envVar => envVar.IsPassThrough).Select(envVar => pipFragmentRenderer.Render(envVar.Name)); // Append any passthrough environment variables if they're specified passThroughEnvNames = globalUnsafePassthroughEnvironmentVariables != null?passThroughEnvNames.Union(globalUnsafePassthroughEnvironmentVariables) : passThroughEnvNames; IBuildParameters fullEnvironmentForPassThrough = OrchestratorEnvironmentVariables != null? // We first look at the env variables from the worker, // then if the pass through variable is unset, we look at the env variables from the orchestrator. // That's why, if OrchestratorEnvironmentVariables is not null, it is overridden by the current environment variables. GetFactory(ReportDuplicateVariable).PopulateFromDictionary(OrchestratorEnvironmentVariables).Override(FullEnvironmentVariables.ToDictionary()) : FullEnvironmentVariables; IBuildParameters effectiveVariables = m_baseEnvironmentVariables .Override(trackedEnv.ToDictionary( envVar => pipFragmentRenderer.Render(envVar.Name), envVar => envVar.Value.ToString(pipFragmentRenderer))) .Override(fullEnvironmentForPassThrough.Select(passThroughEnvNames).ToDictionary()); // If the variable to indicate the retry attempt is set, make sure it gets populated if (pip.RetryAttemptEnvironmentVariable.IsValid) { effectiveVariables = effectiveVariables.Override( new[] { new KeyValuePair <string, string>(pipFragmentRenderer.Render(pip.RetryAttemptEnvironmentVariable), currentUserRetryCount.ToString()) }); } return(effectiveVariables); }
public void TestRendererWithoutHashLookup() { var pathTable = new PathTable(); var renderer = new PipFragmentRenderer(pathTable); DoTestRenderer(pathTable, renderer, FileContentInfo.CreateWithUnknownLength(ContentHashingUtilities.ZeroHash).Render()); var moniker = new StringMoniker("123"); XAssert.AreEqual(moniker.Id, renderer.Render(PipFragment.CreateIpcMonikerForTesting(moniker, pathTable.StringTable))); }
public void TestRendererWithHashLookup() { var pathTable = new PathTable(); var fakeContentInfo = FileContentInfo.CreateWithUnknownLength(ContentHash.Random()); var expectedHash = fakeContentInfo.Render(); var renderer = new PipFragmentRenderer(pathTable, (mId) => "XYZ:" + mId, (f) => fakeContentInfo); DoTestRenderer(pathTable, renderer, expectedHash); var moniker = new StringMoniker("123"); XAssert.AreEqual("XYZ:123", renderer.Render(PipFragment.CreateIpcMonikerForTesting(moniker, pathTable.StringTable))); }
public void TestReadThenWrte(string xml) { var spec = @" namespace M { const result = _PreludeAmbientHack_Xml.read(f`in.xml`); }"; var result = Build() .AddFile("in.xml", xml) .AddSpec(spec) .EvaluateExpressionWithNoErrors("M.result"); var objectLiteral = result as ObjectLiteral; Assert.NotNull(objectLiteral); var renderer = new PipFragmentRenderer( absPath => { var path = absPath.ToString(PathTable, PathFormat.Script); var testRoot = TestRoot.Replace('\\', '/') + "/TestSln/src/"; if (path.StartsWith(testRoot, StringComparison.OrdinalIgnoreCase)) { return("##" + path.Substring(testRoot.Length) + "##"); } return("##" + path + "##"); }, StringTable, x => "@@" + x + "@@"); var pipData = AmbientXml.CreatePipData(StringTable, objectLiteral, new PipDataBuilder(StringTable)); var canonicalPipData = pipData.ToString(renderer).Replace("\r\n", "\n").Replace("/", "\\\\"); var canonicalExpected = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + xml.Replace("\r\n", "\n").Replace("/", "\\\\"); // skip read-write test if xml contains DOCTYPE because our writer doesn't generate <!DOCTYPE> if (!xml.ToUpperInvariant().Contains("DOCTYPE")) { Assert.Equal(canonicalExpected, canonicalPipData); } }