/// <summary> /// Helper function to build a simple project based on a particular change wave being set. /// Call SetChangeWave on your TestEnvironment before calling this function. /// </summary> /// <param name="testEnvironment">The TestEnvironment being used for this test.</param> /// <param name="versionToCheckAgainstCurrentChangeWave">The version to compare to the current set Change Wave.</param> /// <param name="currentChangeWaveShouldUltimatelyResolveTo">What the project property for the environment variable MSBuildDisableFeaturesFromVersion ultimately resolves to.</param> /// <param name="warningCodesLogShouldContain">An array of warning codes that should exist in the resulting log. Ex: "MSB4271".</param> private void buildSimpleProjectAndValidateChangeWave(TestEnvironment testEnvironment, Version versionToCheckAgainstCurrentChangeWave, Version currentChangeWaveShouldUltimatelyResolveTo, params string[] warningCodesLogShouldContain) { bool isThisWaveEnabled = versionToCheckAgainstCurrentChangeWave < currentChangeWaveShouldUltimatelyResolveTo || currentChangeWaveShouldUltimatelyResolveTo == ChangeWaves.EnableAllFeatures; ChangeWaves.AreFeaturesEnabled(versionToCheckAgainstCurrentChangeWave).ShouldBe(isThisWaveEnabled); string projectFile = $"" + $"<Project>" + $"<Target Name='HelloWorld' Condition=\"$([MSBuild]::AreFeaturesEnabled('{versionToCheckAgainstCurrentChangeWave}')) and '$(MSBUILDDISABLEFEATURESFROMVERSION)' == '{currentChangeWaveShouldUltimatelyResolveTo}'\">" + $"<Message Text='Hello World!'/>" + $"</Target>" + $"</Project>"; TransientTestFile file = testEnvironment.CreateFile("proj.csproj", projectFile); ProjectCollection collection = new ProjectCollection(); MockLogger log = new MockLogger(_output); collection.RegisterLogger(log); Project p = collection.LoadProject(file.Path); p.Build().ShouldBeTrue(); log.FullLog.Contains("Hello World!").ShouldBe(isThisWaveEnabled); if (warningCodesLogShouldContain != null) { log.WarningCount.ShouldBe(warningCodesLogShouldContain.Length); log.AssertLogContains(warningCodesLogShouldContain); } ChangeWaves.ResetStateForTests(); }
public void VersionTooHighClampsToHighestVersionInRotation(string disableFromWave) { using (TestEnvironment env = TestEnvironment.Create()) { env.SetChangeWave(disableFromWave); BuildEnvironmentHelper.ResetInstance_ForUnitTestsOnly(); // all waves but the highest should pass for (int i = 0; i < ChangeWaves.AllWaves.Length - 1; i++) { ChangeWaves.ResetStateForTests(); string projectFile = $"" + $"<Project>" + $"<Target Name='HelloWorld' Condition=\"'$(MSBUILDDISABLEFEATURESFROMVERSION)' == '{ChangeWaves.HighestWave}' and $([MSBuild]::AreFeaturesEnabled('{ChangeWaves.AllWaves[i]}'))\">" + $"<Message Text='Hello World!'/>" + $"</Target>" + $"</Project>"; TransientTestFile file = env.CreateFile("proj.csproj", projectFile); ProjectCollection collection = new ProjectCollection(); MockLogger log = new MockLogger(); collection.RegisterLogger(log); Project p = collection.LoadProject(file.Path); p.Build().ShouldBeTrue(); BuildEnvironmentHelper.ResetInstance_ForUnitTestsOnly(); log.WarningCount.ShouldBe(1); log.AssertLogContains("out of rotation"); log.AssertLogContains("Hello World!"); } } }
public void NoChangeWaveSetMeansAllChangeWavesAreEnabled(string featureWave) { using (TestEnvironment env = TestEnvironment.Create()) { ChangeWaves.ResetStateForTests(); ChangeWaves.AreFeaturesEnabled(featureWave).ShouldBe(true); string projectFile = $"" + $"<Project>" + $"<Target Name='HelloWorld' Condition=\"'$(MSBUILDDISABLEFEATURESFROMVERSION)' == '{ChangeWaves.EnableAllFeatures}' and $([MSBuild]::AreFeaturesEnabled('{featureWave}'))\">" + $"<Message Text='Hello World!'/>" + $"</Target>" + $"</Project>"; TransientTestFile file = env.CreateFile("proj.csproj", projectFile); ProjectCollection collection = new ProjectCollection(); MockLogger log = new MockLogger(); collection.RegisterLogger(log); collection.LoadProject(file.Path).Build().ShouldBeTrue(); log.AssertLogContains("Hello World!"); BuildEnvironmentHelper.ResetInstance_ForUnitTestsOnly(); } }
private static void VerifyDriveEnumerationWarningLoggedUponCreateItemExecution(string itemSpec) { using (var env = TestEnvironment.Create()) { Helpers.ResetStateForDriveEnumeratingWildcardTests(env, "0"); try { MockEngine engine = new MockEngine(); CreateItem t = new CreateItem() { BuildEngine = engine, Include = new ITaskItem[] { new TaskItem(itemSpec) }, }; t.Execute().ShouldBeTrue(); engine.Warnings.ShouldBe(1); engine.AssertLogContains("MSB5029"); } finally { ChangeWaves.ResetStateForTests(); } } }
public void WildcardDriveEnumerationTaskItemLogsError(string itemSpec) { using (var env = TestEnvironment.Create()) { Helpers.ResetStateForDriveEnumeratingWildcardTests(env, "1"); try { MockEngine engine = new MockEngine(); CreateItem t = new CreateItem() { BuildEngine = engine, Include = new ITaskItem[] { new TaskItem(itemSpec) }, }; t.Execute().ShouldBeFalse(); engine.Errors.ShouldBe(1); engine.AssertLogContains("MSB5029"); } finally { ChangeWaves.ResetStateForTests(); } } }
public void TargetPathAlreadySet_DisabledUnderChangeWave16_10(string targetPath) { using TestEnvironment env = TestEnvironment.Create(); string link = "c:/some/path"; ChangeWaves.ResetStateForTests(); env.SetEnvironmentVariable("MSBUILDDISABLEFEATURESFROMVERSION", ChangeWaves.Wave16_10.ToString()); BuildEnvironmentHelper.ResetInstance_ForUnitTestsOnly(); AssignTargetPath t = new AssignTargetPath(); t.BuildEngine = new MockEngine(); Dictionary <string, string> metaData = new Dictionary <string, string>(); metaData.Add("TargetPath", targetPath); metaData.Add("Link", link); t.Files = new ITaskItem[] { new TaskItem( itemSpec: NativeMethodsShared.IsWindows ? @"c:\f1\f2\file.txt" : "/f1/f2/file.txt", itemMetadata: metaData) }; t.RootFolder = NativeMethodsShared.IsWindows ? @"c:\f1\f2" : "/f1/f2"; t.Execute().ShouldBeTrue(); t.AssignedFiles.Length.ShouldBe(1); t.AssignedFiles[0].GetMetadata("TargetPath").ShouldBe(link); ChangeWaves.ResetStateForTests(); }
public void EndToEndMultilineExec_EscapeSpecialCharacters_DisabledUnderChangeWave16_10() { using (var env = TestEnvironment.Create(_output)) { ChangeWaves.ResetStateForTests(); env.SetEnvironmentVariable("MSBUILDDISABLEFEATURESFROMVERSION", ChangeWaves.Wave16_10.ToString()); BuildEnvironmentHelper.ResetInstance_ForUnitTestsOnly(); var testProject = env.CreateTestProjectWithFiles(@"<Project> <Target Name=""ExecCommand""> <Exec Command=""echo Hello, World!"" /> </Target> </Project>"); // Ensure path has subfolders var newTempPath = env.CreateNewTempPathWithSubfolder("hello()wo(rld)").TempPath; string tempPath = Path.GetTempPath(); Assert.StartsWith(newTempPath, tempPath); using (var buildManager = new BuildManager()) { MockLogger logger = new MockLogger(_output, profileEvaluation: false, printEventsToStdout: false); var parameters = new BuildParameters() { Loggers = new[] { logger }, }; var collection = new ProjectCollection( new Dictionary <string, string>(), new[] { logger }, remoteLoggers: null, ToolsetDefinitionLocations.Default, maxNodeCount: 1, onlyLogCriticalEvents: false, loadProjectsReadOnly: true); var project = collection.LoadProject(testProject.ProjectFile).CreateProjectInstance(); var request = new BuildRequestData( project, targetsToBuild: new[] { "ExecCommand" }, hostServices: null); var result = buildManager.Build(parameters, request); logger.AssertLogContains("Hello, World!"); result.OverallResult.ShouldBe(BuildResultCode.Failure); } ChangeWaves.ResetStateForTests(); } }
public void SpacePropertyOptOutWave16_10() { using TestEnvironment env = TestEnvironment.Create(); ChangeWaves.ResetStateForTests(); env.SetEnvironmentVariable("MSBUILDDISABLEFEATURESFROMVERSION", ChangeWaves.Wave16_10.ToString()); BuildEnvironmentHelper.ResetInstance_ForUnitTestsOnly(); Scanner lexer = new Scanner("$(x )", ParserOptions.AllowProperties); AdvanceToScannerError(lexer); Assert.Null(lexer.UnexpectedlyFound); lexer = new Scanner("$( x)", ParserOptions.AllowProperties); AdvanceToScannerError(lexer); Assert.Null(lexer.UnexpectedlyFound); ChangeWaves.ResetStateForTests(); }
public void EscapeSpecifiedCharactersInPathToGeneratedBatchFile_DisabledUnderChangeWave16_10() { using (var testEnvironment = TestEnvironment.Create()) { ChangeWaves.ResetStateForTests(); testEnvironment.SetEnvironmentVariable("MSBUILDDISABLEFEATURESFROMVERSION", ChangeWaves.Wave16_10.ToString()); BuildEnvironmentHelper.ResetInstance_ForUnitTestsOnly(); var newTempPath = testEnvironment.CreateNewTempPathWithSubfolder("hello()w]o(rld)").TempPath; string tempPath = Path.GetTempPath(); Assert.StartsWith(newTempPath, tempPath); // Now run the Exec task on a simple command. Exec exec = PrepareExec("echo Hello World!"); exec.Execute().ShouldBeFalse(); ChangeWaves.ResetStateForTests(); } }
public void AssertFirstResolverWithPatternCantResolveChangeWave17_4() { using (TestEnvironment env = TestEnvironment.Create()) { ChangeWaves.ResetStateForTests(); env.SetEnvironmentVariable("MSBUILDDISABLEFEATURESFROMVERSION", ChangeWaves.Wave17_4.ToString()); BuildEnvironmentHelper.ResetInstance_ForUnitTestsOnly(); SdkResolverService.Instance.InitializeForTests(new MockLoaderStrategy(includeResolversWithPatterns: true)); SdkReference sdk = new SdkReference("1sdkName", "referencedVersion", "minimumVersion"); var result = SdkResolverService.Instance.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath", interactive: false, isRunningInVisualStudio: false); result.Path.ShouldBe("resolverpath1"); _logger.BuildMessageEvents.Select(i => i.Message).ShouldContain("MockSdkResolver1 running"); _logger.BuildMessageEvents.Select(i => i.Message).ShouldNotContain("MockSdkResolverWithResolvableSdkPattern1 running"); ChangeWaves.ResetStateForTests(); } }
/// <summary> /// Performs necessary operations for setting the MSBuildDisableFeaturesFromVersion environment variable. /// This is required because Change Waves is static and stale values can be seen between tests in the same assembly. /// </summary> /// <param name="wave">The version to set as the current Change Wave.</param> private void SetChangeWave(string wave, TestEnvironment env) { ChangeWaves.ResetStateForTests(); env.SetEnvironmentVariable("MSBUILDDISABLEFEATURESFROMVERSION", wave); BuildEnvironmentHelper.ResetInstance_ForUnitTestsOnly(); }
public void SetChangeWave(string wave) { ChangeWaves.ResetStateForTests(); SetEnvironmentVariable("MSBUILDDISABLEFEATURESFROMVERSION", wave); }