public void SetUp() { LoggingServiceFactory loggingFactory = new LoggingServiceFactory(LoggerMode.Synchronous, 1); _loggingService = loggingFactory.CreateInstance(BuildComponentType.LoggingService) as LoggingService; _customLogger = new MyCustomLogger(); _mockHost = new MockHost(); _mockHost.LoggingService = _loggingService; _loggingService.RegisterLogger(_customLogger); _elementLocation = ElementLocation.Create("MockFile", 5, 5); BuildRequest buildRequest = new BuildRequest(1 /* submissionId */, 1, 1, new List<string>(), null, BuildEventContext.Invalid, null); BuildRequestConfiguration configuration = new BuildRequestConfiguration(1, new BuildRequestData("Nothing", new Dictionary<string, string>(), "4.0", new string[0], null), "2.0"); configuration.Project = new ProjectInstance(ProjectRootElement.Create()); BuildRequestEntry entry = new BuildRequestEntry(buildRequest, configuration); BuildResult buildResult = new BuildResult(buildRequest, false); buildResult.AddResultsForTarget("Build", new TargetResult(new TaskItem[] { new TaskItem("IamSuper", configuration.ProjectFullPath) }, TestUtilities.GetSkippedResult())); _mockRequestCallback = new MockIRequestBuilderCallback(new BuildResult[] { buildResult }); entry.Builder = (IRequestBuilder)_mockRequestCallback; _taskHost = new TaskHost(_mockHost, entry, _elementLocation, null /*Dont care about the callback either unless doing a build*/); _taskHost.LoggingContext = new TaskLoggingContext(_loggingService, BuildEventContext.Invalid); }
public void TestConstructorNullTarget() { ProjectInstance project = CreateTestProject(true /* Returns enabled */); BuildRequestConfiguration config = new BuildRequestConfiguration(1, new BuildRequestData("foo", new Dictionary<string, string>(), "foo", new string[0], null), "2.0"); BuildRequestEntry requestEntry = new BuildRequestEntry(CreateNewBuildRequest(1, new string[] { "foo" }), config); Lookup lookup = new Lookup(new ItemDictionary<ProjectItemInstance>(project.Items), new PropertyDictionary<ProjectPropertyInstance>(project.Properties), null); TargetEntry entry = new TargetEntry(requestEntry, this, null, lookup, null, _host, false); }
public void TestValidConfiguration() { BuildRequestData data = new BuildRequestData("file", new Dictionary<string, string>(), "toolsVersion", new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(1, data, "2.0"); ConfigurationMetadata metadata = new ConfigurationMetadata(config); Assert.AreEqual(data.ProjectFullPath, metadata.ProjectFullPath); Assert.AreEqual(data.ExplicitlySpecifiedToolsVersion, metadata.ToolsVersion); }
/// <summary> /// Initializes a build request. /// </summary> /// <param name="config">The configuration to use for the request.</param> /// <param name="targets">The set of targets to build.</param> /// <param name="resultsNeeded">Whether or not to wait for the results of this request.</param> public FullyQualifiedBuildRequest(BuildRequestConfiguration config, string[] targets, bool resultsNeeded) { ErrorUtilities.VerifyThrowArgumentNull(config, "config"); ErrorUtilities.VerifyThrowArgumentNull(targets, "targets"); _requestConfiguration = config; _targets = targets; _resultsNeeded = resultsNeeded; }
public void TestConstructorGood() { BuildRequest request = CreateNewBuildRequest(1, new string[0] { }); BuildRequestData data = new BuildRequestData("foo", new Dictionary<string, string>(), "foo", new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(1, data, "2.0"); BuildRequestEntry entry = new BuildRequestEntry(request, config); Assert.AreEqual(entry.State, BuildRequestEntryState.Ready); Assert.AreEqual(entry.Request, request); }
public void TestProperties() { BuildRequestData data = new BuildRequestData("foo", new Dictionary<string, string>(), "tools", new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(data, "2.0"); FullyQualifiedBuildRequest request = new FullyQualifiedBuildRequest(config, new string[1] { "foo" }, true); Assert.AreEqual(request.Config, config); Assert.AreEqual(request.Targets.Length, 1); Assert.AreEqual(request.Targets[0], "foo"); Assert.AreEqual(request.ResultsNeeded, true); }
public void TestConstructorInvalidConfigId() { Assert.Throws<InternalErrorException>(() => { BuildRequestData data = new BuildRequestData("file", new Dictionary<string, string>(), "toolsVersion", new string[0], null); BuildRequestConfiguration config1 = new BuildRequestConfiguration(1, data, "2.0"); BuildRequestConfiguration config2 = config1.ShallowCloneWithNewId(0); } ); }
public void TestGetHashCode() { BuildRequestConfiguration config1 = new BuildRequestConfiguration(new BuildRequestData("file", new Dictionary <string, string>(), "toolsVersion", new string[0], null), "2.0"); BuildRequestConfiguration config2 = new BuildRequestConfiguration(new BuildRequestData("File", new Dictionary <string, string>(), "ToolsVersion", new string[0], null), "2.0"); BuildRequestConfiguration config3 = new BuildRequestConfiguration(new BuildRequestData("file2", new Dictionary <string, string>(), "toolsVersion", new string[0], null), "2.0"); BuildRequestConfiguration config4 = new BuildRequestConfiguration(new BuildRequestData("file2", new Dictionary <string, string>(), "toolsVersion2", new string[0], null), "2.0"); BuildRequestConfiguration config5 = new BuildRequestConfiguration(new BuildRequestData("file", new Dictionary <string, string>(), "toolsVersion2", new string[0], null), "2.0"); Assert.Equal(config1.GetHashCode(), config2.GetHashCode()); Assert.NotEqual(config1.GetHashCode(), config3.GetHashCode()); Assert.NotEqual(config1.GetHashCode(), config5.GetHashCode()); Assert.NotEqual(config4.GetHashCode(), config5.GetHashCode()); }
public void TestSetProjectGood() { BuildRequestData data1 = new BuildRequestData("file", new Dictionary <string, string>(), "toolsVersion", new string[0], null); BuildRequestConfiguration config1 = new BuildRequestConfiguration(data1, "2.0"); Assert.Null(config1.Project); Project project = new Project(XmlReader.Create(new StringReader(ObjectModelHelpers.CleanupFileContents(@"<Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace' />")))); ProjectInstance projectInstance = project.CreateProjectInstance(); config1.Project = projectInstance; Assert.Same(config1.Project, projectInstance); }
public void TestProperties() { BuildRequestData data = new BuildRequestData("foo", new Dictionary <string, string>(), "tools", Array.Empty <string>(), null); BuildRequestConfiguration config = new BuildRequestConfiguration(data, "2.0"); FullyQualifiedBuildRequest request = new FullyQualifiedBuildRequest(config, new string[1] { "foo" }, true); Assert.Equal(request.Config, config); Assert.Single(request.Targets); Assert.Equal("foo", request.Targets[0]); Assert.True(request.ResultsNeeded); }
public void TestProperties() { BuildRequestData data = new BuildRequestData("foo", new Dictionary <string, string>(), "tools", new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(data, "2.0"); FullyQualifiedBuildRequest request = new FullyQualifiedBuildRequest(config, new string[1] { "foo" }, true); Assert.AreEqual(request.Config, config); Assert.AreEqual(request.Targets.Length, 1); Assert.AreEqual(request.Targets[0], "foo"); Assert.AreEqual(request.ResultsNeeded, true); }
/// <summary> /// Adds the specified configuration to the cache. /// </summary> /// <param name="config">The configuration to add.</param> public void AddConfiguration(BuildRequestConfiguration config) { ErrorUtilities.VerifyThrowArgumentNull(config, "config"); ErrorUtilities.VerifyThrow(config.ConfigurationId != 0, "Invalid configuration ID"); lock (_configurations) { int configId = GetKeyForConfiguration(config); ErrorUtilities.VerifyThrow(!_configurations.ContainsKey(configId), "Configuration {0} already cached", config.ConfigurationId); _configurations.Add(configId, config); _configurationIdsByMetadata.Add(new ConfigurationMetadata(config), configId); } }
/// <summary> /// Adds a new configuration to the configuration cache if one is not already there. /// Some times this method can be called twice specially when 2 request contains the same project /// where one is a request from the engine (building a reference) and 1 is a request from the test. /// If the configuration already exists in the cache then we will just use that. /// </summary> public BuildRequestConfiguration CreateConfiguration(RequestDefinition definition) { BuildRequestConfiguration unresolvedConfig = definition.UnresolvedConfiguration; BuildRequestConfiguration newConfig = this.configurationCache.GetMatchingConfiguration(unresolvedConfig); if (newConfig == null) { int newId = GetIdForUnresolvedConfiguration(unresolvedConfig); newConfig = new BuildRequestConfiguration(newId, new BuildRequestData(definition.FileName, definition.GlobalProperties.ToDictionary(), definition.ToolsVersion, new string[0], null), "2.0"); this.configurationCache.AddConfiguration(newConfig); newConfig.Project = definition.ProjectDefinition.GetMSBuildProjectInstance(); } return(newConfig); }
public BuildRequestConfiguration GetMatchingConfiguration(BuildRequestConfiguration config) { var overrideConfig = _override.GetMatchingConfiguration(config); if (overrideConfig != null) { #if DEBUG ErrorUtilities.VerifyThrow(CurrentCache.GetMatchingConfiguration(config) == null, "caches should not overlap"); #endif return(overrideConfig); } else { return(CurrentCache.GetMatchingConfiguration(config)); } }
public void TestNoReadyToComplete() { BuildRequest request = CreateNewBuildRequest(1, new string[1] { "foo" }); BuildRequestData data1 = new BuildRequestData("foo", new Dictionary <string, string>(), "foo", new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(1, data1, "2.0"); BuildRequestEntry entry = new BuildRequestEntry(request, config); Assert.AreEqual(entry.State, BuildRequestEntryState.Ready); BuildResult requiredResult = new BuildResult(request); requiredResult.AddResultsForTarget("foo", TestUtilities.GetEmptySucceedingTargetResult()); entry.Complete(requiredResult); }
public void TestRequestWithReferenceCancelled() { BuildRequestConfiguration configuration = CreateTestProject(1); try { TestTargetBuilder targetBuilder = (TestTargetBuilder)_host.GetComponent(BuildComponentType.TargetBuilder); IConfigCache configCache = (IConfigCache)_host.GetComponent(BuildComponentType.ConfigCache); FullyQualifiedBuildRequest[] newRequest = new FullyQualifiedBuildRequest[1] { new FullyQualifiedBuildRequest(configuration, new string[1] { "testTarget2" }, true) }; targetBuilder.SetNewBuildRequests(newRequest); configCache.AddConfiguration(configuration); BuildRequest request = CreateNewBuildRequest(1, new string[1] { "target1" }); BuildRequestEntry entry = new BuildRequestEntry(request, configuration); BuildResult result = new BuildResult(request); result.AddResultsForTarget("target1", GetEmptySuccessfulTargetResult()); targetBuilder.SetResultsToReturn(result); _requestBuilder.BuildRequest(GetNodeLoggingContext(), entry); WaitForEvent(_newBuildRequestsEvent, "New Build Requests"); Assert.Equal(_newBuildRequests_Entry, entry); ObjectModelHelpers.AssertArrayContentsMatch(_newBuildRequests_FQRequests, newRequest); BuildResult newResult = new BuildResult(_newBuildRequests_BuildRequests[0]); newResult.AddResultsForTarget("testTarget2", GetEmptySuccessfulTargetResult()); entry.ReportResult(newResult); _requestBuilder.ContinueRequest(); Thread.Sleep(500); _requestBuilder.CancelRequest(); WaitForEvent(_buildRequestCompletedEvent, "Build Request Completed"); Assert.Equal(BuildRequestEntryState.Complete, entry.State); Assert.Equal(entry, _buildRequestCompleted_Entry); Assert.Equal(BuildResultCode.Failure, _buildRequestCompleted_Entry.Result.OverallResult); } finally { DeleteTestProject(configuration); } }
public void TestSimpleStateProgression() { // Start in Ready BuildRequest request = CreateNewBuildRequest(1, new string[1] { "foo" }); BuildRequestConfiguration config = new BuildRequestConfiguration(1, new BuildRequestData("foo", new Dictionary<string, string>(), "foo", new string[0], null), "2.0"); BuildRequestEntry entry = new BuildRequestEntry(request, config); Assert.AreEqual(entry.State, BuildRequestEntryState.Ready); Assert.AreEqual(entry.Request, request); Assert.IsNull(entry.Result); // Move to active. Should not be any results yet. IDictionary<int, BuildResult> results = entry.Continue(); Assert.AreEqual(entry.State, BuildRequestEntryState.Active); Assert.IsNull(entry.Result); Assert.IsNull(results); // Wait for results, move to waiting. BuildRequest waitingRequest = CreateNewBuildRequest(2, new string[1] { "bar" }); entry.WaitForResult(waitingRequest); Assert.AreEqual(entry.State, BuildRequestEntryState.Waiting); Assert.AreEqual(entry.Request, request); Assert.IsNull(entry.Result); // Provide the results, move to ready. BuildResult requiredResult = new BuildResult(waitingRequest); requiredResult.AddResultsForTarget("bar", TestUtilities.GetEmptySucceedingTargetResult()); entry.ReportResult(requiredResult); Assert.AreEqual(entry.State, BuildRequestEntryState.Ready); Assert.AreEqual(entry.Request, request); Assert.IsNull(entry.Result); // Continue the build, move to active. results = entry.Continue(); Assert.AreEqual(entry.State, BuildRequestEntryState.Active); Assert.IsNull(entry.Result); Assert.AreEqual(results.Count, 1); Assert.IsTrue(results.ContainsKey(requiredResult.NodeRequestId)); Assert.AreEqual(results[requiredResult.NodeRequestId], requiredResult); // Complete the build, move to completed. BuildResult result = new BuildResult(request); result.AddResultsForTarget("foo", TestUtilities.GetEmptySucceedingTargetResult()); entry.Complete(result); Assert.AreEqual(entry.State, BuildRequestEntryState.Complete); Assert.IsNotNull(entry.Result); Assert.AreEqual(entry.Result, result); }
public void TestDefaultConfigurationId() { BuildRequestData data1 = new BuildRequestData("file", new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase), "toolsVersion", new string[0], null); BuildRequestConfiguration config1 = new BuildRequestConfiguration(-1, data1, "2.0"); Assert.Equal(-1, config1.ConfigurationId); BuildRequestData data2 = new BuildRequestData("file", new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase), "toolsVersion", new string[0], null); BuildRequestConfiguration config2 = new BuildRequestConfiguration(1, data2, "2.0"); Assert.Equal(1, config2.ConfigurationId); BuildRequestData data3 = new BuildRequestData("file", new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase), "toolsVersion", new string[0], null); BuildRequestConfiguration config3 = new BuildRequestConfiguration(0, data3, "2.0"); Assert.Equal(0, config3.ConfigurationId); }
public void TestWasGeneratedByNode() { BuildRequestData data1 = new BuildRequestData("file", new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase), "toolsVersion", new string[0], null); BuildRequestConfiguration config1 = new BuildRequestConfiguration(-1, data1, "2.0"); Assert.True(config1.WasGeneratedByNode); BuildRequestData data2 = new BuildRequestData("file", new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase), "toolsVersion", new string[0], null); BuildRequestConfiguration config2 = new BuildRequestConfiguration(1, data2, "2.0"); Assert.False(config2.WasGeneratedByNode); BuildRequestData data3 = new BuildRequestData("file", new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase), "toolsVersion", new string[0], null); BuildRequestConfiguration config3 = new BuildRequestConfiguration(data3, "2.0"); Assert.False(config3.WasGeneratedByNode); }
public void TestNoReadyToWaiting() { BuildRequest request = CreateNewBuildRequest(1, new string[1] { "foo" }); BuildRequestData data1 = new BuildRequestData("foo", new Dictionary <string, string>(), "foo", new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(1, data1, "2.0"); BuildRequestEntry entry = new BuildRequestEntry(request, config); Assert.AreEqual(entry.State, BuildRequestEntryState.Ready); BuildRequest waitingRequest1 = CreateNewBuildRequest(2, new string[1] { "bar" }); entry.WaitForResult(waitingRequest1); }
public void TestTranslationWithEntireProjectState() { string projectBody = ObjectModelHelpers.CleanupFileContents(@" <Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace'> <PropertyGroup> <One>1</One> <Two>2</Two> <Three>$(ThreeIn)</Three> </PropertyGroup> <Target Name='Build'> <CallTarget Targets='Foo'/> </Target> </Project>"); Dictionary <string, string> globalProperties = new (StringComparer.OrdinalIgnoreCase); globalProperties["ThreeIn"] = "3"; Project project = new Project( XmlReader.Create(new StringReader(projectBody)), globalProperties, ObjectModelHelpers.MSBuildDefaultToolsVersion, new ProjectCollection()); project.FullPath = "foo"; ProjectInstance instance = project.CreateProjectInstance(); instance.TranslateEntireState = true; BuildRequestConfiguration configuration = new BuildRequestConfiguration(new BuildRequestData(instance, new string[] { }, null), "2.0"); configuration.ConfigurationId = 1; ((ITranslatable)configuration).Translate(TranslationHelpers.GetWriteTranslator()); INodePacket packet = BuildRequestConfiguration.FactoryForDeserialization(TranslationHelpers.GetReadTranslator()); BuildRequestConfiguration deserializedConfig = packet as BuildRequestConfiguration; deserializedConfig.ShouldNotBeNull(); deserializedConfig.ShouldBe(configuration); deserializedConfig.Project.ShouldNotBeNull(); // Verify that at least some data from 'entire project state' has been deserialized. deserializedConfig.Project.Directory.ShouldNotBeEmpty(); deserializedConfig.Project.Directory.ShouldBe(configuration.Project.Directory); }
/// <summary> /// Given adefination find and return the key value associated with it which will also act as the config id. /// Sometimes we may have multiple definitions for the same project file name. So we want to make sure that we pick the correct one. /// </summary> private int GetIdForUnresolvedConfiguration(BuildRequestConfiguration config) { int id = -1; lock (this.definitions) { foreach (KeyValuePair <int, RequestDefinition> pair in this.definitions) { if (pair.Value.AreSameDefinitions(config)) { id = pair.Key; break; } } } return(id); }
public void TestNoReadyToComplete() { Assert.Throws <InternalErrorException>(() => { BuildRequest request = CreateNewBuildRequest(1, new string[1] { "foo" }); BuildRequestData data1 = new BuildRequestData("foo", new Dictionary <string, string>(), "foo", Array.Empty <string>(), null); BuildRequestConfiguration config = new BuildRequestConfiguration(1, data1, "2.0"); BuildRequestEntry entry = new BuildRequestEntry(request, config); Assert.Equal(BuildRequestEntryState.Ready, entry.State); BuildResult requiredResult = new BuildResult(request); requiredResult.AddResultsForTarget("foo", BuildResultUtilities.GetEmptySucceedingTargetResult()); entry.Complete(requiredResult); } ); }
public void TestMixedWaitingRequests() { BuildRequest request = CreateNewBuildRequest(1, new string[1] { "foo" }); BuildRequestConfiguration config = new BuildRequestConfiguration(1, new BuildRequestData("foo", new Dictionary <string, string>(), "foo", Array.Empty <string>(), null), "2.0"); BuildRequestEntry entry = new BuildRequestEntry(request, config); Assert.Equal(BuildRequestEntryState.Ready, entry.State); entry.Continue(); Assert.Equal(BuildRequestEntryState.Active, entry.State); BuildRequest waitingRequest1 = CreateNewBuildRequest(2, new string[1] { "bar" }); entry.WaitForResult(waitingRequest1); Assert.Equal(BuildRequestEntryState.Waiting, entry.State); BuildRequest waitingRequest2 = CreateNewBuildRequest(-1, new string[1] { "xor" }); entry.WaitForResult(waitingRequest2); Assert.Equal(BuildRequestEntryState.Waiting, entry.State); Assert.Null(entry.GetRequestsToIssueIfReady()); // "Entry should not be ready to issue because there are unresolved configurations" entry.ResolveConfigurationRequest(-1, 3); Assert.Equal(BuildRequestEntryState.Waiting, entry.State); BuildResult requiredResult1 = new BuildResult(waitingRequest1); requiredResult1.AddResultsForTarget("bar", BuildResultUtilities.GetEmptySucceedingTargetResult()); entry.ReportResult(requiredResult1); Assert.Equal(BuildRequestEntryState.Waiting, entry.State); BuildResult requiredResult2 = new BuildResult(waitingRequest2); requiredResult2.AddResultsForTarget("xor", BuildResultUtilities.GetEmptySucceedingTargetResult()); entry.ReportResult(requiredResult2); Assert.Equal(BuildRequestEntryState.Ready, entry.State); }
public void TestNoReadyToWaiting() { Assert.Throws <InternalErrorException>(() => { BuildRequest request = CreateNewBuildRequest(1, new string[1] { "foo" }); BuildRequestData data1 = new BuildRequestData("foo", new Dictionary <string, string>(), "foo", Array.Empty <string>(), null); BuildRequestConfiguration config = new BuildRequestConfiguration(1, data1, "2.0"); BuildRequestEntry entry = new BuildRequestEntry(request, config); Assert.Equal(BuildRequestEntryState.Ready, entry.State); BuildRequest waitingRequest1 = CreateNewBuildRequest(2, new string[1] { "bar" }); entry.WaitForResult(waitingRequest1); } ); }
private void NewBuildRequestsCallback(BuildRequestEntry entry, FullyQualifiedBuildRequest[] requests) { _newBuildRequests_FQRequests = requests; _newBuildRequests_BuildRequests = new BuildRequest[requests.Length]; _newBuildRequests_Entry = entry; int index = 0; foreach (FullyQualifiedBuildRequest request in requests) { IConfigCache configCache = (IConfigCache)_host.GetComponent(BuildComponentType.ConfigCache); BuildRequestConfiguration matchingConfig = configCache.GetMatchingConfiguration(request.Config); BuildRequest newRequest = CreateNewBuildRequest(matchingConfig.ConfigurationId, request.Targets); entry.WaitForResult(newRequest); _newBuildRequests_BuildRequests[index++] = newRequest; } _newBuildRequestsEvent.Set(); }
public void TestTranslation() { PropertyDictionary <ProjectPropertyInstance> properties = new PropertyDictionary <ProjectPropertyInstance>(); properties.Set(ProjectPropertyInstance.Create("this", "that")); properties.Set(ProjectPropertyInstance.Create("foo", "bar")); BuildRequestData data = new BuildRequestData("file", properties.ToDictionary(), "4.0", new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(data, "2.0"); Assert.Equal(NodePacketType.BuildRequestConfiguration, config.Type); ((ITranslatable)config).Translate(TranslationHelpers.GetWriteTranslator()); INodePacket packet = BuildRequestConfiguration.FactoryForDeserialization(TranslationHelpers.GetReadTranslator()); BuildRequestConfiguration deserializedConfig = packet as BuildRequestConfiguration; Assert.Equal(config, deserializedConfig); }
public void TestMissingProjectFile() { TestTargetBuilder targetBuilder = (TestTargetBuilder)_host.GetComponent(BuildComponentType.TargetBuilder); IConfigCache configCache = (IConfigCache)_host.GetComponent(BuildComponentType.ConfigCache); BuildRequestConfiguration configuration = new BuildRequestConfiguration(1, new BuildRequestData("testName", new Dictionary <string, string>(), "3.5", Array.Empty <string>(), null), "2.0"); configCache.AddConfiguration(configuration); BuildRequest request = CreateNewBuildRequest(1, new string[1] { "target1" }); BuildRequestEntry entry = new BuildRequestEntry(request, configuration); _requestBuilder.BuildRequest(GetNodeLoggingContext(), entry); WaitForEvent(_buildRequestCompletedEvent, "Build Request Completed"); Assert.Equal(BuildRequestEntryState.Complete, entry.State); Assert.Equal(entry, _buildRequestCompleted_Entry); Assert.Equal(BuildResultCode.Failure, _buildRequestCompleted_Entry.Result.OverallResult); Assert.Equal(typeof(InvalidProjectFileException), _buildRequestCompleted_Entry.Result.Exception.GetType()); }
private BuildRequestConfiguration CreateTestProject(int configId) { string projectFileContents = @" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`http://schemas.microsoft.com/developer/msbuild/2003`> <ItemGroup> <Compile Include=`b.cs` /> <Compile Include=`c.cs` /> </ItemGroup> <ItemGroup> <Reference Include=`System` /> </ItemGroup> <Target Name=`Build` /> </Project> "; string projectFile = GetTestProjectFile(configId); File.WriteAllText(projectFile, projectFileContents.Replace('`', '"')); string defaultToolsVersion = null; defaultToolsVersion = FrameworkLocationHelper.PathToDotNetFrameworkV20 == null ? ObjectModelHelpers.MSBuildDefaultToolsVersion : "2.0"; BuildRequestConfiguration config = new BuildRequestConfiguration( configId, new BuildRequestData( projectFile, new Dictionary <string, string>(), ObjectModelHelpers.MSBuildDefaultToolsVersion, new string[0], null), defaultToolsVersion); return(config); }
private void TestSkipIsolationConstraints(string glob, string referencePath, bool expectedOutput, string projectContents = null) { if (!NativeMethodsShared.IsWindows) { glob = glob.Replace(@"c:\", "/").ToSlash(); referencePath = referencePath.Replace(@"c:\", "/").ToSlash(); } glob = $"$([MSBuild]::Escape('{glob}'))"; projectContents ??= $@" <Project> <ItemGroup> <{ItemTypeNames.GraphIsolationExemptReference} Include=`{glob};ShouldNotMatchAnything`/> </ItemGroup> </Project> ".Cleanup(); var projectCollection = _env.CreateProjectCollection().Collection; var project = Project.FromXmlReader( XmlReader.Create(new StringReader(projectContents)), new ProjectOptions { ProjectCollection = projectCollection }); project.FullPath = _env.CreateFolder().Path; var projectInstance = project.CreateProjectInstance(); var configuration = new BuildRequestConfiguration(new BuildRequestData(projectInstance, new string[] {}), MSBuildConstants.CurrentToolsVersion); if (referencePath.Contains("$")) { referencePath = project.ExpandPropertyValueBestEffortLeaveEscaped(referencePath, ElementLocation.EmptyLocation); } configuration.ShouldSkipIsolationConstraintsForReference(referencePath).ShouldBe(expectedOutput); }
public void TestMultipleWaitingRequests() { BuildRequest request = CreateNewBuildRequest(1, new string[1] { "foo" }); BuildRequestData data1 = new BuildRequestData("foo", new Dictionary <string, string>(), "foo", Array.Empty <string>(), null); BuildRequestConfiguration config = new BuildRequestConfiguration(1, data1, "2.0"); BuildRequestEntry entry = new BuildRequestEntry(request, config); entry.Continue(); Assert.Equal(BuildRequestEntryState.Active, entry.State); BuildRequest waitingRequest1 = CreateNewBuildRequest(2, new string[1] { "bar" }); entry.WaitForResult(waitingRequest1); Assert.Equal(BuildRequestEntryState.Waiting, entry.State); BuildRequest waitingRequest2 = CreateNewBuildRequest(2, new string[1] { "xor" }); entry.WaitForResult(waitingRequest2); Assert.Equal(BuildRequestEntryState.Waiting, entry.State); BuildResult requiredResult1 = new BuildResult(waitingRequest1); requiredResult1.AddResultsForTarget("bar", BuildResultUtilities.GetEmptySucceedingTargetResult()); entry.ReportResult(requiredResult1); Assert.Equal(BuildRequestEntryState.Waiting, entry.State); BuildResult requiredResult2 = new BuildResult(waitingRequest2); requiredResult2.AddResultsForTarget("xor", BuildResultUtilities.GetEmptySucceedingTargetResult()); entry.ReportResult(requiredResult2); Assert.Equal(BuildRequestEntryState.Ready, entry.State); }
/// <summary> /// Logs the project started/finished pair for projects which are skipped entirely because all /// of their results are available in the cache. /// </summary> internal void LogRequestHandledFromCache(BuildRequest request, BuildRequestConfiguration configuration, BuildResult result) { ProjectLoggingContext projectLoggingContext = LogProjectStarted(request, configuration); // When pulling a request from the cache, we want to make sure we log a task skipped message for any targets which // were used to build the request including default and inital targets. foreach (string target in configuration.GetTargetsUsedToBuildRequest(request)) { projectLoggingContext.LogComment ( MessageImportance.Low, result[target].ResultCode == TargetResultCode.Failure ? "TargetAlreadyCompleteFailure" : "TargetAlreadyCompleteSuccess", target ); if (result[target].ResultCode == TargetResultCode.Failure) { break; } } projectLoggingContext.LogProjectFinished(result.OverallResult == BuildResultCode.Success); }
/// <summary> /// Logs the project started/finished pair for projects which are skipped entirely because all /// of their results are available in the cache. /// </summary> internal void LogRequestHandledFromCache(BuildRequest request, BuildRequestConfiguration configuration, BuildResult result) { ProjectLoggingContext projectLoggingContext = LogProjectStarted(request, configuration); // When pulling a request from the cache, we want to make sure we log a task skipped message for any targets which // were used to build the request including default and inital targets. foreach (string target in configuration.GetTargetsUsedToBuildRequest(request)) { projectLoggingContext.LogComment ( MessageImportance.Low, result[target].ResultCode == TargetResultCode.Failure ? "TargetAlreadyCompleteFailure" : "TargetAlreadyCompleteSuccess", target ); if (result[target].ResultCode == TargetResultCode.Failure) { break; } } projectLoggingContext.LogProjectFinished(result.OverallResult == BuildResultCode.Success); }
public void TestSimpleBuildScenario() { BuildRequestData data = new BuildRequestData("TestFile", new Dictionary <string, string>(), "TestToolsVersion", new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(1, data, "2.0"); _cache.AddConfiguration(config); string[] targets = new string[3] { "target1", "target2", "target3" }; BuildRequest request = CreateNewBuildRequest(1, targets); VerifyEngineStatus(BuildRequestEngineStatus.Uninitialized); _engine.InitializeForBuild(new NodeLoggingContext(_host.LoggingService, 0, false)); _engine.SubmitBuildRequest(request); Thread.Sleep(250); VerifyEngineStatus(BuildRequestEngineStatus.Active); WaitForEvent(_requestCompleteEvent, "RequestComplete"); Assert.Equal(request, _requestComplete_Request); Assert.Equal(BuildResultCode.Success, _requestComplete_Result.OverallResult); VerifyEngineStatus(BuildRequestEngineStatus.Idle); }
public void TestEquals() { BuildRequestData data = new BuildRequestData("file", new Dictionary <string, string>(), ObjectModelHelpers.MSBuildDefaultToolsVersion, new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(1, data, ObjectModelHelpers.MSBuildDefaultToolsVersion); Project project = CreateProject(); ConfigurationMetadata metadata1 = new ConfigurationMetadata(config); ConfigurationMetadata metadata2 = new ConfigurationMetadata(project); Assert.True(metadata1.Equals(metadata2)); data = new BuildRequestData("file2", new Dictionary <string, string>(), ObjectModelHelpers.MSBuildDefaultToolsVersion, new string[0], null); BuildRequestConfiguration config2 = new BuildRequestConfiguration(1, data, ObjectModelHelpers.MSBuildDefaultToolsVersion); ConfigurationMetadata metadata3 = new ConfigurationMetadata(config2); Assert.False(metadata1.Equals(metadata3)); data = new BuildRequestData("file", new Dictionary <string, string>(), "3.0", new string[0], null); BuildRequestConfiguration config3 = new BuildRequestConfiguration(1, data, "3.0"); ConfigurationMetadata metadata4 = new ConfigurationMetadata(config3); Assert.False(metadata1.Equals(metadata4)); }
public void TestResultsWithNoMatch1() { BuildRequest request = CreateNewBuildRequest(1, new string[1] { "foo" }); BuildRequestConfiguration config = new BuildRequestConfiguration(1, new BuildRequestData("foo", new Dictionary<string, string>(), "foo", new string[0], null), "2.0"); BuildRequestEntry entry = new BuildRequestEntry(request, config); Assert.AreEqual(entry.State, BuildRequestEntryState.Ready); entry.Continue(); Assert.AreEqual(entry.State, BuildRequestEntryState.Active); BuildRequest waitingRequest1 = CreateNewBuildRequest(2, new string[1] { "bar" }); entry.WaitForResult(waitingRequest1); Assert.AreEqual(entry.State, BuildRequestEntryState.Waiting); BuildRequest randomRequest = CreateNewBuildRequest(3, new string[0]); BuildResult requiredResult = new BuildResult(randomRequest); requiredResult.AddResultsForTarget("bar", TestUtilities.GetEmptySucceedingTargetResult()); entry.ReportResult(requiredResult); Assert.AreEqual(entry.State, BuildRequestEntryState.Waiting); }
public void TestNoReadyToComplete() { BuildRequest request = CreateNewBuildRequest(1, new string[1] { "foo" }); BuildRequestData data1 = new BuildRequestData("foo", new Dictionary<string, string>(), "foo", new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(1, data1, "2.0"); BuildRequestEntry entry = new BuildRequestEntry(request, config); Assert.AreEqual(entry.State, BuildRequestEntryState.Ready); BuildResult requiredResult = new BuildResult(request); requiredResult.AddResultsForTarget("foo", TestUtilities.GetEmptySucceedingTargetResult()); entry.Complete(requiredResult); }
public void TestNoReadyToWaiting() { BuildRequest request = CreateNewBuildRequest(1, new string[1] { "foo" }); BuildRequestData data1 = new BuildRequestData("foo", new Dictionary<string, string>(), "foo", new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(1, data1, "2.0"); BuildRequestEntry entry = new BuildRequestEntry(request, config); Assert.AreEqual(entry.State, BuildRequestEntryState.Ready); BuildRequest waitingRequest1 = CreateNewBuildRequest(2, new string[1] { "bar" }); entry.WaitForResult(waitingRequest1); }
public void TestMixedWaitingRequests() { BuildRequest request = CreateNewBuildRequest(1, new string[1] { "foo" }); BuildRequestConfiguration config = new BuildRequestConfiguration(1, new BuildRequestData("foo", new Dictionary<string, string>(), "foo", new string[0], null), "2.0"); BuildRequestEntry entry = new BuildRequestEntry(request, config); Assert.AreEqual(entry.State, BuildRequestEntryState.Ready); entry.Continue(); Assert.AreEqual(entry.State, BuildRequestEntryState.Active); BuildRequest waitingRequest1 = CreateNewBuildRequest(2, new string[1] { "bar" }); entry.WaitForResult(waitingRequest1); Assert.AreEqual(entry.State, BuildRequestEntryState.Waiting); BuildRequest waitingRequest2 = CreateNewBuildRequest(-1, new string[1] { "xor" }); entry.WaitForResult(waitingRequest2); Assert.AreEqual(entry.State, BuildRequestEntryState.Waiting); Assert.IsNull(entry.GetRequestsToIssueIfReady(), "Entry should not be ready to issue because there are unresolved configurations"); entry.ResolveConfigurationRequest(-1, 3); Assert.AreEqual(entry.State, BuildRequestEntryState.Waiting); BuildResult requiredResult1 = new BuildResult(waitingRequest1); requiredResult1.AddResultsForTarget("bar", TestUtilities.GetEmptySucceedingTargetResult()); entry.ReportResult(requiredResult1); Assert.AreEqual(entry.State, BuildRequestEntryState.Waiting); BuildResult requiredResult2 = new BuildResult(waitingRequest2); requiredResult2.AddResultsForTarget("xor", TestUtilities.GetEmptySucceedingTargetResult()); entry.ReportResult(requiredResult2); Assert.AreEqual(entry.State, BuildRequestEntryState.Ready); }
public void TestTranslation() { PropertyDictionary<ProjectPropertyInstance> properties = new PropertyDictionary<ProjectPropertyInstance>(); properties.Set(ProjectPropertyInstance.Create("this", "that")); properties.Set(ProjectPropertyInstance.Create("foo", "bar")); BuildRequestData data = new BuildRequestData("file", properties.ToDictionary(), "4.0", new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(data, "2.0"); Assert.Equal(NodePacketType.BuildRequestConfiguration, config.Type); ((INodePacketTranslatable)config).Translate(TranslationHelpers.GetWriteTranslator()); INodePacket packet = BuildRequestConfiguration.FactoryForDeserialization(TranslationHelpers.GetReadTranslator()); BuildRequestConfiguration deserializedConfig = packet as BuildRequestConfiguration; Assert.Equal(config, deserializedConfig); }
/// <summary> /// Callback for event raised when a new configuration needs an ID resolved. /// </summary> /// <param name="config">The configuration needing an ID</param> private void Engine_NewConfigurationRequest(BuildRequestConfiguration config) { _newConfiguration_Config = config; _newConfigurationEvent.Set(); }
/// <summary> /// Creates a test project. /// </summary> /// <returns>The project.</returns> private ProjectInstance CreateTestProject() { string projectFileContents = ObjectModelHelpers.CleanupFileContents(@" <Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace'> <ItemGroup> <Compile Include='b.cs' /> <Compile Include='c.cs' /> </ItemGroup> <ItemGroup> <Reference Include='System' /> </ItemGroup> <Target Name='Empty' /> <Target Name='Skip' Inputs='testProject.proj' Outputs='testProject.proj' /> <Target Name='Error' > <ErrorTask1 ContinueOnError='True'/> <ErrorTask2 ContinueOnError='False'/> <ErrorTask3 /> <OnError ExecuteTargets='Foo'/> <OnError ExecuteTargets='Bar'/> </Target> <Target Name='Foo' Inputs='foo.cpp' Outputs='foo.o'> <FooTask1/> </Target> <Target Name='Bar'> <BarTask1/> </Target> <Target Name='Baz' DependsOnTargets='Bar'> <BazTask1/> <BazTask2/> </Target> <Target Name='Baz2' DependsOnTargets='Bar;Foo'> <Baz2Task1/> <Baz2Task2/> <Baz2Task3/> </Target> <Target Name='DepSkip' DependsOnTargets='Skip'> <DepSkipTask1/> <DepSkipTask2/> <DepSkipTask3/> </Target> <Target Name='DepError' DependsOnTargets='Foo;Skip;Error'> <DepSkipTask1/> <DepSkipTask2/> <DepSkipTask3/> </Target> </Project> "); IConfigCache cache = (IConfigCache)_host.GetComponent(BuildComponentType.ConfigCache); BuildRequestConfiguration config = new BuildRequestConfiguration(1, new BuildRequestData("testfile", new Dictionary<string, string>(), "3.5", new string[0], null), "2.0"); Project project = new Project(XmlReader.Create(new StringReader(projectFileContents))); config.Project = project.CreateProjectInstance(); cache.AddConfiguration(config); return config.Project; }
public void TestGetHashCode() { BuildRequestConfiguration config1 = new BuildRequestConfiguration(new BuildRequestData("file", new Dictionary<string, string>(), "toolsVersion", new string[0], null), "2.0"); BuildRequestConfiguration config2 = new BuildRequestConfiguration(new BuildRequestData("File", new Dictionary<string, string>(), "ToolsVersion", new string[0], null), "2.0"); BuildRequestConfiguration config3 = new BuildRequestConfiguration(new BuildRequestData("file2", new Dictionary<string, string>(), "toolsVersion", new string[0], null), "2.0"); BuildRequestConfiguration config4 = new BuildRequestConfiguration(new BuildRequestData("file2", new Dictionary<string, string>(), "toolsVersion2", new string[0], null), "2.0"); BuildRequestConfiguration config5 = new BuildRequestConfiguration(new BuildRequestData("file", new Dictionary<string, string>(), "toolsVersion2", new string[0], null), "2.0"); Assert.Equal(config1.GetHashCode(), config2.GetHashCode()); Assert.NotEqual(config1.GetHashCode(), config3.GetHashCode()); Assert.NotEqual(config1.GetHashCode(), config5.GetHashCode()); Assert.NotEqual(config4.GetHashCode(), config5.GetHashCode()); }
public void TestCache2() { string projectBody = ObjectModelHelpers.CleanupFileContents(@" <Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace'> <PropertyGroup> <One>1</One> <Two>2</Two> <Three>$(ThreeIn)</Three> </PropertyGroup> <ItemGroup> <Foo Include=""*""/> <Bar Include=""msbuild.out""> <One>1</One> </Bar> <Baz Include=""$(BazIn)""/> </ItemGroup> <Target Name='Build'> <CallTarget Targets='Foo;Bar'/> </Target> <Target Name='Foo' DependsOnTargets='Foo'> <FooTarget/> </Target> <Target Name='Bar'> <BarTarget/> </Target> <Target Name='Foo'> <FooTarget/> </Target> </Project>"); Dictionary <string, string> globalProperties = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); globalProperties["ThreeIn"] = "3"; globalProperties["BazIn"] = "bazfile"; Project project = new Project(XmlReader.Create(new StringReader(projectBody)), globalProperties, ObjectModelHelpers.MSBuildDefaultToolsVersion, new ProjectCollection()); project.FullPath = "foo"; ProjectInstance instance = project.CreateProjectInstance(); BuildRequestConfiguration configuration = new BuildRequestConfiguration(new BuildRequestData(instance, new string[] { }, null), "2.0"); string originalTmp = Environment.GetEnvironmentVariable("TMP"); string originalTemp = Environment.GetEnvironmentVariable("TEMP"); try { string problematicTmpPath = @"C:\Users\}\blabla\temp"; Environment.SetEnvironmentVariable("TMP", problematicTmpPath); Environment.SetEnvironmentVariable("TEMP", problematicTmpPath); FileUtilities.ClearCacheDirectoryPath(); string cacheFilePath = configuration.GetCacheFile(); Assert.StartsWith(problematicTmpPath, cacheFilePath); } finally { Environment.SetEnvironmentVariable("TMP", originalTmp); Environment.SetEnvironmentVariable("TEMP", originalTemp); FileUtilities.ClearCacheDirectoryPath(); } }
public void TestCache() { string projectBody = ObjectModelHelpers.CleanupFileContents(@" <Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace'> <PropertyGroup> <One>1</One> <Two>2</Two> <Three>$(ThreeIn)</Three> </PropertyGroup> <ItemGroup> <Foo Include=""*""/> <Bar Include=""msbuild.out""> <One>1</One> </Bar> <Baz Include=""$(BazIn)""/> </ItemGroup> <Target Name='Build'> <CallTarget Targets='Foo;Goo'/> </Target> <Target Name='Foo' DependsOnTargets='Foo2'> <FooTarget/> </Target> <Target Name='Goo'> <GooTarget/> </Target> <Target Name='Foo2'> <Foo2Target/> </Target> </Project>"); Dictionary <string, string> globalProperties = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); globalProperties["ThreeIn"] = "3"; globalProperties["BazIn"] = "bazfile"; Project project = new Project( XmlReader.Create(new StringReader(projectBody)), globalProperties, ObjectModelHelpers.MSBuildDefaultToolsVersion, new ProjectCollection()); project.FullPath = "foo"; ProjectInstance instance = project.CreateProjectInstance(); BuildRequestConfiguration configuration = new BuildRequestConfiguration(new BuildRequestData(instance, new string[] { }, null), "2.0"); configuration.ConfigurationId = 1; string originalValue = Environment.GetEnvironmentVariable("MSBUILDCACHE"); try { Environment.SetEnvironmentVariable("MSBUILDCACHE", "1"); Assert.Equal("3", instance.GlobalProperties["ThreeIn"]); Assert.Equal("bazfile", instance.GlobalProperties["BazIn"]); Assert.Equal("1", instance.PropertiesToBuildWith["One"].EvaluatedValue); Assert.Equal("2", instance.PropertiesToBuildWith["Two"].EvaluatedValue); Assert.Equal("3", instance.PropertiesToBuildWith["Three"].EvaluatedValue); int fooCount = instance.ItemsToBuildWith["Foo"].Count; Assert.True(fooCount > 0); Assert.Single(instance.ItemsToBuildWith["Bar"]); Assert.Single(instance.ItemsToBuildWith["Baz"]); Assert.Equal("bazfile", instance.ItemsToBuildWith["Baz"].First().EvaluatedInclude); Lookup lookup = configuration.BaseLookup; Assert.NotNull(lookup); Assert.Equal(fooCount, lookup.GetItems("Foo").Count); // Configuration initialized with a ProjectInstance should not be cacheable by default. Assert.False(configuration.IsCacheable); configuration.IsCacheable = true; configuration.CacheIfPossible(); Assert.Null(instance.GlobalPropertiesDictionary); Assert.Null(instance.ItemsToBuildWith); Assert.Null(instance.PropertiesToBuildWith); configuration.RetrieveFromCache(); Assert.Equal("3", instance.GlobalProperties["ThreeIn"]); Assert.Equal("bazfile", instance.GlobalProperties["BazIn"]); Assert.Equal("1", instance.PropertiesToBuildWith["One"].EvaluatedValue); Assert.Equal("2", instance.PropertiesToBuildWith["Two"].EvaluatedValue); Assert.Equal("3", instance.PropertiesToBuildWith["Three"].EvaluatedValue); Assert.Equal(fooCount, instance.ItemsToBuildWith["Foo"].Count); Assert.Single(instance.ItemsToBuildWith["Bar"]); Assert.Single(instance.ItemsToBuildWith["Baz"]); Assert.Equal("bazfile", instance.ItemsToBuildWith["Baz"].First().EvaluatedInclude); lookup = configuration.BaseLookup; Assert.NotNull(lookup); Assert.Equal(fooCount, lookup.GetItems("Foo").Count); } finally { configuration.ClearCacheFile(); Environment.SetEnvironmentVariable("MSBUILDCACHE", originalValue); } }
public void TestCache() { string projectBody = ObjectModelHelpers.CleanupFileContents(@" <Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace'> <PropertyGroup> <One>1</One> <Two>2</Two> <Three>$(ThreeIn)</Three> </PropertyGroup> <ItemGroup> <Foo Include=""*""/> <Bar Include=""msbuild.out""> <One>1</One> </Bar> <Baz Include=""$(BazIn)""/> </ItemGroup> <Target Name='Build'> <CallTarget Targets='Foo;Goo'/> </Target> <Target Name='Foo' DependsOnTargets='Foo2'> <FooTarget/> </Target> <Target Name='Goo'> <GooTarget/> </Target> <Target Name='Foo2'> <Foo2Target/> </Target> </Project>"); Dictionary<string, string> globalProperties = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); globalProperties["ThreeIn"] = "3"; globalProperties["BazIn"] = "bazfile"; Project project = new Project(XmlReader.Create(new StringReader(projectBody)), globalProperties, "4.0", new ProjectCollection()); project.FullPath = "foo"; ProjectInstance instance = project.CreateProjectInstance(); BuildRequestConfiguration configuration = new BuildRequestConfiguration(new BuildRequestData(instance, new string[] { }, null), "2.0"); configuration.ConfigurationId = 1; string originalValue = Environment.GetEnvironmentVariable("MSBUILDCACHE"); try { Environment.SetEnvironmentVariable("MSBUILDCACHE", "1"); Assert.Equal("3", instance.GlobalProperties["ThreeIn"]); Assert.Equal("bazfile", instance.GlobalProperties["BazIn"]); Assert.Equal("1", instance.PropertiesToBuildWith["One"].EvaluatedValue); Assert.Equal("2", instance.PropertiesToBuildWith["Two"].EvaluatedValue); Assert.Equal("3", instance.PropertiesToBuildWith["Three"].EvaluatedValue); int fooCount = instance.ItemsToBuildWith["Foo"].Count; Assert.True(fooCount > 0); Assert.Equal(1, instance.ItemsToBuildWith["Bar"].Count); Assert.Equal(1, instance.ItemsToBuildWith["Baz"].Count); Assert.Equal("bazfile", instance.ItemsToBuildWith["Baz"].First().EvaluatedInclude); Lookup lookup = configuration.BaseLookup; Assert.NotNull(lookup); Assert.Equal(fooCount, lookup.GetItems("Foo").Count); // Configuration initialized with a ProjectInstance should not be cacheable by default. Assert.False(configuration.IsCacheable); configuration.IsCacheable = true; configuration.CacheIfPossible(); Assert.Null(instance.GlobalPropertiesDictionary); Assert.Null(instance.ItemsToBuildWith); Assert.Null(instance.PropertiesToBuildWith); configuration.RetrieveFromCache(); Assert.Equal("3", instance.GlobalProperties["ThreeIn"]); Assert.Equal("bazfile", instance.GlobalProperties["BazIn"]); Assert.Equal("1", instance.PropertiesToBuildWith["One"].EvaluatedValue); Assert.Equal("2", instance.PropertiesToBuildWith["Two"].EvaluatedValue); Assert.Equal("3", instance.PropertiesToBuildWith["Three"].EvaluatedValue); Assert.Equal(fooCount, instance.ItemsToBuildWith["Foo"].Count); Assert.Equal(1, instance.ItemsToBuildWith["Bar"].Count); Assert.Equal(1, instance.ItemsToBuildWith["Baz"].Count); Assert.Equal("bazfile", instance.ItemsToBuildWith["Baz"].First().EvaluatedInclude); lookup = configuration.BaseLookup; Assert.NotNull(lookup); Assert.Equal(fooCount, lookup.GetItems("Foo").Count); } finally { configuration.ClearCacheFile(); Environment.SetEnvironmentVariable("MSBUILDCACHE", originalValue); } }
public void TestEquals() { BuildRequestConfiguration config1 = new BuildRequestConfiguration(new BuildRequestData("file", new Dictionary<string, string>(), "toolsVersion", new string[0], null), "2.0"); Assert.Equal(config1, config1); BuildRequestConfiguration config2 = new BuildRequestConfiguration(new BuildRequestData("file", new Dictionary<string, string>(), "toolsVersion", new string[0], null), "2.0"); Assert.Equal(config1, config2); BuildRequestConfiguration config3 = new BuildRequestConfiguration(new BuildRequestData("file2", new Dictionary<string, string>(), "toolsVersion", new string[0], null), "2.0"); Assert.NotEqual(config1, config3); BuildRequestConfiguration config4 = new BuildRequestConfiguration(new BuildRequestData("file", new Dictionary<string, string>(), "toolsVersion2", new string[0], null), "2.0"); Assert.NotEqual(config1, config4); PropertyDictionary<ProjectPropertyInstance> props = new PropertyDictionary<ProjectPropertyInstance>(); props.Set(ProjectPropertyInstance.Create("prop1", "value1")); BuildRequestData data = new BuildRequestData("file", props.ToDictionary(), "toolsVersion", new string[0], null); BuildRequestConfiguration config5 = new BuildRequestConfiguration(data, "2.0"); Assert.NotEqual(config1, config5); Assert.Equal(config1, config2); Assert.NotEqual(config1, config3); }
public void TestMissingProjectFile() { TestTargetBuilder targetBuilder = (TestTargetBuilder)_host.GetComponent(BuildComponentType.TargetBuilder); IConfigCache configCache = (IConfigCache)_host.GetComponent(BuildComponentType.ConfigCache); BuildRequestConfiguration configuration = new BuildRequestConfiguration(1, new BuildRequestData("testName", new Dictionary<string, string>(), "3.5", new string[0], null), "2.0"); configCache.AddConfiguration(configuration); BuildRequest request = CreateNewBuildRequest(1, new string[1] { "target1" }); BuildRequestEntry entry = new BuildRequestEntry(request, configuration); _requestBuilder.BuildRequest(GetNodeLoggingContext(), entry); WaitForEvent(_buildRequestCompletedEvent, "Build Request Completed"); Assert.Equal(BuildRequestEntryState.Complete, entry.State); Assert.Equal(entry, _buildRequestCompleted_Entry); Assert.Equal(BuildResultCode.Failure, _buildRequestCompleted_Entry.Result.OverallResult); Assert.Equal(typeof(InvalidProjectFileException), _buildRequestCompleted_Entry.Result.Exception.GetType()); }
/// <summary> /// Creates a build request entry from a build request. /// </summary> /// <param name="request">The originating build request.</param> /// <param name="requestConfiguration">The build request configuration.</param> internal BuildRequestEntry(BuildRequest request, BuildRequestConfiguration requestConfiguration) { ErrorUtilities.VerifyThrowArgumentNull(request, "request"); ErrorUtilities.VerifyThrowArgumentNull(requestConfiguration, "requestConfiguration"); ErrorUtilities.VerifyThrow(requestConfiguration.ConfigurationId == request.ConfigurationId, "Configuration id mismatch"); _dataMonitor = new Object(); _request = request; _requestConfiguration = requestConfiguration; _blockingGlobalRequestId = BuildRequest.InvalidGlobalRequestId; _completedResult = null; ChangeState(BuildRequestEntryState.Ready); }
public void TestWasGeneratedByNode() { BuildRequestData data1 = new BuildRequestData("file", new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase), "toolsVersion", new string[0], null); BuildRequestConfiguration config1 = new BuildRequestConfiguration(-1, data1, "2.0"); Assert.True(config1.WasGeneratedByNode); BuildRequestData data2 = new BuildRequestData("file", new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase), "toolsVersion", new string[0], null); BuildRequestConfiguration config2 = new BuildRequestConfiguration(1, data2, "2.0"); Assert.False(config2.WasGeneratedByNode); BuildRequestData data3 = new BuildRequestData("file", new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase), "toolsVersion", new string[0], null); BuildRequestConfiguration config3 = new BuildRequestConfiguration(data3, "2.0"); Assert.False(config3.WasGeneratedByNode); }
public void TestBuildWithNewConfiguration() { BuildRequestData data = new BuildRequestData(Path.GetFullPath("TestFile"), new Dictionary <string, string>(), "TestToolsVersion", new string[0], null); BuildRequestConfiguration config = new BuildRequestConfiguration(1, data, "2.0"); _cache.AddConfiguration(config); // Configure the builder to spawn build requests MockRequestBuilder builder = (MockRequestBuilder)_host.GetComponent(BuildComponentType.RequestBuilder); BuildRequestData data2 = new BuildRequestData(Path.GetFullPath("OtherFile"), new Dictionary <string, string>(), "TestToolsVersion", new string[0], null); BuildRequestConfiguration unresolvedConfig = new BuildRequestConfiguration(data2, "2.0"); builder.NewRequests.Add(new FullyQualifiedBuildRequest[1] { new FullyQualifiedBuildRequest(unresolvedConfig, new string[1] { "requiredTarget1" }, true) }); // Create the initial build request string[] targets = new string[3] { "target1", "target2", "target3" }; BuildRequest request = CreateNewBuildRequest(1, targets); // Kick it off VerifyEngineStatus(BuildRequestEngineStatus.Uninitialized); _engine.InitializeForBuild(new NodeLoggingContext(_host.LoggingService, 0, false)); _engine.SubmitBuildRequest(request); Thread.Sleep(250); VerifyEngineStatus(BuildRequestEngineStatus.Active); // Wait for the request to generate the child request with the unresolved configuration WaitForEvent(_newConfigurationEvent, "NewConfigurationEvent"); Assert.Equal(Path.GetFullPath("OtherFile"), _newConfiguration_Config.ProjectFullPath); Assert.Equal("TestToolsVersion", _newConfiguration_Config.ToolsVersion); Assert.True(_newConfiguration_Config.WasGeneratedByNode); Thread.Sleep(250); VerifyEngineStatus(BuildRequestEngineStatus.Waiting); // Resolve the configuration BuildRequestConfigurationResponse response = new BuildRequestConfigurationResponse(_newConfiguration_Config.ConfigurationId, 2, 0); _engine.ReportConfigurationResponse(response); // Now wait for the actual requests to be issued. WaitForEvent(_newRequestEvent, "NewRequestEvent"); Assert.Equal(2, _newRequest_Request.BuildRequests[0].ConfigurationId); Assert.Equal(2, _newRequest_Request.BuildRequests[0].ConfigurationId); Assert.Single(_newRequest_Request.BuildRequests[0].Targets); Assert.Equal("requiredTarget1", _newRequest_Request.BuildRequests[0].Targets[0]); // Report a result to satisfy the build request BuildResult result = new BuildResult(_newRequest_Request.BuildRequests[0]); result.AddResultsForTarget("requiredTarget1", BuildResultUtilities.GetEmptySucceedingTargetResult()); _engine.UnblockBuildRequest(new BuildRequestUnblocker(result)); // Continue the request _engine.UnblockBuildRequest(new BuildRequestUnblocker(request.GlobalRequestId)); // Wait for the original request to complete WaitForEvent(_requestCompleteEvent, "RequestComplete"); Assert.Equal(request, _requestComplete_Request); Assert.Equal(BuildResultCode.Success, _requestComplete_Result.OverallResult); Thread.Sleep(250); VerifyEngineStatus(BuildRequestEngineStatus.Idle); }
private void HandleBuildRequestConfiguration(BuildRequestConfiguration configuration) { _globalConfigCache.AddConfiguration(configuration); }
public void TestPacketType() { BuildRequestData data1 = new BuildRequestData("file", new Dictionary<string, string>(), "toolsVersion", new string[0], null); BuildRequestConfiguration config1 = new BuildRequestConfiguration(data1, "2.0"); Assert.Equal(config1.Type, NodePacketType.BuildRequestConfiguration); }
public void TestProperties() { BuildRequestConfiguration configuration = new BuildRequestConfiguration(new BuildRequestData("path", new Dictionary<string, string>(), "2.0", new string[] { }, null), "2.0"); Assert.True(configuration.IsCacheable); Assert.False(configuration.IsLoaded); Assert.False(configuration.IsCached); Assert.False(configuration.IsActivelyBuilding); }
/// <summary> /// Creates a test project. /// </summary> private ProjectInstance CreateTestProject(string projectBodyContents, string initialTargets, string defaultTargets) { string projectFileContents = String.Format("<Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='http://schemas.microsoft.com/developer/msbuild/2003' InitialTargets='{0}' DefaultTargets='{1}'>{2}</Project>", initialTargets, defaultTargets, projectBodyContents); // retries to deal with occasional locking issues where the file can't be written to initially for (int retries = 0; retries < 5; retries++) { try { File.Create("testProject.proj").Close(); break; } catch (Exception ex) { if (retries < 4) { Console.WriteLine(ex.ToString()); } else { // All the retries have failed. We will now fail with the // actual problem now instead of with some more difficult-to-understand // issue later. throw; } } } IConfigCache cache = (IConfigCache)_host.GetComponent(BuildComponentType.ConfigCache); BuildRequestConfiguration config = new BuildRequestConfiguration(1, new BuildRequestData("testFile", new Dictionary<string, string>(), "3.5", new string[0], null), "2.0"); Project project = new Project(XmlReader.Create(new StringReader(projectFileContents))); config.Project = project.CreateProjectInstance(); cache.AddConfiguration(config); return config.Project; }
/// <summary> /// Creates a configuration and stores it in the cache. /// </summary> private void CreateConfiguration(int configId, string file) { BuildRequestData data = new BuildRequestData(file, new Dictionary<string, string>(), "4.0", new string[] { }, null); BuildRequestConfiguration config = new BuildRequestConfiguration(configId, data, "4.0"); config.ProjectInitialTargets = new List<string>(); config.ProjectDefaultTargets = new List<string>(); (_host.GetComponent(BuildComponentType.ConfigCache) as IConfigCache).AddConfiguration(config); }
private BuildRequestConfiguration CreateTestProject(int configId) { string projectFileContents = @" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`http://schemas.microsoft.com/developer/msbuild/2003`> <ItemGroup> <Compile Include=`b.cs` /> <Compile Include=`c.cs` /> </ItemGroup> <ItemGroup> <Reference Include=`System` /> </ItemGroup> <Target Name=`Build` /> </Project> "; string projectFile = GetTestProjectFile(configId); File.WriteAllText(projectFile, projectFileContents.Replace('`', '"')); string defaultToolsVersion = null; if (FrameworkLocationHelper.PathToDotNetFrameworkV20 == null) { defaultToolsVersion = "4.0"; } else { defaultToolsVersion = "2.0"; } BuildRequestConfiguration config = new BuildRequestConfiguration(configId, new BuildRequestData(projectFile, new Dictionary<string, string>(), "4.0", new string[0], null), defaultToolsVersion); return config; }
public void TestCache2() { string projectBody = ObjectModelHelpers.CleanupFileContents(@" <Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace'> <PropertyGroup> <One>1</One> <Two>2</Two> <Three>$(ThreeIn)</Three> </PropertyGroup> <ItemGroup> <Foo Include=""*""/> <Bar Include=""msbuild.out""> <One>1</One> </Bar> <Baz Include=""$(BazIn)""/> </ItemGroup> <Target Name='Build'> <CallTarget Targets='Foo;Bar'/> </Target> <Target Name='Foo' DependsOnTargets='Foo'> <FooTarget/> </Target> <Target Name='Bar'> <BarTarget/> </Target> <Target Name='Foo'> <FooTarget/> </Target> </Project>"); Dictionary<string, string> globalProperties = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); globalProperties["ThreeIn"] = "3"; globalProperties["BazIn"] = "bazfile"; Project project = new Project(XmlReader.Create(new StringReader(projectBody)), globalProperties, "4.0", new ProjectCollection()); project.FullPath = "foo"; ProjectInstance instance = project.CreateProjectInstance(); BuildRequestConfiguration configuration = new BuildRequestConfiguration(new BuildRequestData(instance, new string[] { }, null), "2.0"); string originalTmp = Environment.GetEnvironmentVariable("TMP"); string originalTemp = Environment.GetEnvironmentVariable("TEMP"); try { string problematicTmpPath = @"C:\Users\}\blabla\temp"; Environment.SetEnvironmentVariable("TMP", problematicTmpPath); Environment.SetEnvironmentVariable("TEMP", problematicTmpPath); FileUtilities.ClearCacheDirectoryPath(); string cacheFilePath = configuration.GetCacheFile(); Assert.True(cacheFilePath.StartsWith(problematicTmpPath, StringComparison.OrdinalIgnoreCase)); } finally { Environment.SetEnvironmentVariable("TMP", originalTmp); Environment.SetEnvironmentVariable("TEMP", originalTemp); FileUtilities.ClearCacheDirectoryPath(); } }
/// <summary> /// Informs the entry that it has configurations which need to be resolved. /// </summary> /// <param name="configuration">The configuration to be resolved.</param> public void WaitForConfiguration(BuildRequestConfiguration configuration) { ErrorUtilities.VerifyThrow(configuration.WasGeneratedByNode, "Configuration has already been resolved."); _unresolvedConfigurationsToIssue = _unresolvedConfigurationsToIssue ?? new List<BuildRequestConfiguration>(); _unresolvedConfigurationsToIssue.Add(configuration); }
private void DeleteTestProject(BuildRequestConfiguration config) { string fileName = GetTestProjectFile(config.ConfigurationId); if (File.Exists(fileName)) { File.Delete(fileName); } }