File: ErrorWarningMessage_Tests.cs
Web Access
Project: ..\..\..\src\Tasks.UnitTests\Microsoft.Build.Tasks.UnitTests.csproj (Microsoft.Build.Tasks.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using Microsoft.Build.Shared;
using Microsoft.Build.Tasks;
using Xunit;
 
#nullable disable
 
namespace Microsoft.Build.UnitTests
{
    public sealed class ErrorWarningMessage_Tests
    {
        /// <summary>
        /// Simple case
        /// </summary>
        [Fact]
        public void Message()
        {
            MockEngine e = new MockEngine();
            Message m = new Message();
            m.BuildEngine = e;
 
            m.Text = "messagetext";
 
            bool retval = m.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.True(retval);
            Assert.NotEqual(-1, e.Log.IndexOf("messagetext"));
        }
 
        /// <summary>
        /// Multiple lines
        /// </summary>
        [Fact]
        public void MultilineMessage()
        {
            MockEngine e = new MockEngine();
            Message m = new Message();
            m.BuildEngine = e;
 
            m.Text = "messagetext\n  messagetext2  \n\nmessagetext3";
 
            bool retval = m.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.True(retval);
            Assert.NotEqual(-1, e.Log.IndexOf("messagetext\n  messagetext2  \n\nmessagetext3"));
        }
 
        /// <summary>
        /// Empty message should not log an event
        /// </summary>
        [Fact]
        public void EmptyMessage()
        {
            MockEngine e = new MockEngine();
            Message m = new Message();
            m.BuildEngine = e;
 
            // don't set text
 
            bool retval = m.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.True(retval);
            Assert.Equal(0, e.Messages);
        }
 
        /// <summary>
        /// Simple case
        /// </summary>
        [Fact]
        public void Warning()
        {
            MockEngine e = new MockEngine(true);
            Warning w = new Warning();
            w.BuildEngine = e;
 
            w.Text = "warningtext";
            w.File = "c:\\file";
 
            bool retval = w.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.True(retval);
            e.AssertLogContains("c:\\file(0,0): WARNING : warningtext");
            Assert.Equal(1, e.Warnings);
        }
 
        /// <summary>
        /// Empty warning SHOULD log an event
        /// </summary>
        [Fact]
        public void EmptyWarning()
        {
            MockEngine e = new MockEngine();
            Warning w = new Warning
            {
                BuildEngine = e
                // don't set text
            };
 
            bool retval = w.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.True(retval);
            Assert.Equal(1, e.Warnings);
            Assert.Contains(AssemblyResources.GetString("ErrorAndWarning.EmptyMessage"), e.Log);
        }
 
        /// <summary>
        /// Empty warning message but a code specified should still be logged
        /// </summary>
        [Fact]
        public void EmptyWarningMessageButCodeSpecified()
        {
            MockEngine e = new MockEngine();
            Warning w = new Warning
            {
                BuildEngine = e,
                Code = "123"
                // don't set text
            };
 
            bool retval = w.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.True(retval);
            Assert.Equal(1, e.Warnings);
            Assert.Contains(AssemblyResources.GetString("ErrorAndWarning.EmptyMessage"), e.Log);
        }
 
        /// <summary>
        /// Empty error SHOULD log an event
        /// </summary>
        [Fact]
        public void EmptyError()
        {
            MockEngine e = new MockEngine();
            Error err = new Error
            {
                BuildEngine = e
                // don't set text
            };
 
 
 
            bool retval = err.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.False(retval);
            Assert.Equal(1, e.Errors);
            Assert.Contains(AssemblyResources.GetString("ErrorAndWarning.EmptyMessage"), e.Log);
        }
 
        /// <summary>
        /// Empty error message but a code specified should still be logged
        /// </summary>
        [Fact]
        public void EmptyErrorMessageButCodeSpecified()
        {
            MockEngine e = new MockEngine();
            Error err = new Error
            {
                BuildEngine = e,
                Code = "999"
                // don't set text
            };
 
 
            bool retval = err.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.False(retval);
            Assert.Equal(1, e.Errors);
            Assert.Contains(AssemblyResources.GetString("ErrorAndWarning.EmptyMessage"), e.Log);
        }
 
        /// <summary>
        /// Simple case
        /// </summary>
        [Fact]
        public void Error()
        {
            MockEngine e = new MockEngine(true);
            Error err = new Error();
            err.BuildEngine = e;
 
            err.Text = "errortext";
            err.File = "c:\\file";
 
            bool retval = err.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.False(retval);
            e.AssertLogContains("c:\\file(0,0): ERROR : errortext");
            Assert.Equal(1, e.Errors);
        }
 
        /// <summary>
        /// Simple case for error message coming from a resource string
        /// </summary>
        [Fact]
        public void ErrorFromResources()
        {
            MockEngine e = new MockEngine(true);
            ErrorFromResources err = new ErrorFromResources();
            err.BuildEngine = e;
 
            err.Resource = "Exec.MissingCommandError";
 
            bool retval = err.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.False(retval);
 
            string message = AssemblyResources.GetString(err.Resource);
            e.AssertLogContains(message);
            Assert.Equal(1, e.Errors);
        }
 
        /// <summary>
        /// If a "Code" is passed to the task, use it to override the code
        /// (if any) defined in the error message.
        /// </summary>
        [Fact]
        public void ErrorFromResourcesWithOverriddenCode()
        {
            MockEngine e = new MockEngine(true);
            ErrorFromResources err = new ErrorFromResources();
            err.BuildEngine = e;
 
            err.Resource = "Exec.MissingCommandError";
            err.Code = "ABC1234";
 
            bool retval = err.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.False(retval);
 
            string message = AssemblyResources.GetString(err.Resource);
            string updatedMessage = message.Replace("MSB3072", "ABC1234");
            e.AssertLogContains(updatedMessage);
            Assert.Equal(1, e.Errors);
        }
 
        /// <summary>
        /// Simple case of logging a resource-based error that takes
        /// arguments
        /// </summary>
        [Fact]
        public void ErrorFromResourcesWithArguments()
        {
            MockEngine e = new MockEngine(true);
            ErrorFromResources err = new ErrorFromResources();
            err.BuildEngine = e;
 
            err.Resource = "Copy.Error";
            err.Arguments = new string[] { "a.txt", "b.txt", "xyz" };
 
            bool retval = err.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.False(retval);
 
            string message = String.Format(AssemblyResources.GetString(err.Resource), err.Arguments);
            e.AssertLogContains(message);
            Assert.Equal(1, e.Errors);
        }
 
        /// <summary>
        /// If invalid arguments are passed to the task, it should still
        /// log an error informing the user of that.
        /// </summary>
        [Fact]
        public void ErrorFromResourcesWithInvalidArguments()
        {
            MockEngine e = new MockEngine(true);
            ErrorFromResources err = new ErrorFromResources();
            err.BuildEngine = e;
 
            err.Resource = "Copy.Error";
            err.Arguments = new string[] { "a.txt", "b.txt" };
 
            bool retval = err.Execute();
 
            Console.WriteLine("===");
            Console.WriteLine(e.Log);
            Console.WriteLine("===");
 
            Assert.False(retval);
 
            e.AssertLogDoesntContain("a.txt");
            e.AssertLogContains("MSB3861");
            Assert.Equal(1, e.Errors);
        }
 
        /// <summary>
        /// If no resource string is passed to ErrorFromResources, we should error
        /// because a required parameter is missing.
        /// </summary>
        [Fact]
        public void ErrorFromResourcesNoResources()
        {
            string projectContents = @"
<Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`>
  <Target Name=`Build`>
    <ErrorFromResources />
  </Target>
</Project>
";
 
            MockLogger logger = ObjectModelHelpers.BuildProjectExpectFailure(projectContents);
 
            // missing required parameter
            logger.AssertLogContains("MSB4044");
        }
    }
}