Example #1
0
        public async Task EnterThenExit()
        {
            var writeCount  = 200;
            var gate        = new QuotaPolicyGate(_counterStore, TimeSpan.FromSeconds(1), 1000);
            var httpContext = new DefaultHttpContext();

            var enter = await gate.TryEnterAsync(new QosGateEnterContext()
            {
                HttpContext = httpContext,
                Key         = "k"
            });

            Assert.True(enter.Success);
            Assert.Equal(0, _counter);

            await httpContext.Response.Body.WriteAsync(new byte[writeCount], 0, writeCount);

            await gate.ExitAsync(new QosGateExitContext()
            {
                HttpContext = httpContext,
                Key         = "k"
            });

            Assert.Equal(writeCount, _counter);
        }
Example #2
0
        public async Task EnterUpToLimit()
        {
            var writeCount  = 200;
            var gate        = new QuotaPolicyGate(_counterStore, TimeSpan.FromSeconds(1), 300);
            var httpContext = new DefaultHttpContext();

            // First write
            var enter1 = await gate.TryEnterAsync(new QosGateEnterContext()
            {
                HttpContext = httpContext,
                Key         = "k"
            });

            Assert.True(enter1.Success);
            Assert.Equal(0, _counter);

            await httpContext.Response.Body.WriteAsync(new byte[writeCount], 0, writeCount);

            await gate.ExitAsync(new QosGateExitContext()
            {
                HttpContext = httpContext,
                Key         = "k",
                GateData    = enter1.Data
            });

            Assert.Equal(writeCount, _counter);

            // Second write
            var enter2 = await gate.TryEnterAsync(new QosGateEnterContext()
            {
                HttpContext = httpContext,
                Key         = "k"
            });

            Assert.True(enter2.Success);
            Assert.Equal(writeCount, _counter);

            await httpContext.Response.Body.WriteAsync(new byte[writeCount], 0, writeCount);

            await gate.ExitAsync(new QosGateExitContext()
            {
                HttpContext = httpContext,
                Key         = "k",
                GateData    = enter2.Data
            });

            Assert.Equal(writeCount * 2, _counter);

            // Third write
            var enter3 = await gate.TryEnterAsync(new QosGateEnterContext()
            {
                HttpContext = httpContext,
                Key         = "k"
            });

            Assert.False(enter3.Success);
            Assert.Equal(writeCount * 2, _counter);
        }