public void DecoyTimeAttribute_ExecutionTakesAtleastNMilliseconds(int delayMs) { //Arrange var mockTimeCalculator = new Mock <IDecoyTimeCalculator>(); mockTimeCalculator.Setup(x => x.GetDelay()) .Returns(TimeSpan.FromMilliseconds(delayMs)); var sut = new DecoyTimeGeneratorAttribute(mockTimeCalculator.Object); var actionContext = new ActionContext( new DefaultHttpContext(), new RouteData(), new ActionDescriptor(), new ModelStateDictionary()); var resultExecutingContext = new ResourceExecutedContext( actionContext, new List <IFilterMetadata>()); var timer = new Stopwatch(); //Act timer.Start(); sut.OnResourceExecuted(resultExecutingContext); timer.Stop(); //Assert // 10% margin, as Task.Delay has some inaccuracies Assert.True(timer.ElapsedMilliseconds >= 0.90 * delayMs, $"Recorded time: {timer.ElapsedMilliseconds}ms."); }
public async void DecoyTimeAttribute_ExecutionTakesAtleastNMilliseconds(int delayMs) { //Arrange var mockRNG = new Mock <IRandomNumberGenerator>(); mockRNG.Setup(x => x.Next(It.IsAny <int>(), It.IsAny <int>()) ).Returns(delayMs); var sut = new DecoyTimeGeneratorAttribute( new TestLogger <DecoyTimeGeneratorAttribute>(), mockRNG.Object, new DefaultDecoyKeysConfig()); var actionContext = new ActionContext( new DefaultHttpContext(), new RouteData(), new ActionDescriptor(), new ModelStateDictionary()); var actionExecutingContext = new ActionExecutingContext( actionContext, new List <IFilterMetadata>(), new Dictionary <string, object>(), null); ActionExecutionDelegate nullAction = async() => { return(null); }; var timer = new Stopwatch(); //Act timer.Start(); await sut.OnActionExecutionAsync(actionExecutingContext, nullAction); timer.Stop(); //Assert Assert.True(timer.ElapsedMilliseconds >= delayMs, $"Recorded time: {timer.ElapsedMilliseconds}ms."); }