﻿# Simulation and rate limiting


The `NonDurableBroker` supports optional simulation settings for testing resilience scenarios. Simulation can introduce artificial delays or rejections on send, receive, and delayed delivery operations. Combined with a fake time provider, tests can simulate the passage of time deterministically.

## Basic simulation

Configure rate limiting with a fixed window:

<!-- snippet: NonDurableTransport-Simulation -->

```cs
var broker = new NonDurableBroker(new NonDurableBrokerOptions
{
    Send =
    {
        Mode = NonDurableSimulationMode.Delay,
        RateLimit = new NonDurableRateLimitOptions
        {
            PermitLimit = 1,
            Window = TimeSpan.FromSeconds(5)
        }
    },
    Receive =
    {
        Mode = NonDurableSimulationMode.Reject,
        RateLimit = new NonDurableRateLimitOptions
        {
            PermitLimit = 0,
            Window = TimeSpan.FromSeconds(30)
        }
    }
});

endpointConfiguration.UseTransport(new NonDurableTransport(new NonDurableTransportOptions(broker)));
```

<!-- endsnippet -->

## Simulating the passage of time

Use `FakeTimeProvider` to advance time deterministically in tests:

<!-- snippet: NonDurableTransport-SimulatedTime -->

```cs
var simulatedTime = new FakeTimeProvider(DateTimeOffset.UtcNow);

var broker = new NonDurableBroker(new NonDurableBrokerOptions
{
    TimeProvider = simulatedTime,
    Send =
    {
        Mode = NonDurableSimulationMode.Delay,
        RateLimit = new NonDurableRateLimitOptions
        {
            PermitLimit = 1,
            Window = TimeSpan.FromSeconds(5)
        }
    }
});

// In tests, advance time to trigger delayed operations
// simulatedTime.Advance(TimeSpan.FromSeconds(5));

endpointConfiguration.UseTransport(new NonDurableTransport(new NonDurableTransportOptions(broker)));
```

<!-- endsnippet -->

## Per-queue rate limit overrides

Apply different simulation settings to specific queues:

<!-- snippet: NonDurableTransport-QueueOverride -->

```cs
var options = new NonDurableBrokerOptions
{
    Send =
    {
        RateLimit = new NonDurableRateLimitOptions
        {
            PermitLimit = 1,
            Window = TimeSpan.FromSeconds(30)
        }
    }
};

// Override the default rate limit for a specific queue
options.ForQueue("orders").Send.RateLimit = new NonDurableRateLimitOptions
{
    PermitLimit = 10,
    Window = TimeSpan.FromSeconds(30)
};

var broker = new NonDurableBroker(options);
endpointConfiguration.UseTransport(new NonDurableTransport(new NonDurableTransportOptions(broker)));
```

<!-- endsnippet -->

## Delayed delivery simulation

Control the timing of delayed message delivery:

<!-- snippet: NonDurableTransport-DelayedDeliverySimulation -->

```cs
var simulatedTime = new FakeTimeProvider(DateTimeOffset.UtcNow);

var broker = new NonDurableBroker(new NonDurableBrokerOptions
{
    TimeProvider = simulatedTime,
    DelayedDelivery =
    {
        Mode = NonDurableSimulationMode.Delay,
        RateLimit = new NonDurableRateLimitOptions
        {
            PermitLimit = 1,
            Window = TimeSpan.FromSeconds(5)
        }
    }
});

endpointConfiguration.UseTransport(new NonDurableTransport(new NonDurableTransportOptions(broker)));
```

<!-- endsnippet -->
