Пример #1
0
        public void ValidateBasicCacheMissCounters()
        {
            AbsolutePath.TryCreate(Context.PathTable, ReadonlyRoot, out var readonlyRootPath);
            var readonlyRootDir = DirectoryArtifact.CreateWithZeroPartialSealId(readonlyRootPath);
            var childDir        = DirectoryArtifact.CreateWithZeroPartialSealId(CreateUniqueDirectory(ReadonlyRoot));

            // Enumerate /readonlyroot and /readonlyroot/childDir
            Process enumeratorPip = CreateAndSchedulePipBuilder(new Operation[]
            {
                Operation.EnumerateDir(childDir),
                Operation.WriteFile(CreateOutputFileArtifact())
            }).Process;

            Process writerPip = CreateAndSchedulePipBuilder(new Operation[]
            {
                Operation.WriteFile(CreateOutputFileArtifact())
            }).Process;

            ScheduleRunResult result1 = RunScheduler();

            result1.AssertCacheMiss(enumeratorPip.PipId, writerPip.PipId);
            result1.AssertNumWeakFingerprintMisses(2);

            // Create /childDir/nestedFile, causing strong fingerprint miss
            FileArtifact      nestedFile = CreateSourceFile(ArtifactToString(childDir));
            ScheduleRunResult result2    = RunScheduler();

            result2.AssertCacheHit(writerPip.PipId);
            // Weak fingerprint hit on both pips
            result2.AssertNumWeakFingerprintMisses(0);
            // Strong fingerprint miss on enumeratorPip
            result2.AssertCacheMiss(enumeratorPip.PipId);
            result2.AssertNumStrongFingerprintMisses(1);
        }
Пример #2
0
        public void PreserveOutputsWithTrustLevelModification()
        {
            Configuration.Sandbox.UnsafeSandboxConfigurationMutable.PreserveOutputs           = PreserveOutputsMode.Enabled;
            Configuration.Sandbox.UnsafeSandboxConfigurationMutable.PreserveOutputsTrustLevel = 3;
            var input            = CreateSourceFile();
            var outputPreservedA = CreateOutputFileArtifact(Path.Combine(ObjectRoot, @"nested\out\filePreservedA"));

            var builderA = CreatePipBuilder(new Operation[]
            {
                Operation.ReadFile(input),
                Operation.WriteFile(outputPreservedA, CONTENT),
            });

            // processA won't perserve outputs
            builderA.Options |= Process.Options.AllowPreserveOutputs;
            builderA.PreserveOutputsTrustLevel = 2;
            var processAndOutputsA = SchedulePipBuilder(builderA);

            RunSchedulerAndGetOutputContents(outputPreservedA, false, processAndOutputsA.Process.PipId);
            XAssert.AreEqual(CONTENT, File.ReadAllText(ArtifactToString(outputPreservedA)));

            // after decreasing global preserve output trust level to 1, process A will not be scheduled
            Configuration.Sandbox.UnsafeSandboxConfigurationMutable.PreserveOutputsTrustLevel = 1;
            ScheduleRunResult result = RunScheduler();

            if (Configuration.Schedule.IncrementalScheduling)
            {
                result.AssertNotScheduled(processAndOutputsA.Process.PipId);
            }
            else
            {
                result.AssertCacheHit(processAndOutputsA.Process.PipId);
            }
            XAssert.AreEqual(CONTENT, File.ReadAllText(ArtifactToString(outputPreservedA)));

            // once we change back global TL to 3, process A will be scheduled again
            Configuration.Sandbox.UnsafeSandboxConfigurationMutable.PreserveOutputsTrustLevel = 3;
            result = RunScheduler();
            if (Configuration.Schedule.IncrementalScheduling)
            {
                result.AssertScheduled(processAndOutputsA.Process.PipId);
            }
            else
            {
                result.AssertCacheMiss(processAndOutputsA.Process.PipId);
            }
            XAssert.AreEqual(CONTENT, File.ReadAllText(ArtifactToString(outputPreservedA)));
        }
