Beispiel #1
0
        /// <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();
        }
Beispiel #2
0
        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!");
                }
            }
        }
Beispiel #3
0
        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();
            }
        }
Beispiel #4
0
        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();
                }
            }
        }
Beispiel #5
0
        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();
                }
            }
        }
Beispiel #6
0
        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();
        }
Beispiel #7
0
        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();
            }
        }
Beispiel #8
0
        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();
        }
Beispiel #9
0
        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();
            }
        }
Beispiel #10
0
        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();
            }
        }
Beispiel #11
0
 /// <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();
 }
Beispiel #12
0
 public void SetChangeWave(string wave)
 {
     ChangeWaves.ResetStateForTests();
     SetEnvironmentVariable("MSBUILDDISABLEFEATURESFROMVERSION", wave);
 }