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"), }); }
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"), }); }
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); }