public void DuplicateInputsAndOutputsMergePredictedBys()
        {
            var predictors = new IProjectPredictor[]
            {
                new MockPredictor(
                    new[] { @"common\inputFile" },
                    new[] { @"common\inputDirectory" },
                    new[] { @"common\outputFile" },
                    new[] { @"common\outputDirectory" }),
                new MockPredictor2(
                    new[] { @"common\inputFile" },
                    new[] { @"common\inputDirectory" },
                    new[] { @"common\outputFile" },
                    new[] { @"common\outputDirectory" }),
            };

            var executor = new ProjectPredictionExecutor(predictors);

            var project = TestHelpers.CreateProjectInstanceFromRootElement(ProjectRootElement.Create());

            ProjectPredictions predictions = executor.PredictInputsAndOutputs(project);

            predictions.AssertPredictions(
                project,
                new[] { new PredictedItem(@"common\inputFile", "MockPredictor", "MockPredictor2"), },
                new[] { new PredictedItem(@"common\inputDirectory", "MockPredictor", "MockPredictor2"), },
                new[] { new PredictedItem(@"common\outputFile", "MockPredictor", "MockPredictor2"), },
                new[] { new PredictedItem(@"common\outputDirectory", "MockPredictor", "MockPredictor2"), });
        }
コード例 #2
0
        protected void ParseAndVerifyProject(
            string projFileName,
            IProjectPredictor predictor,
            IReadOnlyCollection <PredictedItem> expectedInputFiles,
            IReadOnlyCollection <PredictedItem> expectedInputDirectories,
            IReadOnlyCollection <PredictedItem> expectedOutputFiles,
            IReadOnlyCollection <PredictedItem> expectedOutputDirectories)
        {
            var globalProperties = new Dictionary <string, string>
            {
                { "Platform", "amd64" },
                { "Configuration", "debug" },
            };
            var projectCollection = new ProjectCollection();

            var projectOptions = new ProjectOptions
            {
                ProjectCollection = projectCollection,
                GlobalProperties  = globalProperties,
            };

            // TestsData files are marked to CopyToOutput and are available next to the executing assembly
            var projectInstance = ProjectInstance.FromFile(Path.Combine(TestsDirectoryPath, projFileName), projectOptions);

            predictor
            .GetProjectPredictions(projectInstance)
            .AssertPredictions(
                projectInstance,
                expectedInputFiles,
                expectedInputDirectories,
                expectedOutputFiles,
                expectedOutputDirectories);
        }
        public void DistinctInputsAndOutputsAreAggregated()
        {
            /*
             * Missed value in the input files:
             * PredictedItem: 1\inputFile; PredictedBy=MockPredictor
             * from among actual list
             * PredictedItem: E:\MSBuildPrediction\src\BuildPredictionTests\bin\Debug\net472\2\inputFile; PredictedBy=MockPredictor2:: PredictedItem: E:\MSBuildPrediction\src\BuildPredictionTests\bin\Debug\net472\1\inputFile; PredictedBy=MockPredictor
             */
            var predictors = new IProjectPredictor[]
            {
                new MockPredictor(
                    new[] { @"1\inputFile" },
                    new[] { @"1\inputDirectory" },
                    new[] { @"1\outputFile" },
                    new[] { @"1\outputDirectory" }),
                new MockPredictor2(
                    new[] { @"2\inputFile" },
                    new[] { @"2\inputDirectory" },
                    new[] { @"2\outputFile" },
                    new[] { @"2\outputDirectory" }),
            };

            var executor = new ProjectPredictionExecutor(predictors);

            var project = TestHelpers.CreateProjectInstanceFromRootElement(ProjectRootElement.Create());

            ProjectPredictions predictions = executor.PredictInputsAndOutputs(project);

            predictions.AssertPredictions(
                project,
                new[] { new PredictedItem(@"1\inputFile", "MockPredictor"), new PredictedItem(@"2\inputFile", "MockPredictor2"), },
                new[] { new PredictedItem(@"1\inputDirectory", "MockPredictor"), new PredictedItem(@"2\inputDirectory", "MockPredictor2"), },
                new[] { new PredictedItem(@"1\outputFile", "MockPredictor"), new PredictedItem(@"2\outputFile", "MockPredictor2"), },
                new[] { new PredictedItem(@"1\outputDirectory", "MockPredictor"), new PredictedItem(@"2\outputDirectory", "MockPredictor2"), });
        }