Пример #3
0
        public void ValidateCachingRewrittenFiles()
        {
            // Three pips sharing the same file as input and rewriting it.
            // Each pip has a unique src file that is modified to trigger that individual pip to re-run.
            // When a pip is run, it reads in the shared file, then appends one line of random output.
            // The random output triggers the subsequent, dependent pips to re-run.

            var srcA          = CreateSourceFile();
            var rewrittenFile = CreateOutputFileArtifact();
            var paoA          = CreateAndSchedulePipBuilder(new Operation[]
            {
                Operation.ReadFile(srcA),
                Operation.WriteFile(rewrittenFile), /* unique output on every pip run */
                Operation.WriteFile(rewrittenFile, System.Environment.NewLine)
            });
            Process pipA = paoA.Process;

            var srcB        = CreateSourceFile();
            var pipBuilderB = CreatePipBuilder(new Operation[]
            {
                Operation.ReadFile(srcB),
                Operation.WriteFile(rewrittenFile, doNotInfer: true), /* unique output on every pip run */
                Operation.WriteFile(rewrittenFile, System.Environment.NewLine, doNotInfer: true)
            });

            pipBuilderB.AddRewrittenFileInPlace(paoA.ProcessOutputs.GetOutputFile(rewrittenFile.Path));
            var     paoB = SchedulePipBuilder(pipBuilderB);
            Process pipB = paoB.Process;

            var srcC        = CreateSourceFile();
            var pipBuilderC = CreatePipBuilder(new Operation[]
            {
                Operation.ReadFile(srcC),
                Operation.WriteFile(rewrittenFile, doNotInfer: true), /* unique output on every pip run */
                Operation.WriteFile(rewrittenFile, System.Environment.NewLine, doNotInfer: true)
            });

            pipBuilderC.AddRewrittenFileInPlace(paoB.ProcessOutputs.GetOutputFile(rewrittenFile.Path));
            Process pipC = SchedulePipBuilder(pipBuilderC).Process;

            RunScheduler().AssertSuccess();

            // Modify input to pipA to trigger re-run, cache miss on all three
            File.AppendAllText(ArtifactToString(srcA), "srcA");
            ScheduleRunResult resultA = RunScheduler().AssertSuccess();

            resultA.AssertCacheMiss(pipA.PipId);
            resultA.AssertCacheMiss(pipB.PipId);
            resultA.AssertCacheMiss(pipC.PipId);

            // Store results of file to check cache replay
            var outRunA = File.ReadAllLines(ArtifactToString(rewrittenFile));

            XAssert.AreEqual(3, outRunA.Length); /* exactly one line of output per pip */

            // Modify input to pipB to trigger re-run, cache miss on B and C
            File.AppendAllText(ArtifactToString(srcB), "srcB");
            ScheduleRunResult resultB = RunScheduler().AssertSuccess();

            resultB.AssertCacheHit(pipA.PipId);
            resultB.AssertCacheMiss(pipB.PipId);
            resultB.AssertCacheMiss(pipC.PipId);

            // Check cache hit from resultB replayed version of file written only by pipA
            var outRunB = File.ReadAllLines(ArtifactToString(rewrittenFile));

            XAssert.AreEqual(3, outRunB.Length); /* exactly one line of output per pip */

            XAssert.AreEqual(outRunA[0], outRunB[0]);
            XAssert.AreNotEqual(outRunA[1], outRunB[1]);
            XAssert.AreNotEqual(outRunA[2], outRunB[2]);

            // Modify input to pipC to trigger re-run, cache miss on only C
            File.AppendAllText(ArtifactToString(srcC), "srcC");
            ScheduleRunResult resultC = RunScheduler().AssertSuccess();

            resultC.AssertCacheHit(pipA.PipId);
            resultC.AssertCacheHit(pipB.PipId);
            resultC.AssertCacheMiss(pipC.PipId);

            // Check cache hit from resultC replayed version of file run written only by pipA and pipB
            var outRunC = File.ReadAllLines(ArtifactToString(rewrittenFile));

            XAssert.AreEqual(outRunA.Length, 3); /* exactly one line of output per pip */

            XAssert.AreEqual(outRunB[0], outRunC[0]);
            XAssert.AreEqual(outRunB[1], outRunC[1]);
            XAssert.AreNotEqual(outRunB[2], outRunC[2]);
        }