File: Microsoft.NetCore.Analyzers\Security\SetViewStateUserKeyTests.cs
Web Access
Project: ..\..\..\src\Microsoft.CodeAnalysis.NetAnalyzers\tests\Microsoft.CodeAnalysis.NetAnalyzers.UnitTests\Microsoft.CodeAnalysis.NetAnalyzers.UnitTests.csproj (Microsoft.CodeAnalysis.NetAnalyzers.UnitTests)
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the MIT license.  See License.txt in the project root for license information.
 
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Testing;
using Test.Utilities;
using Xunit;
using VerifyCS = Test.Utilities.CSharpSecurityCodeFixVerifier<
    Microsoft.NetCore.Analyzers.Security.SetViewStateUserKey,
    Microsoft.CodeAnalysis.Testing.EmptyCodeFixProvider>;
using VerifyVB = Test.Utilities.VisualBasicSecurityCodeFixVerifier<
    Microsoft.NetCore.Analyzers.Security.SetViewStateUserKey,
    Microsoft.CodeAnalysis.Testing.EmptyCodeFixProvider>;
 
namespace Microsoft.NetCore.Analyzers.Security.UnitTests
{
    public class SetViewStateUserKeyTests
    {
        [Fact]
        public async Task TestSubclassWithoutOnInitMethodDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    protected void TestMethod (EventArgs e)
    {
        ViewStateUserKey = ""ViewStateUserKey"";
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
 
            await VerifyBasicAnalyzerAsync(@"
Imports System
Imports System.Web.UI
 
class TestClass
    Inherits Page
    protected Sub TestMethod (ByVal e As EventArgs)
        ViewStateUserKey = ""ViewStateUserKey""
    End Sub
End Class",
            GetBasicResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestOverrideModifierWithoutSettingViewStateUserKeyDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    protected override void OnInit (EventArgs e)
    {
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
 
            await VerifyBasicAnalyzerAsync(@"
Imports System
Imports System.Web.UI
 
class TestClass
    Inherits Page
    protected Sub OnInit (ByVal e As EventArgs)
    End Sub
End Class",
            GetBasicResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestNewModifierWithoutSettingViewStateUserKeyDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    protected new void OnInit (EventArgs e)
    {
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestNoModifierWithoutSettingViewStateUserKeyDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    protected void OnInit (EventArgs e)
    {
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestOverloadOnInitWithSettingViewStateUserKeyDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    protected internal void OnInit ()
    {
        ViewStateUserKey = ""ViewStateUserKey"";
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestStaticMethodWithSettingViewStateUserKeyDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    protected static void OnInit (EventArgs e)
    {
        var testClass = new TestClass();
        testClass.ViewStateUserKey = ""ViewStateUserKey"";
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestSubclassWithSettingPropertyOfLocalObjectDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    protected override void OnInit (EventArgs e)
    {
        var testClass = new TestClass();
        testClass.ViewStateUserKey = ""ViewStateUserKey"";
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestSubclassWithSettingPropertyOfWrongClassDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class MyType
{
    public string ViewStateUserKey { get; set; }
}
 
class TestClass : Page
{
    private MyType _field;
 
    protected override void OnInit (EventArgs e)
    {
        _field.ViewStateUserKey = ""ViewStateUserKey"";
    }
}",
            GetCSharpResultAt(10, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestSubclassWithSettingWrongPropertyDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    public int ViewStateUserKey { get; set; }
 
    protected override void OnInit (EventArgs e)
    {
        ViewStateUserKey = 123;
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestSettingPropertyOfLocalObjectInPage_InitDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    private void Page_Init (object sender, EventArgs e)
    {
        var testClass = new TestClass();
        testClass.ViewStateUserKey = ""ViewStateUserKey"";
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TesthSettingPropertyOfWrongClassInPage_InitDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class MyType
{
    public string ViewStateUserKey { get; set; }
}
 
class TestClass : Page
{
    private MyType _field;
 
    private void Page_Init (object sender, EventArgs e)
    {
        _field.ViewStateUserKey = ""ViewStateUserKey"";
    }
}",
            GetCSharpResultAt(10, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestWithSettingWrongPropertyInPage_InitDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    public int ViewStateUserKey { get; set; }
 
    private void Page_Init (object sender, EventArgs e)
    {
        ViewStateUserKey = 123;
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestInPage_InitWithObjectParameterDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    private void Page_Init (EventArgs e)
    {
        ViewStateUserKey = ""ViewStateUserKey"";
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestInPage_InitWithStringReturnTypeDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    private string Page_Init (EventArgs e)
    {
        ViewStateUserKey = ""ViewStateUserKey"";
        return ViewStateUserKey;
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestNeitherOnInitNorInPage_InitNoDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    protected override void OnInit (EventArgs e)
    {
    }
 
    private void Page_Init (object sender, EventArgs e)
    {
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestNewPageDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    public new System.Web.UI.Page Page { get; set; }
 
    private void Page_Init (object sender, EventArgs e)
    {
        Page.ViewStateUserKey = ""ViewStateUserKey"";
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestOverridePageDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    public override System.Web.UI.Page Page { get; set; }
 
    private void Page_Init (object sender, EventArgs e)
    {
        Page.ViewStateUserKey = ""ViewStateUserKey"";
    }
}",
            GetCSharpResultAt(5, 7, "TestClass"));
        }
 
        [Fact]
        public async Task TestSubclassWithSettingViewStateUserKeyNoDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    protected override void OnInit (EventArgs e)
    {
        ViewStateUserKey = ""ViewStateUserKey"";
    }
}");
        }
 
        [Fact]
        public async Task TestNewModifierNoDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    protected new void OnInit (EventArgs e)
    {
        ViewStateUserKey = ""ViewStateUserKey"";
    }
}");
        }
 
        [Fact]
        public async Task TestWithoutModifierNoDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    protected void OnInit (EventArgs e)
    {
        ViewStateUserKey = ""ViewStateUserKey"";
    }
}");
        }
 
        [Fact]
        public async Task TestOrdinaryClassWithSettingViewStateUserKeyNoDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
 
class TestClass
{
    public string ViewStateUserKey { get; set; }
 
    protected void OnInit (EventArgs e)
    {
        ViewStateUserKey = ""ViewStateUserKey"";
    }
}");
        }
 
        [Fact]
        public async Task TestSettingViewStateUserKeyInPage_InitNoDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    private void Page_Init (object sender, EventArgs e)
    {
        ViewStateUserKey = ""ViewStateUserKey"";
    }
}");
        }
 
        [Fact]
        public async Task TestBothOnInitAndInPage_InitNoDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    protected override void OnInit (EventArgs e)
    {
        ViewStateUserKey = ""ViewStateUserKey"";
    }
 
    private void Page_Init (object sender, EventArgs e)
    {
        ViewStateUserKey = ""ViewStateUserKey"";
    }
}");
        }
 
        [Fact]
        public async Task TestNotAPage_NoDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass
{
    public Page Page { get; set; }
 
    protected void OnInit (EventArgs e)
    {
    }
 
    private void Page_Init (object sender, EventArgs e)
    {
    }
}");
        }
 
        [Fact]
        public async Task TestInterface_NoDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
interface ITestInterface
{
    Page Page { get; set; }
 
    void OnInit(EventArgs e);
 
    void Page_Init(object sender, EventArgs e);
}");
        }
 
        [Fact]
        public async Task TestSettingViewStateUserKeyOfPageNoDiagnosticAsync()
        {
            await VerifyCSharpAnalyzerAsync(@"
using System;
using System.Web.UI;
 
class TestClass : Page
{
    private void Page_Init (object sender, EventArgs e)
    {
        Page.ViewStateUserKey = ""ViewStateUserKey"";
    }
}");
        }
 
        private static async Task VerifyCSharpAnalyzerAsync(string source, params DiagnosticResult[] expected)
        {
            var csharpTest = new VerifyCS.Test
            {
                ReferenceAssemblies = AdditionalMetadataReferences.DefaultWithSystemWeb,
                TestState =
                {
                    Sources = { source },
                }
            };
 
            csharpTest.ExpectedDiagnostics.AddRange(expected);
 
            await csharpTest.RunAsync();
        }
 
        private static async Task VerifyBasicAnalyzerAsync(string source, params DiagnosticResult[] expected)
        {
            var csharpTest = new VerifyVB.Test
            {
                ReferenceAssemblies = AdditionalMetadataReferences.DefaultWithSystemWeb,
                TestState =
                {
                    Sources = { source },
                }
            };
 
            csharpTest.ExpectedDiagnostics.AddRange(expected);
 
            await csharpTest.RunAsync();
        }
 
        private static DiagnosticResult GetCSharpResultAt(int line, int column, params string[] arguments)
#pragma warning disable RS0030 // Do not use banned APIs
            => VerifyCS.Diagnostic()
                .WithLocation(line, column)
#pragma warning restore RS0030 // Do not use banned APIs
                .WithArguments(arguments);
 
        private static DiagnosticResult GetBasicResultAt(int line, int column, params string[] arguments)
#pragma warning disable RS0030 // Do not use banned APIs
            => VerifyVB.Diagnostic()
                .WithLocation(line, column)
#pragma warning restore RS0030 // Do not use banned APIs
                .WithArguments(arguments);
    }
}