コード例 #4
0
        public static ProjectPredictions GetProjectPredictions(this IProjectPredictor predictor, ProjectInstance projectInstance)
        {
            var projectPredictionCollector = new DefaultProjectPredictionCollector();
            var predictionReporter         = new ProjectPredictionReporter(
                projectPredictionCollector,
                projectInstance,
                predictor.GetType().Name);

            predictor.PredictInputsAndOutputs(projectInstance, predictionReporter);
            return(projectPredictionCollector.Predictions);
        }
        public void PredictorSparsenessStressTest()
        {
            int[] numPredictorCases     = { 40 }; // Set to 1000 or more for reduced average noise when using tickResults for measurements.
            int[] sparsenessPercentages = { 0, 25, 50, 75, 100 };
            var   tickResults           = new long[numPredictorCases.Length][];

            var proj = TestHelpers.CreateProjectInstanceFromRootElement(ProjectRootElement.Create());

            // Run through twice and keep the second round only - first round affected by JIT overhead.
            for (int iter = 0; iter < 2; iter++)
            {
                for (int p = 0; p < numPredictorCases.Length; p++)
                {
                    int numPredictors = numPredictorCases[p];
                    tickResults[p] = new long[sparsenessPercentages.Length];
                    var predictors  = new IProjectPredictor[numPredictors];
                    int sparseIndex = 0;

                    for (int s = 0; s < sparsenessPercentages.Length; s++)
                    {
                        int sparsenessPercentage = sparsenessPercentages[s];
                        for (int i = 0; i < numPredictors; i++)
                        {
                            if (sparseIndex < sparsenessPercentage)
                            {
                                predictors[i] = new MockPredictor(null, null, null, null);
                            }
                            else
                            {
                                predictors[i] = new MockPredictor(
                                    new[] { $@"{i}\inputFile" },
                                    new[] { $@"{i}\inputDirectory" },
                                    new[] { $@"{i}\outputFile" },
                                    new[] { $@"{i}\outputDirectory" });
                            }

                            sparseIndex++;
                            if (sparseIndex > sparsenessPercentage)
                            {
                                sparseIndex = 0;
                            }
                        }

                        var       executor = new ProjectPredictionExecutor(predictors);
                        Stopwatch sw       = Stopwatch.StartNew();
                        executor.PredictInputsAndOutputs(proj);
                        sw.Stop();
                        tickResults[p][s] = sw.ElapsedTicks;
                        Console.WriteLine($"{numPredictors} @ {sparsenessPercentage}%: {sw.ElapsedTicks} ticks");
                    }
                }
            }
        }
        public void EmptyPredictionsResultInEmptyAggregateResult()
        {
            var predictors = new IProjectPredictor[]
            {
                new MockPredictor(null, null, null, null),
                new MockPredictor(null, null, null, null),
            };

            var executor = new ProjectPredictionExecutor(predictors);

            var project = TestHelpers.CreateProjectInstanceFromRootElement(ProjectRootElement.Create());
            ProjectPredictions predictions = executor.PredictInputsAndOutputs(project);

            Assert.NotNull(predictions);
            Assert.Equal(0, predictions.InputFiles.Count);
            Assert.Equal(0, predictions.InputDirectories.Count);
            Assert.Equal(0, predictions.OutputFiles.Count);
            Assert.Equal(0, predictions.OutputDirectories.Count);
        }
        public void EmptyPredictionsResultInEmptyAggregateResult()
        {
            var graphPredictors = new IProjectGraphPredictor[]
            {
                new MockGraphPredictor(null, null, null, null),
                new MockGraphPredictor(null, null, null, null),
            };

            var predictors = new IProjectPredictor[]
            {
                new MockPredictor(null, null, null, null),
                new MockPredictor(null, null, null, null),
            };

            var executor = new ProjectGraphPredictionExecutor(graphPredictors, predictors);

            ProjectRootElement projectA = CreateProject("a");
            ProjectRootElement projectB = CreateProject("b");
            ProjectRootElement projectC = CreateProject("c");
            ProjectRootElement projectD = CreateProject("d");

            // A depends on B, D; B depends on C, D; C depends on D
            projectA.AddItem("ProjectReference", @"..\b\b.proj");
            projectA.AddItem("ProjectReference", @"..\d\d.proj");
            projectB.AddItem("ProjectReference", @"..\c\c.proj");
            projectB.AddItem("ProjectReference", @"..\d\d.proj");
            projectC.AddItem("ProjectReference", @"..\d\d.proj");

            projectA.Save();
            projectB.Save();
            projectC.Save();
            projectD.Save();

            var projectGraph = new ProjectGraph(projectA.FullPath, new ProjectCollection());
            ProjectGraphPredictions graphPredictions = executor.PredictInputsAndOutputs(projectGraph);

            AssertPredictionsMadeForEveryNode(projectGraph, graphPredictions);
            foreach (ProjectPredictions projectPredictions in graphPredictions.PredictionsPerNode.Values)
            {
                projectPredictions.AssertNoPredictions();
            }
        }
        public void DistinctInputsAndOutputsAreAggregated()
        {
            var graphPredictors = new IProjectGraphPredictor[]
            {
                new MockGraphPredictor(
                    new[] { @"inputFile1" },
                    new[] { @"inputDirectory1" },
                    new[] { @"outputFile1" },
                    new[] { @"outputDirectory1" }),
                new MockGraphPredictor2(
                    new[] { @"inputFile2" },
                    new[] { @"inputDirectory2" },
                    new[] { @"outputFile2" },
                    new[] { @"outputDirectory2" }),
            };

            var predictors = new IProjectPredictor[]
            {
                new MockPredictor(
                    new[] { @"inputFile3" },
                    new[] { @"inputDirectory3" },
                    new[] { @"outputFile3" },
                    new[] { @"outputDirectory3" }),
                new MockPredictor2(
                    new[] { @"inputFile4" },
                    new[] { @"inputDirectory4" },
                    new[] { @"outputFile4" },
                    new[] { @"outputDirectory4" }),
            };

            var executor = new ProjectGraphPredictionExecutor(graphPredictors, predictors);

            ProjectRootElement projectA = CreateProject("a");
            ProjectRootElement projectB = CreateProject("b");
            ProjectRootElement projectC = CreateProject("c");
            ProjectRootElement projectD = CreateProject("d");

            // A depends on B, D; B depends on C, D; C depends on D
            projectA.AddItem("ProjectReference", @"..\b\b.proj");
            projectA.AddItem("ProjectReference", @"..\d\d.proj");
            projectB.AddItem("ProjectReference", @"..\c\c.proj");
            projectB.AddItem("ProjectReference", @"..\d\d.proj");
            projectC.AddItem("ProjectReference", @"..\d\d.proj");

            projectA.Save();
            projectB.Save();
            projectC.Save();
            projectD.Save();

            var projectGraph = new ProjectGraph(projectA.FullPath, new ProjectCollection());
            ProjectGraphPredictions graphPredictions = executor.PredictInputsAndOutputs(projectGraph);

            AssertPredictionsMadeForEveryNode(projectGraph, graphPredictions);

            var expectedInputFiles = new[]
            {
                new PredictedItem(@"a\inputFile3", "MockPredictor"),
                new PredictedItem(@"a\inputFile4", "MockPredictor2"),
                new PredictedItem(@"b\inputFile1", "MockGraphPredictor"),
                new PredictedItem(@"b\inputFile2", "MockGraphPredictor2"),
                new PredictedItem(@"d\inputFile1", "MockGraphPredictor"),
                new PredictedItem(@"d\inputFile2", "MockGraphPredictor2"),
            };
            var expectedInputDirectories = new[]
            {
                new PredictedItem(@"a\inputDirectory3", "MockPredictor"),
                new PredictedItem(@"a\inputDirectory4", "MockPredictor2"),
                new PredictedItem(@"b\inputDirectory1", "MockGraphPredictor"),
                new PredictedItem(@"b\inputDirectory2", "MockGraphPredictor2"),
                new PredictedItem(@"d\inputDirectory1", "MockGraphPredictor"),
                new PredictedItem(@"d\inputDirectory2", "MockGraphPredictor2"),
            };
            var expectedOutputFiles = new[]
            {
                new PredictedItem(@"a\outputFile3", "MockPredictor"),
                new PredictedItem(@"a\outputFile4", "MockPredictor2"),
                new PredictedItem(@"b\outputFile1", "MockGraphPredictor"),
                new PredictedItem(@"b\outputFile2", "MockGraphPredictor2"),
                new PredictedItem(@"d\outputFile1", "MockGraphPredictor"),
                new PredictedItem(@"d\outputFile2", "MockGraphPredictor2"),
            };
            var expectedOutputDirectories = new[]
            {
                new PredictedItem(@"a\outputDirectory3", "MockPredictor"),
                new PredictedItem(@"a\outputDirectory4", "MockPredictor2"),
                new PredictedItem(@"b\outputDirectory1", "MockGraphPredictor"),
                new PredictedItem(@"b\outputDirectory2", "MockGraphPredictor2"),
                new PredictedItem(@"d\outputDirectory1", "MockGraphPredictor"),
                new PredictedItem(@"d\outputDirectory2", "MockGraphPredictor2"),
            };

            GetPredictionsForProject(graphPredictions, "a").AssertPredictions(
                _rootDir,
                expectedInputFiles,
                expectedInputDirectories,
                expectedOutputFiles,
                expectedOutputDirectories);

            expectedInputFiles = new[]
            {
                new PredictedItem(@"b\inputFile3", "MockPredictor"),
                new PredictedItem(@"b\inputFile4", "MockPredictor2"),
                new PredictedItem(@"c\inputFile1", "MockGraphPredictor"),
                new PredictedItem(@"c\inputFile2", "MockGraphPredictor2"),
                new PredictedItem(@"d\inputFile1", "MockGraphPredictor"),
                new PredictedItem(@"d\inputFile2", "MockGraphPredictor2"),
            };
            expectedInputDirectories = new[]
            {
                new PredictedItem(@"b\inputDirectory3", "MockPredictor"),
                new PredictedItem(@"b\inputDirectory4", "MockPredictor2"),
                new PredictedItem(@"c\inputDirectory1", "MockGraphPredictor"),
                new PredictedItem(@"c\inputDirectory2", "MockGraphPredictor2"),
                new PredictedItem(@"d\inputDirectory1", "MockGraphPredictor"),
                new PredictedItem(@"d\inputDirectory2", "MockGraphPredictor2"),
            };
            expectedOutputFiles = new[]
            {
                new PredictedItem(@"b\outputFile3", "MockPredictor"),
                new PredictedItem(@"b\outputFile4", "MockPredictor2"),
                new PredictedItem(@"c\outputFile1", "MockGraphPredictor"),
                new PredictedItem(@"c\outputFile2", "MockGraphPredictor2"),
                new PredictedItem(@"d\outputFile1", "MockGraphPredictor"),
                new PredictedItem(@"d\outputFile2", "MockGraphPredictor2"),
            };
            expectedOutputDirectories = new[]
            {
                new PredictedItem(@"b\outputDirectory3", "MockPredictor"),
                new PredictedItem(@"b\outputDirectory4", "MockPredictor2"),
                new PredictedItem(@"c\outputDirectory1", "MockGraphPredictor"),
                new PredictedItem(@"c\outputDirectory2", "MockGraphPredictor2"),
                new PredictedItem(@"d\outputDirectory1", "MockGraphPredictor"),
                new PredictedItem(@"d\outputDirectory2", "MockGraphPredictor2"),
            };
            GetPredictionsForProject(graphPredictions, "b").AssertPredictions(
                _rootDir,
                expectedInputFiles,
                expectedInputDirectories,
                expectedOutputFiles,
                expectedOutputDirectories);

            expectedInputFiles = new[]
            {
                new PredictedItem(@"c\inputFile3", "MockPredictor"),
                new PredictedItem(@"c\inputFile4", "MockPredictor2"),
                new PredictedItem(@"d\inputFile1", "MockGraphPredictor"),
                new PredictedItem(@"d\inputFile2", "MockGraphPredictor2"),
            };
            expectedInputDirectories = new[]
            {
                new PredictedItem(@"c\inputDirectory3", "MockPredictor"),
                new PredictedItem(@"c\inputDirectory4", "MockPredictor2"),
                new PredictedItem(@"d\inputDirectory1", "MockGraphPredictor"),
                new PredictedItem(@"d\inputDirectory2", "MockGraphPredictor2"),
            };
            expectedOutputFiles = new[]
            {
                new PredictedItem(@"c\outputFile3", "MockPredictor"),
                new PredictedItem(@"c\outputFile4", "MockPredictor2"),
                new PredictedItem(@"d\outputFile1", "MockGraphPredictor"),
                new PredictedItem(@"d\outputFile2", "MockGraphPredictor2"),
            };
            expectedOutputDirectories = new[]
            {
                new PredictedItem(@"c\outputDirectory3", "MockPredictor"),
                new PredictedItem(@"c\outputDirectory4", "MockPredictor2"),
                new PredictedItem(@"d\outputDirectory1", "MockGraphPredictor"),
                new PredictedItem(@"d\outputDirectory2", "MockGraphPredictor2"),
            };
            GetPredictionsForProject(graphPredictions, "c").AssertPredictions(
                _rootDir,
                expectedInputFiles,
                expectedInputDirectories,
                expectedOutputFiles,
                expectedOutputDirectories);

            expectedInputFiles = new[]
            {
                new PredictedItem(@"d\inputFile3", "MockPredictor"),
                new PredictedItem(@"d\inputFile4", "MockPredictor2"),
            };
            expectedInputDirectories = new[]
            {
                new PredictedItem(@"d\inputDirectory3", "MockPredictor"),
                new PredictedItem(@"d\inputDirectory4", "MockPredictor2"),
            };
            expectedOutputFiles = new[]
            {
                new PredictedItem(@"d\outputFile3", "MockPredictor"),
                new PredictedItem(@"d\outputFile4", "MockPredictor2"),
            };
            expectedOutputDirectories = new[]
            {
                new PredictedItem(@"d\outputDirectory3", "MockPredictor"),
                new PredictedItem(@"d\outputDirectory4", "MockPredictor2"),
            };
            GetPredictionsForProject(graphPredictions, "d").AssertPredictions(
                _rootDir,
                expectedInputFiles,
                expectedInputDirectories,
                expectedOutputFiles,
                expectedOutputDirectories);
        }
        public void DuplicateInputsAndOutputsMergePredictedBys()
        {
            var graphPredictors = new IProjectGraphPredictor[]
            {
                new MockGraphPredictor(
                    new[] { @"..\common\inputFile" },
                    new[] { @"..\common\inputDirectory" },
                    new[] { @"..\common\outputFile" },
                    new[] { @"..\common\outputDirectory" }),
                new MockGraphPredictor2(
                    new[] { @"..\common\inputFile" },
                    new[] { @"..\common\inputDirectory" },
                    new[] { @"..\common\outputFile" },
                    new[] { @"..\common\outputDirectory" }),
            };

            var predictors = new IProjectPredictor[]
            {
                new MockPredictor(
                    new[] { @"..\common\inputFile" },
                    new[] { @"..\common\inputDirectory" },
                    new[] { @"..\common\outputFile" },
                    new[] { @"..\common\outputDirectory" }),
                new MockPredictor2(
                    new[] { @"..\common\inputFile" },
                    new[] { @"..\common\inputDirectory" },
                    new[] { @"..\common\outputFile" },
                    new[] { @"..\common\outputDirectory" }),
            };

            var executor = new ProjectGraphPredictionExecutor(graphPredictors, predictors);

            ProjectRootElement projectA = CreateProject("a");
            ProjectRootElement projectB = CreateProject("b");

            // A depends on B
            projectA.AddItem("ProjectReference", @"..\b\b.proj");

            projectA.Save();
            projectB.Save();

            var projectGraph = new ProjectGraph(projectA.FullPath, new ProjectCollection());
            ProjectGraphPredictions graphPredictions = executor.PredictInputsAndOutputs(projectGraph);

            AssertPredictionsMadeForEveryNode(projectGraph, graphPredictions);

            var expectedInputFiles = new[]
            {
                new PredictedItem(@"common\inputFile", "MockGraphPredictor", "MockGraphPredictor2", "MockPredictor", "MockPredictor2"),
            };
            var expectedInputDirectories = new[]
            {
                new PredictedItem(@"common\inputDirectory", "MockGraphPredictor", "MockGraphPredictor2", "MockPredictor", "MockPredictor2"),
            };
            var expectedOutputFiles = new[]
            {
                new PredictedItem(@"common\outputFile", "MockGraphPredictor", "MockGraphPredictor2", "MockPredictor", "MockPredictor2"),
            };
            var expectedOutputDirectories = new[]
            {
                new PredictedItem(@"common\outputDirectory", "MockGraphPredictor", "MockGraphPredictor2", "MockPredictor", "MockPredictor2"),
            };

            GetPredictionsForProject(graphPredictions, "a").AssertPredictions(
                _rootDir,
                expectedInputFiles,
                expectedInputDirectories,
                expectedOutputFiles,
                expectedOutputDirectories);
        }