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.");
        }
Example #2
0
        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.");
        }