public void AnalyzeSymbol(SymbolAnalysisContext context) { Debug.Assert(context.Symbol.Kind == SymbolKind.NamedType); var type = (INamedTypeSymbol)context.Symbol; var optionsAnalysis = _context.GetRelatedSingletonAnalysis <OptionsAnalysis>(type); if (optionsAnalysis == null) { return; } // Find the middleware analysis foreach of the Configure methods defined by this class and validate. // // Note that this doesn't attempt to handle inheritance scenarios. foreach (var middlewareAnalysis in _context.GetRelatedAnalyses <MiddlewareAnalysis>(type)) { foreach (var middlewareItem in middlewareAnalysis.Middleware) { if (middlewareItem.UseMethod.Name == "UseMvc" || middlewareItem.UseMethod.Name == "UseMvcWithDefaultRoute") { // Report a diagnostic if it's unclear that the user turned off Endpoint Routing. if (!OptionsFacts.IsEndpointRoutingExplicitlyDisabled(optionsAnalysis)) { context.ReportDiagnostic(Diagnostic.Create( StartupAnalyzer.Diagnostics.UnsupportedUseMvcWithEndpointRouting, middlewareItem.Operation.Syntax.GetLocation(), middlewareItem.UseMethod.Name, optionsAnalysis.ConfigureServicesMethod.Name)); } } } } }
public async Task StartupAnalyzer_MvcOptionsAnalysis_MultipleUseMvc() { // Arrange var source = Read("MvcOptions_UseMvcMultiple"); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); // Assert var optionsAnalysis = Assert.Single(Analyses.OfType <OptionsAnalysis>()); Assert.False(OptionsFacts.IsEndpointRoutingExplicitlyDisabled(optionsAnalysis)); Assert.Collection( diagnostics, diagnostic => { Assert.Same(StartupAnalyzer.Diagnostics.UnsupportedUseMvcWithEndpointRouting, diagnostic.Descriptor); AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM1"], diagnostic.Location); }, diagnostic => { Assert.Same(StartupAnalyzer.Diagnostics.UnsupportedUseMvcWithEndpointRouting, diagnostic.Descriptor); AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM2"], diagnostic.Location); }, diagnostic => { Assert.Same(StartupAnalyzer.Diagnostics.UnsupportedUseMvcWithEndpointRouting, diagnostic.Descriptor); AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM3"], diagnostic.Location); }); }
public async Task StartupAnalyzer_MvcOptionsAnalysis_MultipleMiddleware() { // Arrange var source = Read("MvcOptions_UseMvcWithOtherMiddleware"); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); // Assert var optionsAnalysis = Assert.Single(Analyses.OfType <OptionsAnalysis>()); Assert.False(OptionsFacts.IsEndpointRoutingExplicitlyDisabled(optionsAnalysis)); var middlewareAnalysis = Assert.Single(Analyses.OfType <MiddlewareAnalysis>()); Assert.Collection( middlewareAnalysis.Middleware, item => Assert.Equal("UseStaticFiles", item.UseMethod.Name), item => Assert.Equal("UseMiddleware", item.UseMethod.Name), item => Assert.Equal("UseMvc", item.UseMethod.Name), item => Assert.Equal("UseRouting", item.UseMethod.Name), item => Assert.Equal("UseEndpoints", item.UseMethod.Name)); Assert.Collection( diagnostics, diagnostic => { Assert.Same(StartupAnalyzer.Diagnostics.UnsupportedUseMvcWithEndpointRouting, diagnostic.Descriptor); AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); }); }
public async Task StartupAnalyzer_MvcOptionsAnalysis_FindsEndpointRoutingEnabled(string sourceFileName, string mvcMiddlewareName) { // Arrange var source = Read(sourceFileName); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); // Assert var optionsAnalysis = Assert.Single(Analyses.OfType <OptionsAnalysis>()); Assert.False(OptionsFacts.IsEndpointRoutingExplicitlyDisabled(optionsAnalysis)); var middlewareAnalysis = Assert.Single(Analyses.OfType <MiddlewareAnalysis>()); var middleware = Assert.Single(middlewareAnalysis.Middleware); Assert.Equal(mvcMiddlewareName, middleware.UseMethod.Name); Assert.Collection( diagnostics, diagnostic => { Assert.Same(StartupAnalyzer.Diagnostics.UnsupportedUseMvcWithEndpointRouting, diagnostic.Descriptor); AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); }); }
public async Task StartupAnalyzer_WorksWithOtherMethodsInProgram() { // Arrange var source = TestSource.Read(@"using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); builder.Services.AddMvc(); var app = builder.Build(); app.UseStaticFiles(); app.UseMiddleware<AuthorizationMiddleware>(); /*MM*/app.UseMvc(); app.UseRouting(); app.UseEndpoints(endpoints => { }); app.Run(); } private static void MethodA() { } private static void MethodB() { } }"); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); // Assert var optionsAnalysis = Assert.Single(Analyses.OfType <OptionsAnalysis>()); Assert.False(OptionsFacts.IsEndpointRoutingExplicitlyDisabled(optionsAnalysis)); var middlewareAnalysis = Assert.Single(Analyses.OfType <MiddlewareAnalysis>()); Assert.Collection( middlewareAnalysis.Middleware, item => Assert.Equal("UseStaticFiles", item.UseMethod.Name), item => Assert.Equal("UseMiddleware", item.UseMethod.Name), item => Assert.Equal("UseMvc", item.UseMethod.Name), item => Assert.Equal("UseRouting", item.UseMethod.Name), item => Assert.Equal("UseEndpoints", item.UseMethod.Name)); Assert.Collection( diagnostics, diagnostic => { Assert.Same(StartupAnalyzer.Diagnostics.UnsupportedUseMvcWithEndpointRouting, diagnostic.Descriptor); AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); Assert.Contains("inside 'Main", diagnostic.GetMessage()); }); }
public async Task StartupAnalyzer_MvcOptionsAnalysis_UseMvc_FindsEndpointRoutingDisabled() { // Arrange var source = Read("MvcOptions_UseMvcWithDefaultRouteAndEndpointRoutingDisabled"); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); // Assert var optionsAnalysis = Assert.Single(Analyses.OfType <OptionsAnalysis>()); Assert.True(OptionsFacts.IsEndpointRoutingExplicitlyDisabled(optionsAnalysis)); var middlewareAnalysis = Assert.Single(Analyses.OfType <MiddlewareAnalysis>()); var middleware = Assert.Single(middlewareAnalysis.Middleware); Assert.Equal("UseMvcWithDefaultRoute", middleware.UseMethod.Name); Assert.Empty(diagnostics); }