public void CachingWrapperShouldOnlyResolveOnce() { var sdk = new SdkReference("foo", "1.0.0", null); var resolver = new SdkUtilities.ConfigurableMockSdkResolver( new SdkResultImpl( sdk, "path", "1.0.0", Enumerable.Empty <string>() )); var service = new CachingSdkResolverService(); service.InitializeForTests( null, new List <SdkResolver> { resolver }); // Resolve the SDK 10 times in parallel Parallel.For( 0, 10, _ => service.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath", interactive: false, isRunningInVisualStudio: false)); var result = resolver.ResolvedCalls.ShouldHaveSingleItem(); result.Key.ShouldBe(sdk.Name); // The SDK resolver keeps track of the number of times it was called which should be 1 result.Value.ShouldBe(1, $"The SDK resolver should have only been called once but was called {result.Value} times"); }
public ProjectEvaluationContext_Tests() { _env = TestEnvironment.Create(); _resolver = new SdkUtilities.ConfigurableMockSdkResolver( new Dictionary <string, SdkResult> { { "foo", new SdkResult(new SdkReference("foo", "1.0.0", null), "path", "1.0.0", null) }, { "bar", new SdkResult(new SdkReference("bar", "1.0.0", null), "path", "1.0.0", null) } }); }
public void SdkResultCanReturnMultiplePaths(bool includePropertiesAndItems) { string expectedPath1 = "First/Path/To/Return/From/Resolver"; string expectedPath2 = "Second/Path/To/Return/From/Resolver"; var sdk = new SdkReference("foo", "1.0", null); Dictionary <string, string> propertiesToAdd = null; Dictionary <string, SdkResultItem> itemsToAdd = null; if (includePropertiesAndItems) { CreateMockSdkResultPropertiesAndItems(out propertiesToAdd, out itemsToAdd); } var resolver = new SdkUtilities.ConfigurableMockSdkResolver( new SdkResultImpl( sdk, new [] { expectedPath1, expectedPath2 }, version: "1.0", propertiesToAdd, itemsToAdd, warnings: null )); SdkResolverService.Instance.InitializeForTests(null, new List <SdkResolver>() { resolver }); var result = SdkResolverService.Instance.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath", interactive: false, isRunningInVisualStudio: false); result.Success.ShouldBeTrue(); var resultPaths = new List <string>(); resultPaths.Add(result.Path); resultPaths.AddRange(result.AdditionalPaths); resultPaths.ShouldBeSameIgnoringOrder(new[] { expectedPath1, expectedPath2 }); ValidateExpectedPropertiesAndItems(includePropertiesAndItems, result); _logger.WarningCount.ShouldBe(0); }
public void AssertResolutionWarnsIfResolvedVersionIsDifferentFromReferencedVersionWithMultipleReturnPaths() { var expectedPath1 = "First/Path/To/Return/From/Resolver"; var expectedPath2 = "Second/Path/To/Return/From/Resolver"; var sdk = new SdkReference("foo", "1.0", null); Dictionary <string, string> propertiesToAdd = null; Dictionary <string, SdkResultItem> itemsToAdd = null; CreateMockSdkResultPropertiesAndItems(out propertiesToAdd, out itemsToAdd); var resolver = new SdkUtilities.ConfigurableMockSdkResolver( new SdkResultImpl( sdk, new[] { expectedPath1, expectedPath2 }, version: "1.1", propertiesToAdd, itemsToAdd, warnings: null )); SdkResolverService.Instance.InitializeForTests(null, new List <SdkResolver>() { resolver }); var result = SdkResolverService.Instance.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath", interactive: false); result.Success.ShouldBeTrue(); var resultPaths = new List <string>(); resultPaths.Add(result.Path); resultPaths.AddRange(result.AdditionalPaths); resultPaths.ShouldBeSameIgnoringOrder(new[] { expectedPath1, expectedPath2 }); ValidateExpectedPropertiesAndItems(true, result); _logger.WarningCount.ShouldBe(1); _logger.Warnings.First().Code.ShouldStartWith("MSB4241"); }
public void SdkResolverCanReturnNoPaths(bool includePropertiesAndItems) { var sdk = new SdkReference("foo", null, null); Dictionary <string, string> propertiesToAdd = null; Dictionary <string, SdkResultItem> itemsToAdd = null; if (includePropertiesAndItems) { CreateMockSdkResultPropertiesAndItems(out propertiesToAdd, out itemsToAdd); } var resolver = new SdkUtilities.ConfigurableMockSdkResolver( new SdkResultImpl( sdk, Enumerable.Empty <string>(), version: null, propertiesToAdd, itemsToAdd, warnings: null )); SdkResolverService.Instance.InitializeForTests(null, new List <SdkResolver>() { resolver }); var result = SdkResolverService.Instance.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath", interactive: false, isRunningInVisualStudio: false); result.Success.ShouldBeTrue(); result.Path.ShouldBeNull(); result.Version.ShouldBeNull(); result.AdditionalPaths.ShouldBeNull(); ValidateExpectedPropertiesAndItems(includePropertiesAndItems, result); _logger.WarningCount.ShouldBe(0); }
public void SdkResultCanReturnPropertiesAndItems() { string expectedPath = "Path/To/Return/From/Resolver"; var sdk = new SdkReference("foo", null, null); Dictionary <string, string> propertiesToAdd; Dictionary <string, SdkResultItem> itemsToAdd; CreateMockSdkResultPropertiesAndItems(out propertiesToAdd, out itemsToAdd); var resolver = new SdkUtilities.ConfigurableMockSdkResolver( new SdkResultImpl( sdk, new[] { expectedPath }, version: "1.0", propertiesToAdd, itemsToAdd, warnings: null )); SdkResolverService.Instance.InitializeForTests(null, new List <SdkResolver>() { resolver }); var result = SdkResolverService.Instance.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath", interactive: false, isRunningInVisualStudio: false); result.Success.ShouldBeTrue(); result.Path.ShouldBe(expectedPath); result.Version.ShouldBe("1.0"); result.AdditionalPaths.ShouldBeNull(); ValidateExpectedPropertiesAndItems(true, result); _logger.WarningCount.ShouldBe(0); }
public void CachingWrapperShouldWarnWhenMultipleVersionsAreReferenced() { var sdk = new SdkReference("foo", "1.0.0", null); var resolver = new SdkUtilities.ConfigurableMockSdkResolver( new SdkResultImpl( sdk, "path", "1.0.0", Enumerable.Empty <string>() )); var service = new CachingSdkResolverService(); service.InitializeForTests( null, new List <SdkResolver> { resolver }); var result = service.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath", interactive: false, isRunningInVisualStudio: false); resolver.ResolvedCalls.Count.ShouldBe(1); result.Path.ShouldBe("path"); result.Version.ShouldBe("1.0.0"); _logger.WarningCount.ShouldBe(0); result = service.ResolveSdk(BuildEventContext.InvalidSubmissionId, new SdkReference("foo", "2.0.0", null), _loggingContext, new MockElementLocation("file"), "sln", "projectPath", interactive: false, isRunningInVisualStudio: false); resolver.ResolvedCalls.Count.ShouldBe(1); result.Path.ShouldBe("path"); result.Version.ShouldBe("1.0.0"); _logger.WarningCount.ShouldBe(1); _logger.Warnings.First().Code.ShouldBe("MSB4240"); resolver.ResolvedCalls.First().Key.ShouldBe("foo"); resolver.ResolvedCalls.Count.ShouldBe(1); }
private SdkResolver SetupSdkResolver(string projectFolder) { Directory.CreateDirectory(Path.Combine(projectFolder, "Sdk1")); Directory.CreateDirectory(Path.Combine(projectFolder, "Sdk2")); string sdk1propsContents = @" <Project> <ItemGroup> <SdksImported Include='Sdk1' /> </ItemGroup> </Project>"; string sdk2propsContents = @" <Project> <ItemGroup> <SdksImported Include='Sdk2' /> </ItemGroup> </Project>"; File.WriteAllText(Path.Combine(projectFolder, "Sdk1", "Sdk.props"), CleanupFileContents(sdk1propsContents)); File.WriteAllText(Path.Combine(projectFolder, "Sdk2", "Sdk.props"), CleanupFileContents(sdk2propsContents)); var sdkResolver = new SdkUtilities.ConfigurableMockSdkResolver( new Build.BackEnd.SdkResolution.SdkResult( new SdkReference("TestSdk", null, null), new[] { Path.Combine(projectFolder, "Sdk1"), Path.Combine(projectFolder, "Sdk2") }, version: null, propertiesToAdd: new Dictionary <string, string>() { { "PropertyNameFromResolver", "PropertyValueFromResolver" } }, itemsToAdd: new Dictionary <string, SdkResultItem>() { { "ItemFromResolver", new SdkResultItem("ItemValueFromResolver", null) } }, warnings: null )); EvaluationContext.TestOnlyHookOnCreate = context => { var sdkService = (SdkResolverService)context.SdkResolverService; sdkService.InitializeForTests(null, new List <SdkResolver> { sdkResolver }); }; ((IBuildComponentHost)_buildManager).RegisterFactory(BuildComponentType.SdkResolverService, type => { var resolverService = new MainNodeSdkResolverService(); resolverService.InitializeForTests(null, new List <SdkResolver> { sdkResolver }); return(resolverService); }); return(sdkResolver); }