public void Annotation_NotEntryMethod_AttibutesAreIgnored() { const string code = @" namespace Namespace { public class FromBodyAttribute : System.Attribute { } public class NotAController { public object Foo([FromBody] long itemId, [FromBody] string itemId2) { var data = itemId; // data := __id [ const ] var data = itemId2; // data := __id [ itemId2 ] return null; } } }"; var ucfg = UcfgVerifier.VerifyInstructions(code, "Foo"); var entryPoints = UcfgVerifier.GetEntryPointInstructions(ucfg); entryPoints.Count.Should().Be(0); }
public void Annotation_EntryMethod_AttributeOnStringParameterIsHandled() { const string code = @" namespace Namespace { using System.Web.Mvc; public class FromBodyAttribute : System.Attribute { } public class CartController : Controller { public object Remove([FromBody] string itemId) { var data = itemId; // data := __id [ itemId ] // %0 := __entrypoint [ itemId ] // %1 := __annotate [ Namespace.FromBodyAttribute.FromBodyAttribute() itemId ] // itemId := __annotation [ %1 ] return null; } } }"; var ucfg = UcfgVerifier.VerifyInstructions(code, "Remove"); var entryPoints = UcfgVerifier.GetEntryPointInstructions(ucfg); entryPoints.Count.Should().Be(1); // Entry point location should be the "Remove" token. // Line numbers are 1-based, offsets are 0-based var actualLocation = entryPoints[0].Assigncall.Location; actualLocation.StartLine.Should().Be(10); actualLocation.EndLine.Should().Be(10); actualLocation.StartLineOffset.Should().Be(22); actualLocation.EndLineOffset.Should().Be(28); }
public void ControllerMethod_Contains_EntryPoint_And_Attributes() { const string code = @" using System.ComponentModel; using System.Web.Mvc; public class Class1 : Controller { public class DummyAttribute : System.Attribute { } private string field; [HttpPost] // should be ignored public void Foo([Description]string s, [Missing]string x, [Dummy] int i, [DummyAttribute]string s2) {} // %0 := __entrypoint [ s x const s2 ] // %1 := __annotate [ System.ComponentModel.DescriptionAttribute.DescriptionAttribute() s ] // s := __annotation [ %1 ] // i is a const so the attribute is ignored // the Missing attribute is unknown and is not included // %2 := __annotate [ Class1.DummyAttribute.DummyAttribute() s2 ] // s2 := __annotation [ %2 ] }"; var ucfg = UcfgVerifier.VerifyInstructions(code, "Foo"); var entryPoints = UcfgVerifier.GetEntryPointInstructions(ucfg); entryPoints.Count.Should().Be(1); // Entry point location should be the "Foo" token. // Line numbers are 1-based, offsets are 0-based var actualLocation = entryPoints[0].Assigncall.Location; actualLocation.StartLine.Should().Be(10); actualLocation.EndLine.Should().Be(10); actualLocation.StartLineOffset.Should().Be(16); actualLocation.EndLineOffset.Should().Be(19); }