Пример #1
0
        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);
        }
Пример #2
0
        /// <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()));
        }
Пример #3
0
        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)));
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        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)));
        }
Пример #6
0
        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)));
        }
Пример #7
0
        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);
            }
        }