diff --git a/.github/workflows/aws.yml b/.github/workflows/aws.yml index 3e723f602..58e32a9a0 100644 --- a/.github/workflows/aws.yml +++ b/.github/workflows/aws.yml @@ -17,63 +17,27 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET 8 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x - name: Setup .NET 10 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x - - name: Start LocalStack and PostgreSQL - run: docker compose up -d localstack postgresql - - - name: Build SQS Tests - run: dotnet build src/Transports/AWS/Wolverine.AmazonSqs.Tests/Wolverine.AmazonSqs.Tests.csproj --configuration ${{ env.config }} --framework net10.0 - - - name: Build SNS Tests - run: dotnet build src/Transports/AWS/Wolverine.AmazonSns.Tests/Wolverine.AmazonSns.Tests.csproj --configuration ${{ env.config }} --framework net10.0 - - - name: Wait for LocalStack - run: | - echo "Waiting for LocalStack to be ready..." - for i in {1..60}; do - if curl -s http://localhost:4566/_localstack/health > /dev/null 2>&1; then - echo "LocalStack is ready" - break - fi - echo "Attempt $i: LocalStack not ready yet, waiting..." - sleep 2 - done - - - name: Wait for PostgreSQL - run: | - echo "Waiting for PostgreSQL to be ready..." - for i in {1..30}; do - if docker compose exec -T postgresql pg_isready -U postgres; then - echo "PostgreSQL is ready" - break - fi - echo "Attempt $i: PostgreSQL not ready yet, waiting..." - sleep 2 - done - - - name: Test SQS - run: dotnet test src/Transports/AWS/Wolverine.AmazonSqs.Tests/Wolverine.AmazonSqs.Tests.csproj --configuration ${{ env.config }} --framework net10.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" - - - name: Test SNS - run: dotnet test src/Transports/AWS/Wolverine.AmazonSns.Tests/Wolverine.AmazonSns.Tests.csproj --configuration ${{ env.config }} --framework net10.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" + - name: Run AWS Tests + run: ./build.sh CIAWS --framework net9.0 - name: Stop containers if: always() diff --git a/.github/workflows/azure-service-bus.yml b/.github/workflows/azure-service-bus.yml new file mode 100644 index 000000000..3c60823de --- /dev/null +++ b/.github/workflows/azure-service-bus.yml @@ -0,0 +1,44 @@ +name: azure-service-bus + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + config: Release + disable_test_parallelization: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: Setup .NET 9 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + + - name: Setup .NET 10 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Run Azure Service Bus Tests + run: ./build.sh CIAzureServiceBus --framework net9.0 + + - name: Stop containers + if: always() + run: docker compose down diff --git a/.github/workflows/cosmosdb.yml b/.github/workflows/cosmosdb.yml new file mode 100644 index 000000000..a504de599 --- /dev/null +++ b/.github/workflows/cosmosdb.yml @@ -0,0 +1,44 @@ +name: cosmosdb + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + config: Release + disable_test_parallelization: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: Setup .NET 9 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + + - name: Setup .NET 10 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Run CosmosDb Tests + run: ./build.sh CICosmosDb --framework net9.0 + + - name: Stop containers + if: always() + run: docker compose down diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 424176fe0..d7e985878 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -7,20 +7,20 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Setup .NET 8 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x - name: Setup .NET 10 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index e9d3afcd0..73bdc452b 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -18,22 +18,22 @@ jobs: steps: - name: Setup .NET 8 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x - name: Setup .NET 10 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 diff --git a/.github/workflows/efcore.yml b/.github/workflows/efcore.yml index f73bbfffb..9cffbc85d 100644 --- a/.github/workflows/efcore.yml +++ b/.github/workflows/efcore.yml @@ -17,62 +17,27 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET 8 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x - name: Setup .NET 10 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x - - name: Start containers - run: docker compose up -d postgresql sqlserver - - - name: Build - run: | - dotnet build src/Persistence/EfCoreTests/EfCoreTests.csproj --configuration ${{ env.config }} --framework net9.0 - dotnet build src/Persistence/EfCoreTests.MultiTenancy/EfCoreTests.MultiTenancy.csproj --configuration ${{ env.config }} --framework net9.0 - - - name: Wait for PostgreSQL - run: | - echo "Waiting for PostgreSQL to be ready..." - for i in {1..30}; do - if docker compose exec -T postgresql pg_isready -U postgres; then - echo "PostgreSQL is ready" - break - fi - echo "Attempt $i: PostgreSQL not ready yet, waiting..." - sleep 2 - done - - - name: Wait for SQL Server - run: | - echo "Waiting for SQL Server to be ready..." - for i in {1..30}; do - if docker compose exec -T sqlserver /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P 'P@55w0rd' -C -Q "SELECT 1" > /dev/null 2>&1; then - echo "SQL Server is ready" - break - fi - echo "Attempt $i: SQL Server not ready yet, waiting..." - sleep 2 - done - - - name: Test EfCoreTests - run: dotnet test src/Persistence/EfCoreTests/EfCoreTests.csproj --configuration ${{ env.config }} --framework net9.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" - - - name: Test EfCoreTests.MultiTenancy - run: dotnet test src/Persistence/EfCoreTests.MultiTenancy/EfCoreTests.MultiTenancy.csproj --configuration ${{ env.config }} --framework net9.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" + - name: Run EF Core Tests + run: ./build.sh CIEfCore --framework net9.0 - name: Stop containers if: always() diff --git a/.github/workflows/http.yml b/.github/workflows/http.yml index bdd38bdfa..e216a03fd 100644 --- a/.github/workflows/http.yml +++ b/.github/workflows/http.yml @@ -18,47 +18,27 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET 8 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x - name: Setup .NET 10 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x - - name: Start PostgreSQL - run: docker compose up -d postgresql - - - name: Wait for PostgreSQL - run: | - echo "Waiting for PostgreSQL to be ready..." - for i in {1..30}; do - if docker compose exec -T postgresql pg_isready -U postgres; then - echo "PostgreSQL is ready" - exit 0 - fi - echo "Attempt $i: PostgreSQL not ready yet, waiting..." - sleep 2 - done - echo "PostgreSQL failed to start" - exit 1 - - - name: Build - run: dotnet build src/Http/Wolverine.Http.Tests/Wolverine.Http.Tests.csproj --framework net9.0 --configuration ${{ env.config }} - - - name: Test - run: dotnet test src/Http/Wolverine.Http.Tests/Wolverine.Http.Tests.csproj -e Development --framework net9.0 --configuration ${{ env.config }} --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" + - name: Run HTTP Tests + run: ./build.sh CIHttp --framework net9.0 - name: Stop containers if: always() diff --git a/.github/workflows/kafka.yml b/.github/workflows/kafka.yml index f06d33370..f076d5ea0 100644 --- a/.github/workflows/kafka.yml +++ b/.github/workflows/kafka.yml @@ -13,61 +13,31 @@ env: jobs: test: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET 8 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x - name: Setup .NET 10 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x - - name: Start Kafka and PostgreSQL - run: docker compose up -d kafka postgresql - - - name: Wait for Kafka - run: | - echo "Waiting for Kafka to be ready..." - for i in {1..60}; do - if curl -s http://localhost:8082/v3/clusters > /dev/null 2>&1; then - echo "Kafka is ready" - break - fi - echo "Attempt $i: Kafka not ready yet, waiting..." - sleep 2 - done - - - name: Wait for PostgreSQL - run: | - echo "Waiting for PostgreSQL to be ready..." - for i in {1..30}; do - if nc -z localhost 5433 > /dev/null 2>&1; then - echo "PostgreSQL is ready" - break - fi - echo "Attempt $i: PostgreSQL not ready yet, waiting..." - sleep 2 - done - - - name: Build - run: dotnet build src/Transports/Kafka/Wolverine.Kafka.Tests/Wolverine.Kafka.Tests.csproj --configuration ${{ env.config }} --framework net10.0 - - - name: Test - run: dotnet test src/Transports/Kafka/Wolverine.Kafka.Tests/Wolverine.Kafka.Tests.csproj --configuration ${{ env.config }} --framework net10.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" + - name: Run Kafka Tests + run: ./build.sh CIKafka --framework net9.0 - name: Stop containers if: always() diff --git a/.github/workflows/marten.yml b/.github/workflows/marten.yml new file mode 100644 index 000000000..fe9ce2d51 --- /dev/null +++ b/.github/workflows/marten.yml @@ -0,0 +1,44 @@ +name: marten + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + config: Release + disable_test_parallelization: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: Setup .NET 9 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + + - name: Setup .NET 10 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Run Marten Tests + run: ./build.sh CIMarten --framework net9.0 + + - name: Stop containers + if: always() + run: docker compose down diff --git a/.github/workflows/mqtt.yml b/.github/workflows/mqtt.yml index 43561cebb..c0eceb0f6 100644 --- a/.github/workflows/mqtt.yml +++ b/.github/workflows/mqtt.yml @@ -13,49 +13,31 @@ env: jobs: test: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET 8 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x - name: Setup .NET 10 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x - - name: Start PostgreSQL - run: docker compose up -d postgresql - - - name: Wait for PostgreSQL - run: | - echo "Waiting for PostgreSQL to be ready..." - for i in {1..30}; do - if nc -z localhost 5433 > /dev/null 2>&1; then - echo "PostgreSQL is ready" - break - fi - echo "Attempt $i: PostgreSQL not ready yet, waiting..." - sleep 2 - done - - - name: Build - run: dotnet build src/Transports/MQTT/Wolverine.MQTT.Tests/Wolverine.MQTT.Tests.csproj --configuration ${{ env.config }} --framework net10.0 - - - name: Test - run: dotnet test src/Transports/MQTT/Wolverine.MQTT.Tests/Wolverine.MQTT.Tests.csproj --configuration ${{ env.config }} --framework net10.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" + - name: Run MQTT Tests + run: ./build.sh CIMQTT --framework net9.0 - name: Stop containers if: always() diff --git a/.github/workflows/mysql.yml b/.github/workflows/mysql.yml new file mode 100644 index 000000000..91d43649c --- /dev/null +++ b/.github/workflows/mysql.yml @@ -0,0 +1,44 @@ +name: mysql + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + config: Release + disable_test_parallelization: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: Setup .NET 9 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + + - name: Setup .NET 10 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Run MySQL Tests + run: ./build.sh CIMySql --framework net9.0 + + - name: Stop containers + if: always() + run: docker compose down diff --git a/.github/workflows/nats.yml b/.github/workflows/nats.yml index 204cbd5b4..4c67d9af7 100644 --- a/.github/workflows/nats.yml +++ b/.github/workflows/nats.yml @@ -13,61 +13,31 @@ env: jobs: test: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET 8 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x - name: Setup .NET 10 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x - - name: Start NATS and PostgreSQL - run: docker compose up -d nats postgresql - - - name: Wait for NATS - run: | - echo "Waiting for NATS to be ready..." - for i in {1..30}; do - if nc -z localhost 4222 > /dev/null 2>&1; then - echo "NATS is ready" - break - fi - echo "Attempt $i: NATS not ready yet, waiting..." - sleep 2 - done - - - name: Wait for PostgreSQL - run: | - echo "Waiting for PostgreSQL to be ready..." - for i in {1..30}; do - if nc -z localhost 5433 > /dev/null 2>&1; then - echo "PostgreSQL is ready" - break - fi - echo "Attempt $i: PostgreSQL not ready yet, waiting..." - sleep 2 - done - - - name: Build - run: dotnet build src/Transports/NATS/Wolverine.Nats.Tests/Wolverine.Nats.Tests.csproj --configuration ${{ env.config }} --framework net10.0 - - - name: Test - run: dotnet test src/Transports/NATS/Wolverine.Nats.Tests/Wolverine.Nats.Tests.csproj --configuration ${{ env.config }} --framework net10.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" + - name: Run NATS Tests + run: ./build.sh CINATS --framework net9.0 - name: Stop containers if: always() diff --git a/.github/workflows/oracle.yml b/.github/workflows/oracle.yml new file mode 100644 index 000000000..88ebc9ded --- /dev/null +++ b/.github/workflows/oracle.yml @@ -0,0 +1,44 @@ +name: oracle + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + config: Release + disable_test_parallelization: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: Setup .NET 9 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + + - name: Setup .NET 10 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Run Oracle Tests + run: ./build.sh CIOracle --framework net9.0 + + - name: Stop containers + if: always() + run: docker compose down diff --git a/.github/workflows/persistence.yml b/.github/workflows/persistence.yml index 6b8d25a63..1d9dad533 100644 --- a/.github/workflows/persistence.yml +++ b/.github/workflows/persistence.yml @@ -17,99 +17,28 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - + - name: Setup .NET 8 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x - name: Setup .NET 10 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x - - name: Start containers - run: docker compose up -d postgresql sqlserver mysql rabbitmq - - - name: Build - run: | - dotnet build src/Persistence/PersistenceTests/PersistenceTests.csproj --configuration ${{ env.config }} --framework net9.0 - dotnet build src/Persistence/PostgresqlTests/PostgresqlTests.csproj --configuration ${{ env.config }} --framework net10.0 - dotnet build src/Persistence/SqlServerTests/SqlServerTests.csproj --configuration ${{ env.config }} --framework net10.0 - dotnet build src/Persistence/MySql/MySqlTests/MySqlTests.csproj --configuration ${{ env.config }} --framework net10.0 - dotnet build src/Persistence/SqliteTests/SqliteTests.csproj --configuration ${{ env.config }} --framework net10.0 - - - name: Wait for PostgreSQL - run: | - echo "Waiting for PostgreSQL to be ready..." - for i in {1..30}; do - if docker compose exec -T postgresql pg_isready -U postgres; then - echo "PostgreSQL is ready" - break - fi - echo "Attempt $i: PostgreSQL not ready yet, waiting..." - sleep 2 - done - - - name: Wait for MySQL - run: | - echo "Waiting for MySQL to be ready..." - for i in {1..30}; do - if docker compose exec -T mysql mysqladmin ping -h localhost -u root -pP@55w0rd --silent; then - echo "MySQL is ready" - break - fi - echo "Attempt $i: MySQL not ready yet, waiting..." - sleep 2 - done - - - name: Wait for RabbitMQ - run: | - echo "Waiting for RabbitMQ to be ready..." - for i in {1..30}; do - if docker compose exec -T rabbitmq rabbitmq-diagnostics -q ping; then - echo "RabbitMQ is ready" - break - fi - echo "Attempt $i: RabbitMQ not ready yet, waiting..." - sleep 2 - done - - - name: Test SqliteTests - run: dotnet test src/Persistence/SqliteTests/SqliteTests.csproj --configuration ${{ env.config }} --framework net10.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" - - - name: Test MySqlTests - run: dotnet test src/Persistence/MySql/MySqlTests/MySqlTests.csproj --configuration ${{ env.config }} --framework net10.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" - - - name: Test PersistenceTests - run: dotnet test src/Persistence/PersistenceTests/PersistenceTests.csproj --configuration ${{ env.config }} --framework net9.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" - - - name: Wait for SQL Server - run: | - echo "Waiting for SQL Server to be ready..." - for i in {1..30}; do - if docker compose exec -T sqlserver /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P 'P@55w0rd' -C -Q "SELECT 1" > /dev/null 2>&1; then - echo "SQL Server is ready" - break - fi - echo "Attempt $i: SQL Server not ready yet, waiting..." - sleep 2 - done - - - name: Test SqlServerTests - run: dotnet test src/Persistence/SqlServerTests/SqlServerTests.csproj --configuration ${{ env.config }} --framework net10.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" + - name: Run Persistence Tests + run: ./build.sh CIPersistence --framework net9.0 - - name: Test PostgresqlTests - run: dotnet test src/Persistence/PostgresqlTests/PostgresqlTests.csproj --configuration ${{ env.config }} --framework net10.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" - - name: Stop containers if: always() run: docker compose down diff --git a/.github/workflows/polecat.yml b/.github/workflows/polecat.yml new file mode 100644 index 000000000..039d5fd63 --- /dev/null +++ b/.github/workflows/polecat.yml @@ -0,0 +1,44 @@ +name: polecat + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + config: Release + disable_test_parallelization: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: Setup .NET 9 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + + - name: Setup .NET 10 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Run Polecat Tests + run: ./build.sh CIPolecat --framework net9.0 + + - name: Stop containers + if: always() + run: docker compose down diff --git a/.github/workflows/publish_nugets.yml b/.github/workflows/publish_nugets.yml index 67b7803f7..7b179c898 100644 --- a/.github/workflows/publish_nugets.yml +++ b/.github/workflows/publish_nugets.yml @@ -8,20 +8,20 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Setup .NET 8 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x - name: Setup .NET 10 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x diff --git a/.github/workflows/pulsar.yml b/.github/workflows/pulsar.yml index 86a15f59d..0303d0ecc 100644 --- a/.github/workflows/pulsar.yml +++ b/.github/workflows/pulsar.yml @@ -17,45 +17,27 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - + - name: Setup .NET 8 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x - name: Setup .NET 10 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x - - name: Start Pulsar - run: docker compose up -d pulsar - - - name: Wait for Pulsar - run: | - echo "Waiting for Pulsar to be ready..." - for i in {1..60}; do - if curl -s http://localhost:8080/admin/v2/brokers/healthcheck > /dev/null 2>&1; then - echo "Pulsar is ready" - break - fi - echo "Attempt $i: Pulsar not ready yet, waiting..." - sleep 2 - done - - - name: Build - run: dotnet build src/Transports/Pulsar/Wolverine.Pulsar.Tests/Wolverine.Pulsar.Tests.csproj --configuration ${{ env.config }} --framework net10.0 - - - name: Test - run: dotnet test src/Transports/Pulsar/Wolverine.Pulsar.Tests/Wolverine.Pulsar.Tests.csproj --configuration ${{ env.config }} --framework net10.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" + - name: Run Pulsar Tests + run: ./build.sh CIPulsar --framework net9.0 - name: Stop containers if: always() diff --git a/.github/workflows/rabbitmq.yml b/.github/workflows/rabbitmq.yml new file mode 100644 index 000000000..ec869cd20 --- /dev/null +++ b/.github/workflows/rabbitmq.yml @@ -0,0 +1,44 @@ +name: rabbitmq + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + config: Release + disable_test_parallelization: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: Setup .NET 9 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + + - name: Setup .NET 10 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Run RabbitMQ Tests + run: ./build.sh CIRabbitMQ --framework net9.0 + + - name: Stop containers + if: always() + run: docker compose down diff --git a/.github/workflows/redis.yml b/.github/workflows/redis.yml index b0580efb5..bf059a517 100644 --- a/.github/workflows/redis.yml +++ b/.github/workflows/redis.yml @@ -13,61 +13,31 @@ env: jobs: test: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET 8 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x - name: Setup .NET 10 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x - - name: Start Redis and PostgreSQL - run: docker compose up -d redis-server postgresql - - - name: Build - run: dotnet build src/Transports/Redis/Wolverine.Redis.Tests/Wolverine.Redis.Tests.csproj --configuration ${{ env.config }} --framework net10.0 - - - name: Wait for Redis - run: | - echo "Waiting for Redis to be ready..." - for i in {1..30}; do - if docker compose exec -T redis-server redis-cli ping | grep -q PONG; then - echo "Redis is ready" - break - fi - echo "Attempt $i: Redis not ready yet, waiting..." - sleep 2 - done - - - name: Wait for PostgreSQL - run: | - echo "Waiting for PostgreSQL to be ready..." - for i in {1..30}; do - if docker compose exec -T postgresql pg_isready -U postgres; then - echo "PostgreSQL is ready" - break - fi - echo "Attempt $i: PostgreSQL not ready yet, waiting..." - sleep 2 - done - - - name: Test - run: dotnet test src/Transports/Redis/Wolverine.Redis.Tests/Wolverine.Redis.Tests.csproj --configuration ${{ env.config }} --framework net10.0 --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" + - name: Run Redis Tests + run: ./build.sh CIRedis --framework net9.0 - name: Stop containers if: always() diff --git a/.github/workflows/sqlite.yml b/.github/workflows/sqlite.yml new file mode 100644 index 000000000..3e174f324 --- /dev/null +++ b/.github/workflows/sqlite.yml @@ -0,0 +1,40 @@ +name: sqlite + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + config: Release + disable_test_parallelization: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: Setup .NET 9 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + + - name: Setup .NET 10 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Run Sqlite Tests + run: ./build.sh CISqlite --framework net9.0 diff --git a/.github/workflows/sqlserver.yml b/.github/workflows/sqlserver.yml new file mode 100644 index 000000000..2bbcda89b --- /dev/null +++ b/.github/workflows/sqlserver.yml @@ -0,0 +1,44 @@ +name: sqlserver + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + config: Release + disable_test_parallelization: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: Setup .NET 9 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + + - name: Setup .NET 10 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Run SQL Server Tests + run: ./build.sh CISqlServer --framework net9.0 + + - name: Stop containers + if: always() + run: docker compose down diff --git a/.nuke/build.schema.json b/.nuke/build.schema.json index cac017234..8c89ad57b 100644 --- a/.nuke/build.schema.json +++ b/.nuke/build.schema.json @@ -28,6 +28,24 @@ "Attach", "BankingServiceSampleTests", "CI", + "CIAWS", + "CIAzureServiceBus", + "CICosmosDb", + "CIEfCore", + "CIHttp", + "CIKafka", + "CIMarten", + "CIMQTT", + "CIMySql", + "CINATS", + "CIOracle", + "CIPersistence", + "CIPolecat", + "CIPulsar", + "CIRabbitMQ", + "CIRedis", + "CISqlite", + "CISqlServer", "CodegenPreviewCommand", "Commands", "Compile", diff --git a/Directory.Packages.props b/Directory.Packages.props index 4f092c87d..f265d5323 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -26,6 +26,7 @@ + @@ -76,6 +77,13 @@ + + + + + + + diff --git a/DomainEventsWithEfCore/BackLogService/Code.cs b/DomainEventsWithEfCore/BackLogService/Code.cs index a5f52c1bd..3fca620fe 100644 --- a/DomainEventsWithEfCore/BackLogService/Code.cs +++ b/DomainEventsWithEfCore/BackLogService/Code.cs @@ -4,8 +4,8 @@ public class BacklogItem { public Guid Id { get; private set; } - public string Description { get; private set; } - public virtual Sprint Sprint { get; private set; } + public string Description { get; private set; } = null!; + public virtual Sprint Sprint { get; private set; } = null!; public DateTime CreatedAtUtc { get; private set; } = DateTime.UtcNow; public void CommitTo(Sprint sprint) diff --git a/DomainEventsWithEfCore/BackLogService/Program.cs b/DomainEventsWithEfCore/BackLogService/Program.cs index bf3f06a2f..e5f12a3b7 100644 --- a/DomainEventsWithEfCore/BackLogService/Program.cs +++ b/DomainEventsWithEfCore/BackLogService/Program.cs @@ -13,7 +13,7 @@ builder.UseWolverine(opts => { opts.UseEntityFrameworkCoreTransactions(); - opts.PersistMessagesWithPostgresql(connectionString, "wolverine"); + opts.PersistMessagesWithPostgresql(connectionString!, "wolverine"); opts.Policies.AutoApplyTransactions(); }); diff --git a/DomainEventsWithEfCore/BackLogService/Relay/Code.cs b/DomainEventsWithEfCore/BackLogService/Relay/Code.cs index 1fd976198..163df39fd 100644 --- a/DomainEventsWithEfCore/BackLogService/Relay/Code.cs +++ b/DomainEventsWithEfCore/BackLogService/Relay/Code.cs @@ -11,8 +11,8 @@ public class BacklogItem { public Guid Id { get; private set; } - public string Description { get; private set; } - public virtual Sprint Sprint { get; private set; } + public string Description { get; private set; } = null!; + public virtual Sprint Sprint { get; private set; } = null!; public DateTime CreatedAtUtc { get; private set; } = DateTime.UtcNow; // The exact return type isn't hugely important here diff --git a/DomainEventsWithEfCore/BackLogService/Scraping/Code.cs b/DomainEventsWithEfCore/BackLogService/Scraping/Code.cs index 3d11f5a59..3caabde42 100644 --- a/DomainEventsWithEfCore/BackLogService/Scraping/Code.cs +++ b/DomainEventsWithEfCore/BackLogService/Scraping/Code.cs @@ -31,8 +31,8 @@ public class BacklogItem : Entity { public Guid Id { get; private set; } - public string Description { get; private set; } - public virtual Sprint Sprint { get; private set; } + public string Description { get; private set; } = null!; + public virtual Sprint Sprint { get; private set; } = null!; public DateTime CreatedAtUtc { get; private set; } = DateTime.UtcNow; public void CommitTo(Sprint sprint) diff --git a/DomainEventsWithEfCore/BackLogService/UseEventPublisher/Code.cs b/DomainEventsWithEfCore/BackLogService/UseEventPublisher/Code.cs index 830455d41..9b87ec4aa 100644 --- a/DomainEventsWithEfCore/BackLogService/UseEventPublisher/Code.cs +++ b/DomainEventsWithEfCore/BackLogService/UseEventPublisher/Code.cs @@ -30,7 +30,7 @@ public class RecordingEventPublisher : OutgoingMessages, IEventPublisher { public void Publish(T @event) { - Add(@event); + Add(@event!); } } @@ -79,7 +79,7 @@ public async Task LoadAsync(Guid id) item.Publisher = _publisher; } - return item; + return item!; } } @@ -109,11 +109,11 @@ public class BacklogItem : Entity { public Guid Id { get; private set; } = Guid.CreateVersion7(); - public string Description { get; private set; } - + public string Description { get; private set; } = null!; + // ZOMG, I forgot how annoying ORMs are. Use a document database // and stop worrying about making things virtual just for lazy loading - public virtual Sprint Sprint { get; private set; } + public virtual Sprint Sprint { get; private set; } = null!; public void CommitTo(Sprint sprint) { @@ -144,6 +144,6 @@ ItemsDbContext dbContext // This method would cause an event to be published within // the BacklogItem object here that we need to gather up and // relay to Wolverine later - item.CommitTo(sprint); + item.CommitTo(sprint!); } } \ No newline at end of file diff --git a/NuGet.config b/NuGet.config index 426bc9097..9636fc762 100644 --- a/NuGet.config +++ b/NuGet.config @@ -2,21 +2,13 @@ - - - - - - - - diff --git a/build/CITargets.cs b/build/CITargets.cs new file mode 100644 index 000000000..349f5bf12 --- /dev/null +++ b/build/CITargets.cs @@ -0,0 +1,437 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using Nuke.Common; +using Nuke.Common.IO; +using Nuke.Common.Tooling; +using Nuke.Common.Tools.DotNet; +using Serilog; +using static Nuke.Common.Tools.DotNet.DotNetTasks; + +partial class Build +{ + /// + /// Starts specific docker compose services and waits for them to be ready. + /// + void StartDockerServices(params string[] services) + { + bool IsToolAvailable(string toolName) + { + try + { ToolPathResolver.GetPathExecutable(toolName); + return true; } + catch (ArgumentException) + { return false; } + } + + string toolName = new List { "docker", "podman" } + .FirstOrDefault(IsToolAvailable) ?? "docker"; + + var serviceList = string.Join(" ", services); + Log.Information("Starting docker services: {Services}", serviceList); + + // Pass each service as a separate argument to avoid quoting issues + var args = "compose up -d " + serviceList; + ProcessTasks + .StartProcess(toolName, args, logOutput: false, logInvocation: false) + .AssertWaitForExit() + .AssertZeroExitCode(); + + // Wait for databases that were requested + if (services.Contains("postgresql")) + WaitForDatabaseToBeReady(); + if (services.Contains("sqlserver")) + WaitForSqlServerToBeReady(); + if (services.Contains("mysql")) + WaitForMySqlToBeReady(); + if (services.Contains("oracle")) + WaitForOracleToBeReady(); + if (services.Contains("localstack")) + WaitForLocalStackToBeReady(); + if (services.Contains("asb-emulator")) + WaitForAzureServiceBusEmulatorToBeReady(); + } + + void WaitForSqlServerToBeReady() + { + var attempt = 0; + while (attempt < 30) + { + try + { + using var conn = new Microsoft.Data.SqlClient.SqlConnection("Server=localhost,1434;User Id=sa;Password=P@55w0rd;Timeout=5;Encrypt=False"); + conn.Open(); + var cmd = conn.CreateCommand(); + cmd.CommandText = "SELECT 1"; + cmd.ExecuteNonQuery(); + Log.Information("SQL Server is up and ready!"); + return; + } + catch (Exception) + { + Thread.Sleep(2000); + attempt++; + } + } + + Log.Warning("SQL Server did not become ready after 60 seconds"); + } + + void WaitForMySqlToBeReady() + { + var attempt = 0; + while (attempt < 30) + { + try + { + using var conn = new MySqlConnector.MySqlConnection("Server=localhost;Port=3306;Database=wolverine;User=root;Password=P@55w0rd;"); + conn.Open(); + var cmd = conn.CreateCommand(); + cmd.CommandText = "SELECT 1"; + cmd.ExecuteNonQuery(); + Log.Information("MySQL is up and ready!"); + return; + } + catch (Exception) + { + Thread.Sleep(2000); + attempt++; + } + } + + Log.Warning("MySQL did not become ready after 60 seconds"); + } + + void WaitForOracleToBeReady() + { + var attempt = 0; + while (attempt < 60) + { + try + { + using var conn = new Oracle.ManagedDataAccess.Client.OracleConnection("User Id=wolverine;Password=wolverine;Data Source=localhost:1521/FREEPDB1"); + conn.Open(); + var cmd = conn.CreateCommand(); + cmd.CommandText = "SELECT 1 FROM DUAL"; + cmd.ExecuteNonQuery(); + Log.Information("Oracle is up and ready!"); + return; + } + catch (Exception) + { + Thread.Sleep(2000); + attempt++; + } + } + + Log.Warning("Oracle did not become ready after 120 seconds"); + } + + void WaitForLocalStackToBeReady() + { + var attempt = 0; + using var httpClient = new System.Net.Http.HttpClient { Timeout = TimeSpan.FromSeconds(5) }; + while (attempt < 30) + { + try + { + var response = httpClient.GetAsync("http://localhost:4566/_localstack/health").GetAwaiter().GetResult(); + if (response.IsSuccessStatusCode) + { + Log.Information("LocalStack is up and ready!"); + return; + } + } + catch (Exception) + { + // ignore connection errors + } + + Thread.Sleep(2000); + attempt++; + } + + Log.Warning("LocalStack did not become ready after 60 seconds"); + } + + void WaitForAzureServiceBusEmulatorToBeReady() + { + var attempt = 0; + while (attempt < 30) + { + try + { + using var tcpClient = new System.Net.Sockets.TcpClient(); + tcpClient.Connect("localhost", 5673); + Log.Information("Azure Service Bus emulator is up and ready!"); + return; + } + catch (Exception) + { + // ignore connection errors + } + + Thread.Sleep(2000); + attempt++; + } + + Log.Warning("Azure Service Bus emulator did not become ready after 60 seconds"); + } + + /// + /// Builds specific test projects (not the entire solution). + /// + void BuildTestProjects(params AbsolutePath[] projects) + { + BuildTestProjectsWithFramework(null, projects); + } + + void BuildTestProjectsWithFramework(string frameworkOverride, params AbsolutePath[] projects) + { + var framework = frameworkOverride ?? Framework; + foreach (var project in projects) + { + Log.Information("Building {Project} ({Framework})...", project.Name, framework ?? "all"); + DotNetBuild(c => c + .SetProjectFile(project) + .SetConfiguration(Configuration) + .SetFramework(framework)); + } + } + + // ─── Persistence CI Targets ──────────────────────────────────────── + + Target CIPersistence => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var persistenceTests = RootDirectory / "src" / "Persistence" / "PersistenceTests" / "PersistenceTests.csproj"; + var postgresqlTests = RootDirectory / "src" / "Persistence" / "PostgresqlTests" / "PostgresqlTests.csproj"; + + BuildTestProjects(postgresqlTests); + // PersistenceTests only targets net8.0/net9.0 + BuildTestProjectsWithFramework("net9.0", persistenceTests); + StartDockerServices("postgresql", "sqlserver", "rabbitmq"); + + RunSingleProjectOneClassAtATime(persistenceTests, frameworkOverride: "net9.0"); + RunSingleProjectOneClassAtATime(postgresqlTests); + }); + + Target CISqlite => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var sqliteTests = RootDirectory / "src" / "Persistence" / "SqliteTests" / "SqliteTests.csproj"; + + BuildTestProjects(sqliteTests); + + RunSingleProjectOneClassAtATime(sqliteTests); + }); + + Target CISqlServer => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var sqlServerTests = RootDirectory / "src" / "Persistence" / "SqlServerTests" / "SqlServerTests.csproj"; + + BuildTestProjects(sqlServerTests); + StartDockerServices("sqlserver"); + + RunSingleProjectOneClassAtATime(sqlServerTests); + }); + + Target CIMarten => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var martenTests = RootDirectory / "src" / "Persistence" / "MartenTests" / "MartenTests.csproj"; + var martenSubscriptionTests = RootDirectory / "src" / "Persistence" / "MartenSubscriptionTests" / "MartenSubscriptionTests.csproj"; + + BuildTestProjects(martenTests, martenSubscriptionTests); + StartDockerServices("postgresql"); + + RunSingleProjectOneClassAtATime(martenTests); + RunSingleProjectOneClassAtATime(martenSubscriptionTests); + }); + + Target CIMySql => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var mySqlTests = RootDirectory / "src" / "Persistence" / "MySql" / "MySqlTests" / "MySqlTests.csproj"; + + BuildTestProjects(mySqlTests); + StartDockerServices("mysql"); + + RunSingleProjectOneClassAtATime(mySqlTests); + }); + + Target CIOracle => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var oracleTests = RootDirectory / "src" / "Persistence" / "Oracle" / "OracleTests" / "OracleTests.csproj"; + + BuildTestProjects(oracleTests); + StartDockerServices("oracle"); + + RunSingleProjectOneClassAtATime(oracleTests); + }); + + Target CIEfCore => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var efCoreTests = RootDirectory / "src" / "Persistence" / "EfCoreTests" / "EfCoreTests.csproj"; + var efCoreMultiTenancy = RootDirectory / "src" / "Persistence" / "EfCoreTests.MultiTenancy" / "EfCoreTests.MultiTenancy.csproj"; + + BuildTestProjects(efCoreTests, efCoreMultiTenancy); + StartDockerServices("postgresql", "sqlserver"); + + RunSingleProjectOneClassAtATime(efCoreTests); + RunSingleProjectOneClassAtATime(efCoreMultiTenancy); + }); + + // ─── Transport CI Targets ────────────────────────────────────────── + + Target CIAWS => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var sqsTests = RootDirectory / "src" / "Transports" / "AWS" / "Wolverine.AmazonSqs.Tests" / "Wolverine.AmazonSqs.Tests.csproj"; + var snsTests = RootDirectory / "src" / "Transports" / "AWS" / "Wolverine.AmazonSns.Tests" / "Wolverine.AmazonSns.Tests.csproj"; + + BuildTestProjects(sqsTests, snsTests); + StartDockerServices("localstack", "postgresql"); + + RunSingleProjectOneClassAtATime(sqsTests); + RunSingleProjectOneClassAtATime(snsTests); + }); + + Target CIKafka => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var tests = RootDirectory / "src" / "Transports" / "Kafka" / "Wolverine.Kafka.Tests" / "Wolverine.Kafka.Tests.csproj"; + + BuildTestProjects(tests); + StartDockerServices("postgresql"); + + RunSingleProjectOneClassAtATime(tests); + }); + + Target CIMQTT => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var tests = RootDirectory / "src" / "Transports" / "MQTT" / "Wolverine.MQTT.Tests" / "Wolverine.MQTT.Tests.csproj"; + + BuildTestProjects(tests); + StartDockerServices("postgresql"); + + RunSingleProjectOneClassAtATime(tests); + }); + + Target CINATS => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var tests = RootDirectory / "src" / "Transports" / "NATS" / "Wolverine.Nats.Tests" / "Wolverine.Nats.Tests.csproj"; + + BuildTestProjects(tests); + StartDockerServices("postgresql"); + + RunSingleProjectOneClassAtATime(tests); + }); + + Target CIPulsar => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var tests = RootDirectory / "src" / "Transports" / "Pulsar" / "Wolverine.Pulsar.Tests" / "Wolverine.Pulsar.Tests.csproj"; + + BuildTestProjects(tests); + + RunSingleProjectOneClassAtATime(tests); + }); + + Target CIRedis => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var tests = RootDirectory / "src" / "Transports" / "Redis" / "Wolverine.Redis.Tests" / "Wolverine.Redis.Tests.csproj"; + + BuildTestProjects(tests); + StartDockerServices("postgresql"); + + RunSingleProjectOneClassAtATime(tests); + }); + + Target CIHttp => _ => _ + .Executes(() => + { + var tests = RootDirectory / "src" / "Http" / "Wolverine.Http.Tests" / "Wolverine.Http.Tests.csproj"; + + BuildTestProjects(tests); + StartDockerServices("postgresql"); + + var framework = Framework; + DotNetTest(c => c + .SetProjectFile(tests) + .SetConfiguration(Configuration) + .SetFramework(framework) + .EnableNoBuild()); + }); + + Target CIRabbitMQ => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var rabbitTests = RootDirectory / "src" / "Transports" / "RabbitMQ" / "Wolverine.RabbitMQ.Tests" / "Wolverine.RabbitMQ.Tests.csproj"; + var circuitTests = RootDirectory / "src" / "Transports" / "RabbitMQ" / "CircuitBreakingTests" / "CircuitBreakingTests.csproj"; + + BuildTestProjects(rabbitTests, circuitTests); + StartDockerServices("rabbitmq", "postgresql", "sqlserver"); + + RunSingleProjectOneClassAtATime(rabbitTests); + RunSingleProjectOneClassAtATime(circuitTests); + }); + + Target CICosmosDb => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var cosmosDbTests = RootDirectory / "src" / "Persistence" / "CosmosDbTests" / "CosmosDbTests.csproj"; + var leaderElectionTests = RootDirectory / "src" / "Persistence" / "LeaderElection" / "CosmosDbTests.LeaderElection" / "CosmosDbTests.LeaderElection.csproj"; + + BuildTestProjects(cosmosDbTests, leaderElectionTests); + + RunSingleProjectOneClassAtATime(cosmosDbTests); + RunSingleProjectOneClassAtATime(leaderElectionTests); + }); + + Target CIAzureServiceBus => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var tests = RootDirectory / "src" / "Transports" / "Azure" / "Wolverine.AzureServiceBus.Tests" / "Wolverine.AzureServiceBus.Tests.csproj"; + + BuildTestProjects(tests); + StartDockerServices("asb-emulator"); + + RunSingleProjectOneClassAtATime(tests); + }); + + Target CIPolecat => _ => _ + .ProceedAfterFailure() + .Executes(() => + { + var polecatTests = RootDirectory / "src" / "Persistence" / "PolecatTests" / "PolecatTests.csproj"; + + BuildTestProjectsWithFramework("net10.0", polecatTests); + StartDockerServices("sqlserver"); + + RunSingleProjectOneClassAtATime(polecatTests, frameworkOverride: "net10.0"); + }); +} diff --git a/build/TestAllPersistence.cs b/build/TestAllPersistence.cs index 2dd51d0e8..fbbdebf9c 100644 --- a/build/TestAllPersistence.cs +++ b/build/TestAllPersistence.cs @@ -1,6 +1,8 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text.RegularExpressions; using Nuke.Common; using Nuke.Common.IO; using Nuke.Common.Tools.DotNet; @@ -15,10 +17,163 @@ partial class Build .Executes(() => { var persistenceDir = RootDirectory / "src" / "Persistence"; - RunTestProjectsOneFileAtATime(persistenceDir); + RunTestProjectsOneClassAtATime(persistenceDir); }); - void RunTestProjectsOneFileAtATime(AbsolutePath directory) + /// + /// Files that are never test classes and should be skipped during discovery. + /// + static readonly HashSet SkippedFileNames = new(StringComparer.OrdinalIgnoreCase) + { + "NoParallelization", + "GlobalUsings", + "AssemblyInfo", + "Usings", + "ModuleInitializer", + }; + + /// + /// Regex patterns that indicate a file contains xUnit test methods. + /// + static readonly Regex TestAttributePattern = new( + @"\[\s*(Fact|Theory|InlineData|MemberData|ClassData)", + RegexOptions.Compiled); + + /// + /// Determines if a project is a leader election test project, + /// which requires running each test method individually. + /// + static bool IsLeaderElectionProject(string projectPath) + { + var projectName = Path.GetFileNameWithoutExtension(projectPath); + return projectName.Contains("LeaderElection", StringComparison.OrdinalIgnoreCase); + } + + /// + /// Discovers test classes from source files by looking for [Fact] or [Theory] attributes. + /// Returns the class name (file name without extension) for files that contain tests. + /// + static List DiscoverTestClasses(string projectDir) + { + var testFiles = Directory.GetFiles(projectDir, "*.cs", SearchOption.AllDirectories) + .Where(f => !f.Contains($"{Path.DirectorySeparatorChar}obj{Path.DirectorySeparatorChar}") + && !f.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}")) + .OrderBy(f => f) + .ToList(); + + var testClasses = new List(); + foreach (var testFile in testFiles) + { + var className = Path.GetFileNameWithoutExtension(testFile); + + if (SkippedFileNames.Contains(className)) + continue; + + try + { + var content = File.ReadAllText(testFile); + if (TestAttributePattern.IsMatch(content)) + { + testClasses.Add(className); + } + } + catch (Exception ex) + { + Log.Warning("Could not read {File}: {Message}", testFile, ex.Message); + } + } + + return testClasses; + } + + /// + /// Discovers individual test method names from source files for leader election projects. + /// Returns tuples of (className, methodName). + /// + static List<(string ClassName, string MethodName)> DiscoverTestMethods(string projectDir) + { + var methodPattern = new Regex( + @"\[\s*(?:Fact|Theory).*?\]\s*(?:\[.*?\]\s*)*public\s+(?:async\s+)?(?:Task|void)\s+(\w+)\s*\(", + RegexOptions.Compiled | RegexOptions.Singleline); + + var testFiles = Directory.GetFiles(projectDir, "*.cs", SearchOption.AllDirectories) + .Where(f => !f.Contains($"{Path.DirectorySeparatorChar}obj{Path.DirectorySeparatorChar}") + && !f.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}")) + .ToList(); + + var results = new List<(string, string)>(); + + foreach (var testFile in testFiles) + { + var className = Path.GetFileNameWithoutExtension(testFile); + if (SkippedFileNames.Contains(className)) continue; + + try + { + var content = File.ReadAllText(testFile); + var matches = methodPattern.Matches(content); + foreach (Match match in matches) + { + results.Add((className, match.Groups[1].Value)); + } + } + catch (Exception ex) + { + Log.Warning("Could not read {File}: {Message}", testFile, ex.Message); + } + } + + return results; + } + + /// + /// Runs a single dotnet test invocation with retry logic. + /// Returns true if the test passed (on first attempt or retry). + /// + bool RunTestWithRetry(string projectPath, string filter, string description, int maxAttempts = 2, string frameworkOverride = null) + { + var framework = frameworkOverride ?? Framework; + for (var attempt = 1; attempt <= maxAttempts; attempt++) + { + try + { + if (attempt > 1) + { + Log.Warning(" Retry attempt {Attempt} for {Description}", attempt, description); + } + + DotNetTest(c => c + .SetProjectFile(projectPath) + .SetConfiguration(Configuration) + .EnableNoBuild() + .EnableNoRestore() + .SetFramework(framework) + .SetFilter(filter)); + + return true; + } + catch (Exception ex) + { + if (attempt == maxAttempts) + { + Log.Error(" {Description} failed after {Attempts} attempts: {Message}", + description, maxAttempts, ex.Message); + return false; + } + + Log.Warning(" {Description} failed on attempt {Attempt}, will retry: {Message}", + description, attempt, ex.Message); + } + } + + return false; + } + + /// + /// Improved test runner that discovers actual test classes from source, + /// runs each class in isolation, and supports leader election one-test-at-a-time mode. + /// + void RunTestProjectsOneClassAtATime(AbsolutePath directory) { var testProjects = directory.GlobFiles("**/*Tests.csproj", "**/*Tests/*.csproj") .Select(p => p.ToString()) @@ -26,38 +181,127 @@ void RunTestProjectsOneFileAtATime(AbsolutePath directory) .OrderBy(p => p) .ToList(); + var failedTests = new List(); + foreach (var projectPath in testProjects) { - var projectDir = Path.GetDirectoryName(projectPath); - var testFiles = Directory.GetFiles(projectDir!, "*.cs", SearchOption.AllDirectories) - .Where(f => !f.Contains($"{Path.DirectorySeparatorChar}obj{Path.DirectorySeparatorChar}") - && !f.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}")) - .OrderBy(f => f) - .ToList(); - + var projectDir = Path.GetDirectoryName(projectPath)!; var projectName = Path.GetFileNameWithoutExtension(projectPath); - Log.Information("Running tests one file at a time for {Project} ({Count} files)", projectName, testFiles.Count); - foreach (var testFile in testFiles) + if (IsLeaderElectionProject(projectPath)) + { + // Leader election: run each test method individually + var testMethods = DiscoverTestMethods(projectDir); + Log.Information("Running leader election tests one method at a time for {Project} ({Count} tests)", + projectName, testMethods.Count); + + foreach (var (className, methodName) in testMethods) + { + var filter = $"FullyQualifiedName~{className}.{methodName}"; + var description = $"{projectName}/{className}.{methodName}"; + Log.Information(" Running {Description}...", description); + + if (!RunTestWithRetry(projectPath, filter, description)) + { + failedTests.Add(description); + } + } + } + else + { + // Normal: run one class at a time + var testClasses = DiscoverTestClasses(projectDir); + Log.Information("Running tests one class at a time for {Project} ({Count} classes)", + projectName, testClasses.Count); + + foreach (var className in testClasses) + { + var filter = AppendCategoryFilter($"FullyQualifiedName~{className}"); + var description = $"{projectName}/{className}"; + Log.Information(" Running {Description}...", description); + + if (!RunTestWithRetry(projectPath, filter, description)) + { + failedTests.Add(description); + } + } + } + } + + if (failedTests.Any()) + { + Log.Error("The following tests failed after retries:"); + foreach (var test in failedTests) + { + Log.Error(" - {Test}", test); + } + } + } + + /// + /// Appends Category!=Flaky to a test filter when running in CI. + /// + static string AppendCategoryFilter(string filter) + { + return filter + "&Category!=Flaky"; + } + + /// + /// Runs a single test project one class at a time with retry logic. + /// Used by individual Nuke targets for specific test projects. + /// + void RunSingleProjectOneClassAtATime(string projectPath, string frameworkOverride = null) + { + var projectDir = Path.GetDirectoryName(projectPath)!; + var projectName = Path.GetFileNameWithoutExtension(projectPath); + var failedTests = new List(); + + if (IsLeaderElectionProject(projectPath)) + { + var testMethods = DiscoverTestMethods(projectDir); + Log.Information("Running leader election tests one method at a time for {Project} ({Count} tests)", + projectName, testMethods.Count); + + foreach (var (className, methodName) in testMethods) { - var className = Path.GetFileNameWithoutExtension(testFile); - Log.Information(" Running tests in {ClassName}...", className); + var filter = AppendCategoryFilter($"FullyQualifiedName~{className}.{methodName}"); + var description = $"{projectName}/{className}.{methodName}"; + Log.Information(" Running {Description}...", description); - try + if (!RunTestWithRetry(projectPath, filter, description, frameworkOverride: frameworkOverride)) { - DotNetTest(c => c - .SetProjectFile(projectPath) - .SetConfiguration(Configuration) - .EnableNoBuild() - .EnableNoRestore() - .SetFramework(Framework) - .SetFilter($"FullyQualifiedName~{className}")); + failedTests.Add(description); } - catch (Exception ex) + } + } + else + { + var testClasses = DiscoverTestClasses(projectDir); + Log.Information("Running tests one class at a time for {Project} ({Count} classes)", + projectName, testClasses.Count); + + foreach (var className in testClasses) + { + var filter = AppendCategoryFilter($"FullyQualifiedName~{className}"); + var description = $"{projectName}/{className}"; + Log.Information(" Running {Description}...", description); + + if (!RunTestWithRetry(projectPath, filter, description, frameworkOverride: frameworkOverride)) { - Log.Error(" Tests in {ClassName} failed: {Message}", className, ex.Message); + failedTests.Add(description); } } } + + if (failedTests.Any()) + { + Log.Error("The following tests failed after retries:"); + foreach (var test in failedTests) + { + Log.Error(" - {Test}", test); + } + + throw new Exception($"{failedTests.Count} test(s) failed in {projectName}"); + } } } diff --git a/build/TestAllTransports.cs b/build/TestAllTransports.cs index ae8794895..a227f62dc 100644 --- a/build/TestAllTransports.cs +++ b/build/TestAllTransports.cs @@ -1,11 +1,4 @@ -using System; -using System.IO; -using System.Linq; using Nuke.Common; -using Nuke.Common.IO; -using Nuke.Common.Tools.DotNet; -using Serilog; -using static Nuke.Common.Tools.DotNet.DotNetTasks; partial class Build { @@ -15,6 +8,6 @@ partial class Build .Executes(() => { var transportsDir = RootDirectory / "src" / "Transports"; - RunTestProjectsOneFileAtATime(transportsDir); + RunTestProjectsOneClassAtATime(transportsDir); }); } diff --git a/build/build.csproj b/build/build.csproj index 122f244a0..cdae85c67 100644 --- a/build/build.csproj +++ b/build/build.csproj @@ -12,8 +12,11 @@ + + + \ No newline at end of file diff --git a/ci-improvements.md b/ci-improvements.md new file mode 100644 index 000000000..095cc18a1 --- /dev/null +++ b/ci-improvements.md @@ -0,0 +1,55 @@ +# CI Improvements - Remaining Work & Status + +## Completed TestContainers Migrations + +| Transport | Status | Notes | +|-----------|--------|-------| +| NATS | Done | Collection fixture with reference counting | +| Redis | Done | ModuleInitializer, 87/87 pass | +| Kafka | Done | ModuleInitializer, 91 pass / 2 transient DLQ failures | +| Pulsar | Done | ModuleInitializer, 89 pass / 12 flaky reliability tests | +| MQTT | Done | Generic ContainerBuilder for Mosquitto, 73 pass / 3 transient | +| AWS SQS | Done | LocalStack v4, 140 pass / 4 RawJson failures (pre-existing) | +| AWS SNS | Done | LocalStack v4, 78/78 pass | +| CosmosDb | Done (testing) | Shared static container, awaiting test results | +| Azure Service Bus | Done (untested locally) | ServiceBusBuilder with MsSql backing store | + +## Remaining TestContainers Work + +- **GCP Pub/Sub**: Not yet converted. Uses docker-compose `pubsub-emulator` on port 8085. Would need generic ContainerBuilder with `gcr.io/google.com/cloudsdktool/google-cloud-cli` or similar. +- **CosmosDb test verification**: Test run `bzrh2vnsw` in progress with shared static container fix. Previous run failed (56/62) due to multiple AppFixture instances each starting their own emulator. +- **Azure Service Bus test verification**: Not tested locally yet. The ServiceBusContainerFixture uses Testcontainers.ServiceBus module with MsSql backing store. + +## CI Target / Workflow Status + +| Target | Workflow | Status | +|--------|----------|--------| +| CIPersistence | persistence.yml | Reduced: sqlite, PersistenceTests, sqlserver, postgresql | +| CIMySql | mysql.yml | New: split from persistence | +| CIOracle | oracle.yml | New: split from persistence | +| CIEfCore | efcore.yml | Existing | +| CIAWS | aws.yml | Updated: no localstack in docker-compose | +| CIKafka | kafka.yml | Updated: no kafka in docker-compose | +| CIMQTT | mqtt.yml | Updated: no mosquitto in docker-compose | +| CINATS | nats.yml | Updated: no nats in docker-compose | +| CIPulsar | pulsar.yml | Updated: no docker-compose at all | +| CIRedis | redis.yml | Updated: no redis in docker-compose | +| CIRabbitMQ | rabbitmq.yml | Fixed: added sqlserver to docker services | +| CIHttp | http.yml | Simplified: plain dotnet test (no retry) | +| CICosmosDb | cosmosdb.yml | New | +| CIAzureServiceBus | azure-service-bus.yml | New | + +## Known Pre-existing Test Failures + +- **SQS RawJson tests** (4 tests): `receive_raw_json_as_buffered` and `receive_raw_json_as_inline` - LocalStack v4 incompatibility with native JSON message handling +- **Pulsar reliability tests** (~12 tests): Timing-sensitive retry/redelivery tests that are flaky +- **Kafka DLQ tests** (2 tests): Transient timing issues with dead letter queue +- **MQTT tests** (3 tests): Transient timing issues +- **RabbitMQ flaky tests**: `use_fan_out_exchange`, `use_direct_exchange_with_binding_key`, DLQ polling tests with tight timeouts (1.25s) + +## Potential Future Improvements + +- Increase DLQ polling timeouts in RabbitMQ tests (currently 5 retries * 250ms = 1.25s) +- Consider converting RabbitMQ to TestContainers (currently uses docker-compose) +- Consider converting PostgreSQL/SQL Server to TestContainers (currently docker-compose, used by many projects) +- Add `[Trait]` attributes to flaky tests for optional skip in CI diff --git a/docker-compose.yml b/docker-compose.yml index 019774d29..1ddd27c4e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,14 +6,14 @@ networks: services: mosquitto: - image: "eclipse-mosquitto:latest" + image: "eclipse-mosquitto:2" ports: - "1883:1883" volumes: - ./docker/mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf postgresql: - image: "postgres:latest" + image: "postgres:17" ports: - "5433:5432" environment: @@ -42,15 +42,15 @@ services: "--log-http", "--user-output-enabled", ] - + rabbitmq: - image: "rabbitmq:management" + image: "rabbitmq:4-management" ports: - "5672:5672" - "15672:15672" sqlserver: - image: "mcr.microsoft.com/azure-sql-edge" + image: "mcr.microsoft.com/azure-sql-edge:latest" ports: - "1434:1433" environment: @@ -59,14 +59,14 @@ services: - "MSSQL_PID=Developer" pulsar: - image: "apachepulsar/pulsar:latest" + image: "apachepulsar/pulsar:4.0" ports: - "6650:6650" - "8080:8080" command: bin/pulsar standalone localstack: - image: localstack/localstack:stable + image: localstack/localstack:4 ports: - "127.0.0.1:4566:4566" # LocalStack Gateway - "127.0.0.1:4510-4559:4510-4559" # external services port range @@ -80,29 +80,21 @@ services: - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack" - "/var/run/docker.sock:/var/run/docker.sock" - zookeeper: - image: confluentinc/cp-zookeeper:latest - environment: - ZOOKEEPER_CLIENT_PORT: 2181 - ZOOKEEPER_TICK_TIME: 2000 - ports: - - 22181:2181 - kafka: - image: confluentinc/confluent-local:latest + image: confluentinc/confluent-local:7.7.1 ports: - "8082:8082" - "9092:9092" - "9101:9101" - + redis-server: - image: "redis:alpine" + image: "redis:7-alpine" command: redis-server ports: - "6379:6379" nats: - image: "nats:latest" + image: "nats:2" ports: - "4222:4222" - "8222:8222" @@ -128,7 +120,7 @@ services: - ./docker/oracle:/container-entrypoint-initdb.d asb-sql: - image: "mcr.microsoft.com/azure-sql-edge" + image: "mcr.microsoft.com/azure-sql-edge:latest" environment: - "ACCEPT_EULA=Y" - "MSSQL_SA_PASSWORD=Strong_Passw0rd#2025" @@ -161,7 +153,7 @@ services: - "PROTOCOL=https" asb-sql-2: - image: "mcr.microsoft.com/azure-sql-edge" + image: "mcr.microsoft.com/azure-sql-edge:latest" environment: - "ACCEPT_EULA=Y" - "MSSQL_SA_PASSWORD=Strong_Passw0rd#2025" @@ -183,4 +175,4 @@ services: depends_on: - asb-sql-2 networks: - sb-emulator-2: \ No newline at end of file + sb-emulator-2: diff --git a/src/Extensions/Wolverine.DataAnnotationsValidation.Tests/configuration_specs.cs b/src/Extensions/Wolverine.DataAnnotationsValidation.Tests/configuration_specs.cs index 233d628f9..316113b9a 100644 --- a/src/Extensions/Wolverine.DataAnnotationsValidation.Tests/configuration_specs.cs +++ b/src/Extensions/Wolverine.DataAnnotationsValidation.Tests/configuration_specs.cs @@ -39,16 +39,16 @@ public async Task place_or_not_place_the_middleware_correctly() // Not proud of this code var handlers = (HandlerGraph)typeof(WolverineOptions) - .GetProperty(nameof(HandlerGraph), BindingFlags.NonPublic | BindingFlags.Instance) - .GetValue(wolverineOptions); + .GetProperty(nameof(HandlerGraph), BindingFlags.NonPublic | BindingFlags.Instance)! + .GetValue(wolverineOptions)!; - handlers.ChainFor().Middleware.OfType() + handlers.ChainFor()!.Middleware.OfType() .Any(x => x.HandlerType == typeof(DataAnnotationsValidationExecutor) && x.Method.Name == nameof(DataAnnotationsValidationExecutor.Validate)) .ShouldBeTrue(); - + // No validators here, but the middleware will always be applied - handlers.ChainFor().Middleware.OfType() + handlers.ChainFor()!.Middleware.OfType() .Any(x => x.HandlerType == typeof(DataAnnotationsValidationExecutor)) .ShouldBeTrue(); } @@ -57,17 +57,17 @@ public async Task place_or_not_place_the_middleware_correctly() public class Command1 { [Required] - public string Name { get; set; } + public string Name { get; set; } = null!; [Required] - public string Color { get; set; } + public string Color { get; set; } = null!; [Range(3, int.MaxValue)] public int Number { get; set; } } public class Command2 : IValidatableObject { - public string Name { get; set; } - public string Color { get; set; } + public string Name { get; set; } = null!; + public string Color { get; set; } = null!; public IEnumerable Validate(ValidationContext validationContext) { diff --git a/src/Extensions/Wolverine.DataAnnotationsValidation.Tests/end_to_end.cs b/src/Extensions/Wolverine.DataAnnotationsValidation.Tests/end_to_end.cs index 829abebad..0c5c1c8e3 100644 --- a/src/Extensions/Wolverine.DataAnnotationsValidation.Tests/end_to_end.cs +++ b/src/Extensions/Wolverine.DataAnnotationsValidation.Tests/end_to_end.cs @@ -35,7 +35,7 @@ public async Task invoke_sad_path_with_multiple_validators() var command = new Command1 { - Name = null, Color = "blue", Number = 4 + Name = null!, Color = "blue", Number = 4 }; await Should.ThrowAsync(() => host.InvokeAsync(command)); @@ -70,7 +70,7 @@ public async Task invoke_sad_path_with_single_validator() var command = new Command2 { - Name = null + Name = null! }; await Should.ThrowAsync(() => host.InvokeAsync(command)); diff --git a/src/Extensions/Wolverine.FluentValidation.Tests/configuration_specs.cs b/src/Extensions/Wolverine.FluentValidation.Tests/configuration_specs.cs index b495ae20f..b42bb4fd9 100644 --- a/src/Extensions/Wolverine.FluentValidation.Tests/configuration_specs.cs +++ b/src/Extensions/Wolverine.FluentValidation.Tests/configuration_specs.cs @@ -27,10 +27,10 @@ public async Task register_validators_in_application_assembly() var container = host.Services.GetRequiredService(); // No args, this needs to be a singleton - container.DefaultFor>() + container.DefaultFor>()! .Lifetime.ShouldBe(ServiceLifetime.Singleton); - container.DefaultFor>() + container.DefaultFor>()! .Lifetime.ShouldBe(ServiceLifetime.Scoped); } @@ -65,21 +65,21 @@ public async Task place_or_not_place_the_middleware_correctly() // Not proud of this code var handlers = (HandlerGraph)typeof(WolverineOptions) - .GetProperty(nameof(HandlerGraph), BindingFlags.NonPublic | BindingFlags.Instance) - .GetValue(wolverineOptions); + .GetProperty(nameof(HandlerGraph), BindingFlags.NonPublic | BindingFlags.Instance)! + .GetValue(wolverineOptions)!; - handlers.ChainFor().Middleware.OfType() + handlers.ChainFor()!.Middleware.OfType() .Any(x => x.HandlerType == typeof(FluentValidationExecutor) && x.Method.Name == nameof(FluentValidationExecutor.ExecuteMany)) .ShouldBeTrue(); - handlers.ChainFor().Middleware.OfType() + handlers.ChainFor()!.Middleware.OfType() .Any(x => x.HandlerType == typeof(FluentValidationExecutor) && x.Method.Name == nameof(FluentValidationExecutor.ExecuteOne)) .ShouldBeTrue(); // No validators here - handlers.ChainFor().Middleware.OfType() + handlers.ChainFor()!.Middleware.OfType() .Any(x => x.HandlerType == typeof(FluentValidationExecutor)) .ShouldBeFalse(); } @@ -87,8 +87,8 @@ public async Task place_or_not_place_the_middleware_correctly() public class Command1 { - public string Name { get; set; } - public string Color { get; set; } + public string Name { get; set; } = null!; + public string Color { get; set; } = null!; public int Number { get; set; } } @@ -133,8 +133,8 @@ public async Task IsUniqueUsername(string userName) public class Command2 { - public string Name { get; set; } - public string Color { get; set; } + public string Name { get; set; } = null!; + public string Color { get; set; } = null!; } public class FancyCommand2Validator : AbstractValidator diff --git a/src/Extensions/Wolverine.FluentValidation.Tests/end_to_end.cs b/src/Extensions/Wolverine.FluentValidation.Tests/end_to_end.cs index 71b54610a..ebba5c5ba 100644 --- a/src/Extensions/Wolverine.FluentValidation.Tests/end_to_end.cs +++ b/src/Extensions/Wolverine.FluentValidation.Tests/end_to_end.cs @@ -40,7 +40,7 @@ public async Task invoke_sad_path_with_multiple_validators() var command = new Command1 { - Name = null, Color = "blue", Number = 4 + Name = null!, Color = "blue", Number = 4 }; await Should.ThrowAsync(() => host.InvokeAsync(command)); @@ -79,7 +79,7 @@ public async Task invoke_sad_path_with_single_validator() var command = new Command2 { - Name = null + Name = null! }; await Should.ThrowAsync(() => host.InvokeAsync(command)); diff --git a/src/Extensions/Wolverine.FluentValidation/Internals/FluentValidationPolicy.cs b/src/Extensions/Wolverine.FluentValidation/Internals/FluentValidationPolicy.cs index 1c4787cf5..731862d34 100644 --- a/src/Extensions/Wolverine.FluentValidation/Internals/FluentValidationPolicy.cs +++ b/src/Extensions/Wolverine.FluentValidation/Internals/FluentValidationPolicy.cs @@ -22,7 +22,7 @@ public void Apply(HandlerChain chain, IServiceContainer container) var registered = container.RegistrationsFor(validatorInterface); if (registered.Count() == 1) { - var method = typeof(FluentValidationExecutor).GetMethod(nameof(FluentValidationExecutor.ExecuteOne)) + var method = typeof(FluentValidationExecutor).GetMethod(nameof(FluentValidationExecutor.ExecuteOne))! .MakeGenericMethod(chain.MessageType); var methodCall = new MethodCall(typeof(FluentValidationExecutor), method); @@ -30,7 +30,7 @@ public void Apply(HandlerChain chain, IServiceContainer container) } else if (registered.Count() > 1) { - var method = typeof(FluentValidationExecutor).GetMethod(nameof(FluentValidationExecutor.ExecuteMany)) + var method = typeof(FluentValidationExecutor).GetMethod(nameof(FluentValidationExecutor.ExecuteMany))! .MakeGenericMethod(chain.MessageType); var methodCall = new MethodCall(typeof(FluentValidationExecutor), method); diff --git a/src/Extensions/Wolverine.FluentValidation/WolverineFluentValidationExtensions.cs b/src/Extensions/Wolverine.FluentValidation/WolverineFluentValidationExtensions.cs index 60fcaceec..4ba198e34 100644 --- a/src/Extensions/Wolverine.FluentValidation/WolverineFluentValidationExtensions.cs +++ b/src/Extensions/Wolverine.FluentValidation/WolverineFluentValidationExtensions.cs @@ -49,7 +49,7 @@ public static WolverineOptions UseFluentValidation(this WolverineOptions options { using var provider = options.Services.BuildServiceProvider(); var jasperFxOptions = provider.GetService>(); - if (jasperFxOptions.Value != null) + if (jasperFxOptions?.Value != null) { options.ApplicationAssembly = jasperFxOptions.Value.ApplicationAssembly; } diff --git a/src/Extensions/Wolverine.MemoryPack.Tests/Messages.cs b/src/Extensions/Wolverine.MemoryPack.Tests/Messages.cs index 00b00e35e..e35fd2f37 100644 --- a/src/Extensions/Wolverine.MemoryPack.Tests/Messages.cs +++ b/src/Extensions/Wolverine.MemoryPack.Tests/Messages.cs @@ -5,7 +5,7 @@ namespace Wolverine.MemoryPack.Tests; [MemoryPackable] public partial class MemoryPackMessage { - public string Name; + public string Name = null!; } // fake handler diff --git a/src/Extensions/Wolverine.MemoryPack.Tests/end_to_end.cs b/src/Extensions/Wolverine.MemoryPack.Tests/end_to_end.cs index dd35d1e0d..a24dee77e 100644 --- a/src/Extensions/Wolverine.MemoryPack.Tests/end_to_end.cs +++ b/src/Extensions/Wolverine.MemoryPack.Tests/end_to_end.cs @@ -10,8 +10,8 @@ namespace Wolverine.MemoryPack.Tests; public class end_to_end : IAsyncLifetime { - private IHost _publishingHost; - private IHost _receivingHost; + private IHost _publishingHost = null!; + private IHost _receivingHost = null!; [Fact] public async Task end_to_end_message_send_using_memorypack() diff --git a/src/Extensions/Wolverine.MessagePack.Tests/Messages.cs b/src/Extensions/Wolverine.MessagePack.Tests/Messages.cs index 535049923..0c3d48e11 100644 --- a/src/Extensions/Wolverine.MessagePack.Tests/Messages.cs +++ b/src/Extensions/Wolverine.MessagePack.Tests/Messages.cs @@ -6,13 +6,13 @@ namespace Wolverine.MessagePack.Tests; public class MessagePackMessage { [Key(0)] - public string Name; + public string Name = null!; } [MessagePackObject(keyAsPropertyName: true)] public class MessagePackKeylessMessage { - public string Name; + public string Name = null!; } [MessagePackObject] diff --git a/src/Extensions/Wolverine.MessagePack.Tests/end_to_end.cs b/src/Extensions/Wolverine.MessagePack.Tests/end_to_end.cs index 12b26a530..a827e0798 100644 --- a/src/Extensions/Wolverine.MessagePack.Tests/end_to_end.cs +++ b/src/Extensions/Wolverine.MessagePack.Tests/end_to_end.cs @@ -11,8 +11,8 @@ namespace Wolverine.MessagePack.Tests; public class end_to_end : IAsyncLifetime { - private IHost _publishingHost; - private IHost _receivingHost; + private IHost _publishingHost = null!; + private IHost _receivingHost = null!; [Fact] public async Task end_to_end_message_send_using_messagepack() diff --git a/src/Extensions/Wolverine.Protobuf.Tests/end_to_end.cs b/src/Extensions/Wolverine.Protobuf.Tests/end_to_end.cs index 16d49ed80..3e2a5dc70 100644 --- a/src/Extensions/Wolverine.Protobuf.Tests/end_to_end.cs +++ b/src/Extensions/Wolverine.Protobuf.Tests/end_to_end.cs @@ -11,8 +11,8 @@ namespace Wolverine.Protobuf.Tests; public class end_to_end : IAsyncLifetime { - private IHost _publishingHost; - private IHost _receivingHost; + private IHost _publishingHost = null!; + private IHost _receivingHost = null!; [Fact] public async Task end_to_end_message_send_using_protobuf() diff --git a/src/Extensions/Wolverine.Protobuf/Internal/ProtobufMessageSerializer.cs b/src/Extensions/Wolverine.Protobuf/Internal/ProtobufMessageSerializer.cs index 574cfe637..a8b08e457 100644 --- a/src/Extensions/Wolverine.Protobuf/Internal/ProtobufMessageSerializer.cs +++ b/src/Extensions/Wolverine.Protobuf/Internal/ProtobufMessageSerializer.cs @@ -6,6 +6,8 @@ namespace Wolverine.Protobuf.Internal; internal class ProtobufMessageSerializer(ProtobufSerializerOptions options) : IMessageSerializer { + // ReSharper disable once NotAccessedField.Local + private readonly ProtobufSerializerOptions _options = options; public string ContentType => "binary/protobuf"; public object ReadFromData(Type messageType, Envelope envelope) diff --git a/src/Http/CrazyStartingWebApp/Program.cs b/src/Http/CrazyStartingWebApp/Program.cs index 1c483ffe7..7073f717a 100644 --- a/src/Http/CrazyStartingWebApp/Program.cs +++ b/src/Http/CrazyStartingWebApp/Program.cs @@ -78,7 +78,7 @@ public Task StartAsync(CancellationToken cancellationToken) { hostApplicationLifetime.ApplicationStarted.Register((_, ct) => { - StartClientInLoop(cancellationToken); + _ = StartClientInLoop(cancellationToken); }, null); return Task.CompletedTask; } @@ -88,7 +88,7 @@ private async Task StartClientInLoop(CancellationToken token) await Task.Delay(2000, token); var address = server.Features.Get()?.Addresses.First(); - var client = new Client(address); + var client = new Client(address!); while (!token.IsCancellationRequested) { var success = await client.CallEndpointsConcurrently(); diff --git a/src/Http/OpenApiDemonstrator/Endpoints.cs b/src/Http/OpenApiDemonstrator/Endpoints.cs index 8be918d14..fa28d62d2 100644 --- a/src/Http/OpenApiDemonstrator/Endpoints.cs +++ b/src/Http/OpenApiDemonstrator/Endpoints.cs @@ -46,6 +46,6 @@ public class Message1; public class ResponseModel { - public string Name { get; set; } + public string Name { get; set; } = null!; public int Age { get; set; } } \ No newline at end of file diff --git a/src/Http/Wolverine.Http.Marten/CompiledQueryWriterPolicy.cs b/src/Http/Wolverine.Http.Marten/CompiledQueryWriterPolicy.cs index deab112d7..927438d12 100644 --- a/src/Http/Wolverine.Http.Marten/CompiledQueryWriterPolicy.cs +++ b/src/Http/Wolverine.Http.Marten/CompiledQueryWriterPolicy.cs @@ -37,7 +37,7 @@ public bool TryApply(HttpChain chain) { // This call runs the query var queryCall = - typeof(MartenQueryMethodCall<,>).CloseAndBuildAs(result, arguments); + typeof(MartenQueryMethodCall<,>).CloseAndBuildAs(result!, arguments); chain.Postprocessors.Add(queryCall); // This call writes the response directly to the HttpContext as a string @@ -50,7 +50,7 @@ public bool TryApply(HttpChain chain) { var writeJsonCall = - typeof(MartenWriteJsonToStreamMethodCall<,>).CloseAndBuildAs(result, + typeof(MartenWriteJsonToStreamMethodCall<,>).CloseAndBuildAs(result!, (_responseType, _successStatusCode), arguments); chain.Postprocessors.Add(writeJsonCall); } @@ -59,7 +59,7 @@ public bool TryApply(HttpChain chain) } } -public class MartenQueryMethodCall : MethodCall +public class MartenQueryMethodCall : MethodCall where TDoc : notnull { public MartenQueryMethodCall(Variable resultVariable) : base(typeof(IDocumentSession), FindMethod()) { @@ -73,7 +73,7 @@ static MethodInfo FindMethod() } } -public class MartenWriteJsonToStreamMethodCall : MethodCall +public class MartenWriteJsonToStreamMethodCall : MethodCall where TDoc : notnull { public MartenWriteJsonToStreamMethodCall(Variable resultVariable, (string responseType, int successStatusCode) options) : base(typeof(QueryableExtensions), FindMethod(resultVariable)) { diff --git a/src/Http/Wolverine.Http.Marten/WolverineTenantDetectedSessionFactory.cs b/src/Http/Wolverine.Http.Marten/WolverineTenantDetectedSessionFactory.cs index 87ab94e4e..8d468c110 100644 --- a/src/Http/Wolverine.Http.Marten/WolverineTenantDetectedSessionFactory.cs +++ b/src/Http/Wolverine.Http.Marten/WolverineTenantDetectedSessionFactory.cs @@ -75,7 +75,7 @@ public override IQuerySession QuerySession() var tenantId = _options.TryDetectTenantIdSynchronously(_contextAccessor.HttpContext); - return _store.QuerySession(tenantId); + return _store.QuerySession(tenantId!); } public override SessionOptions BuildOptions() @@ -83,7 +83,7 @@ public override SessionOptions BuildOptions() var tenantId = _contextAccessor.HttpContext == null ? null : _options.TryDetectTenantIdSynchronously(_contextAccessor.HttpContext); var options = new SessionOptions { - TenantId = tenantId, + TenantId = tenantId!, Tracking = DocumentTracking.None }; diff --git a/src/Http/Wolverine.Http.Tests/Bugs/Bug_1295_aggregate_handler_should_not_try_to_use_query_string.cs b/src/Http/Wolverine.Http.Tests/Bugs/Bug_1295_aggregate_handler_should_not_try_to_use_query_string.cs index 74ac3b5db..9db094915 100644 --- a/src/Http/Wolverine.Http.Tests/Bugs/Bug_1295_aggregate_handler_should_not_try_to_use_query_string.cs +++ b/src/Http/Wolverine.Http.Tests/Bugs/Bug_1295_aggregate_handler_should_not_try_to_use_query_string.cs @@ -87,7 +87,7 @@ public record TestInput(string Id); public class TestAggregate { - public string Id { get; set; } + public string Id { get; set; } = null!; public void Apply(TestEvent _) => Debug.WriteLine("okay"); diff --git a/src/Http/Wolverine.Http.Tests/Bugs/Bug_1941_do_not_try_to_parse_IPAddress.cs b/src/Http/Wolverine.Http.Tests/Bugs/Bug_1941_do_not_try_to_parse_IPAddress.cs index ed11ee6d2..f91ab85ce 100644 --- a/src/Http/Wolverine.Http.Tests/Bugs/Bug_1941_do_not_try_to_parse_IPAddress.cs +++ b/src/Http/Wolverine.Http.Tests/Bugs/Bug_1941_do_not_try_to_parse_IPAddress.cs @@ -62,7 +62,7 @@ public static (IResult, IPAddress?) LoadAsync(HttpContext httpContext) public class IpRequest { - public string Name { get; set; } + public string Name { get; set; } = null!; public int Age { get; set; } } diff --git a/src/Http/Wolverine.Http.Tests/Bugs/Bug_505_required_attribute_not_working.cs b/src/Http/Wolverine.Http.Tests/Bugs/Bug_505_required_attribute_not_working.cs index 94599afeb..8ef85e9cb 100644 --- a/src/Http/Wolverine.Http.Tests/Bugs/Bug_505_required_attribute_not_working.cs +++ b/src/Http/Wolverine.Http.Tests/Bugs/Bug_505_required_attribute_not_working.cs @@ -81,10 +81,10 @@ public Task LoadAsync(Guid breederId, string what, CancellationToken cance { if (Breeders.TryGetValue(breederId, out var breeder)) { - return Task.FromResult(breeder as T); + return Task.FromResult((breeder as T)!); } - return Task.FromResult(null); + return Task.FromResult(null!); } } @@ -99,7 +99,7 @@ public static async Task Before(ChangeVisionCommand c, ClaimsPrincipal } public static async Task LoadAsync(ChangeVisionCommand c, AggregateRepository r, CancellationToken ct) - => await r.LoadAsync(c.BreederId, null, ct); + => await r.LoadAsync(c.BreederId, null!, ct); [Tags("Breeder")] [ProducesResponseType(204)] diff --git a/src/Http/Wolverine.Http.Tests/Bugs/Bug_582_erroneous_faliure_ack.cs b/src/Http/Wolverine.Http.Tests/Bugs/Bug_582_erroneous_faliure_ack.cs index 86b0811fd..bf2533ad8 100644 --- a/src/Http/Wolverine.Http.Tests/Bugs/Bug_582_erroneous_faliure_ack.cs +++ b/src/Http/Wolverine.Http.Tests/Bugs/Bug_582_erroneous_faliure_ack.cs @@ -41,7 +41,7 @@ await host.Scenario(x => public class CreateItemCommand { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class ItemCreated @@ -52,7 +52,7 @@ public class ItemCreated public class ItemDocument { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public class ItemHandler diff --git a/src/Http/Wolverine.Http.Tests/Bugs/Bug_772_Saga_codegen.cs b/src/Http/Wolverine.Http.Tests/Bugs/Bug_772_Saga_codegen.cs index f0483e44d..3439d490a 100644 --- a/src/Http/Wolverine.Http.Tests/Bugs/Bug_772_Saga_codegen.cs +++ b/src/Http/Wolverine.Http.Tests/Bugs/Bug_772_Saga_codegen.cs @@ -78,7 +78,7 @@ public Task GetData(Guid messageDataId) public class RecordData { public Guid MessageDataId { get; set; } - public string Data { get; set; } + public string Data { get; set; } = null!; } public record BeginProcess(Guid DataId); diff --git a/src/Http/Wolverine.Http.Tests/Bugs/Bug_970_starting_up_in_mediator_only_mode.cs b/src/Http/Wolverine.Http.Tests/Bugs/Bug_970_starting_up_in_mediator_only_mode.cs index ce43a9c73..0ffb22cf3 100644 --- a/src/Http/Wolverine.Http.Tests/Bugs/Bug_970_starting_up_in_mediator_only_mode.cs +++ b/src/Http/Wolverine.Http.Tests/Bugs/Bug_970_starting_up_in_mediator_only_mode.cs @@ -74,16 +74,16 @@ public class ProjectOverview { public Guid UserId { get; set; } public Guid Id { get; set; } - public string Name { get; set; } - public string Category { get; set; } + public string Name { get; set; } = null!; + public string Category { get; set; } = null!; } public class Project { public Guid Id { get; set; } public Guid UserId { get; set; } - public string Name { get; set; } - public string Category { get; set; } + public string Name { get; set; } = null!; + public string Category { get; set; } = null!; } public class GetProjectsHandler(IQuerySession session) diff --git a/src/Http/Wolverine.Http.Tests/Bugs/Bug_using_fromquery_with_aggregatehandler.cs b/src/Http/Wolverine.Http.Tests/Bugs/Bug_using_fromquery_with_aggregatehandler.cs index 2629ee760..730c08e60 100644 --- a/src/Http/Wolverine.Http.Tests/Bugs/Bug_using_fromquery_with_aggregatehandler.cs +++ b/src/Http/Wolverine.Http.Tests/Bugs/Bug_using_fromquery_with_aggregatehandler.cs @@ -28,7 +28,7 @@ public record FromQueryAggregateHandlerEvent(Guid Id, string Something); public class FromQueryAggregateHandlerAggregate { public Guid Id { get; set; } - public string Something{get;set;} + public string Something{get;set;} = null!; public void Apply(FromQueryAggregateHandlerEvent e){ this.Id = e.Id; diff --git a/src/Http/Wolverine.Http.Tests/CodeGeneration/service_location_assertions.cs b/src/Http/Wolverine.Http.Tests/CodeGeneration/service_location_assertions.cs index 5fc2b8bf2..401863a15 100644 --- a/src/Http/Wolverine.Http.Tests/CodeGeneration/service_location_assertions.cs +++ b/src/Http/Wolverine.Http.Tests/CodeGeneration/service_location_assertions.cs @@ -26,7 +26,7 @@ public class service_location_assertions { public readonly ServiceDescriptor descriptor1 = new ServiceDescriptor(typeof(IWidget), typeof(AWidget)); public readonly ServiceDescriptor descripter2 = new ServiceDescriptor(typeof(IWidget), "B", typeof(BWidget)); - public readonly HttpChain theChain = new HttpChain(MethodCall.For(x => x.Post(null, null, null, null)), new HttpGraph(new WolverineOptions(), Substitute.For())); + public readonly HttpChain theChain = new HttpChain(MethodCall.For(x => x.Post(null!, null!, null!, null!)), new HttpGraph(new WolverineOptions(), Substitute.For())); public readonly RecordingLogger theLogger = new(); private IServiceProvider servicesWithPolicy(ServiceLocationPolicy policy) @@ -290,7 +290,7 @@ public string Post(WidgetRequest request, IWidget widget, IThing thing, HttpCont context.RequestServices.GetRequiredService().ShouldBeSameAs(thing); - return widget.ToString(); + return widget.ToString()!; } } @@ -371,7 +371,7 @@ public interface IUserContext public class UserContext : IUserContext { - public string UserId { get; set; } + public string UserId { get; set; } = null!; } public class UserContextFactory diff --git a/src/Http/Wolverine.Http.Tests/Marten/document_attribute_usage.cs b/src/Http/Wolverine.Http.Tests/Marten/document_attribute_usage.cs index 5bbd73933..205941cb3 100644 --- a/src/Http/Wolverine.Http.Tests/Marten/document_attribute_usage.cs +++ b/src/Http/Wolverine.Http.Tests/Marten/document_attribute_usage.cs @@ -68,7 +68,7 @@ await Host.Scenario(x => }); var loaded = await session.LoadAsync(invoice.Id); - loaded.Paid.ShouldBeTrue(); + loaded!.Paid.ShouldBeTrue(); } [Fact] @@ -86,6 +86,6 @@ await Host.Scenario(x => }); var loaded = await session.LoadAsync(invoice.Id); - loaded.Approved.ShouldBeTrue(); + loaded!.Approved.ShouldBeTrue(); } } \ No newline at end of file diff --git a/src/Http/Wolverine.Http.Tests/Marten/multi_tenanted_session_factory_without_wolverine.cs b/src/Http/Wolverine.Http.Tests/Marten/multi_tenanted_session_factory_without_wolverine.cs index b6d59553f..8ea37f0e3 100644 --- a/src/Http/Wolverine.Http.Tests/Marten/multi_tenanted_session_factory_without_wolverine.cs +++ b/src/Http/Wolverine.Http.Tests/Marten/multi_tenanted_session_factory_without_wolverine.cs @@ -69,12 +69,12 @@ public async Task can_do_the_tenancy_detection() } var blueDoc = await host.GetAsJson("/color?tenant=blue"); - blueDoc.Number.ShouldBe(1); - + blueDoc!.Number.ShouldBe(1); + var greenDoc = await host.GetAsJson("/color?tenant=green"); - greenDoc.Number.ShouldBe(2); + greenDoc!.Number.ShouldBe(2); } - + [Fact] public async Task can_do_the_tenancy_detection_with_custom_metadata() { @@ -101,7 +101,7 @@ public async Task can_do_the_tenancy_detection_with_custom_metadata() }); #endregion - + // This is using Alba, which uses WebApplicationFactory under the covers await using var host = await AlbaHost.For(builder, app => { @@ -121,7 +121,7 @@ public async Task can_do_the_tenancy_detection_with_custom_metadata() await session.SaveChangesAsync(); } - + // Store the green doc using (var session = store.LightweightSession("green")) { @@ -135,15 +135,15 @@ public async Task can_do_the_tenancy_detection_with_custom_metadata() } var blueDoc = await host.GetAsJson("/color?tenant=blue"); - blueDoc.Number.ShouldBe(1); - + blueDoc!.Number.ShouldBe(1); + var greenDoc = await host.GetAsJson("/color?tenant=green"); - greenDoc.Number.ShouldBe(2); + greenDoc!.Number.ShouldBe(2); } } public class ColorDoc { - public string Id { get; set; } + public string Id { get; set; } = null!; public int Number { get; set; } } \ No newline at end of file diff --git a/src/Http/Wolverine.Http.Tests/Marten/reacting_to_read_aggregate.cs b/src/Http/Wolverine.Http.Tests/Marten/reacting_to_read_aggregate.cs index 61134de4e..8e91e0a34 100644 --- a/src/Http/Wolverine.Http.Tests/Marten/reacting_to_read_aggregate.cs +++ b/src/Http/Wolverine.Http.Tests/Marten/reacting_to_read_aggregate.cs @@ -13,7 +13,7 @@ namespace Wolverine.Http.Tests.Marten; public class reacting_to_read_aggregate : IAsyncLifetime { - private IAlbaHost theHost; + private IAlbaHost theHost = null!; public async Task InitializeAsync() { diff --git a/src/Http/Wolverine.Http.Tests/Marten/strong_typed_identifiers.cs b/src/Http/Wolverine.Http.Tests/Marten/strong_typed_identifiers.cs index e869c4755..738795f7e 100644 --- a/src/Http/Wolverine.Http.Tests/Marten/strong_typed_identifiers.cs +++ b/src/Http/Wolverine.Http.Tests/Marten/strong_typed_identifiers.cs @@ -79,11 +79,11 @@ await Scenario(x => }); var aggregate1 = await session.Events.FetchLatest(stream1Id); - aggregate1.BCount.ShouldBe(2); - + aggregate1!.BCount.ShouldBe(2); + var aggregate2 = await session.Events.FetchLatest(stream2Id); - aggregate2.BCount.ShouldBe(3); - + aggregate2!.BCount.ShouldBe(3); + } [Fact] @@ -94,7 +94,7 @@ public async Task batch_query_with_both_read_and_write_aggregate() using var session = Host.DocumentStore().LightweightSession(); session.Events.StartStream(stream1Id, new AEvent(), new BEvent(), new CEvent(), new CEvent()); - + session.Events.StartStream(stream2Id, new AEvent(), new BEvent(), new BEvent(), new AEvent(), new DEvent()); await session.SaveChangesAsync(); @@ -107,12 +107,12 @@ await Host.Scenario(x => }); var aggregate1 = await session.Events.FetchLatest(stream1Id); - aggregate1.BCount.ShouldBe(3); + aggregate1!.BCount.ShouldBe(3); aggregate1.ACount.ShouldBe(3); aggregate1.DCount.ShouldBe(1); - + var aggregate2 = await session.Events.FetchLatest(stream2Id); - aggregate2.BCount.ShouldBe(2); + aggregate2!.BCount.ShouldBe(2); } [Fact] diff --git a/src/Http/Wolverine.Http.Tests/Marten/using_read_aggregate_attribute.cs b/src/Http/Wolverine.Http.Tests/Marten/using_read_aggregate_attribute.cs index b593d48bf..1df253ffe 100644 --- a/src/Http/Wolverine.Http.Tests/Marten/using_read_aggregate_attribute.cs +++ b/src/Http/Wolverine.Http.Tests/Marten/using_read_aggregate_attribute.cs @@ -20,9 +20,9 @@ await Scenario(x => }); var result = await Host.GetAsJson("/orders/latest/" + id); - result.Items.Keys.ShouldContain("Socks"); + result!.Items.Keys.ShouldContain("Socks"); } - + [Fact] public async Task happy_path_reading_aggregate_and_version_in_url() { @@ -35,7 +35,7 @@ await Scenario(x => }); var result = await Host.GetAsJson("/orders/V1.0/latest/" + id); - result.Items.Keys.ShouldContain("Socks"); + result!.Items.Keys.ShouldContain("Socks"); } [Fact] @@ -60,6 +60,6 @@ await Scenario(x => }); var result = await Host.GetAsJson("/orders/latest/from-query?id=" + id); - result.Items.Keys.ShouldContain("Socks"); + result!.Items.Keys.ShouldContain("Socks"); } } \ No newline at end of file diff --git a/src/Http/Wolverine.Http.Tests/Marten/working_against_multiple_streams.cs b/src/Http/Wolverine.Http.Tests/Marten/working_against_multiple_streams.cs index fea37486a..892e2c1c1 100644 --- a/src/Http/Wolverine.Http.Tests/Marten/working_against_multiple_streams.cs +++ b/src/Http/Wolverine.Http.Tests/Marten/working_against_multiple_streams.cs @@ -24,7 +24,7 @@ private async Task fetchAmount(Guid id) { using var session = Host.DocumentStore().LightweightSession(); var account = await session.Events.FetchLatest(id); - return account.Amount; + return account!.Amount; } [Fact] diff --git a/src/Http/Wolverine.Http.Tests/MultiTenancy/multi_tenancy_detection_and_integration.cs b/src/Http/Wolverine.Http.Tests/MultiTenancy/multi_tenancy_detection_and_integration.cs index 168223844..9778ebce5 100644 --- a/src/Http/Wolverine.Http.Tests/MultiTenancy/multi_tenancy_detection_and_integration.cs +++ b/src/Http/Wolverine.Http.Tests/MultiTenancy/multi_tenancy_detection_and_integration.cs @@ -27,7 +27,7 @@ namespace Wolverine.Http.Tests.MultiTenancy; public class multi_tenancy_detection_and_integration : IAsyncDisposable, IDisposable { private readonly ITestOutputHelper _output; - private IAlbaHost theHost; + private IAlbaHost theHost = null!; public multi_tenancy_detection_and_integration(ITestOutputHelper output) { @@ -90,7 +90,7 @@ protected async Task configure(Action configure) app.MapWolverineEndpoints(configure); }, securityStub); - var graph = theHost.Services.GetRequiredService().Endpoints; + var graph = theHost.Services.GetRequiredService().Endpoints!; foreach (var chain in graph.Chains.OrderBy(x => x.Description)) { _output.WriteLine(chain.Description); @@ -374,10 +374,10 @@ await configure(opts => - var chain = theHost.Services.GetRequiredService().Endpoints + var chain = theHost.Services.GetRequiredService().Endpoints! .ChainFor("POST", "/tenant/{tenant}/formdata"); - - chain.IsFormData.ShouldBeTrue(); + + chain!.IsFormData.ShouldBeTrue(); var formData = new Dictionary { { "value", "blue" } }; var result = await theHost.Scenario(x => @@ -415,7 +415,7 @@ public static class TenantedEndpoints public static string GetTenantIdFromRoute(IMessageBus bus, TenantId tenantId) { tenantId.Value.ShouldBe(bus.TenantId); - return bus.TenantId; + return bus.TenantId!; } [Authorize] @@ -423,10 +423,10 @@ public static string GetTenantIdFromRoute(IMessageBus bus, TenantId tenantId) public static string GetTenantIdFromWhatever(IMessageBus bus, HttpContext httpContext, TenantId tenantId) { // IHttpActivityFeature.Activity is set to null after the request, so to access the - // Activity in the test we capture the Activity into a custom Feature + // Activity in the test we capture the Activity into a custom Feature httpContext.Features.Set(CustomActivityFeature.FromHttpContext(httpContext)); tenantId.Value.ShouldBe(bus.TenantId); - return bus.TenantId; + return bus.TenantId!; } [WolverineGet("/todo/{id}")] @@ -451,21 +451,21 @@ public static IMartenOp Create(CreateTodo command, TenantId tenantId) public static string GetTenantWithArgs1(IMessageBus bus, TenantId tenantId) { tenantId.Value.ShouldBe(bus.TenantId); - return bus.TenantId; + return bus.TenantId!; } [WolverineGet("/tenant/context/{tenant}")] public static string GetTenantWithArgs1(IMessageContext context, TenantId tenantId) { tenantId.Value.ShouldBe(context.TenantId); - return context.TenantId; + return context.TenantId!; } [WolverineGet("/tenant/both/{tenant}")] public static string GetTenantWithArgs1(IMessageContext context, IMessageBus bus, TenantId tenantId) { bus.TenantId.ShouldBe(context.TenantId); - return context.TenantId; + return context.TenantId!; } // in this combination, TenantId needs the [FromServices] attribute, otherwise codegen tries to @@ -512,9 +512,9 @@ public record CreateTodo(string Id, string Description); public class TenantTodo : ITenanted { - public string Id { get; set; } - public string Description { get; set; } - public string TenantId { get; set; } + public string Id { get; set; } = null!; + public string Description { get; set; } = null!; + public string? TenantId { get; set; } } // Custom HttpContext Feature used to capture the Activity diff --git a/src/Http/Wolverine.Http.Tests/Persistence/global_entity_defaults_http.cs b/src/Http/Wolverine.Http.Tests/Persistence/global_entity_defaults_http.cs index 7d1655ad8..e4e46ccbb 100644 --- a/src/Http/Wolverine.Http.Tests/Persistence/global_entity_defaults_http.cs +++ b/src/Http/Wolverine.Http.Tests/Persistence/global_entity_defaults_http.cs @@ -12,7 +12,7 @@ namespace Wolverine.Http.Tests.Persistence; public class global_entity_defaults_http : IAsyncLifetime { - private IAlbaHost theHost; + private IAlbaHost theHost = null!; public async Task InitializeAsync() { diff --git a/src/Http/Wolverine.Http.Tests/Persistence/reacting_to_entity_attributes.cs b/src/Http/Wolverine.Http.Tests/Persistence/reacting_to_entity_attributes.cs index a2d0f4ad9..4293e6216 100644 --- a/src/Http/Wolverine.Http.Tests/Persistence/reacting_to_entity_attributes.cs +++ b/src/Http/Wolverine.Http.Tests/Persistence/reacting_to_entity_attributes.cs @@ -16,7 +16,7 @@ namespace Wolverine.Http.Tests.Persistence; public class reacting_to_entity_attributes : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IAlbaHost theHost; + private IAlbaHost theHost = null!; public reacting_to_entity_attributes(ITestOutputHelper output) { @@ -106,9 +106,9 @@ public async Task throw_exception_on_missing() }); var text = tracked.ReadAsText(); - text.ShouldContain(typeof(RequiredDataMissingException).FullName); + text.ShouldContain(typeof(RequiredDataMissingException).FullName!); } - + [Fact] public async Task problem_details_400_on_missing_with_custom_message() { @@ -147,7 +147,7 @@ public async Task throw_exception_on_missing_with_custom_message() }); var text = tracked.ReadAsText(); - text.ShouldContain(typeof(RequiredDataMissingException).FullName); + text.ShouldContain(typeof(RequiredDataMissingException).FullName!); text.ShouldContain("Id 'nonexistent' is wrong!"); } diff --git a/src/Http/Wolverine.Http.Tests/Persistence/reacting_to_required_attribute.cs b/src/Http/Wolverine.Http.Tests/Persistence/reacting_to_required_attribute.cs index bc14e3913..29567edf8 100644 --- a/src/Http/Wolverine.Http.Tests/Persistence/reacting_to_required_attribute.cs +++ b/src/Http/Wolverine.Http.Tests/Persistence/reacting_to_required_attribute.cs @@ -13,7 +13,7 @@ public class reacting_to_required_attribute : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IAlbaHost theHost; + private IAlbaHost theHost = null!; public reacting_to_required_attribute(ITestOutputHelper output) { diff --git a/src/Http/Wolverine.Http.Tests/Samples/ExternalHttpServer.cs b/src/Http/Wolverine.Http.Tests/Samples/ExternalHttpServer.cs index b415312ac..8efa4c9ec 100644 --- a/src/Http/Wolverine.Http.Tests/Samples/ExternalHttpServer.cs +++ b/src/Http/Wolverine.Http.Tests/Samples/ExternalHttpServer.cs @@ -62,7 +62,7 @@ public TestCommand1 Handle(TestCommand command) public record TestCommand1(string message); -public class TestCommand1Handler(IMessageContext messageBus) +public class TestCommand1Handler { public void Handle(TestCommand1 command) { diff --git a/src/Http/Wolverine.Http.Tests/Samples/MultiTenancy.cs b/src/Http/Wolverine.Http.Tests/Samples/MultiTenancy.cs index 161c61b39..0ce91c8ca 100644 --- a/src/Http/Wolverine.Http.Tests/Samples/MultiTenancy.cs +++ b/src/Http/Wolverine.Http.Tests/Samples/MultiTenancy.cs @@ -19,7 +19,7 @@ public static async Task bootstrap(params string[] args) var connectionString = builder.Configuration.GetConnectionString("postgres"); builder.Services - .AddMarten(connectionString) + .AddMarten(connectionString!) .IntegrateWithWolverine(); builder.Host.UseWolverine(opts => diff --git a/src/Http/Wolverine.Http.Tests/Transport/CloudEventsHttpTransportTests.cs b/src/Http/Wolverine.Http.Tests/Transport/CloudEventsHttpTransportTests.cs index 35f464841..d01622262 100644 --- a/src/Http/Wolverine.Http.Tests/Transport/CloudEventsHttpTransportTests.cs +++ b/src/Http/Wolverine.Http.Tests/Transport/CloudEventsHttpTransportTests.cs @@ -51,7 +51,7 @@ public async Task send_envelope_as_cloud_event() _handler.LastRequest.ShouldNotBeNull(); _handler.LastRequest.Method.ShouldBe(HttpMethod.Post); - _handler.LastRequest.Content.Headers.ContentType.MediaType.ShouldBe(HttpTransport.CloudEventsContentType); + _handler.LastRequest.Content!.Headers.ContentType!.MediaType.ShouldBe(HttpTransport.CloudEventsContentType); // Verify the body contains a CloudEvents formatted JSON var content = Encoding.UTF8.GetString(_handler.LastContent); @@ -120,7 +120,7 @@ public async Task send_batch_with_cloud_events_uses_envelope_batch_content_type( _handler.LastRequest.ShouldNotBeNull(); // Note: CloudEvents client uses EnvelopeBatchContentType for batches - _handler.LastRequest.Content.Headers.ContentType.MediaType.ShouldBe(HttpTransport.EnvelopeBatchContentType); + _handler.LastRequest.Content!.Headers.ContentType!.MediaType.ShouldBe(HttpTransport.EnvelopeBatchContentType); } [Fact] @@ -143,13 +143,13 @@ public async Task cloud_events_with_null_options_uses_default() await _client.SendAsync(uri, envelope, null); _handler.LastRequest.ShouldNotBeNull(); - _handler.LastRequest.Content.Headers.ContentType.MediaType.ShouldBe(HttpTransport.CloudEventsContentType); + _handler.LastRequest.Content!.Headers.ContentType!.MediaType.ShouldBe(HttpTransport.CloudEventsContentType); } } public class TestMessage { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class CloudEventsTestCommand diff --git a/src/Http/Wolverine.Http.Tests/Transport/HttpEndpointTests.cs b/src/Http/Wolverine.Http.Tests/Transport/HttpEndpointTests.cs index e36fb0076..1188c08c2 100644 --- a/src/Http/Wolverine.Http.Tests/Transport/HttpEndpointTests.cs +++ b/src/Http/Wolverine.Http.Tests/Transport/HttpEndpointTests.cs @@ -25,13 +25,13 @@ public HttpEndpointTests() private ISender InvokeCreateSender(IWolverineRuntime runtime) { var method = typeof(HttpEndpoint).GetMethod("CreateSender", BindingFlags.Instance | BindingFlags.NonPublic); - return (ISender)method.Invoke(_endpoint, new object[] { runtime }); + return (ISender)method!.Invoke(_endpoint, new object[] { runtime })!; } private bool InvokeSupportsMode(EndpointMode mode) { var method = typeof(HttpEndpoint).GetMethod("supportsMode", BindingFlags.Instance | BindingFlags.NonPublic); - return (bool)method.Invoke(_endpoint, new object[] { mode }); + return (bool)method!.Invoke(_endpoint, new object[] { mode })!; } [Fact] diff --git a/src/Http/Wolverine.Http.Tests/Transport/WolverineHttpTransportClientTests.cs b/src/Http/Wolverine.Http.Tests/Transport/WolverineHttpTransportClientTests.cs index 0bed64f1e..dc4a377a9 100644 --- a/src/Http/Wolverine.Http.Tests/Transport/WolverineHttpTransportClientTests.cs +++ b/src/Http/Wolverine.Http.Tests/Transport/WolverineHttpTransportClientTests.cs @@ -42,8 +42,8 @@ public async Task send_envelope_async() _handler.LastRequest.ShouldNotBeNull(); _handler.LastRequest.Method.ShouldBe(HttpMethod.Post); - _handler.LastRequest.RequestUri.ToString().ShouldBe(uri); - _handler.LastRequest.Content.Headers.ContentType.MediaType.ShouldBe(HttpTransport.EnvelopeContentType); + _handler.LastRequest.RequestUri!.ToString().ShouldBe(uri); + _handler.LastRequest.Content!.Headers.ContentType!.MediaType.ShouldBe(HttpTransport.EnvelopeContentType); var expectedData = EnvelopeSerializer.Serialize(envelope); _handler.LastContent.ShouldBe(expectedData); @@ -68,8 +68,8 @@ public async Task send_batch_async() _handler.LastRequest.ShouldNotBeNull(); _handler.LastRequest.Method.ShouldBe(HttpMethod.Post); - _handler.LastRequest.RequestUri.ToString().ShouldBe("https://target-url/"); - _handler.LastRequest.Content.Headers.ContentType.MediaType.ShouldBe(HttpTransport.EnvelopeBatchContentType); + _handler.LastRequest.RequestUri!.ToString().ShouldBe("https://target-url/"); + _handler.LastRequest.Content!.Headers.ContentType!.MediaType.ShouldBe(HttpTransport.EnvelopeBatchContentType); var expectedData = EnvelopeSerializer.Serialize(envelopes); _handler.LastContent.ShouldBe(expectedData); @@ -78,8 +78,8 @@ public async Task send_batch_async() public class MockHttpMessageHandler : HttpMessageHandler { - public HttpRequestMessage LastRequest { get; private set; } - public byte[] LastContent { get; private set; } + public HttpRequestMessage LastRequest { get; private set; } = null!; + public byte[] LastContent { get; private set; } = null!; protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { diff --git a/src/Http/Wolverine.Http.Tests/asparameters_binding.cs b/src/Http/Wolverine.Http.Tests/asparameters_binding.cs index 78667cf6e..eb7218254 100644 --- a/src/Http/Wolverine.Http.Tests/asparameters_binding.cs +++ b/src/Http/Wolverine.Http.Tests/asparameters_binding.cs @@ -137,8 +137,8 @@ public async Task post_body_services_and_route_arguments() // First check this for OpenAPI generation var options = Host.Services.GetRequiredService(); - var chain = options.Endpoints.ChainFor("POST", "/asp2/{id}/{number}"); - chain.RequestType.ShouldBe(typeof(AsParameterBody)); + var chain = options.Endpoints!.ChainFor("POST", "/asp2/{id}/{number}"); + chain!.RequestType.ShouldBe(typeof(AsParameterBody)); response.Body.Name.ShouldBe("Jeremy"); response.Body.Direction.ShouldBe(Direction.East); diff --git a/src/Http/Wolverine.Http.Tests/dataannotations_validation_middleware.cs b/src/Http/Wolverine.Http.Tests/dataannotations_validation_middleware.cs index d878bd9e5..69d59f36a 100644 --- a/src/Http/Wolverine.Http.Tests/dataannotations_validation_middleware.cs +++ b/src/Http/Wolverine.Http.Tests/dataannotations_validation_middleware.cs @@ -45,7 +45,7 @@ public async Task one_validator_happy_path() [Fact] public async Task one_validator_sad_path() { - var createCustomer = new CreateAccount(null, "123"); + var createCustomer = new CreateAccount(null!, "123"); var results = await Host.Scenario(x => { diff --git a/src/Http/Wolverine.Http.Tests/endpoint_adds_requesttype_audit_tags_to_activity.cs b/src/Http/Wolverine.Http.Tests/endpoint_adds_requesttype_audit_tags_to_activity.cs index 79094ae48..b4b616273 100644 --- a/src/Http/Wolverine.Http.Tests/endpoint_adds_requesttype_audit_tags_to_activity.cs +++ b/src/Http/Wolverine.Http.Tests/endpoint_adds_requesttype_audit_tags_to_activity.cs @@ -14,7 +14,7 @@ public void finds_audit_members_from_attributes() { var chain = HttpChains.ChainFor("POST", "/auditable/empty"); - chain.AuditedMembers.Single() + chain!.AuditedMembers.Single() .MemberName.ShouldBe(nameof(AuditablePostBody.Id)); } } \ No newline at end of file diff --git a/src/Http/Wolverine.Http.Tests/endpoint_discovery_and_construction.cs b/src/Http/Wolverine.Http.Tests/endpoint_discovery_and_construction.cs index a5398a594..ca6e5b1c8 100644 --- a/src/Http/Wolverine.Http.Tests/endpoint_discovery_and_construction.cs +++ b/src/Http/Wolverine.Http.Tests/endpoint_discovery_and_construction.cs @@ -40,14 +40,14 @@ public void discover_csharp_static_bool_endpoint() public void read_order_from_attribute() { var chain = HttpChains.ChainFor("GET", "/fake/hello"); - chain.Endpoint.Order.ShouldBe(55); + chain!.Endpoint!.Order.ShouldBe(55); } [Fact] public void read_display_name_from_http_method_attribute() { var chain = HttpChains.ChainFor("GET", "/fake/hello"); - chain.Endpoint.DisplayName.ShouldBe("The Hello Route!"); + chain!.Endpoint!.DisplayName.ShouldBe("The Hello Route!"); } [Fact] @@ -55,7 +55,7 @@ public void ability_to_discern_cascaded_messages_in_tuple_return_values() { var chain = HttpChains.ChainFor("POST", "/spawn"); - chain.InputType().ShouldBe(typeof(SpawnInput)); + chain!.InputType().ShouldBe(typeof(SpawnInput)); chain.ResourceType.ShouldBe(typeof(string)); } diff --git a/src/Http/Wolverine.Http.Tests/fluent_validation_middleware.cs b/src/Http/Wolverine.Http.Tests/fluent_validation_middleware.cs index b3d33d2e1..d9c982477 100644 --- a/src/Http/Wolverine.Http.Tests/fluent_validation_middleware.cs +++ b/src/Http/Wolverine.Http.Tests/fluent_validation_middleware.cs @@ -45,7 +45,7 @@ public async Task one_validator_happy_path() [Fact] public async Task one_validator_sad_path() { - var createCustomer = new CreateCustomer(null, "Humphrey", "11111"); + var createCustomer = new CreateCustomer(null!, "Humphrey", "11111"); var results = await Scenario(x => { @@ -58,7 +58,7 @@ public async Task one_validator_sad_path() // in the request var problems = results.ReadAsJson(); } - + [Fact] public async Task one_validator_happy_path_on_complex_query_string_argument() { @@ -76,7 +76,7 @@ public async Task one_validator_happy_path_on_complex_query_string_argument() [Fact] public async Task one_validator_sad_path_on_complex_query_string_argument() { - var createCustomer = new CreateCustomer(null, "Humphrey", "11111"); + var createCustomer = new CreateCustomer(null!, "Humphrey", "11111"); var results = await Scenario(x => { @@ -96,7 +96,7 @@ public async Task one_validator_sad_path_on_complex_query_string_argument() [Fact] public async Task one_validator_sad_path_in_different_assembly() { - var createCustomer = new CreateCustomer2(null, "Humphrey", "11111"); + var createCustomer = new CreateCustomer2(null!, "Humphrey", "11111"); var results = await Scenario(x => { diff --git a/src/Http/Wolverine.Http.Tests/from_form_binding.cs b/src/Http/Wolverine.Http.Tests/from_form_binding.cs index 9e804b4c1..80d7bea66 100644 --- a/src/Http/Wolverine.Http.Tests/from_form_binding.cs +++ b/src/Http/Wolverine.Http.Tests/from_form_binding.cs @@ -94,15 +94,15 @@ public async Task nullable_number_on_setter() public async Task nullable_bool_on_setter() { (await forForm([new("name", "Jones"), new("number", "95")])).NullableFlag.ShouldBeNull(); - (await forForm([new("name", "Jones"), new("number", "95"), new("nullableFlag", "true")])).NullableFlag.Value.ShouldBeTrue(); - (await forForm([new("name", "Jones"), new("number", "95"), new("NullableFlag", "false")])).NullableFlag.Value.ShouldBeFalse(); + (await forForm([new("name", "Jones"), new("number", "95"), new("nullableFlag", "true")])).NullableFlag!.Value.ShouldBeTrue(); + (await forForm([new("name", "Jones"), new("number", "95"), new("NullableFlag", "false")])).NullableFlag!.Value.ShouldBeFalse(); } [Fact] public async Task nullable_enum_on_setter() { (await forForm([new("name", "Jones"), new("number", "95")])).NullableDirection.ShouldBeNull(); - (await forForm([new("name", "Jones"), new("number", "95"), new("nullableDirection", "east")])).NullableDirection.Value.ShouldBe(Direction.East); + (await forForm([new("name", "Jones"), new("number", "95"), new("nullableDirection", "east")])).NullableDirection!.Value.ShouldBe(Direction.East); } [Fact(Skip = "Alba doesnt support multiple values in form data")] diff --git a/src/Http/Wolverine.Http.Tests/from_query_binding.cs b/src/Http/Wolverine.Http.Tests/from_query_binding.cs index ec1d34dd0..53b592a2e 100644 --- a/src/Http/Wolverine.Http.Tests/from_query_binding.cs +++ b/src/Http/Wolverine.Http.Tests/from_query_binding.cs @@ -83,15 +83,15 @@ public async Task nullable_number_on_setter() public async Task nullable_bool_on_setter() { (await forQuerystring("name=Jones&number=95")).NullableFlag.ShouldBeNull(); - (await forQuerystring("name=Jones&number=95&nullableFlag=true")).NullableFlag.Value.ShouldBeTrue(); - (await forQuerystring("name=Jones&number=95&NullableFlag=false")).NullableFlag.Value.ShouldBeFalse(); + (await forQuerystring("name=Jones&number=95&nullableFlag=true")).NullableFlag!.Value.ShouldBeTrue(); + (await forQuerystring("name=Jones&number=95&NullableFlag=false")).NullableFlag!.Value.ShouldBeFalse(); } [Fact] public async Task nullable_enum_on_setter() { (await forQuerystring("name=Jones&number=95")).NullableDirection.ShouldBeNull(); - (await forQuerystring("name=Jones&number=95&nullableDirection=east")).NullableDirection.Value.ShouldBe(Direction.East); + (await forQuerystring("name=Jones&number=95&nullableDirection=east")).NullableDirection!.Value.ShouldBe(Direction.East); } [Fact] diff --git a/src/Http/Wolverine.Http.Tests/initializing_endpoints_from_method_call.cs b/src/Http/Wolverine.Http.Tests/initializing_endpoints_from_method_call.cs index f0ab280a4..648d0ad6f 100644 --- a/src/Http/Wolverine.Http.Tests/initializing_endpoints_from_method_call.cs +++ b/src/Http/Wolverine.Http.Tests/initializing_endpoints_from_method_call.cs @@ -38,7 +38,7 @@ public void build_pattern_using_http_pattern_with_attribute() { var endpoint = HttpChain.ChainFor(x => x.SayHello()); - endpoint.RoutePattern.RawText.ShouldBe("/fake/hello"); + endpoint!.RoutePattern!.RawText.ShouldBe("/fake/hello"); endpoint.RoutePattern.Parameters.Any().ShouldBeFalse(); } @@ -92,11 +92,11 @@ public void capturing_metadata_for_resource_type() metadata.Length.ShouldBeGreaterThanOrEqualTo(2); var responseBody = metadata.FirstOrDefault(x => x.StatusCode == 200); - responseBody.Type.ShouldBe(typeof(ArithmeticResults)); + responseBody!.Type.ShouldBe(typeof(ArithmeticResults)); responseBody.ContentTypes.Single().ShouldBe("application/json"); var noValue = metadata.FirstOrDefault(x => x.StatusCode == 404); - noValue.ContentTypes.Any().ShouldBeFalse(); + noValue!.ContentTypes.Any().ShouldBeFalse(); noValue.Type.ShouldBe(typeof(void)); } @@ -147,28 +147,28 @@ public void pick_up_metadata_from_attribute_on_method() [Fact] public void must_use_outbox_when_using_message_bus() { - var chain = HttpChain.ChainFor(x => x.Yes(null, null)); + var chain = HttpChain.ChainFor(x => x.Yes(null!, null!)); chain.RequiresOutbox().ShouldBeTrue(); } [Fact] public void does_not_use_outbox_when_not_using_message_bus() { - var chain = HttpChain.ChainFor(x => x.No(null)); + var chain = HttpChain.ChainFor(x => x.No(null!)); chain.RequiresOutbox().ShouldBeFalse(); } [Fact] public void default_tenancy_is_null() { - var chain = HttpChain.ChainFor(x => x.No(null)); + var chain = HttpChain.ChainFor(x => x.No(null!)); chain.TenancyMode.ShouldBeNull(); } [Fact] public void add_from_route_metadata() { - var chain = HttpChain.ChainFor(x => x.Get(null)); + var chain = HttpChain.ChainFor(x => x.Get(null!)); } } diff --git a/src/Http/Wolverine.Http.Tests/open_api_generation.cs b/src/Http/Wolverine.Http.Tests/open_api_generation.cs index 63d175d97..645cb74a1 100644 --- a/src/Http/Wolverine.Http.Tests/open_api_generation.cs +++ b/src/Http/Wolverine.Http.Tests/open_api_generation.cs @@ -39,7 +39,7 @@ public void verify_open_api_expectations(HttpChain chain) { var opType = Enum.Parse(chain.HttpMethods.Single(), true); - var (item, op) = FindOpenApiDocument(opType, chain.RoutePattern.RawText); + var (item, op) = FindOpenApiDocument(opType, chain.RoutePattern!.RawText!); item.ShouldNotBeNull(); op.ShouldNotBeNull(); diff --git a/src/Http/Wolverine.Http.Tests/routename_applies_routenamemetadata_to_route.cs b/src/Http/Wolverine.Http.Tests/routename_applies_routenamemetadata_to_route.cs index 4b1599383..53f70170a 100644 --- a/src/Http/Wolverine.Http.Tests/routename_applies_routenamemetadata_to_route.cs +++ b/src/Http/Wolverine.Http.Tests/routename_applies_routenamemetadata_to_route.cs @@ -13,6 +13,6 @@ public routename_applies_routenamemetadata_to_route(AppFixture fixture) : base(f public void routename_applies_routenamemetadata() { var chain = HttpChains.ChainFor("POST", "/named/route"); - chain.Endpoint.Metadata.Any(m => m is RouteNameMetadata { RouteName: "NamedRoute"}).ShouldBeTrue(); + chain!.Endpoint!.Metadata.Any(m => m is RouteNameMetadata { RouteName: "NamedRoute"}).ShouldBeTrue(); } } \ No newline at end of file diff --git a/src/Http/Wolverine.Http.Tests/swashbuckle_integration.cs b/src/Http/Wolverine.Http.Tests/swashbuckle_integration.cs index eb0621b3d..0ceedbb80 100644 --- a/src/Http/Wolverine.Http.Tests/swashbuckle_integration.cs +++ b/src/Http/Wolverine.Http.Tests/swashbuckle_integration.cs @@ -27,7 +27,7 @@ public async Task wolverine_stuff_is_in_the_document() [Fact] public void ignore_endpoint_methods_that_are_marked_with_ExcludeFromDescription() { - HttpChains.Chains.Any(x => x.RoutePattern.RawText == "/ignore").ShouldBeTrue(); + HttpChains.Chains.Any(x => x.RoutePattern!.RawText == "/ignore").ShouldBeTrue(); var generator = Host.Services.GetRequiredService(); var doc = generator.GetSwagger("v1"); diff --git a/src/Http/Wolverine.Http.Tests/todo_endpoint_specs.cs b/src/Http/Wolverine.Http.Tests/todo_endpoint_specs.cs index 7c7df0e76..93c2f30b8 100644 --- a/src/Http/Wolverine.Http.Tests/todo_endpoint_specs.cs +++ b/src/Http/Wolverine.Http.Tests/todo_endpoint_specs.cs @@ -31,7 +31,7 @@ await Scenario(opts => }); var changes = await session.LoadAsync(todo.Id); - changes.IsComplete.ShouldBeTrue(); + changes!.IsComplete.ShouldBeTrue(); changes.Name.ShouldBe("Second"); } @@ -49,7 +49,7 @@ await Scenario(opts => }); var changes = await session.LoadAsync(todo.Id); - changes.IsComplete.ShouldBeTrue(); + changes!.IsComplete.ShouldBeTrue(); changes.Name.ShouldBe("Second"); } diff --git a/src/Http/Wolverine.Http.Tests/using_create_response_and_metadata_derived_from_response_type.cs b/src/Http/Wolverine.Http.Tests/using_create_response_and_metadata_derived_from_response_type.cs index 67a8d56f2..554d3441c 100644 --- a/src/Http/Wolverine.Http.Tests/using_create_response_and_metadata_derived_from_response_type.cs +++ b/src/Http/Wolverine.Http.Tests/using_create_response_and_metadata_derived_from_response_type.cs @@ -13,7 +13,7 @@ public using_create_response_and_metadata_derived_from_response_type(AppFixture [Fact] public void read_metadata_from_IEndpointMetadataProvider() { - var chain = HttpChain.ChainFor(x => x.Create(null)); + var chain = HttpChain.ChainFor(x => x.Create(null!)); var endpoint = chain.BuildEndpoint(RouteWarmup.Lazy); diff --git a/src/Http/Wolverine.Http.Tests/using_form_parameters.cs b/src/Http/Wolverine.Http.Tests/using_form_parameters.cs index ff2d4c550..2aa4989dc 100644 --- a/src/Http/Wolverine.Http.Tests/using_form_parameters.cs +++ b/src/Http/Wolverine.Http.Tests/using_form_parameters.cs @@ -535,6 +535,6 @@ public void trouble_shoot_form_matching() var parameter = method.Method.GetParameters().Single(); var variable = chain.TryFindOrCreateFormValue(parameter); - variable.Creator.ShouldBeOfType(); + variable!.Creator.ShouldBeOfType(); } } \ No newline at end of file diff --git a/src/Http/Wolverine.Http.Tests/using_marten.cs b/src/Http/Wolverine.Http.Tests/using_marten.cs index a32ed0d7a..e2ed47ec7 100644 --- a/src/Http/Wolverine.Http.Tests/using_marten.cs +++ b/src/Http/Wolverine.Http.Tests/using_marten.cs @@ -23,7 +23,7 @@ public async Task use_marten_document_session_without_outbox() var result = await Host.GetAsJson($"/data/{data.Id}"); - result.Name.ShouldBe("foo"); + result!.Name.ShouldBe("foo"); } [Fact] diff --git a/src/Http/Wolverine.Http.Tests/using_policies_and_attributes_to_customize_handling.cs b/src/Http/Wolverine.Http.Tests/using_policies_and_attributes_to_customize_handling.cs index c7a76f39d..fd3942739 100644 --- a/src/Http/Wolverine.Http.Tests/using_policies_and_attributes_to_customize_handling.cs +++ b/src/Http/Wolverine.Http.Tests/using_policies_and_attributes_to_customize_handling.cs @@ -35,9 +35,9 @@ public void attribute_usage_on_handler_level() endpoints.Any().ShouldBeTrue(); var testEndpoints = endpoints.Select(x => x.Metadata.GetMetadata()) - .Where(x => x != null).Where(x => x.Method.HandlerType == typeof(TestEndpoints)); + .Where(x => x != null).Where(x => x!.Method.HandlerType == typeof(TestEndpoints)); - foreach (var endpoint in testEndpoints) endpoint.Middleware.OfType().Any().ShouldBeTrue(); + foreach (var endpoint in testEndpoints) endpoint!.Middleware.OfType().Any().ShouldBeTrue(); } [Fact] @@ -49,8 +49,8 @@ public void attribute_usage_on_a_single_method() endpoints.Any().ShouldBeTrue(); var endpoint = endpoints.Select(x => x.Metadata.GetMetadata()) - .Where(x => x != null).Single(x => x.RoutePattern.RawText == "/data/{id}"); + .Where(x => x != null).Single(x => x!.RoutePattern!.RawText == "/data/{id}"); - endpoint.Middleware.OfType().Any().ShouldBeTrue(); + endpoint!.Middleware.OfType().Any().ShouldBeTrue(); } } \ No newline at end of file diff --git a/src/Http/Wolverine.Http.Tests/using_querystring_parameters.cs b/src/Http/Wolverine.Http.Tests/using_querystring_parameters.cs index 4599ed881..a489c377b 100644 --- a/src/Http/Wolverine.Http.Tests/using_querystring_parameters.cs +++ b/src/Http/Wolverine.Http.Tests/using_querystring_parameters.cs @@ -497,6 +497,6 @@ public void trouble_shoot_querystring_matching() var parameter = method.Method.GetParameters().Single(); var variable = chain.TryFindOrCreateQuerystringValue(parameter); - variable.Creator.ShouldBeOfType(); + variable!.Creator.ShouldBeOfType(); } } \ No newline at end of file diff --git a/src/Http/Wolverine.Http.Tests/using_storage_actions_and_entity_attribute.cs b/src/Http/Wolverine.Http.Tests/using_storage_actions_and_entity_attribute.cs index 489ee9bec..524c731d1 100644 --- a/src/Http/Wolverine.Http.Tests/using_storage_actions_and_entity_attribute.cs +++ b/src/Http/Wolverine.Http.Tests/using_storage_actions_and_entity_attribute.cs @@ -38,10 +38,10 @@ await Host.Scenario(x => }); var todo = await Load(command.Id); - - todo.Name.ShouldBe("Write docs"); + + todo!.Name.ShouldBe("Write docs"); } - + [Fact] public async Task use_store_as_return_value() { @@ -53,8 +53,8 @@ await Host.Scenario(x => }); var todo = await Load(command.Id); - - todo.Name.ShouldBe("Write docs"); + + todo!.Name.ShouldBe("Write docs"); } [Fact] @@ -70,9 +70,9 @@ await Host.Scenario(x => }); var todo = await Load(command.Id); - todo.Name.ShouldBe("New name"); + todo!.Name.ShouldBe("New name"); } - + [Fact] public async Task use_entity_attribute_with_entity_id() { @@ -86,9 +86,9 @@ await Host.Scenario(x => }); var todo = await Load(command.Id); - todo.Name.ShouldBe("New name2"); + todo!.Name.ShouldBe("New name2"); } - + [Fact] public async Task use_entity_attribute_with_explicit_id() { @@ -100,9 +100,9 @@ await Host.Scenario(x => x.Post.Json(new RenameTodo3(command.Id, "New name3")).ToUrl("/api/todo/update3"); x.StatusCodeShouldBe(204); }); - + var todo = await Load(command.Id); - todo.Name.ShouldBe("New name3"); + todo!.Name.ShouldBe("New name3"); } [Fact] @@ -123,7 +123,7 @@ await Host.Scenario(x => x.StatusCodeShouldBe(204); }); - (await Load(shouldInsert.Id)).Name.ShouldBe("Pick up milk"); + (await Load(shouldInsert.Id))!.Name.ShouldBe("Pick up milk"); (await Load(shouldDoNothing.Id)).ShouldBeNull(); } @@ -170,7 +170,7 @@ await Host.Scenario(x => x.StatusCodeShouldBe(204); }); - (await Load(todoId)).IsComplete.ShouldBeTrue(); + (await Load(todoId))!.IsComplete.ShouldBeTrue(); } [Fact] @@ -194,7 +194,7 @@ await Host.Scenario(x => x.StatusCodeShouldBe(204); }); - (await Load(todoId)).IsComplete.ShouldBeTrue(); + (await Load(todoId))!.IsComplete.ShouldBeTrue(); } [Fact] @@ -211,7 +211,7 @@ await Host.Scenario(x => x.StatusCodeShouldBe(204); }); - (await Load(todoId)).IsComplete.ShouldBeTrue(); + (await Load(todoId))!.IsComplete.ShouldBeTrue(); } [Fact] diff --git a/src/Http/Wolverine.Http/CodeGen/AsParametersBindingFrame.cs b/src/Http/Wolverine.Http/CodeGen/AsParametersBindingFrame.cs index 0568ea492..65ab8b895 100644 --- a/src/Http/Wolverine.Http/CodeGen/AsParametersBindingFrame.cs +++ b/src/Http/Wolverine.Http/CodeGen/AsParametersBindingFrame.cs @@ -92,8 +92,8 @@ public AsParametersBindingFrame(Type queryType, HttpChain chain, IServiceContain { if (tryCreateFrame(parameter, chain, container, out var variable)) { - _parameters.Add(variable); - if (variable.Creator != null) + _parameters.Add(variable!); + if (variable!.Creator != null) { _parameterFrames.Add(variable.Creator); } @@ -111,8 +111,8 @@ public AsParametersBindingFrame(Type queryType, HttpChain chain, IServiceContain } else { - _props.Add(new AssignPropertyFrame(Variable, propertyInfo, variable)); - _dependencies.Add(variable); + _props.Add(new AssignPropertyFrame(Variable, propertyInfo, variable!)); + _dependencies.Add(variable!); } } } @@ -135,7 +135,7 @@ private bool tryCreateFrame(ParameterInfo parameter, HttpChain chain, IServiceCo { _hasForms = true; var formName = fatt.Name ?? memberName; - variable = chain.TryFindOrCreateFormValue(memberType, memberName, formName); + variable = chain.TryFindOrCreateFormValue(memberType, memberName!, formName); return true; } @@ -143,7 +143,7 @@ private bool tryCreateFrame(ParameterInfo parameter, HttpChain chain, IServiceCo { var queryStringName = qatt.Name ?? memberName; variable = - chain.TryFindOrCreateQuerystringValue(memberType, queryStringName); + chain.TryFindOrCreateQuerystringValue(memberType, queryStringName!); return true; } @@ -151,7 +151,7 @@ private bool tryCreateFrame(ParameterInfo parameter, HttpChain chain, IServiceCo if (parameter.TryGetAttribute(out var ratt)) { var routeArgumentName = ratt.Name ?? memberName; - if (chain.FindRouteVariable(memberType, routeArgumentName, out variable)) + if (chain.FindRouteVariable(memberType, routeArgumentName!, out variable)) { return true; } @@ -191,12 +191,12 @@ private bool tryCreateFrame(PropertyInfo propertyInfo, HttpChain chain, IService var memberType = propertyInfo.PropertyType; var memberName = propertyInfo.Name; - + if (propertyInfo.TryGetAttribute(out var fatt)) { _hasForms = true; var formName = fatt.Name ?? memberName; - variable = chain.TryFindOrCreateFormValue(memberType, memberName, formName); + variable = chain.TryFindOrCreateFormValue(memberType, memberName!, formName); return true; } @@ -204,7 +204,7 @@ private bool tryCreateFrame(PropertyInfo propertyInfo, HttpChain chain, IService { var queryStringName = qatt.Name ?? memberName; variable = - chain.TryFindOrCreateQuerystringValue(memberType, queryStringName); + chain.TryFindOrCreateQuerystringValue(memberType, queryStringName!); return true; } @@ -212,7 +212,7 @@ private bool tryCreateFrame(PropertyInfo propertyInfo, HttpChain chain, IService if (propertyInfo.TryGetAttribute(out var ratt)) { var routeArgumentName = ratt.Name ?? memberName; - if (chain.FindRouteVariable(memberType, routeArgumentName, out variable)) + if (chain.FindRouteVariable(memberType, routeArgumentName!, out variable)) { return true; } diff --git a/src/Http/Wolverine.Http/CodeGen/FormBindingFrame.cs b/src/Http/Wolverine.Http/CodeGen/FormBindingFrame.cs index ab5f85246..89cfbb3f9 100644 --- a/src/Http/Wolverine.Http/CodeGen/FormBindingFrame.cs +++ b/src/Http/Wolverine.Http/CodeGen/FormBindingFrame.cs @@ -97,7 +97,7 @@ public FormBindingFrame(Type queryType, HttpChain chain){ } var formValueVariable = chain.TryFindOrCreateFormValue(parameter); - _parameters.Add(formValueVariable); + _parameters.Add(formValueVariable!); } if (!_constructor.GetParameters().Any()) diff --git a/src/Http/Wolverine.Http/CodeGen/FormHandling.cs b/src/Http/Wolverine.Http/CodeGen/FormHandling.cs index 91e41d5e9..95fd0de71 100644 --- a/src/Http/Wolverine.Http/CodeGen/FormHandling.cs +++ b/src/Http/Wolverine.Http/CodeGen/FormHandling.cs @@ -104,7 +104,7 @@ public void AssignToProperty(string usage) internal class ParsedArrayFormValue : SyncFrame, IReadHttpFrame { - private string _property; + private string? _property; public ParsedArrayFormValue(Type parameterType, string parameterName) { @@ -137,14 +137,14 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) } else { - var collectionAlias = typeof(List<>).MakeGenericType(elementType).FullNameInCode(); - var elementAlias = elementType.FullNameInCode(); + var collectionAlias = typeof(List<>).MakeGenericType(elementType!).FullNameInCode(); + var elementAlias = elementType!.FullNameInCode(); writer.Write($"var {Variable.Usage}_List = new {collectionAlias}();"); writer.Write($"BLOCK:foreach (var {Variable.Usage}Value in httpContext.Request.Form[\"{Variable.Usage}\"])"); - if (elementType.IsEnum) + if (elementType!.IsEnum) { writer.Write($"BLOCK:if ({elementAlias}.TryParse<{elementAlias}>({Variable.Usage}Value, out var {Variable.Usage}ValueParsed))"); } diff --git a/src/Http/Wolverine.Http/CodeGen/IReadHttpFrame.cs b/src/Http/Wolverine.Http/CodeGen/IReadHttpFrame.cs index bd94c4be8..53b5c917f 100644 --- a/src/Http/Wolverine.Http/CodeGen/IReadHttpFrame.cs +++ b/src/Http/Wolverine.Http/CodeGen/IReadHttpFrame.cs @@ -171,7 +171,7 @@ private void writeParsedValue(ISourceWriter writer, GeneratedMethod method) } - private string _property; + private string? _property; private readonly bool _isOptional; private readonly bool _isNullable; private readonly Type _rawType; diff --git a/src/Http/Wolverine.Http/CodeGen/JsonHandling.cs b/src/Http/Wolverine.Http/CodeGen/JsonHandling.cs index c8ec8ce3b..18e0640fc 100644 --- a/src/Http/Wolverine.Http/CodeGen/JsonHandling.cs +++ b/src/Http/Wolverine.Http/CodeGen/JsonHandling.cs @@ -46,7 +46,7 @@ internal class ReadJsonBodyWithNewtonsoft : MethodCall { private static MethodInfo findMethodForType(Type parameterType) { - return typeof(NewtonsoftHttpSerialization).GetMethod(nameof(NewtonsoftHttpSerialization.ReadFromJsonAsync)) + return typeof(NewtonsoftHttpSerialization).GetMethod(nameof(NewtonsoftHttpSerialization.ReadFromJsonAsync))! .MakeGenericMethod(parameterType); } @@ -127,15 +127,15 @@ public bool TryBuildVariable(HttpChain chain, out Variable variable) { // It *could* be used twice, so let's watch out for this! chain.RequestBodyVariable ??= Usage == JsonUsage.SystemTextJson - ? new ReadJsonBody(chain.RequestType).Variable - : new ReadJsonBodyWithNewtonsoft(chain.RequestType).ReturnVariable!; + ? new ReadJsonBody(chain.RequestType!).Variable + : new ReadJsonBodyWithNewtonsoft(chain.RequestType!).ReturnVariable!; variable = chain.RequestBodyVariable; return true; } - variable = default; + variable = default!; return false; } } \ No newline at end of file diff --git a/src/Http/Wolverine.Http/CodeGen/ParsedArrayQueryStringValue.cs b/src/Http/Wolverine.Http/CodeGen/ParsedArrayQueryStringValue.cs index 9e61797bd..dc3ed912d 100644 --- a/src/Http/Wolverine.Http/CodeGen/ParsedArrayQueryStringValue.cs +++ b/src/Http/Wolverine.Http/CodeGen/ParsedArrayQueryStringValue.cs @@ -7,7 +7,7 @@ namespace Wolverine.Http.CodeGen; internal class ParsedArrayQueryStringValue : SyncFrame, IReadHttpFrame { - private string _property; + private string? _property; public ParsedArrayQueryStringValue(Type parameterType, string parameterName) { @@ -40,14 +40,14 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) } else { - var collectionAlias = typeof(List<>).MakeGenericType(elementType).FullNameInCode(); - var elementAlias = elementType.FullNameInCode(); + var collectionAlias = typeof(List<>).MakeGenericType(elementType!).FullNameInCode(); + var elementAlias = elementType!.FullNameInCode(); writer.Write($"var {Variable.Usage}_List = new {collectionAlias}();"); writer.Write($"BLOCK:foreach (var {Variable.Usage}Value in httpContext.Request.Query[\"{Variable.Usage}\"])"); - if (elementType.IsEnum) + if (elementType!.IsEnum) { writer.Write($"BLOCK:if ({elementAlias}.TryParse<{elementAlias}>({Variable.Usage}Value, out var {Variable.Usage}ValueParsed))"); } diff --git a/src/Http/Wolverine.Http/CodeGen/ProblemDetailsContinuationPolicy.cs b/src/Http/Wolverine.Http/CodeGen/ProblemDetailsContinuationPolicy.cs index 64d5ad587..c4e360085 100644 --- a/src/Http/Wolverine.Http/CodeGen/ProblemDetailsContinuationPolicy.cs +++ b/src/Http/Wolverine.Http/CodeGen/ProblemDetailsContinuationPolicy.cs @@ -136,7 +136,7 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) { writer.WriteComment("Evaluate whether the processing should stop if there are any problems"); writer.Write($"BLOCK:if (!(ReferenceEquals({Details.Usage}, {typeof(WolverineContinue).FullNameInCode()}.{nameof(WolverineContinue.NoProblems)})))"); - writer.Write($"{typeof(ProblemDetailsContinuationPolicy).FullNameInCode()}.{nameof(ProblemDetailsContinuationPolicy.WriteProblems)}({_logger.Usage}, {Details.Usage});"); + writer.Write($"{typeof(ProblemDetailsContinuationPolicy).FullNameInCode()}.{nameof(ProblemDetailsContinuationPolicy.WriteProblems)}({_logger!.Usage}, {Details.Usage});"); writer.Write("return;"); writer.FinishBlock(); writer.BlankLine(); diff --git a/src/Http/Wolverine.Http/CodeGen/QueryStringBindingFrame.cs b/src/Http/Wolverine.Http/CodeGen/QueryStringBindingFrame.cs index de3f2180e..c5f60eb2f 100644 --- a/src/Http/Wolverine.Http/CodeGen/QueryStringBindingFrame.cs +++ b/src/Http/Wolverine.Http/CodeGen/QueryStringBindingFrame.cs @@ -55,7 +55,7 @@ public QueryStringBindingFrame(Type queryType, HttpChain chain) foreach (var parameter in _constructor.GetParameters()) { var queryStringVariable = chain.TryFindOrCreateQuerystringValue(parameter); - _parameters.Add(queryStringVariable); + _parameters.Add(queryStringVariable!); } // Here's the limitation, either it's all ctor args, or all settable props @@ -70,9 +70,9 @@ public QueryStringBindingFrame(Type queryType, HttpChain chain) } var queryStringVariable = - chain.TryFindOrCreateQuerystringValue(propertyInfo.PropertyType, queryStringName); + chain.TryFindOrCreateQuerystringValue(propertyInfo.PropertyType, queryStringName!); - if (queryStringVariable.Creator is IReadHttpFrame frame) + if (queryStringVariable?.Creator is IReadHttpFrame frame) { frame.AssignToProperty($"{Variable.Usage}.{propertyInfo.Name}"); _props.Add(frame); diff --git a/src/Http/Wolverine.Http/CodeGen/RouteHandling.cs b/src/Http/Wolverine.Http/CodeGen/RouteHandling.cs index 3c46a910a..4ddd8a3d7 100644 --- a/src/Http/Wolverine.Http/CodeGen/RouteHandling.cs +++ b/src/Http/Wolverine.Http/CodeGen/RouteHandling.cs @@ -73,7 +73,7 @@ public static void TryApplyRouteVariables(HttpChain chain, MethodCall call) var parameter = call.Method.GetParameters()[i]; if (parameter.ParameterType == typeof(string) || CanParse(parameter.ParameterType)) { - if (chain.FindRouteVariable(parameter.ParameterType, parameter.Name, out var variable)) + if (chain.FindRouteVariable(parameter.ParameterType, parameter.Name!, out var variable)) { call.Arguments[i] = variable; } diff --git a/src/Http/Wolverine.Http/DeadLettersEndpointExtensions.cs b/src/Http/Wolverine.Http/DeadLettersEndpointExtensions.cs index b9ee91966..e60c2c139 100644 --- a/src/Http/Wolverine.Http/DeadLettersEndpointExtensions.cs +++ b/src/Http/Wolverine.Http/DeadLettersEndpointExtensions.cs @@ -10,7 +10,7 @@ namespace Wolverine.Http; public class DeadLetterEnvelopeIdsRequest { - public Guid[] Ids { get; set; } + public Guid[] Ids { get; set; } = []; public string? TenantId { get; set; } } diff --git a/src/Http/Wolverine.Http/HttpChain.ApiDescription.cs b/src/Http/Wolverine.Http/HttpChain.ApiDescription.cs index 0d1b3ba00..8f200adfe 100644 --- a/src/Http/Wolverine.Http/HttpChain.ApiDescription.cs +++ b/src/Http/Wolverine.Http/HttpChain.ApiDescription.cs @@ -62,12 +62,12 @@ public ApiDescription CreateApiDescription(string httpMethod) var apiDescription = new ApiDescription { HttpMethod = httpMethod, - GroupName = Endpoint.Metadata.GetMetadata()?.EndpointGroupName, - RelativePath = Endpoint.RoutePattern.RawText?.TrimStart('/'), + GroupName = Endpoint!.Metadata.GetMetadata()?.EndpointGroupName, + RelativePath = Endpoint!.RoutePattern.RawText?.TrimStart('/'), ActionDescriptor = new WolverineActionDescriptor(this) }; - foreach (var routeParameter in RoutePattern.Parameters) + foreach (var routeParameter in RoutePattern!.Parameters) { var parameter = buildParameterDescription(routeParameter); @@ -88,12 +88,12 @@ public ApiDescription CreateApiDescription(string httpMethod) { var parameterDescription = new ApiParameterDescription { - Name = parameter.Name, + Name = parameter.Name!, ModelMetadata = new EndpointModelMetadata(parameter.ParameterType), Source = BindingSource.FormFile, ParameterDescriptor = new ParameterDescriptor { - Name = parameter.Name, + Name = parameter.Name!, ParameterType = parameter.ParameterType }, Type = parameter.ParameterType, @@ -107,12 +107,12 @@ public ApiDescription CreateApiDescription(string httpMethod) { var parameterDescription = new ApiParameterDescription { - Name = formMetadata.Name, + Name = formMetadata.Name!, ModelMetadata = new EndpointModelMetadata(typeof(IFormFile)), Source = BindingSource.Form, ParameterDescriptor = new ParameterDescriptor { - Name = formMetadata.Name, + Name = formMetadata.Name!, ParameterType = typeof(IFormFile) }, Type = typeof(IFormFile), @@ -141,22 +141,22 @@ public override void UseForResponse(MethodCall methodCall) public override bool TryFindVariable(string valueName, ValueSource source, Type valueType, out Variable variable) { - if ((source == ValueSource.RouteValue || source == ValueSource.Anything) && FindRouteVariable(valueType, valueName, out variable)) + if ((source == ValueSource.RouteValue || source == ValueSource.Anything) && FindRouteVariable(valueType, valueName, out variable!)) { return true; } - - if ((source == ValueSource.FromQueryString || source == ValueSource.Anything) && FindQuerystringVariable(valueType, valueName, out variable)) + + if ((source == ValueSource.FromQueryString || source == ValueSource.Anything) && FindQuerystringVariable(valueType, valueName, out variable!)) { return true; } if (HasRequestType) { - var requestType = InputType(); + var requestType = InputType()!; var member = requestType.GetProperties() .FirstOrDefault(x => x.Name.EqualsIgnoreCase(valueName) && x.PropertyType == valueType) - ?? (MemberInfo)requestType.GetFields() + ?? (MemberInfo?)requestType.GetFields() .FirstOrDefault(x => x.Name.EqualsIgnoreCase(valueName) && x.FieldType == valueType); if (member != null) @@ -241,7 +241,7 @@ private void fillRequestType(ApiDescription apiDescription) apiDescription.ParameterDescriptions.Add(parameterDescription); - foreach (var metadata in Endpoint.Metadata.OfType()) + foreach (var metadata in Endpoint!.Metadata.OfType()) { foreach (var contentType in metadata.ContentTypes) { diff --git a/src/Http/Wolverine.Http/HttpChain.Codegen.cs b/src/Http/Wolverine.Http/HttpChain.Codegen.cs index f888ce05f..68c1fa0be 100644 --- a/src/Http/Wolverine.Http/HttpChain.Codegen.cs +++ b/src/Http/Wolverine.Http/HttpChain.Codegen.cs @@ -115,8 +115,8 @@ internal IEnumerable DetermineFrames(GenerationRules rules) { if (AuditedMembers.All(x => x.Member != identity)) { - Audit(identity); - } + Audit(identity!); + } } if (AuditedMembers.Count != 0) @@ -186,7 +186,7 @@ private bool requiresFlush(Frame[] actionsOnOtherReturnValues) private string determineFileName() { - var parts = RoutePattern.RawText.Replace("{", "").Replace("*", "").Replace(".", "_").Replace("?", "").Replace("}", "").Split('/').Select(x => x.Split(':').First()); + var parts = RoutePattern!.RawText!.Replace("{", "").Replace("*", "").Replace(".", "_").Replace("?", "").Replace("}", "").Split('/').Select(x => x.Split(':').First()); char[] invalidPathChars = Path.GetInvalidPathChars(); var fileName = _httpMethods.Select(x => x.ToUpper()).Concat(parts).Join("_").Replace('-', '_').Replace("__", "_"); diff --git a/src/Http/Wolverine.Http/HttpChain.cs b/src/Http/Wolverine.Http/HttpChain.cs index 51edd5229..8f8d27183 100644 --- a/src/Http/Wolverine.Http/HttpChain.cs +++ b/src/Http/Wolverine.Http/HttpChain.cs @@ -331,13 +331,13 @@ public override Frame[] AddStopConditionIfNull(Variable data, Variable? identity case OnMissing.ProblemDetailsWith400: Metadata.Produces(400, contentType: "application/problem+json"); - return [new WriteProblemDetailsIfNull(data, identity, message, 400)]; + return [new WriteProblemDetailsIfNull(data, identity!, message, 400)]; case OnMissing.ProblemDetailsWith404: Metadata.Produces(404, contentType: "application/problem+json"); - return [new WriteProblemDetailsIfNull(data, identity, message, 404)]; - + return [new WriteProblemDetailsIfNull(data, identity!, message, 404)]; + default: - return [new ThrowRequiredDataMissingExceptionFrame(data, identity, message)]; + return [new ThrowRequiredDataMissingExceptionFrame(data, identity!, message)]; } } @@ -351,7 +351,7 @@ public OptionsDescription ToDescription() var description = new OptionsDescription(this); description.AddValue(nameof(HttpMethods), HttpMethods.ToArray()); - description.AddValue("Route", RoutePattern.RawText); + description.AddValue("Route", RoutePattern?.RawText ?? string.Empty); if (Tags.Any()) { @@ -420,7 +420,7 @@ private void applyMetadata() key = att.Name; } - return TryFindOrCreateFormValue(parameterType, parameterName, key); + return TryFindOrCreateFormValue(parameterType, parameterName!, key); } public HttpElementVariable? TryFindOrCreateFormValue(Type parameterType, string parameterName, string? key = null){ @@ -452,7 +452,7 @@ private void applyMetadata() } } - if (parameterType.IsArray && RouteParameterStrategy.CanParse(parameterType.GetElementType())) + if (parameterType.IsArray && RouteParameterStrategy.CanParse(parameterType.GetElementType()!)) { variable = new ParsedArrayFormValue(parameterType, parameterName).Variable; variable.Name = key; @@ -510,7 +510,7 @@ public bool FindQuerystringVariable(Type variableType, string routeOrParameterNa key = att.Name; } - return TryFindOrCreateQuerystringValue(parameterType, parameterName, key); + return TryFindOrCreateQuerystringValue(parameterType, parameterName!, key); } public HttpElementVariable? TryFindOrCreateQuerystringValue(Type parameterType, string parameterName, string? key = null) @@ -551,7 +551,7 @@ public bool FindQuerystringVariable(Type variableType, string routeOrParameterNa } } - if (parameterType.IsArray && RouteParameterStrategy.CanParse(parameterType.GetElementType())) + if (parameterType.IsArray && RouteParameterStrategy.CanParse(parameterType.GetElementType()!)) { variable = new ParsedArrayQueryStringValue(parameterType, key).Variable; variable.Name = key; @@ -585,7 +585,7 @@ public bool FindQuerystringVariable(Type variableType, string routeOrParameterNa public bool FindRouteVariable(ParameterInfo parameter, [NotNullWhen(true)]out Variable? variable) { var existing = _routeVariables.FirstOrDefault(x => - x.VariableType == parameter.ParameterType && x.Usage.EqualsIgnoreCase(parameter.Name)); + x.VariableType == parameter.ParameterType && x.Usage.EqualsIgnoreCase(parameter.Name!)); if (existing is not null) { @@ -610,7 +610,7 @@ public bool FindRouteVariable(ParameterInfo parameter, [NotNullWhen(true)]out Va var inner = parameter.ParameterType.GetInnerTypeFromNullable(); if (RouteParameterStrategy.CanParse(inner)) { - variable = new ReadHttpFrame(BindingSource.RouteValue, parameter.ParameterType, parameter.Name, isOptional).Variable; + variable = new ReadHttpFrame(BindingSource.RouteValue, parameter.ParameterType, parameter.Name!, isOptional).Variable; _routeVariables.Add(variable); return true; } @@ -618,7 +618,7 @@ public bool FindRouteVariable(ParameterInfo parameter, [NotNullWhen(true)]out Va if (RouteParameterStrategy.CanParse(parameter.ParameterType)) { - variable = new ReadHttpFrame(BindingSource.RouteValue, parameter.ParameterType, parameter.Name, isOptional).Variable; + variable = new ReadHttpFrame(BindingSource.RouteValue, parameter.ParameterType, parameter.Name!, isOptional).Variable; _routeVariables.Add(variable); return true; } @@ -668,9 +668,9 @@ public HttpElementVariable GetOrCreateHeaderVariable(IFromHeaderMetadata metadat if (existing != null) return existing; - var frame = new ReadHttpFrame(BindingSource.Header, parameter.ParameterType, parameter.Name) + var frame = new ReadHttpFrame(BindingSource.Header, parameter.ParameterType, parameter.Name!) { - Key = metadata.Name ?? parameter.Name + Key = metadata.Name ?? parameter.Name! }; _headerVariables.Add(frame.Variable); diff --git a/src/Http/Wolverine.Http/HttpGraph.cs b/src/Http/Wolverine.Http/HttpGraph.cs index a8bf667d1..1e497c3a2 100644 --- a/src/Http/Wolverine.Http/HttpGraph.cs +++ b/src/Http/Wolverine.Http/HttpGraph.cs @@ -78,7 +78,7 @@ public OptionsDescription ToDescription() foreach (var chain in _chains) { var chainDescription = OptionsDescription.For(chain); - chainDescription.Title = chain.RoutePattern.RawText; + chainDescription.Title = (chain.RoutePattern?.RawText)!; list.Rows.Add(chainDescription); } @@ -92,7 +92,7 @@ public void DiscoverEndpoints(WolverineHttpOptions wolverineHttpOptions) var calls = source.FindActions(); logger.LogInformation("Found {Count} Wolverine HTTP endpoints in assemblies {Assemblies}", calls.Length, - _options.Assemblies.Select(x => x.GetName().Name).Join(", ")); + _options.Assemblies.Select(x => x.GetName().Name!).Join(", ")); if (calls.Length == 0) { logger.LogWarning( diff --git a/src/Http/Wolverine.Http/IHttpAware.cs b/src/Http/Wolverine.Http/IHttpAware.cs index 38b679d2c..616f1232c 100644 --- a/src/Http/Wolverine.Http/IHttpAware.cs +++ b/src/Http/Wolverine.Http/IHttpAware.cs @@ -48,7 +48,7 @@ public void Apply(IReadOnlyList chains, GenerationRules rules, IServi internal class ApplyHttpAware : SyncFrame { private readonly Variable _target; - private Variable _httpContext; + private Variable? _httpContext; public ApplyHttpAware(Variable target) { @@ -65,7 +65,7 @@ public override IEnumerable FindVariables(IMethodVariables chain) public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) { writer.WriteComment("This response type customizes the HTTP response"); - writer.Write($"{nameof(HttpHandler.ApplyHttpAware)}({_target.Usage}, {_httpContext.Usage});"); + writer.Write($"{nameof(HttpHandler.ApplyHttpAware)}({_target.Usage}, {_httpContext!.Usage});"); Next?.GenerateCode(method, writer); } } diff --git a/src/Http/Wolverine.Http/NewtonsoftHttpSerialization.cs b/src/Http/Wolverine.Http/NewtonsoftHttpSerialization.cs index db27fc87a..0d3dacefb 100644 --- a/src/Http/Wolverine.Http/NewtonsoftHttpSerialization.cs +++ b/src/Http/Wolverine.Http/NewtonsoftHttpSerialization.cs @@ -78,7 +78,7 @@ public async Task ReadFromJsonAsync(HttpContext context) jsonReader.ArrayPool = _jsonCharPool; jsonReader.CloseInput = false; - return (T)_serializer.Deserialize(jsonReader, targetType); + return (T)_serializer.Deserialize(jsonReader, targetType)!; } internal class JsonArrayPool : IArrayPool diff --git a/src/Http/Wolverine.Http/Policies/SetStatusCodeAndReturnIfEntityIsNullFrame.cs b/src/Http/Wolverine.Http/Policies/SetStatusCodeAndReturnIfEntityIsNullFrame.cs index 433e1842c..2c01ce271 100644 --- a/src/Http/Wolverine.Http/Policies/SetStatusCodeAndReturnIfEntityIsNullFrame.cs +++ b/src/Http/Wolverine.Http/Policies/SetStatusCodeAndReturnIfEntityIsNullFrame.cs @@ -10,7 +10,7 @@ namespace Wolverine.Http.Policies; internal class SetStatusCodeAndReturnIfEntityIsNullFrame : SyncFrame { private readonly Type _entityType; - private Variable _httpResponse; + private Variable? _httpResponse; private Variable? _entity; public SetStatusCodeAndReturnIfEntityIsNullFrame(Type entityType) @@ -33,8 +33,8 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) if (problemDetailsVariable != null) writer.WriteComment($"Take no action if {problemDetailsVariable.Inner.Usage}.Status == 404"); writer.Write( - $"BLOCK:if ({_entity.Usage} == null{(problemDetailsVariable == null ? "" : $" && {problemDetailsVariable.Inner.Usage}.Status != 404")})"); - writer.Write($"{_httpResponse.Usage}.{nameof(HttpResponse.StatusCode)} = 404;"); + $"BLOCK:if ({_entity!.Usage} == null{(problemDetailsVariable == null ? "" : $" && {problemDetailsVariable.Inner.Usage}.Status != 404")})"); + writer.Write($"{_httpResponse!.Usage}.{nameof(HttpResponse.StatusCode)} = 404;"); if (method.AsyncMode == AsyncMode.ReturnCompletedTask) writer.Write($"return {typeof(Task).FullNameInCode()}.{nameof(Task.CompletedTask)};"); else diff --git a/src/Http/Wolverine.Http/Policies/WriteProblemDetailsIfNull.cs b/src/Http/Wolverine.Http/Policies/WriteProblemDetailsIfNull.cs index 36b1015f4..1f6b79330 100644 --- a/src/Http/Wolverine.Http/Policies/WriteProblemDetailsIfNull.cs +++ b/src/Http/Wolverine.Http/Policies/WriteProblemDetailsIfNull.cs @@ -7,7 +7,7 @@ namespace Wolverine.Http.Policies; internal class WriteProblemDetailsIfNull : AsyncFrame { - private Variable _httpContext; + private Variable? _httpContext; public WriteProblemDetailsIfNull(Variable entity, Variable identity, string message, int statusCode = 400) { @@ -32,12 +32,12 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) if (Message.Contains("{0}")) { - writer.Write($"await {nameof(HttpHandler.WriteProblems)}({StatusCode}, string.Format(\"{Message}\", {Identity.Usage}), {_httpContext.Usage}, {Identity.Usage});"); + writer.Write($"await {nameof(HttpHandler.WriteProblems)}({StatusCode}, string.Format(\"{Message}\", {Identity.Usage}), {_httpContext!.Usage}, {Identity.Usage});"); } else { var constant = Constant.For(Message); - writer.Write($"await {nameof(HttpHandler.WriteProblems)}({StatusCode}, {constant.Usage}, {_httpContext.Usage}, {Identity.Usage});"); + writer.Write($"await {nameof(HttpHandler.WriteProblems)}({StatusCode}, {constant.Usage}, {_httpContext!.Usage}, {Identity.Usage});"); } writer.Write("return;"); diff --git a/src/Http/Wolverine.Http/Runtime/MultiTenancy/DetectTenantIdFrame.cs b/src/Http/Wolverine.Http/Runtime/MultiTenancy/DetectTenantIdFrame.cs index 11482664b..180f1489b 100644 --- a/src/Http/Wolverine.Http/Runtime/MultiTenancy/DetectTenantIdFrame.cs +++ b/src/Http/Wolverine.Http/Runtime/MultiTenancy/DetectTenantIdFrame.cs @@ -10,7 +10,7 @@ internal class DetectTenantIdFrame : AsyncFrame { private readonly TenantIdDetection _options; private readonly HttpChain _chain; - private Variable _httpContext; + private Variable? _httpContext; public DetectTenantIdFrame(TenantIdDetection options, HttpChain chain) { @@ -37,7 +37,7 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) writer.WriteComment($"{i + 1}. {_options.Strategies[i]}"); } - writer.Write($"var {TenantId.Usage} = await {nameof(HttpHandler.TryDetectTenantId)}({_httpContext.Usage});"); + writer.Write($"var {TenantId.Usage} = await {nameof(HttpHandler.TryDetectTenantId)}({_httpContext!.Usage});"); if (_options.ShouldAssertTenantIdExists(_chain)) { diff --git a/src/Http/Wolverine.Http/Transport/HttpEndpoint.cs b/src/Http/Wolverine.Http/Transport/HttpEndpoint.cs index 54667ebd2..0e8a72985 100644 --- a/src/Http/Wolverine.Http/Transport/HttpEndpoint.cs +++ b/src/Http/Wolverine.Http/Transport/HttpEndpoint.cs @@ -14,7 +14,7 @@ public HttpEndpoint(Uri uri, EndpointRole role) : base(uri, role) } internal bool SupportsNativeScheduledSend { get; set; } - public string OutboundUri { get; set; } + public string OutboundUri { get; set; } = string.Empty; public override ValueTask BuildListenerAsync(IWolverineRuntime runtime, IReceiver receiver) { diff --git a/src/Http/Wolverine.Http/Transport/HttpTransportExecutor.cs b/src/Http/Wolverine.Http/Transport/HttpTransportExecutor.cs index a2c74f51b..a06477cdf 100644 --- a/src/Http/Wolverine.Http/Transport/HttpTransportExecutor.cs +++ b/src/Http/Wolverine.Http/Transport/HttpTransportExecutor.cs @@ -99,7 +99,7 @@ public async Task InvokeAsync(HttpContext httpContext, JsonSerializerOp envelope.Destination = $"http://localhost{httpContext.Request.Path}".ToUri(); envelope.DoNotCascadeResponse = true; - envelope.Serializer = _runtime.Options.FindSerializer(envelope.ContentType); + envelope.Serializer = _runtime.Options.FindSerializer(envelope.ContentType!); var deserializeResult = await _runtime.Pipeline.TryDeserializeEnvelope(envelope); @@ -132,11 +132,11 @@ public async Task InvokeAsync(HttpContext httpContext, JsonSerializerOp } - IExecutor executor = default; + IExecutor? executor = default; try { - executor = _runtime.FindInvoker(envelope.MessageType) as Executor; + executor = _runtime.FindInvoker(envelope.MessageType!) as Executor; } catch (Exception e) { @@ -170,7 +170,7 @@ public async Task InvokeAsync(HttpContext httpContext, JsonSerializerOp response.ContentType = response.Serializer.ContentType; } - response.Data = response.Serializer.WriteMessage(response.Message); + response.Data = response.Serializer.WriteMessage(response.Message!); httpContext.Response.ContentType = "binary/wolverine-envelope"; var responseData = EnvelopeSerializer.Serialize(response); diff --git a/src/Http/Wolverine.Http/Transport/HttpTransportExtensions.cs b/src/Http/Wolverine.Http/Transport/HttpTransportExtensions.cs index a2e466f8d..61bcf30df 100644 --- a/src/Http/Wolverine.Http/Transport/HttpTransportExtensions.cs +++ b/src/Http/Wolverine.Http/Transport/HttpTransportExtensions.cs @@ -43,7 +43,7 @@ public static HttpTransportSubscriberConfiguration ToHttpEndpoint( string url, bool supportsNativeScheduledSend = false, bool useCloudEvents = false, - JsonSerializerOptions options = null) + JsonSerializerOptions? options = null) { var transports = publishing.As().Parent.Transports; @@ -52,7 +52,7 @@ public static HttpTransportSubscriberConfiguration ToHttpEndpoint( var endpoint = transport.EndpointFor(url); if (useCloudEvents) { - endpoint.SerializerOptions = options; + endpoint.SerializerOptions = options!; } // This is necessary unfortunately to hook up the subscription rules diff --git a/src/Http/Wolverine.Http/Transport/WolverineHttpTransportClient.cs b/src/Http/Wolverine.Http/Transport/WolverineHttpTransportClient.cs index ccf978736..eac524cd6 100644 --- a/src/Http/Wolverine.Http/Transport/WolverineHttpTransportClient.cs +++ b/src/Http/Wolverine.Http/Transport/WolverineHttpTransportClient.cs @@ -16,7 +16,7 @@ public async Task SendBatchAsync(string uri, OutgoingMessageBatch batch) await client.PostAsync(client.BaseAddress, content); } - public async Task SendAsync(string uri, Envelope envelope, JsonSerializerOptions options = null) + public async Task SendAsync(string uri, Envelope envelope, JsonSerializerOptions? options = null) { var client = clientFactory.CreateClient(uri); var content = new ByteArrayContent(EnvelopeSerializer.Serialize(envelope)); @@ -35,7 +35,7 @@ public async Task SendBatchAsync(string uri, OutgoingMessageBatch batch) await client.PostAsync(client.BaseAddress, content); } - public async Task SendAsync(string uri, Envelope envelope, JsonSerializerOptions options = null) + public async Task SendAsync(string uri, Envelope envelope, JsonSerializerOptions? options = null) { var client = clientFactory.CreateClient(uri); var ce = new CloudEventsEnvelope(envelope); diff --git a/src/Http/Wolverine.Http/WolverineHttpOptions.cs b/src/Http/Wolverine.Http/WolverineHttpOptions.cs index 696d70261..e14ec4cd3 100644 --- a/src/Http/Wolverine.Http/WolverineHttpOptions.cs +++ b/src/Http/Wolverine.Http/WolverineHttpOptions.cs @@ -215,7 +215,7 @@ public void SourceServiceFromHttpContext() public void UseNewtonsoftJsonForSerialization(Action? configure = null) { configure?.Invoke(NewtonsoftSerializerSettings); - Endpoints.UseNewtonsoftJson(); + Endpoints!.UseNewtonsoftJson(); } diff --git a/src/Http/WolverineWebApi/Accounts/AccountCode.cs b/src/Http/WolverineWebApi/Accounts/AccountCode.cs index 5e116a0c3..fc46af880 100644 --- a/src/Http/WolverineWebApi/Accounts/AccountCode.cs +++ b/src/Http/WolverineWebApi/Accounts/AccountCode.cs @@ -45,7 +45,7 @@ public static void Handle( [WriteAggregate(nameof(TransferMoney.ToId))] IEventStream toAccount) { // Would already 404 if either referenced account does not exist - if (fromAccount.Aggregate.Amount >= command.Amount) + if (fromAccount.Aggregate!.Amount >= command.Amount) { fromAccount.AppendOne(new Withdrawn(command.Amount)); toAccount.AppendOne(new Debited(command.Amount)); @@ -66,7 +66,7 @@ public static void Handle( [WriteAggregate(nameof(TransferMoney.ToId))] IEventStream toAccount) { // Would already 404 if either referenced account does not exist - if (fromAccount.Aggregate.Amount >= command.Amount) + if (fromAccount.Aggregate!.Amount >= command.Amount) { fromAccount.AppendOne(new Withdrawn(command.Amount)); toAccount.AppendOne(new Debited(command.Amount)); @@ -87,7 +87,7 @@ public static void Handle( [WriteAggregate(nameof(TransferMoney.ToId))] IEventStream toAccount) { // Would already 404 if either referenced account does not exist - if (fromAccount.Aggregate.Amount >= command.Amount) + if (fromAccount.Aggregate!.Amount >= command.Amount) { fromAccount.AppendOne(new Withdrawn(command.Amount)); toAccount.AppendOne(new Debited(command.Amount)); @@ -104,9 +104,9 @@ public static void Before(Account fromAccount, Account toAccount) To = toAccount; } - public static Account To { get; set; } + public static Account To { get; set; } = null!; - public static Account From { get; set; } + public static Account From { get; set; } = null!; [WolverinePost("/accounts/transfer4")] public static void Handle( @@ -117,7 +117,7 @@ public static void Handle( [WriteAggregate(nameof(TransferMoney.ToId))] IEventStream toAccount) { // Would already 404 if either referenced account does not exist - if (fromAccount.Aggregate.Amount >= command.Amount) + if (fromAccount.Aggregate!.Amount >= command.Amount) { fromAccount.AppendOne(new Withdrawn(command.Amount)); toAccount.AppendOne(new Debited(command.Amount)); @@ -133,9 +133,9 @@ public static void Before(Account fromAccount, Account toAccount) To = toAccount; } - public static Account To { get; set; } + public static Account To { get; set; } = null!; - public static Account From { get; set; } + public static Account From { get; set; } = null!; [WolverinePost("/accounts/transfer5")] public static void Handle( @@ -145,7 +145,7 @@ public static void Handle( [Aggregate(nameof(TransferMoney.ToId))] IEventStream toAccount) { - if (fromAccount.Aggregate.Amount >= command.Amount) + if (fromAccount.Aggregate!.Amount >= command.Amount) { fromAccount.AppendOne(new Withdrawn(command.Amount)); toAccount.AppendOne(new Debited(command.Amount)); @@ -161,9 +161,9 @@ public static void Before(Account fromAccount, Account toAccount) To = toAccount; } - public static Account To { get; set; } + public static Account To { get; set; } = null!; - public static Account From { get; set; } + public static Account From { get; set; } = null!; [WolverinePost("/accounts/transfer6")] public static void Handle( @@ -173,7 +173,7 @@ public static void Handle( [ReadAggregate(nameof(TransferMoney.ToId))] Account toAccount) { - if (fromAccount.Aggregate.Amount >= command.Amount) + if (fromAccount.Aggregate!.Amount >= command.Amount) { fromAccount.AppendOne(new Withdrawn(command.Amount)); } diff --git a/src/Http/WolverineWebApi/Bugs/SomeEndpoint.cs b/src/Http/WolverineWebApi/Bugs/SomeEndpoint.cs index 950c71f49..fe4aabd1e 100644 --- a/src/Http/WolverineWebApi/Bugs/SomeEndpoint.cs +++ b/src/Http/WolverineWebApi/Bugs/SomeEndpoint.cs @@ -27,5 +27,5 @@ public class SomeEndpoint public class SomeDocument { - public string Id { get; set; } + public string Id { get; set; } = null!; } \ No newline at end of file diff --git a/src/Http/WolverineWebApi/CreateEndpoint.cs b/src/Http/WolverineWebApi/CreateEndpoint.cs index 34ca9be78..4097a482e 100644 --- a/src/Http/WolverineWebApi/CreateEndpoint.cs +++ b/src/Http/WolverineWebApi/CreateEndpoint.cs @@ -26,5 +26,5 @@ public record IssueCreated(Guid Id) : CreationResponse($"/issue/{Id}"); public class Issue { public Guid Id { get; set; } - public string Title { get; set; } + public string Title { get; set; } = null!; } \ No newline at end of file diff --git a/src/Http/WolverineWebApi/EFCore.cs b/src/Http/WolverineWebApi/EFCore.cs index 5d86cb64d..2cc6e95f5 100644 --- a/src/Http/WolverineWebApi/EFCore.cs +++ b/src/Http/WolverineWebApi/EFCore.cs @@ -25,13 +25,13 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) public class Item { - public string Name { get; set; } + public string Name { get; set; } = null!; public Guid Id { get; set; } } public class CreateItemCommand { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class ItemCreated diff --git a/src/Http/WolverineWebApi/Forms/FormEndpoints.cs b/src/Http/WolverineWebApi/Forms/FormEndpoints.cs index 73a82e8ee..3a9d662b4 100644 --- a/src/Http/WolverineWebApi/Forms/FormEndpoints.cs +++ b/src/Http/WolverineWebApi/Forms/FormEndpoints.cs @@ -115,13 +115,13 @@ public static string PostWithFiles([FromForm] FormWithFiles form) public class FormWithFile { - public string Name { get; set; } + public string Name { get; set; } = null!; public IFormFile? File { get; set; } } public class FormWithFiles { - public string Name { get; set; } + public string Name { get; set; } = null!; public IFormFileCollection? Files { get; set; } } @@ -143,10 +143,10 @@ public class AsParametersQuery{ public Direction EnumNotUsed{get;set;} [FromQuery] - public string StringFromQuery { get; set; } + public string StringFromQuery { get; set; } = null!; [FromForm] - public string StringFromForm { get; set; } - public string StringNotUsed { get; set; } + public string StringFromForm { get; set; } = null!; + public string StringNotUsed { get; set; } = null!; [FromQuery] public int IntegerFromQuery { get; set; } [FromForm] @@ -164,7 +164,7 @@ public class AsParametersQuery{ public bool BooleanNotUsed { get; set; } [FromHeader(Name = "x-string")] - public string StringHeader { get; set; } + public string StringHeader { get; set; } = null!; [FromHeader(Name = "x-number")] public int NumberHeader { get; set; } = 5; @@ -177,7 +177,7 @@ public class AsParametersQuery{ public class AsParameterBody { - public string Name { get; set; } + public string Name { get; set; } = null!; public Direction Direction { get; set; } public int Distance { get; set; } } @@ -186,13 +186,13 @@ public class AsParametersQuery2 { // We do a check inside of an HTTP endpoint that this works correctly [FromServices, JsonIgnore] - public IDocumentStore Store { get; set; } - + public IDocumentStore Store { get; set; } = null!; + [FromBody] - public AsParameterBody Body { get; set; } - + public AsParameterBody Body { get; set; } = null!; + [FromRoute] - public string Id { get; set; } + public string Id { get; set; } = null!; [FromRoute] public int Number { get; set; } diff --git a/src/Http/WolverineWebApi/HeaderUsingEndpoint.cs b/src/Http/WolverineWebApi/HeaderUsingEndpoint.cs index fc1d81b3e..268ded097 100644 --- a/src/Http/WolverineWebApi/HeaderUsingEndpoint.cs +++ b/src/Http/WolverineWebApi/HeaderUsingEndpoint.cs @@ -9,7 +9,7 @@ namespace WolverineWebApi; public class HeaderUsingEndpoint { // For testing - public static string Day; + public static string Day = null!; #region sample_pushing_header_values_into_endpoint_methods @@ -18,7 +18,7 @@ public class HeaderUsingEndpoint public static void Before([FromHeader(Name = "x-day")] string? day) { Debug.WriteLine($"Day header is {day}"); - Day = day; // This is for testing + Day = day!; // This is for testing } [WolverineGet("/headers/simple")] @@ -60,7 +60,7 @@ public class HeaderMiddlewareAttribute : ModifyHttpChainAttribute { public override void Modify(HttpChain chain, GenerationRules rules) { - chain.Middleware.Add(MethodCall.For(x => x.Before(default))); + chain.Middleware.Add(MethodCall.For(x => x.Before(default!))); } } diff --git a/src/Http/WolverineWebApi/HttpContextEndpoints.cs b/src/Http/WolverineWebApi/HttpContextEndpoints.cs index 57b5e51ba..40848741c 100644 --- a/src/Http/WolverineWebApi/HttpContextEndpoints.cs +++ b/src/Http/WolverineWebApi/HttpContextEndpoints.cs @@ -6,7 +6,7 @@ namespace WolverineWebApi; public class HttpContextEndpoints { - public static ClaimsPrincipal User { get; set; } + public static ClaimsPrincipal User { get; set; } = null!; [WolverineGet("/http/context")] public void UseHttpContext(HttpContext context) diff --git a/src/Http/WolverineWebApi/Marten/Orders.cs b/src/Http/WolverineWebApi/Marten/Orders.cs index 1f133586f..c73280707 100644 --- a/src/Http/WolverineWebApi/Marten/Orders.cs +++ b/src/Http/WolverineWebApi/Marten/Orders.cs @@ -33,7 +33,7 @@ public record ItemReady(string Name); public class Item { - public string Name { get; set; } + public string Name { get; set; } = null!; public bool Ready { get; set; } } diff --git a/src/Http/WolverineWebApi/Marten/StrongTypedIdentifiers.cs b/src/Http/WolverineWebApi/Marten/StrongTypedIdentifiers.cs index 81989a57e..6cd1b2691 100644 --- a/src/Http/WolverineWebApi/Marten/StrongTypedIdentifiers.cs +++ b/src/Http/WolverineWebApi/Marten/StrongTypedIdentifiers.cs @@ -11,8 +11,8 @@ public static class StrongLetterHandler #region sample_using_strong_typed_id_as_route_argument [WolverineGet("/sti/aggregate/longhand/{id}")] - public static ValueTask Handle2(LetterId id, IDocumentSession session) => - session.Events.FetchLatest(id.Value); + public static async ValueTask Handle2(LetterId id, IDocumentSession session) => + (await session.Events.FetchLatest(id.Value))!; // This is an equivalent to the endpoint above [WolverineGet("/sti/aggregate/{id}")] diff --git a/src/Http/WolverineWebApi/Marten/Toys.cs b/src/Http/WolverineWebApi/Marten/Toys.cs index 0e4b90c86..82bdad4d9 100644 --- a/src/Http/WolverineWebApi/Marten/Toys.cs +++ b/src/Http/WolverineWebApi/Marten/Toys.cs @@ -10,7 +10,7 @@ namespace WolverineWebApi.Marten; public class Toy { public ToyId Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public static class ToyEndpoints diff --git a/src/Http/WolverineWebApi/MessageHandlers.cs b/src/Http/WolverineWebApi/MessageHandlers.cs index d1475b1c1..bb4e6552e 100644 --- a/src/Http/WolverineWebApi/MessageHandlers.cs +++ b/src/Http/WolverineWebApi/MessageHandlers.cs @@ -26,7 +26,7 @@ public CustomResponse() { } - public string Name { get; set; } + public string Name { get; set; } = null!; } public static class MessageHandler diff --git a/src/Http/WolverineWebApi/MiddlewareEndpoints.cs b/src/Http/WolverineWebApi/MiddlewareEndpoints.cs index 0a91247fd..feced1342 100644 --- a/src/Http/WolverineWebApi/MiddlewareEndpoints.cs +++ b/src/Http/WolverineWebApi/MiddlewareEndpoints.cs @@ -38,7 +38,7 @@ public static void Configure(HttpChain chain) chain.Middleware.Add(MethodCall.For(x => x.Before())); // Call this method after the normal endpoint - chain.Postprocessors.Add(MethodCall.For(x => x.Finally(null, null))); + chain.Postprocessors.Add(MethodCall.For(x => x.Finally(null!, null!))); } [WolverineGet("/timed")] diff --git a/src/Http/WolverineWebApi/QuerystringEndpoints.cs b/src/Http/WolverineWebApi/QuerystringEndpoints.cs index 7f340df01..5c021f670 100644 --- a/src/Http/WolverineWebApi/QuerystringEndpoints.cs +++ b/src/Http/WolverineWebApi/QuerystringEndpoints.cs @@ -118,11 +118,11 @@ public record AliasedIntArrayQuery([FromQuery(Name = "n")] int[] Numbers); public class BigQuery { - public string Name { get; set; } + public string Name { get; set; } = null!; public int Number { get; set; } public Direction Direction { get; set; } - public string[] Values { get; set; } - public int[] Numbers { get; set; } + public string[] Values { get; set; } = null!; + public int[] Numbers { get; set; } = null!; public bool Flag { get; set; } @@ -137,15 +137,15 @@ public class BigQuery public List ListValues { get; set; } = new(); public List EnumListValues { get; set; } = new(); - public List IntList { get; set; } + public List IntList { get; set; } = null!; [FromQuery(Name = "v")] [FromForm(Name = "v")] - public string[] AliasedValues { get; set; } + public string[] AliasedValues { get; set; } = null!; [FromQuery(Name = "n")] [FromForm(Name = "n")] - public int[] AliasedNumbers { get; set; } + public int[] AliasedNumbers { get; set; } = null!; [FromQuery(Name = "d")] [FromForm(Name = "d")] diff --git a/src/Http/WolverineWebApi/Samples/TodoController.cs b/src/Http/WolverineWebApi/Samples/TodoController.cs index 8541d021e..3e354a2dd 100644 --- a/src/Http/WolverineWebApi/Samples/TodoController.cs +++ b/src/Http/WolverineWebApi/Samples/TodoController.cs @@ -144,7 +144,7 @@ public static StoreDoc Put( // but note the [Required] attribute [Required] Todo? todo) { - todo.Name = request.Name; + todo!.Name = request.Name; todo.IsComplete = request.IsComplete; return MartenOps.Store(todo); @@ -182,7 +182,7 @@ public static class UpdateEndpointWithValidation public static IResult Validate([Required] Todo? todo) { - return todo.IsComplete + return todo!.IsComplete ? Results.ValidationProblem([new("IsComplere", ["Completed Todo cannot be updated"])]) : WolverineContinue.Result(); } @@ -199,7 +199,7 @@ public static StoreDoc Put( // but note the [Required] attribute [Required] Todo? todo) { - todo.Name = request.Name; + todo!.Name = request.Name; todo.IsComplete = request.IsComplete; return MartenOps.Store(todo); @@ -220,7 +220,7 @@ public static StoreDoc Put( // but note the [Required] attribute [Required] Todo? todo) { - todo.Name = request.Name; + todo!.Name = request.Name; todo.IsComplete = request.IsComplete; return MartenOps.Store(todo); @@ -248,7 +248,7 @@ public static StoreDoc Put( // but note the [Required] attribute [Required] Todo? todo) { - todo.Name = request.Name; + todo!.Name = request.Name; todo.IsComplete = request.IsComplete; return MartenOps.Store(todo); diff --git a/src/Http/WolverineWebApi/ServiceEndpoints.cs b/src/Http/WolverineWebApi/ServiceEndpoints.cs index d16c6912b..4b70eaa80 100644 --- a/src/Http/WolverineWebApi/ServiceEndpoints.cs +++ b/src/Http/WolverineWebApi/ServiceEndpoints.cs @@ -40,7 +40,7 @@ public void Handle(Data data) public class Data { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public class Recorder diff --git a/src/Http/WolverineWebApi/SwaggerEndpoints.cs b/src/Http/WolverineWebApi/SwaggerEndpoints.cs index d56d15234..c07c177f2 100644 --- a/src/Http/WolverineWebApi/SwaggerEndpoints.cs +++ b/src/Http/WolverineWebApi/SwaggerEndpoints.cs @@ -25,5 +25,5 @@ public record CreateUserProfile(string Name); public class UserProfile { - public string Id { get; set; } + public string Id { get; set; } = null!; } \ No newline at end of file diff --git a/src/Http/WolverineWebApi/Things/Code.cs b/src/Http/WolverineWebApi/Things/Code.cs index 029cdbb5e..93913b7a1 100644 --- a/src/Http/WolverineWebApi/Things/Code.cs +++ b/src/Http/WolverineWebApi/Things/Code.cs @@ -15,8 +15,8 @@ namespace WolverineWebApi.Things; public class Thing { - public string Id { get; set; } - public string Title { get; set; } + public string Id { get; set; } = null!; + public string Title { get; set; } = null!; } public class ThingProjection : SingleStreamProjection diff --git a/src/Http/WolverineWebApi/Todos/Todo2.cs b/src/Http/WolverineWebApi/Todos/Todo2.cs index e74716786..fd8c0c4aa 100644 --- a/src/Http/WolverineWebApi/Todos/Todo2.cs +++ b/src/Http/WolverineWebApi/Todos/Todo2.cs @@ -10,7 +10,7 @@ namespace WolverineWebApi.Todos; [DocumentAlias("test_todo")] public class Todo2 { - public string Id { get; set; } + public string Id { get; set; } = null!; public string? Name { get; set; } public bool IsComplete { get; set; } } diff --git a/src/Http/WolverineWebApi/WebSockets/BroadcastHub.cs b/src/Http/WolverineWebApi/WebSockets/BroadcastHub.cs index d7111393e..d70a5bf24 100644 --- a/src/Http/WolverineWebApi/WebSockets/BroadcastHub.cs +++ b/src/Http/WolverineWebApi/WebSockets/BroadcastHub.cs @@ -96,7 +96,9 @@ public void Apply(IReadOnlyList chains, GenerationRules rules, IServiceC { messages.UseReturnAction(v => { +#pragma warning disable CS4014 var call = MethodCall.For(x => x.PostMany(null!)); +#pragma warning restore CS4014 call.Arguments[0] = messages; return call; diff --git a/src/Persistence/CosmosDbTests/AppFixture.cs b/src/Persistence/CosmosDbTests/AppFixture.cs index 3df787909..5a1fb2d8d 100644 --- a/src/Persistence/CosmosDbTests/AppFixture.cs +++ b/src/Persistence/CosmosDbTests/AppFixture.cs @@ -1,4 +1,6 @@ using System.Net; +using DotNet.Testcontainers.Builders; +using DotNet.Testcontainers.Containers; using Microsoft.Azure.Cosmos; using Wolverine; using Wolverine.CosmosDb; @@ -9,17 +11,51 @@ namespace CosmosDbTests; public class AppFixture : IAsyncLifetime { - // CosmosDB Linux emulator defaults - public const string ConnectionString = - "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="; - + public const string AccountKey = "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="; public const string DatabaseName = "wolverine_tests"; + // Static container shared across all AppFixture instances + private static IContainer? _sharedContainer; + private static string _sharedConnectionString = null!; + private static readonly SemaphoreSlim _lock = new(1, 1); + + public string ConnectionString => _sharedConnectionString; + public CosmosClient Client { get; private set; } = null!; public Container Container { get; private set; } = null!; + private static async Task EnsureContainerStarted() + { + await _lock.WaitAsync(); + try + { + if (_sharedContainer != null) return; + + _sharedContainer = new ContainerBuilder() + .WithImage("mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview") + .WithPortBinding(8081, true) + .WithPortBinding(1234, true) + .WithEnvironment("PROTOCOL", "https") + .WithWaitStrategy(Wait.ForUnixContainer() + .UntilMessageIsLogged("Gateway=OK")) + .Build(); + + await _sharedContainer.StartAsync(); + + var host = _sharedContainer.Hostname; + var port = _sharedContainer.GetMappedPublicPort(8081); + _sharedConnectionString = $"AccountEndpoint=https://{host}:{port}/;AccountKey={AccountKey}"; + } + finally + { + _lock.Release(); + } + } + public async Task InitializeAsync() { + await EnsureContainerStarted(); + var clientOptions = new CosmosClientOptions { HttpClientFactory = () => @@ -65,6 +101,7 @@ public async Task InitializeAsync() public async Task DisposeAsync() { Client?.Dispose(); + // Container is shared - don't dispose it here; process exit handles cleanup } public CosmosDbMessageStore BuildMessageStore() diff --git a/src/Persistence/CosmosDbTests/CosmosDbTests.csproj b/src/Persistence/CosmosDbTests/CosmosDbTests.csproj index f7a5b580d..b1735aff4 100644 --- a/src/Persistence/CosmosDbTests/CosmosDbTests.csproj +++ b/src/Persistence/CosmosDbTests/CosmosDbTests.csproj @@ -16,6 +16,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Persistence/CosmosDbTests/end_to_end.cs b/src/Persistence/CosmosDbTests/end_to_end.cs index c4d4dc114..0e1c5830e 100644 --- a/src/Persistence/CosmosDbTests/end_to_end.cs +++ b/src/Persistence/CosmosDbTests/end_to_end.cs @@ -10,6 +10,7 @@ namespace CosmosDbTests; [Collection("cosmosdb")] +[Trait("Category", "Flaky")] public class end_to_end { private readonly AppFixture _fixture; diff --git a/src/Persistence/CosmosDbTests/using_storage_return_types_and_entity_attributes.cs b/src/Persistence/CosmosDbTests/using_storage_return_types_and_entity_attributes.cs index 4671e8c00..82e4dab45 100644 --- a/src/Persistence/CosmosDbTests/using_storage_return_types_and_entity_attributes.cs +++ b/src/Persistence/CosmosDbTests/using_storage_return_types_and_entity_attributes.cs @@ -10,6 +10,7 @@ namespace CosmosDbTests; [Collection("cosmosdb")] +[Trait("Category", "Flaky")] public class using_storage_return_types_and_entity_attributes { private readonly AppFixture _fixture; diff --git a/src/Persistence/EfCoreTests.MultiTenancy/EfCoreTests.MultiTenancy.csproj b/src/Persistence/EfCoreTests.MultiTenancy/EfCoreTests.MultiTenancy.csproj index 4c606c150..ea174a298 100644 --- a/src/Persistence/EfCoreTests.MultiTenancy/EfCoreTests.MultiTenancy.csproj +++ b/src/Persistence/EfCoreTests.MultiTenancy/EfCoreTests.MultiTenancy.csproj @@ -4,6 +4,7 @@ false true net9.0 + $(NoWarn);CS0436 diff --git a/src/Persistence/EfCoreTests.MultiTenancy/MultiTenancyCompliance.cs b/src/Persistence/EfCoreTests.MultiTenancy/MultiTenancyCompliance.cs index 9e285b6b8..11c30bd27 100644 --- a/src/Persistence/EfCoreTests.MultiTenancy/MultiTenancyCompliance.cs +++ b/src/Persistence/EfCoreTests.MultiTenancy/MultiTenancyCompliance.cs @@ -29,12 +29,12 @@ public enum DatabaseEngine [Collection("multi-tenancy")] public abstract class MultiTenancyCompliance : IAsyncLifetime, IWolverineExtension { - protected IDbContextBuilder theBuilder; + protected IDbContextBuilder theBuilder = null!; private readonly DatabaseEngine _engine; - protected IAlbaHost theHost; - protected string tenant1ConnectionString; - protected string tenant2ConnectionString; - protected string tenant3ConnectionString; + protected IAlbaHost theHost = null!; + protected string tenant1ConnectionString = null!; + protected string tenant2ConnectionString = null!; + protected string tenant3ConnectionString = null!; protected MultiTenancyCompliance(DatabaseEngine engine) { @@ -164,16 +164,16 @@ public async Task end_to_end_with_commands() var greenDbContext = await theBuilder.BuildAsync("green", CancellationToken.None); var redDbContext = await theBuilder.BuildAsync("red", CancellationToken.None); - (await blueDbContext.Items.FindAsync(blueId)).Name.ShouldBe("Blue!"); + (await blueDbContext.Items.FindAsync(blueId))!.Name.ShouldBe("Blue!"); (await greenDbContext.Items.FindAsync(blueId)).ShouldBeNull(); (await redDbContext.Items.FindAsync(blueId)).ShouldBeNull(); (await blueDbContext.Items.FindAsync(redId)).ShouldBeNull(); (await greenDbContext.Items.FindAsync(redId)).ShouldBeNull(); - (await redDbContext.Items.FindAsync(redId)).Name.ShouldBe("Red!"); + (await redDbContext.Items.FindAsync(redId))!.Name.ShouldBe("Red!"); (await blueDbContext.Items.FindAsync(greenId)).ShouldBeNull(); - (await greenDbContext.Items.FindAsync(greenId)).Name.ShouldBe("Green!"); + (await greenDbContext.Items.FindAsync(greenId))!.Name.ShouldBe("Green!"); (await redDbContext.Items.FindAsync(greenId)).ShouldBeNull(); } @@ -191,7 +191,7 @@ public async Task end_to_end_with_default_database() var greenDbContext = await theBuilder.BuildAsync("green", CancellationToken.None); var redDbContext = await theBuilder.BuildAsync("red", CancellationToken.None); - (await defaultDbContext.FindAsync(defaultId)).Name.ShouldBe("The Default!"); + (await defaultDbContext.FindAsync(defaultId))!.Name.ShouldBe("The Default!"); } catch (DefaultTenantUsageDisabledException) { @@ -214,7 +214,7 @@ public async Task end_to_end_with_cascading_messages() var greenDbContext = await theBuilder.BuildAsync("green", CancellationToken.None); var redDbContext = await theBuilder.BuildAsync("red", CancellationToken.None); - var blue = await blueDbContext.Items.FindAsync(blueId); + var blue = (await blueDbContext.Items.FindAsync(blueId))!; blue.Name.ShouldBe("Blue!"); blue.Approved.ShouldBeTrue(); (await greenDbContext.Items.FindAsync(blueId)).ShouldBeNull(); @@ -222,12 +222,12 @@ public async Task end_to_end_with_cascading_messages() (await blueDbContext.Items.FindAsync(redId)).ShouldBeNull(); (await greenDbContext.Items.FindAsync(redId)).ShouldBeNull(); - var red = await redDbContext.Items.FindAsync(redId); + var red = (await redDbContext.Items.FindAsync(redId))!; red.Name.ShouldBe("Red!"); red.Approved.ShouldBeTrue(); (await blueDbContext.Items.FindAsync(greenId)).ShouldBeNull(); - var green = await greenDbContext.Items.FindAsync(greenId); + var green = (await greenDbContext.Items.FindAsync(greenId))!; green.Name.ShouldBe("Green!"); green.Approved.ShouldBeTrue(); (await redDbContext.Items.FindAsync(greenId)).ShouldBeNull(); @@ -254,7 +254,7 @@ await theHost.Scenario(x => (await redDbContext.FindAsync(command.Id)).ShouldBeNull(); (await greenDbContext.FindAsync(command.Id)).ShouldBeNull(); - (await blueDbContext.FindAsync(command.Id)).Name.ShouldBe(command.Name); + (await blueDbContext.FindAsync(command.Id))!.Name.ShouldBe(command.Name); } [Fact] @@ -277,7 +277,7 @@ await theHost.Scenario(x => (await redDbContext.FindAsync(command.Id)).ShouldBeNull(); (await greenDbContext.FindAsync(command.Id)).ShouldBeNull(); - (await defaultDbContext.FindAsync(command.Id)).Name.ShouldBe(command.Name); + (await defaultDbContext.FindAsync(command.Id))!.Name.ShouldBe(command.Name); } [Fact] @@ -373,13 +373,13 @@ await theHost.Scenario(x => var greenDbContext = await theBuilder.BuildAsync("green", CancellationToken.None); var redDbContext = await theBuilder.BuildAsync("red", CancellationToken.None); - (await blueDbContext.FindAsync(command.Id)).Approved.ShouldBeFalse(); - (await redDbContext.FindAsync(command.Id)).Approved.ShouldBeFalse(); - + (await blueDbContext.FindAsync(command.Id))!.Approved.ShouldBeFalse(); + (await redDbContext.FindAsync(command.Id))!.Approved.ShouldBeFalse(); + // Only approved this one - (await greenDbContext.FindAsync(command.Id)).Approved.ShouldBeTrue(); + (await greenDbContext.FindAsync(command.Id))!.Approved.ShouldBeTrue(); } - + [Fact] public async Task http_post_with_direct_reference_in_middleware() { @@ -403,13 +403,13 @@ await theHost.Scenario(x => var greenDbContext = await theBuilder.BuildAsync("green", CancellationToken.None); var redDbContext = await theBuilder.BuildAsync("red", CancellationToken.None); - (await blueDbContext.FindAsync(command.Id)).Approved.ShouldBeFalse(); - (await redDbContext.FindAsync(command.Id)).Approved.ShouldBeFalse(); - + (await blueDbContext.FindAsync(command.Id))!.Approved.ShouldBeFalse(); + (await redDbContext.FindAsync(command.Id))!.Approved.ShouldBeFalse(); + // Only approved this one - (await greenDbContext.FindAsync(command.Id)).Approved.ShouldBeTrue(); + (await greenDbContext.FindAsync(command.Id))!.Approved.ShouldBeTrue(); } - + [Fact] public async Task http_post_with_by_entity_attribute_and_storage_action() { @@ -433,13 +433,13 @@ await theHost.Scenario(x => var greenDbContext = await theBuilder.BuildAsync("green", CancellationToken.None); var redDbContext = await theBuilder.BuildAsync("red", CancellationToken.None); - (await blueDbContext.FindAsync(command.Id)).Approved.ShouldBeFalse(); - (await redDbContext.FindAsync(command.Id)).Approved.ShouldBeFalse(); - + (await blueDbContext.FindAsync(command.Id))!.Approved.ShouldBeFalse(); + (await redDbContext.FindAsync(command.Id))!.Approved.ShouldBeFalse(); + // Only approved this one - (await greenDbContext.FindAsync(command.Id)).Approved.ShouldBeTrue(); + (await greenDbContext.FindAsync(command.Id))!.Approved.ShouldBeTrue(); } - + [Fact] public async Task use_sagas() { @@ -494,7 +494,7 @@ await theHost.ExecuteAndWaitAsync(async _ => var dbContext = await builder.BuildAsync("blue", CancellationToken.None); var item2 = await dbContext.Items.FindAsync(id); - item2.Approved.ShouldBeTrue(); + item2!.Approved.ShouldBeTrue(); } } \ No newline at end of file diff --git a/src/Persistence/EfCoreTests.MultiTenancy/MultiTenancyDocumentationSamples.cs b/src/Persistence/EfCoreTests.MultiTenancy/MultiTenancyDocumentationSamples.cs index 6aa2e6309..d30fd89fe 100644 --- a/src/Persistence/EfCoreTests.MultiTenancy/MultiTenancyDocumentationSamples.cs +++ b/src/Persistence/EfCoreTests.MultiTenancy/MultiTenancyDocumentationSamples.cs @@ -31,15 +31,15 @@ public async Task static_postgresql() { // First, you do have to have a "main" PostgreSQL database for messaging persistence // that will store information about running nodes, agents, and non-tenanted operations - opts.PersistMessagesWithPostgresql(configuration.GetConnectionString("main")) + opts.PersistMessagesWithPostgresql(configuration.GetConnectionString("main")!) // Add known tenants at bootstrapping time .RegisterStaticTenants(tenants => { // Add connection strings for the expected tenant ids - tenants.Register("tenant1", configuration.GetConnectionString("tenant1")); - tenants.Register("tenant2", configuration.GetConnectionString("tenant2")); - tenants.Register("tenant3", configuration.GetConnectionString("tenant3")); + tenants.Register("tenant1", configuration.GetConnectionString("tenant1")!); + tenants.Register("tenant2", configuration.GetConnectionString("tenant2")!); + tenants.Register("tenant3", configuration.GetConnectionString("tenant3")!); }); opts.Services.AddDbContextWithWolverineManagedMultiTenancy((builder, connectionString, _) => @@ -63,15 +63,15 @@ public async Task static_sqlserver() { // First, you do have to have a "main" PostgreSQL database for messaging persistence // that will store information about running nodes, agents, and non-tenanted operations - opts.PersistMessagesWithSqlServer(configuration.GetConnectionString("main")) + opts.PersistMessagesWithSqlServer(configuration.GetConnectionString("main")!) // Add known tenants at bootstrapping time .RegisterStaticTenants(tenants => { // Add connection strings for the expected tenant ids - tenants.Register("tenant1", configuration.GetConnectionString("tenant1")); - tenants.Register("tenant2", configuration.GetConnectionString("tenant2")); - tenants.Register("tenant3", configuration.GetConnectionString("tenant3")); + tenants.Register("tenant1", configuration.GetConnectionString("tenant1")!); + tenants.Register("tenant2", configuration.GetConnectionString("tenant2")!); + tenants.Register("tenant3", configuration.GetConnectionString("tenant3")!); }); // Just to show that you *can* use more than one DbContext @@ -101,7 +101,7 @@ public void dynamic_multi_tenancy_with_postgresql() { // You need a main database no matter what that will hold information about the Wolverine system itself // and.. - opts.PersistMessagesWithPostgresql(configuration.GetConnectionString("wolverine")) + opts.PersistMessagesWithPostgresql(configuration.GetConnectionString("wolverine")!) // ...also a table holding the tenant id to connection string information .UseMasterTableTenancy(seed => @@ -109,9 +109,9 @@ public void dynamic_multi_tenancy_with_postgresql() // These registrations are 100% just to seed data for local development // Maybe you want to omit this during production? // Or do something programmatic by looping through data in the IConfiguration? - seed.Register("tenant1", configuration.GetConnectionString("tenant1")); - seed.Register("tenant2", configuration.GetConnectionString("tenant2")); - seed.Register("tenant3", configuration.GetConnectionString("tenant3")); + seed.Register("tenant1", configuration.GetConnectionString("tenant1")!); + seed.Register("tenant2", configuration.GetConnectionString("tenant2")!); + seed.Register("tenant3", configuration.GetConnectionString("tenant3")!); }); }); @@ -130,7 +130,7 @@ public void dynamic_multi_tenancy_with_sqlserver() { // You need a main database no matter what that will hold information about the Wolverine system itself // and.. - opts.PersistMessagesWithSqlServer(configuration.GetConnectionString("wolverine")) + opts.PersistMessagesWithSqlServer(configuration.GetConnectionString("wolverine")!) // ...also a table holding the tenant id to connection string information .UseMasterTableTenancy(seed => @@ -138,9 +138,9 @@ public void dynamic_multi_tenancy_with_sqlserver() // These registrations are 100% just to seed data for local development // Maybe you want to omit this during production? // Or do something programmatic by looping through data in the IConfiguration? - seed.Register("tenant1", configuration.GetConnectionString("tenant1")); - seed.Register("tenant2", configuration.GetConnectionString("tenant2")); - seed.Register("tenant3", configuration.GetConnectionString("tenant3")); + seed.Register("tenant1", configuration.GetConnectionString("tenant1")!); + seed.Register("tenant2", configuration.GetConnectionString("tenant2")!); + seed.Register("tenant3", configuration.GetConnectionString("tenant3")!); }); }); diff --git a/src/Persistence/EfCoreTests/Bug_252_codegen_issue.cs b/src/Persistence/EfCoreTests/Bug_252_codegen_issue.cs index a3c78d9ba..1d4e148b0 100644 --- a/src/Persistence/EfCoreTests/Bug_252_codegen_issue.cs +++ b/src/Persistence/EfCoreTests/Bug_252_codegen_issue.cs @@ -95,9 +95,9 @@ public async Task bug_256_message_bus_should_be_in_outbox_transaction() opt.Policies.AutoApplyTransactions(); }).StartAsync(); - var chain = host.Services.GetRequiredService().HandlerFor().As().Chain; - - var lines = chain.SourceCode.ReadLines(); + var chain = host.Services.GetRequiredService().HandlerFor()!.As()!.Chain!; + + var lines = chain.SourceCode!.ReadLines()!; // Just proving that the code generation did NOT opt to use a nested container // for creating the handler diff --git a/src/Persistence/EfCoreTests/Bugs/XUnitLogger.cs b/src/Persistence/EfCoreTests/Bugs/XUnitLogger.cs index c7b6cfce3..2c0df9550 100644 --- a/src/Persistence/EfCoreTests/Bugs/XUnitLogger.cs +++ b/src/Persistence/EfCoreTests/Bugs/XUnitLogger.cs @@ -26,13 +26,13 @@ public bool IsEnabled(LogLevel logLevel) return logLevel != LogLevel.None; } - public IDisposable BeginScope(TState state) + public IDisposable BeginScope(TState state) where TState : notnull { return new Disposable(); } - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, - Func formatter) + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, + Func formatter) { if (exception is DivideByZeroException) { diff --git a/src/Persistence/EfCoreTests/DomainEvents/configuration_of_domain_events_scrapers.cs b/src/Persistence/EfCoreTests/DomainEvents/configuration_of_domain_events_scrapers.cs index c94024108..e05d796b3 100644 --- a/src/Persistence/EfCoreTests/DomainEvents/configuration_of_domain_events_scrapers.cs +++ b/src/Persistence/EfCoreTests/DomainEvents/configuration_of_domain_events_scrapers.cs @@ -25,7 +25,7 @@ namespace EfCoreTests.DomainEvents; [Collection("sqlserver")] public class configuration_of_domain_events_scrapers : IAsyncDisposable { - private IHost theHost; + private IHost theHost = null!; public configuration_of_domain_events_scrapers() { @@ -82,7 +82,7 @@ public async Task publish_domain_events_with_DomainEvents() scope.ServiceProvider.GetRequiredService().ShouldNotBeNull(); var container = theHost.Services.GetRequiredService(); - container.DefaultFor().Lifetime.ShouldBe(ServiceLifetime.Scoped); + container.DefaultFor()!.Lifetime.ShouldBe(ServiceLifetime.Scoped); scope.ServiceProvider.GetServices().Single().ShouldBeOfType(); } diff --git a/src/Persistence/EfCoreTests/EfCoreCompilationScenarios.cs b/src/Persistence/EfCoreTests/EfCoreCompilationScenarios.cs index d575e6c09..662525644 100644 --- a/src/Persistence/EfCoreTests/EfCoreCompilationScenarios.cs +++ b/src/Persistence/EfCoreTests/EfCoreCompilationScenarios.cs @@ -63,7 +63,7 @@ public async Task ef_context_is_singleton_and_options_are_singleton() public class CreateItem { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class CreateItemHandler diff --git a/src/Persistence/EfCoreTests/Migrations/with_one_postgresql_context.cs b/src/Persistence/EfCoreTests/Migrations/with_one_postgresql_context.cs index ca97e85f3..b259d198e 100644 --- a/src/Persistence/EfCoreTests/Migrations/with_one_postgresql_context.cs +++ b/src/Persistence/EfCoreTests/Migrations/with_one_postgresql_context.cs @@ -21,7 +21,7 @@ namespace EfCoreTests.Migrations; [Collection("postgresql")] public class with_one_postgresql_context : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/EfCoreTests/Migrations/with_one_sqlserver_context.cs b/src/Persistence/EfCoreTests/Migrations/with_one_sqlserver_context.cs index 35c82022b..1a8d1a8e4 100644 --- a/src/Persistence/EfCoreTests/Migrations/with_one_sqlserver_context.cs +++ b/src/Persistence/EfCoreTests/Migrations/with_one_sqlserver_context.cs @@ -22,7 +22,7 @@ namespace EfCoreTests.Migrations; [Collection("sqlserver")] public class with_one_sqlserver_context : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -109,9 +109,9 @@ public class Blog public int BlogId { get; set; } [Column("url")] - public string Url { get; set; } + public string Url { get; set; } = null!; // Navigation property for related posts - public List Posts { get; set; } + public List Posts { get; set; } = null!; } public class Post @@ -120,15 +120,15 @@ public class Post public int PostId { get; set; } [Column("title")] - public string Title { get; set; } - + public string Title { get; set; } = null!; + [Column("content")] - public string Content { get; set; } + public string Content { get; set; } = null!; // Foreign key to the Blog [Column("blog_id")] public int BlogId { get; set; } // Navigation property for the related blog - public Blog Blog { get; set; } + public Blog Blog { get; set; } = null!; } public class BloggingContext : DbContext diff --git a/src/Persistence/EfCoreTests/Optimistic_concurrency_with_ef_core.cs b/src/Persistence/EfCoreTests/Optimistic_concurrency_with_ef_core.cs index 3a239de4e..17da6f3cc 100644 --- a/src/Persistence/EfCoreTests/Optimistic_concurrency_with_ef_core.cs +++ b/src/Persistence/EfCoreTests/Optimistic_concurrency_with_ef_core.cs @@ -20,6 +20,7 @@ namespace EfCoreTests; [Collection("sqlserver")] +[Trait("Category", "Flaky")] public class Optimistic_concurrency_with_ef_core { private readonly ITestOutputHelper _output; @@ -61,7 +62,7 @@ await dbContext.ConcurrencyTestSagas.AddAsync(new() }); await dbContext.SaveChangesAsync(); - Should.ThrowAsync(() => host.InvokeMessageAndWaitAsync(new UpdateConcurrencyTestSaga(Guid.NewGuid(), "updated value"))); + await Should.ThrowAsync(() => host.InvokeMessageAndWaitAsync(new UpdateConcurrencyTestSaga(Guid.NewGuid(), "updated value"))); } } @@ -86,7 +87,7 @@ public record UpdateConcurrencyTestSaga(Guid Id, string NewValue); public class ConcurrencyTestSaga : Saga { public Guid Id { get; set; } - public string Value { get; set; } + public string Value { get; set; } = null!; public void Handle(UpdateConcurrencyTestSaga order, OptConcurrencyDbContext ctx) { // Fake 999 updates of the saga while this event is being handled diff --git a/src/Persistence/EfCoreTests/OutboxedMessageHandler.cs b/src/Persistence/EfCoreTests/OutboxedMessageHandler.cs index 7d1c7b02e..78e362eb6 100644 --- a/src/Persistence/EfCoreTests/OutboxedMessageHandler.cs +++ b/src/Persistence/EfCoreTests/OutboxedMessageHandler.cs @@ -9,7 +9,7 @@ public record OutboxedMessage public class OutboxedMessageHandler { - private static TaskCompletionSource _source; + private static TaskCompletionSource _source = null!; public static Task WaitForNextMessage() { diff --git a/src/Persistence/EfCoreTests/Sagas/EfCoreSagaHost.cs b/src/Persistence/EfCoreTests/Sagas/EfCoreSagaHost.cs index 7d4b1c217..e4ce81e4f 100644 --- a/src/Persistence/EfCoreTests/Sagas/EfCoreSagaHost.cs +++ b/src/Persistence/EfCoreTests/Sagas/EfCoreSagaHost.cs @@ -14,7 +14,7 @@ namespace EfCoreTests.Sagas; public class EfCoreSagaHost : ISagaHost { - private IHost _host; + private IHost _host = null!; public IHost BuildHost() { @@ -42,7 +42,7 @@ public async Task LoadState(Guid id) where T : Saga using var scope = _host.Services.CreateScope(); var session = scope.ServiceProvider.GetRequiredService(); - return await session.FindAsync(id); + return (await session.FindAsync(id))!; } public async Task LoadState(int id) where T : Saga @@ -50,7 +50,7 @@ public async Task LoadState(int id) where T : Saga using var scope = _host.Services.CreateScope(); var session = scope.ServiceProvider.GetRequiredService(); - return await session.FindAsync(id); + return (await session.FindAsync(id))!; } public async Task LoadState(long id) where T : Saga @@ -58,7 +58,7 @@ public async Task LoadState(long id) where T : Saga using var scope = _host.Services.CreateScope(); var session = scope.ServiceProvider.GetRequiredService(); - return await session.FindAsync(id); + return (await session.FindAsync(id))!; } public async Task LoadState(string id) where T : Saga @@ -66,7 +66,7 @@ public async Task LoadState(string id) where T : Saga using var scope = _host.Services.CreateScope(); var session = scope.ServiceProvider.GetRequiredService(); - return await session.FindAsync(id); + return (await session.FindAsync(id))!; } } \ No newline at end of file diff --git a/src/Persistence/EfCoreTests/SampleUsageWithAutoApplyTransactions.cs b/src/Persistence/EfCoreTests/SampleUsageWithAutoApplyTransactions.cs index 9eb62a175..2ba69b9b2 100644 --- a/src/Persistence/EfCoreTests/SampleUsageWithAutoApplyTransactions.cs +++ b/src/Persistence/EfCoreTests/SampleUsageWithAutoApplyTransactions.cs @@ -41,7 +41,7 @@ public static async Task quickstart() var builder = Host.CreateApplicationBuilder(); - var connectionString = builder.Configuration.GetConnectionString("sqlserver"); + var connectionString = builder.Configuration.GetConnectionString("sqlserver")!; // Register a DbContext or multiple DbContext types as normal builder.Services.AddDbContext( @@ -75,7 +75,7 @@ public static async Task quickstart2() var builder = Host.CreateApplicationBuilder(); - var connectionString = builder.Configuration.GetConnectionString("sqlserver"); + var connectionString = builder.Configuration.GetConnectionString("sqlserver")!; builder.UseWolverine(opts => { diff --git a/src/Persistence/EfCoreTests/eager_idempotency_with_non_wolverine_mapped_db_context.cs b/src/Persistence/EfCoreTests/eager_idempotency_with_non_wolverine_mapped_db_context.cs index 516c7bc7a..aec1480e7 100644 --- a/src/Persistence/EfCoreTests/eager_idempotency_with_non_wolverine_mapped_db_context.cs +++ b/src/Persistence/EfCoreTests/eager_idempotency_with_non_wolverine_mapped_db_context.cs @@ -48,7 +48,7 @@ public async Task happy_path_eager_idempotency() await dbContext.Database.CurrentTransaction!.CommitAsync(); var persisted = (await runtime.Storage.Admin.AllIncomingAsync()).Single(x => x.Id == envelope.Id); - persisted.Data.Length.ShouldBe(0); + persisted.Data!.Length.ShouldBe(0); persisted.Destination.ShouldBe(envelope.Destination); persisted.MessageType.ShouldBe(envelope.MessageType); persisted.Status.ShouldBe(EnvelopeStatus.Handled); diff --git a/src/Persistence/EfCoreTests/end_to_end_efcore_persistence.cs b/src/Persistence/EfCoreTests/end_to_end_efcore_persistence.cs index 99b9da626..e273b527f 100644 --- a/src/Persistence/EfCoreTests/end_to_end_efcore_persistence.cs +++ b/src/Persistence/EfCoreTests/end_to_end_efcore_persistence.cs @@ -111,7 +111,7 @@ private async Task loadItem(Guid id) var context = nested.ServiceProvider.GetRequiredService(); var item = await context.Items.FindAsync(id); - return item; + return item!; } private async Task saveItem(Item item) @@ -128,8 +128,8 @@ public void service_registrations() { var container = Host.Services.GetRequiredService(); - container.DefaultFor().Lifetime.ShouldBe(ServiceLifetime.Scoped); - container.DefaultFor(typeof(IDbContextOutbox<>)).Lifetime.ShouldBe(ServiceLifetime.Scoped); + container.DefaultFor()!.Lifetime.ShouldBe(ServiceLifetime.Scoped); + container.DefaultFor(typeof(IDbContextOutbox<>))!.Lifetime.ShouldBe(ServiceLifetime.Scoped); } [Fact] @@ -213,7 +213,7 @@ public async Task persist_an_outgoing_envelope_raw() var messaging = nested.ServiceProvider.GetRequiredService>() .ShouldBeOfType>(); - await messaging.Transaction.PersistOutgoingAsync(envelope); + await messaging.Transaction!.PersistOutgoingAsync(envelope); messaging.DbContext.Items.Add(new Item { Id = Guid.NewGuid(), Name = Guid.NewGuid().ToString() }); await messaging.SaveChangesAndFlushMessagesAsync(); @@ -256,7 +256,7 @@ public async Task persist_an_outgoing_envelope_mapped() var messaging = nested.ServiceProvider.GetRequiredService>() .ShouldBeOfType>(); - await messaging.Transaction.PersistOutgoingAsync(envelope); + await messaging.Transaction!.PersistOutgoingAsync(envelope); messaging.DbContext.Items.Add(new Item { Id = Guid.NewGuid(), Name = Guid.NewGuid().ToString() }); await messaging.SaveChangesAndFlushMessagesAsync(); @@ -426,7 +426,7 @@ public async Task persist_an_incoming_envelope_raw() messaging.Enroll(context); - await messaging.As().Transaction.PersistIncomingAsync(envelope); + await messaging.As().Transaction!.PersistIncomingAsync(envelope); await messaging.SaveChangesAndFlushMessagesAsync(); } @@ -471,7 +471,7 @@ public async Task persist_an_incoming_envelope_mapped() messaging.Enroll(context); - await messaging.As().Transaction.PersistIncomingAsync(envelope); + await messaging.As().Transaction!.PersistIncomingAsync(envelope); await messaging.SaveChangesAndFlushMessagesAsync(); } @@ -520,8 +520,8 @@ public void Handle(Pass pass) public class Pass { - public string From { get; set; } - public string To { get; set; } + public string From { get; set; } = null!; + public string To { get; set; } = null!; } diff --git a/src/Persistence/EfCoreTests/idempotency_with_inline_or_buffered_endpoints_end_to_end.cs b/src/Persistence/EfCoreTests/idempotency_with_inline_or_buffered_endpoints_end_to_end.cs index 2d2980624..ca0be647b 100644 --- a/src/Persistence/EfCoreTests/idempotency_with_inline_or_buffered_endpoints_end_to_end.cs +++ b/src/Persistence/EfCoreTests/idempotency_with_inline_or_buffered_endpoints_end_to_end.cs @@ -68,7 +68,7 @@ public async Task happy_and_sad_path(IdempotencyStyle idempotency, bool isWolver var sentMessage = tracked1.Executed.SingleEnvelope(); var runtime = host.GetRuntime(); - var circuit = runtime.Endpoints.FindListenerCircuit(sentMessage.Destination); + var circuit = runtime.Endpoints.FindListenerCircuit(sentMessage.Destination!); var tracked2 = await host.TrackActivity() .DoNotAssertOnExceptionsDetected() @@ -76,7 +76,7 @@ public async Task happy_and_sad_path(IdempotencyStyle idempotency, bool isWolver { sentMessage.WasPersistedInInbox = false; sentMessage.Attempts = 0; - return circuit.EnqueueDirectlyAsync([sentMessage]); + return circuit!.EnqueueDirectlyAsync([sentMessage]); }); tracked2.Discarded.SingleEnvelope().ShouldNotBeNull(); @@ -119,7 +119,7 @@ public async Task happy_and_sad_path_with_message_and_destination_tracking(Idemp var sentMessage = tracked1.Executed.SingleEnvelope(); var runtime = host.GetRuntime(); - var circuit = runtime.Endpoints.FindListenerCircuit(sentMessage.Destination); + var circuit = runtime.Endpoints.FindListenerCircuit(sentMessage.Destination!); var tracked2 = await host.TrackActivity() .DoNotAssertOnExceptionsDetected() @@ -127,7 +127,7 @@ public async Task happy_and_sad_path_with_message_and_destination_tracking(Idemp { sentMessage.WasPersistedInInbox = false; sentMessage.Attempts = 0; - return circuit.EnqueueDirectlyAsync([sentMessage]); + return circuit!.EnqueueDirectlyAsync([sentMessage]); }); tracked2.Discarded.SingleEnvelope().ShouldNotBeNull(); @@ -160,7 +160,7 @@ public async Task apply_idempotency_to_non_transactional_handler() #endregion - var chain = host.GetRuntime().Handlers.ChainFor(); + var chain = host.GetRuntime().Handlers.ChainFor()!; chain.IsTransactional.ShouldBeFalse(); chain.Middleware.OfType().Any(x => x.Method.Name == nameof(MessageContext.AssertEagerIdempotencyAsync)).ShouldBeTrue(); chain.Postprocessors.OfType().Any(x => x.Method.Name == nameof(MessageContext.PersistHandledAsync)).ShouldBeTrue(); @@ -172,7 +172,7 @@ public async Task apply_idempotency_to_non_transactional_handler() var sentMessage = tracked1.Executed.SingleEnvelope(); var runtime = host.GetRuntime(); - var circuit = runtime.Endpoints.FindListenerCircuit(sentMessage.Destination); + var circuit = runtime.Endpoints.FindListenerCircuit(sentMessage.Destination!); var tracked2 = await host.TrackActivity() .DoNotAssertOnExceptionsDetected() @@ -181,7 +181,7 @@ public async Task apply_idempotency_to_non_transactional_handler() { sentMessage.WasPersistedInInbox = false; sentMessage.Attempts = 0; - return circuit.EnqueueDirectlyAsync([sentMessage]); + return circuit!.EnqueueDirectlyAsync([sentMessage]); }); tracked2.Discarded.SingleEnvelope().ShouldNotBeNull(); diff --git a/src/Persistence/EfCoreTests/persisting_envelopes_with_sqlserver.cs b/src/Persistence/EfCoreTests/persisting_envelopes_with_sqlserver.cs index 763514195..1152bc5e4 100644 --- a/src/Persistence/EfCoreTests/persisting_envelopes_with_sqlserver.cs +++ b/src/Persistence/EfCoreTests/persisting_envelopes_with_sqlserver.cs @@ -21,9 +21,9 @@ namespace EfCoreTests; [Collection("sqlserver")] public class persisting_envelopes_with_sqlserver : IAsyncLifetime { - private IHost _host; - private Envelope theIncomingEnvelope; - private Envelope theOutgoingEnvelope; + private IHost _host = null!; + private Envelope theIncomingEnvelope = null!; + private Envelope theOutgoingEnvelope = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/EfCoreTests/transaction_middleware_mode_tests.cs b/src/Persistence/EfCoreTests/transaction_middleware_mode_tests.cs index ad7369115..b18325177 100644 --- a/src/Persistence/EfCoreTests/transaction_middleware_mode_tests.cs +++ b/src/Persistence/EfCoreTests/transaction_middleware_mode_tests.cs @@ -36,7 +36,7 @@ public async Task eager_mode_should_add_transaction_frame() .IncludeType(); }).StartAsync(); - var chain = host.GetRuntime().Handlers.ChainFor(); + var chain = host.GetRuntime().Handlers.ChainFor()!; chain.Middleware.OfType().ShouldNotBeEmpty(); @@ -72,7 +72,7 @@ public async Task lightweight_mode_should_not_add_transaction_frame() #endregion - var chain = host.GetRuntime().Handlers.ChainFor(); + var chain = host.GetRuntime().Handlers.ChainFor()!; chain.Middleware.OfType().ShouldBeEmpty(); chain.Middleware.OfType().ShouldBeEmpty(); @@ -103,12 +103,12 @@ public async Task transactional_attribute_lightweight_overrides_eager_default() }).StartAsync(); // Verify the auto-applied handler uses the Eager default - var eagerChain = host.GetRuntime().Handlers.ChainFor(); + var eagerChain = host.GetRuntime().Handlers.ChainFor()!; eagerChain.Middleware.OfType().ShouldNotBeEmpty(); // Force compilation of the [Transactional] chain by triggering HandlerFor host.GetRuntime().Handlers.HandlerFor(); - var chain = host.GetRuntime().Handlers.ChainFor(); + var chain = host.GetRuntime().Handlers.ChainFor()!; // The attribute overrides to Lightweight, so no transaction frame chain.IsTransactional.ShouldBeTrue(); @@ -141,12 +141,12 @@ public async Task transactional_attribute_eager_overrides_lightweight_default() }).StartAsync(); // Verify the auto-applied handler uses the Lightweight default - var lightChain = host.GetRuntime().Handlers.ChainFor(); + var lightChain = host.GetRuntime().Handlers.ChainFor()!; lightChain.Middleware.OfType().ShouldBeEmpty(); // Force compilation of the [Transactional] chain by triggering HandlerFor host.GetRuntime().Handlers.HandlerFor(); - var chain = host.GetRuntime().Handlers.ChainFor(); + var chain = host.GetRuntime().Handlers.ChainFor()!; // The attribute overrides to Eager, so transaction frame should be present chain.IsTransactional.ShouldBeTrue(); @@ -178,7 +178,7 @@ public async Task lightweight_attribute_with_storage_side_effects_should_not_add // Force compilation host.GetRuntime().Handlers.HandlerFor(); - var chain = host.GetRuntime().Handlers.ChainFor(); + var chain = host.GetRuntime().Handlers.ChainFor()!; // The [Transactional(Mode = Lightweight)] should override even with Storage side effects chain.Middleware.OfType().ShouldBeEmpty(); @@ -210,7 +210,7 @@ public async Task eager_attribute_with_storage_side_effects_should_add_transacti // Force compilation host.GetRuntime().Handlers.HandlerFor(); - var chain = host.GetRuntime().Handlers.ChainFor(); + var chain = host.GetRuntime().Handlers.ChainFor()!; // The [Transactional(Mode = Eager)] should override the Lightweight default chain.Middleware.OfType().ShouldNotBeEmpty(); @@ -239,7 +239,7 @@ public async Task default_mode_is_eager() .IncludeType(); }).StartAsync(); - var chain = host.GetRuntime().Handlers.ChainFor(); + var chain = host.GetRuntime().Handlers.ChainFor()!; // Default should be Eager chain.Middleware.OfType().ShouldNotBeEmpty(); diff --git a/src/Persistence/EfCoreTests/using_add_dbcontext_with_wolverine_integration.cs b/src/Persistence/EfCoreTests/using_add_dbcontext_with_wolverine_integration.cs index 7c323503c..5d004bedf 100644 --- a/src/Persistence/EfCoreTests/using_add_dbcontext_with_wolverine_integration.cs +++ b/src/Persistence/EfCoreTests/using_add_dbcontext_with_wolverine_integration.cs @@ -27,7 +27,7 @@ namespace EfCoreTests; [Collection("sqlserver")] public class using_add_dbcontext_with_wolverine_integration : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -54,7 +54,7 @@ public async Task DisposeAsync() SqlConnection.ClearAllPools(); } - public Table ItemsTable { get; } + public Table ItemsTable { get; } = null!; [Fact] public void is_wolverine_enabled() @@ -83,7 +83,7 @@ public async Task happy_path_eager_idempotency() await dbContext.Database.CurrentTransaction!.CommitAsync(); var persisted = (await runtime.Storage.Admin.AllIncomingAsync()).Single(x => x.Id == envelope.Id); - persisted.Data.Length.ShouldBe(0); + persisted.Data!.Length.ShouldBe(0); persisted.Destination.ShouldBe(envelope.Destination); persisted.MessageType.ShouldBe(envelope.MessageType); persisted.Status.ShouldBe(EnvelopeStatus.Handled); diff --git a/src/Persistence/LeaderElection/CosmosDbTests.LeaderElection/CosmosDbContainerFixture.cs b/src/Persistence/LeaderElection/CosmosDbTests.LeaderElection/CosmosDbContainerFixture.cs new file mode 100644 index 000000000..1d75b8277 --- /dev/null +++ b/src/Persistence/LeaderElection/CosmosDbTests.LeaderElection/CosmosDbContainerFixture.cs @@ -0,0 +1,34 @@ +using System.Runtime.CompilerServices; +using DotNet.Testcontainers.Builders; +using DotNet.Testcontainers.Containers; + +namespace CosmosDbTests.LeaderElection; + +public static class CosmosDbContainerFixture +{ + private static IContainer? _container; + + public const string AccountKey = "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="; + + public static string ConnectionString { get; private set; } = + "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="; + + [ModuleInitializer] + internal static void Initialize() + { + _container = new ContainerBuilder() + .WithImage("mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview") + .WithPortBinding(8081, true) + .WithPortBinding(1234, true) + .WithEnvironment("PROTOCOL", "https") + .WithWaitStrategy(Wait.ForUnixContainer() + .UntilMessageIsLogged("Gateway=OK")) + .Build(); + + _container.StartAsync().GetAwaiter().GetResult(); + + var host = _container.Hostname; + var port = _container.GetMappedPublicPort(8081); + ConnectionString = $"AccountEndpoint=https://{host}:{port}/;AccountKey={AccountKey}"; + } +} diff --git a/src/Persistence/LeaderElection/CosmosDbTests.LeaderElection/CosmosDbTests.LeaderElection.csproj b/src/Persistence/LeaderElection/CosmosDbTests.LeaderElection/CosmosDbTests.LeaderElection.csproj index 6333f9389..be4a67bc5 100644 --- a/src/Persistence/LeaderElection/CosmosDbTests.LeaderElection/CosmosDbTests.LeaderElection.csproj +++ b/src/Persistence/LeaderElection/CosmosDbTests.LeaderElection/CosmosDbTests.LeaderElection.csproj @@ -8,6 +8,7 @@ + all diff --git a/src/Persistence/LeaderElection/CosmosDbTests.LeaderElection/leader_election.cs b/src/Persistence/LeaderElection/CosmosDbTests.LeaderElection/leader_election.cs index c07b39844..d38c9fe07 100644 --- a/src/Persistence/LeaderElection/CosmosDbTests.LeaderElection/leader_election.cs +++ b/src/Persistence/LeaderElection/CosmosDbTests.LeaderElection/leader_election.cs @@ -12,8 +12,7 @@ namespace CosmosDbTests.LeaderElection; public class leader_election : LeadershipElectionCompliance { - public const string ConnectionString = - "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="; + public static string ConnectionString => CosmosDbContainerFixture.ConnectionString; public const string DatabaseName = "wolverine_tests"; diff --git a/src/Persistence/LeaderElection/RavenDbTests.LeaderElection/leadership_election_compliance.cs b/src/Persistence/LeaderElection/RavenDbTests.LeaderElection/leadership_election_compliance.cs index 4e9f03ede..04558038c 100644 --- a/src/Persistence/LeaderElection/RavenDbTests.LeaderElection/leadership_election_compliance.cs +++ b/src/Persistence/LeaderElection/RavenDbTests.LeaderElection/leadership_election_compliance.cs @@ -24,7 +24,7 @@ public class DatabaseCollection : ICollectionFixture public class leadership_election_compliance : LeadershipElectionCompliance { private readonly DatabaseFixture _fixture; - private IDocumentStore _store; + private IDocumentStore _store = null!; public leadership_election_compliance(ITestOutputHelper output, DatabaseFixture fixture) : base(output) { diff --git a/src/Persistence/LoadTesting/Repairs/RepairWork.cs b/src/Persistence/LoadTesting/Repairs/RepairWork.cs index 7876bb8c9..7bbae290f 100644 --- a/src/Persistence/LoadTesting/Repairs/RepairWork.cs +++ b/src/Persistence/LoadTesting/Repairs/RepairWork.cs @@ -2,5 +2,5 @@ public class RepairWork { public Guid Id { get; set; } public Guid TripId { get; set; } - public string State { get; set; } + public string State { get; set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/LoadTesting/Trips/Trip.cs b/src/Persistence/LoadTesting/Trips/Trip.cs index eecf2f90c..d219ac702 100644 --- a/src/Persistence/LoadTesting/Trips/Trip.cs +++ b/src/Persistence/LoadTesting/Trips/Trip.cs @@ -11,7 +11,7 @@ public class Trip : Activity public double Traveled { get; set; } - public string State { get; set; } + public string State { get; set; } = null!; public bool Active { get; set; } @@ -23,7 +23,7 @@ protected bool Equals(Trip other) return Id.Equals(other.Id) && EndedOn == other.EndedOn && Traveled.Equals(other.Traveled) && State == other.State && Active == other.Active && StartedOn == other.StartedOn; } - public override bool Equals(object obj) + public override bool Equals(object? obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; diff --git a/src/Persistence/LoadTesting/Trips/TripStream.cs b/src/Persistence/LoadTesting/Trips/TripStream.cs index d36e97155..e43571392 100644 --- a/src/Persistence/LoadTesting/Trips/TripStream.cs +++ b/src/Persistence/LoadTesting/Trips/TripStream.cs @@ -111,10 +111,10 @@ public bool IsFinishedPublishing() public bool TryCheckoutCommand(out object command) { - return (Messages.TryDequeue(out command)); + return (Messages.TryDequeue(out command!)); } - public string TenantId { get; set; } + public string TenantId { get; set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/MartenSubscriptionTests/subscriptions_end_to_end.cs b/src/Persistence/MartenSubscriptionTests/subscriptions_end_to_end.cs index bcfeeb2fc..4a85485ea 100644 --- a/src/Persistence/MartenSubscriptionTests/subscriptions_end_to_end.cs +++ b/src/Persistence/MartenSubscriptionTests/subscriptions_end_to_end.cs @@ -78,10 +78,10 @@ public async Task use_unfiltered_batch_subscription() tracked.Executed.MessagesOf().Count().ShouldBeGreaterThanOrEqualTo(4); using var query = store.QuerySession(); - (await query.LoadAsync("A")).Count.ShouldBe(6); - (await query.LoadAsync("B")).Count.ShouldBe(7); - (await query.LoadAsync("C")).Count.ShouldBe(5); - (await query.LoadAsync("D")).Count.ShouldBe(6); + (await query.LoadAsync("A"))!.Count.ShouldBe(6); + (await query.LoadAsync("B"))!.Count.ShouldBe(7); + (await query.LoadAsync("C"))!.Count.ShouldBe(5); + (await query.LoadAsync("D"))!.Count.ShouldBe(6); } [Fact] @@ -136,8 +136,8 @@ public async Task use_filtered_batch_subscription() tracked.Executed.MessagesOf().Count().ShouldBeGreaterThanOrEqualTo(2); using var query = store.QuerySession(); - (await query.LoadAsync("A")).Count.ShouldBe(6); - (await query.LoadAsync("B")).Count.ShouldBe(7); + (await query.LoadAsync("A"))!.Count.ShouldBe(6); + (await query.LoadAsync("B"))!.Count.ShouldBe(7); (await query.LoadAsync("C")).ShouldBeNull(); (await query.LoadAsync("D")).ShouldBeNull(); } @@ -613,7 +613,7 @@ public override async Task ProcessEventsAsync(EventRange page, ISubscriptionCont public class EventTotals { - public string Id { get; set; } + public string Id { get; set; } = null!; public int Count { get; set; } } diff --git a/src/Persistence/MartenTests/AggregateHandlerWorkflow/AggregateHandlerAttributeTests.cs b/src/Persistence/MartenTests/AggregateHandlerWorkflow/AggregateHandlerAttributeTests.cs index 5505dfc50..1ceba356b 100644 --- a/src/Persistence/MartenTests/AggregateHandlerWorkflow/AggregateHandlerAttributeTests.cs +++ b/src/Persistence/MartenTests/AggregateHandlerWorkflow/AggregateHandlerAttributeTests.cs @@ -25,7 +25,7 @@ public void determine_version_member_for_aggregate() [Fact] public void determine_aggregate_by_second_parameter() { - var chain = HandlerChain.For(x => x.Handle(default(ApproveInvoice), default), + var chain = HandlerChain.For(x => x.Handle(default(ApproveInvoice)!, default!), new HandlerGraph()); AggregateHandling.DetermineAggregateType(chain) .ShouldBe(typeof(Invoice)); @@ -34,7 +34,7 @@ public void determine_aggregate_by_second_parameter() [Fact] public void throw_if_aggregate_type_is_indeterminate() { - var chain = HandlerChain.For(x => x.Handle(default(ApproveInvoice)), new HandlerGraph()); + var chain = HandlerChain.For(x => x.Handle(default(ApproveInvoice)!), new HandlerGraph()); Should.Throw(() => { AggregateHandling.DetermineAggregateType(chain); @@ -44,7 +44,7 @@ public void throw_if_aggregate_type_is_indeterminate() [Fact] public void throw_if_return_is_void_and_does_not_take_in_stream() { - var chain = HandlerChain.For(x => x.Handle(default(Invalid1), default), new HandlerGraph()); + var chain = HandlerChain.For(x => x.Handle(default(Invalid1)!, default!), new HandlerGraph()); Should.Throw(() => { new AggregateHandlerAttribute().Modify(chain, new GenerationRules(), ServiceContainer.Empty()); @@ -54,7 +54,7 @@ public void throw_if_return_is_void_and_does_not_take_in_stream() [Fact] public void throw_if_return_is_Task_and_does_not_take_in_stream() { - var chain = HandlerChain.For(x => x.Handle(default(Invalid2), default), new HandlerGraph()); + var chain = HandlerChain.For(x => x.Handle(default(Invalid2)!, default!), new HandlerGraph()); Should.Throw(() => { new AggregateHandlerAttribute().Modify(chain, new GenerationRules(), ServiceContainer.Empty()); @@ -64,7 +64,7 @@ public void throw_if_return_is_Task_and_does_not_take_in_stream() [Fact] public void determine_aggregate_id_from_command_type_in_aggregate_handler_attribute() { - var chain = HandlerChain.For(x => x.Handle(default(CreateInvoice)), new HandlerGraph()); + var chain = HandlerChain.For(x => x.Handle(default(CreateInvoice)!), new HandlerGraph()); new AggregateHandlerAttribute {AggregateType = typeof(Invoice) }.TryInferMessageIdentity(chain, out var property) .ShouldBe(true); property.Name.ShouldBe(nameof(CreateInvoice.Id)); diff --git a/src/Persistence/MartenTests/AggregateHandlerWorkflow/aggregate_handler_workflow.cs b/src/Persistence/MartenTests/AggregateHandlerWorkflow/aggregate_handler_workflow.cs index a496c47af..bcc1d8218 100644 --- a/src/Persistence/MartenTests/AggregateHandlerWorkflow/aggregate_handler_workflow.cs +++ b/src/Persistence/MartenTests/AggregateHandlerWorkflow/aggregate_handler_workflow.cs @@ -18,8 +18,8 @@ namespace MartenTests.AggregateHandlerWorkflow; public class aggregate_handler_workflow: PostgresqlContext, IAsyncLifetime { - private IHost theHost; - private IDocumentStore theStore; + private IHost theHost = null!; + private IDocumentStore theStore = null!; private Guid theStreamId; public async Task InitializeAsync() @@ -61,7 +61,7 @@ internal async Task GivenAggregate() internal async Task LoadAggregate() { await using var session = theStore.LightweightSession(); - return await session.LoadAsync(theStreamId); + return (await session.LoadAsync(theStreamId))!; } internal async Task OnAggregate(Action assertions) @@ -94,9 +94,9 @@ public void automatically_adding_stream_id_to_the_audit_members() var handler = theHost.GetRuntime().Handlers.HandlerFor(); var chain = theHost.GetRuntime().Handlers.ChainFor(); - chain.AuditedMembers.Single().MemberName.ShouldBe(nameof(RaiseABC.LetterAggregateId)); - - chain.SourceCode.ShouldContain("System.Diagnostics.Activity.Current?.SetTag(\"letter.aggregate.id\", raiseABC.LetterAggregateId);"); + chain!.AuditedMembers.Single().MemberName.ShouldBe(nameof(RaiseABC.LetterAggregateId)); + + chain.SourceCode!.ShouldContain("System.Diagnostics.Activity.Current?.SetTag(\"letter.aggregate.id\", raiseABC.LetterAggregateId);"); } [Fact] @@ -105,7 +105,7 @@ public async Task events_then_response_invoke_with_return() await GivenAggregate(); var (tracked, response) = await theHost.InvokeMessageAndWaitAsync(new RaiseABC(theStreamId)); - response.ACount.ShouldBe(1); + response!.ACount.ShouldBe(1); response.BCount.ShouldBe(1); response.CCount.ShouldBe(1); @@ -138,7 +138,7 @@ [Fact] public async Task response_then_events_invoke_with_return() await GivenAggregate(); var (tracked, response) = await theHost.InvokeMessageAndWaitAsync(new RaiseAABCC(theStreamId)); - response.ACount.ShouldBe(2); + response!.ACount.ShouldBe(2); response.BCount.ShouldBe(1); response.CCount.ShouldBe(2); @@ -158,7 +158,7 @@ public async Task return_mix_of_events_messages_and_response() var (tracked, response) = await theHost.InvokeMessageAndWaitAsync(new RaiseBBCCC(theStreamId)); // Just proves that this is what comes out of the handler - response.ACount.ShouldBe(5); + response!.ACount.ShouldBe(5); await OnAggregate(a => { @@ -177,7 +177,7 @@ public async Task use_event_stream_arg_but_still_return_response() await GivenAggregate(); var (tracked, response) = await theHost.InvokeMessageAndWaitAsync(new RaiseAAA(theStreamId)); - response.CCount.ShouldBe(11); + response!.CCount.ShouldBe(11); await OnAggregate(a => { @@ -248,7 +248,7 @@ public async Task using_updated_aggregate_as_response() tracked.Sent.AllMessages().ShouldBeEmpty(); - updated.ACount.ShouldBe(3); + updated!.ACount.ShouldBe(3); updated.BCount.ShouldBe(4); } @@ -271,11 +271,11 @@ public async Task using_the_aggregate_in_a_before_method() { // Should not apply anything new if there is a value for ACount var existing1 = await session.LoadAsync(streamId); - existing1.BCount.ShouldBe(0); - + existing1!.BCount.ShouldBe(0); + // Should apply anything new if there was no value for ACount var existing2 = await session.LoadAsync(streamId2); - existing2.BCount.ShouldBe(1); + existing2!.BCount.ShouldBe(1); } } } @@ -318,8 +318,8 @@ public static class Outgoing1Handler public record Outgoing1 { - public Event3 Event { get; set; } - public Aggregate Aggregate { get; set; } + public Event3 Event { get; set; } = null!; + public Aggregate Aggregate { get; set; } = null!; } public record LetterMessage1; diff --git a/src/Persistence/MartenTests/AggregateHandlerWorkflow/aggregate_handler_workflow_with_ievent.cs b/src/Persistence/MartenTests/AggregateHandlerWorkflow/aggregate_handler_workflow_with_ievent.cs index 1c5930508..48824b022 100644 --- a/src/Persistence/MartenTests/AggregateHandlerWorkflow/aggregate_handler_workflow_with_ievent.cs +++ b/src/Persistence/MartenTests/AggregateHandlerWorkflow/aggregate_handler_workflow_with_ievent.cs @@ -67,7 +67,7 @@ public async Task use_ievent_as_Guid_id() tracked.Executed.SingleEnvelope>().ShouldNotBeNull(); var doc = await session.LoadAsync(streamId); - doc.DCount.ShouldBe(1); + doc!.DCount.ShouldBe(1); } [Fact] @@ -110,7 +110,7 @@ public async Task using_string_as_stream_key() tracked.Executed.SingleEnvelope>().ShouldNotBeNull(); var doc = await session.LoadAsync(streamKey); - doc.DCount.ShouldBe(1); + doc!.DCount.ShouldBe(1); } @@ -129,7 +129,7 @@ public static DEvent Handle(IEvent _, LetterAggregate aggregate) public class LetterCountsByString: IRevisioned { - public string Id { get; set; } + public string Id { get; set; } = null!; public int ACount { get; set; } public int BCount { get; set; } public int CCount { get; set; } @@ -156,7 +156,7 @@ public static DEvent Handle(IEvent e, LetterCountsByString aggregate) public class LetterCountsByStringProjection: SingleStreamProjection { - public override LetterCountsByString Evolve(LetterCountsByString snapshot, string id, IEvent e) + public override LetterCountsByString Evolve(LetterCountsByString? snapshot, string id, IEvent e) { snapshot ??= new LetterCountsByString { Id = id }; diff --git a/src/Persistence/MartenTests/AggregateHandlerWorkflow/always_enforce_consistency_workflow.cs b/src/Persistence/MartenTests/AggregateHandlerWorkflow/always_enforce_consistency_workflow.cs index 7e3afaead..7cfab4570 100644 --- a/src/Persistence/MartenTests/AggregateHandlerWorkflow/always_enforce_consistency_workflow.cs +++ b/src/Persistence/MartenTests/AggregateHandlerWorkflow/always_enforce_consistency_workflow.cs @@ -16,8 +16,8 @@ namespace MartenTests.AggregateHandlerWorkflow; public class always_enforce_consistency_workflow : PostgresqlContext, IAsyncLifetime { - private IHost theHost; - private IDocumentStore theStore; + private IHost theHost = null!; + private IDocumentStore theStore = null!; private Guid theStreamId; public async Task InitializeAsync() @@ -59,7 +59,7 @@ private async Task GivenAggregate() private async Task LoadAggregate() { await using var session = theStore.LightweightSession(); - return await session.LoadAsync(theStreamId); + return (await session.LoadAsync(theStreamId))!; } [Fact] diff --git a/src/Persistence/MartenTests/AggregateHandlerWorkflow/marten_command_workflow_middleware.cs b/src/Persistence/MartenTests/AggregateHandlerWorkflow/marten_command_workflow_middleware.cs index 55667252c..51826591f 100644 --- a/src/Persistence/MartenTests/AggregateHandlerWorkflow/marten_command_workflow_middleware.cs +++ b/src/Persistence/MartenTests/AggregateHandlerWorkflow/marten_command_workflow_middleware.cs @@ -60,7 +60,7 @@ internal async Task GivenAggregate() internal async Task LoadAggregate() { await using var session = theStore.LightweightSession(); - return await session.LoadAsync(theStreamId); + return (await session.LoadAsync(theStreamId))!; } internal async Task OnAggregate(Action assertions) @@ -249,7 +249,7 @@ public class LetterAggregateHandler // No event returned public AEvent Handle(IncrementNone command, LetterAggregate aggregate) { - return null; + return null!; } // Synchronous, one event, no other services @@ -307,13 +307,13 @@ public Task Handle(IncrementManyAsync command, LetterAggregate aggrega public void Handle(IncrementC command, IEventStream stream) { - command.LetterAggregateId.ShouldBe(stream.Aggregate.Id); + command.LetterAggregateId.ShouldBe(stream.Aggregate!.Id); stream.AppendOne(new CEvent()); } public Task Handle(IncrementD command, IEventStream stream) { - command.LetterAggregateId.ShouldBe(stream.Aggregate.Id); + command.LetterAggregateId.ShouldBe(stream.Aggregate!.Id); stream.AppendOne(new DEvent()); return Task.CompletedTask; } diff --git a/src/Persistence/MartenTests/AggregateHandlerWorkflow/mixed_aggregate_handler_with_multiple_streams.cs b/src/Persistence/MartenTests/AggregateHandlerWorkflow/mixed_aggregate_handler_with_multiple_streams.cs index 703ce5ea8..560b0e7f0 100644 --- a/src/Persistence/MartenTests/AggregateHandlerWorkflow/mixed_aggregate_handler_with_multiple_streams.cs +++ b/src/Persistence/MartenTests/AggregateHandlerWorkflow/mixed_aggregate_handler_with_multiple_streams.cs @@ -34,7 +34,7 @@ public async Task get_the_correct_aggregate_back_out() await session.SaveChangesAsync(); var (tracked, account) = await host.InvokeMessageAndWaitAsync(new MakePurchase(accountId, inventoryId, 30)); - account.Balance.ShouldBe(1700); + account!.Balance.ShouldBe(1700); } } @@ -67,7 +67,7 @@ public record Drawdown(int Quantity); public class Inventory { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; public int Quantity { get; set; } public double UnitPrice { get; set; } @@ -98,8 +98,8 @@ public static UpdatedAggregate Handle( [WriteAggregate] IEventStream inventory) { - if (command.Number > inventory.Aggregate.Quantity || - (command.Number * inventory.Aggregate.UnitPrice) > account.Aggregate.Balance) + if (command.Number > inventory.Aggregate!.Quantity || + (command.Number * inventory.Aggregate.UnitPrice) > account.Aggregate!.Balance) { // Do Nothing! return new UpdatedAggregate(); diff --git a/src/Persistence/MartenTests/AggregateHandlerWorkflow/multi_stream_version_and_consistency.cs b/src/Persistence/MartenTests/AggregateHandlerWorkflow/multi_stream_version_and_consistency.cs index dc993b910..c70a0b41f 100644 --- a/src/Persistence/MartenTests/AggregateHandlerWorkflow/multi_stream_version_and_consistency.cs +++ b/src/Persistence/MartenTests/AggregateHandlerWorkflow/multi_stream_version_and_consistency.cs @@ -16,8 +16,8 @@ namespace MartenTests.AggregateHandlerWorkflow; public class multi_stream_version_and_consistency : PostgresqlContext, IAsyncLifetime { - private IHost theHost; - private IDocumentStore theStore; + private IHost theHost = null!; + private IDocumentStore theStore = null!; private Guid fromAccountId; private Guid toAccountId; @@ -60,7 +60,7 @@ private async Task GivenAccounts(decimal fromBalance = 1000, decimal toBalance = private async Task LoadAccount(Guid id) { await using var session = theStore.LightweightSession(); - return await session.LoadAsync(id); + return (await session.LoadAsync(id))!; } [Fact] @@ -198,7 +198,7 @@ public static void Handle( [WriteAggregate] IEventStream fromAccount, [WriteAggregate(nameof(TransferFunds.ToAccountId))] IEventStream toAccount) { - if (fromAccount.Aggregate.Balance >= command.Amount) + if (fromAccount.Aggregate!.Balance >= command.Amount) { fromAccount.AppendOne(new FundsWithdrawn(command.Amount)); toAccount.AppendOne(new FundsDeposited(command.Amount)); @@ -218,7 +218,7 @@ public static void Handle( VersionSource = nameof(TransferFundsWithDualVersion.ToVersion))] IEventStream toAccount) { - if (fromAccount.Aggregate.Balance >= command.Amount) + if (fromAccount.Aggregate!.Balance >= command.Amount) { fromAccount.AppendOne(new FundsWithdrawn(command.Amount)); toAccount.AppendOne(new FundsDeposited(command.Amount)); @@ -244,7 +244,7 @@ public static async Task Handle( await sneakySession.SaveChangesAsync(); // Insufficient funds: don't append any events to "from" - if (fromAccount.Aggregate.Balance >= command.Amount) + if (fromAccount.Aggregate!.Balance >= command.Amount) { fromAccount.AppendOne(new FundsWithdrawn(command.Amount)); toAccount.AppendOne(new FundsDeposited(command.Amount)); @@ -266,7 +266,7 @@ public static void Handle( IEventStream toAccount) { // Insufficient funds: don't append any events to either stream - if (fromAccount.Aggregate.Balance >= command.Amount) + if (fromAccount.Aggregate!.Balance >= command.Amount) { fromAccount.AppendOne(new FundsWithdrawn(command.Amount)); toAccount.AppendOne(new FundsDeposited(command.Amount)); diff --git a/src/Persistence/MartenTests/AggregateHandlerWorkflow/override_of_event_metadata.cs b/src/Persistence/MartenTests/AggregateHandlerWorkflow/override_of_event_metadata.cs index 2f251835f..4a44f447e 100644 --- a/src/Persistence/MartenTests/AggregateHandlerWorkflow/override_of_event_metadata.cs +++ b/src/Persistence/MartenTests/AggregateHandlerWorkflow/override_of_event_metadata.cs @@ -58,7 +58,7 @@ public async Task return_event_with_metadata_from_aggregate_handler() e.EventTypeName.ShouldNotBeNull(); } - stream.OfType>().Single().Headers["name"].ShouldBe("perrin"); + stream.OfType>().Single().Headers!["name"].ShouldBe("perrin"); } } diff --git a/src/Persistence/MartenTests/AggregateHandlerWorkflow/strong_named_identifiers.cs b/src/Persistence/MartenTests/AggregateHandlerWorkflow/strong_named_identifiers.cs index ea023367c..da997d4e8 100644 --- a/src/Persistence/MartenTests/AggregateHandlerWorkflow/strong_named_identifiers.cs +++ b/src/Persistence/MartenTests/AggregateHandlerWorkflow/strong_named_identifiers.cs @@ -15,8 +15,8 @@ namespace MartenTests.AggregateHandlerWorkflow; public class strong_named_identifiers : IAsyncLifetime { - private IHost theHost; - + private IHost theHost = null!; + public async Task InitializeAsync() { theHost = await Host.CreateDefaultBuilder() @@ -87,11 +87,11 @@ public async Task batch_query_usage_of_write_aggregate() await theHost.InvokeMessageAndWaitAsync(new IncrementBOnBoth(new LetterId(stream1Id), new LetterId(stream2Id))); var aggregate1 = await session.Events.FetchLatest(stream1Id); - aggregate1.BCount.ShouldBe(2); - + aggregate1!.BCount.ShouldBe(2); + var aggregate2 = await session.Events.FetchLatest(stream2Id); - aggregate2.BCount.ShouldBe(3); - + aggregate2!.BCount.ShouldBe(3); + } [Fact] @@ -102,7 +102,7 @@ public async Task batch_query_with_both_read_and_write_aggregate() using var session = theHost.DocumentStore().LightweightSession(); session.Events.StartStream(stream1Id, new AEvent(), new BEvent(), new CEvent(), new CEvent()); - + session.Events.StartStream(stream2Id, new AEvent(), new BEvent(), new BEvent(), new AEvent(), new DEvent()); await session.SaveChangesAsync(); @@ -110,12 +110,12 @@ public async Task batch_query_with_both_read_and_write_aggregate() await theHost.InvokeMessageAndWaitAsync(new AddFrom(new LetterId(stream1Id), new LetterId(stream2Id))); var aggregate1 = await session.Events.FetchLatest(stream1Id); - aggregate1.BCount.ShouldBe(3); + aggregate1!.BCount.ShouldBe(3); aggregate1.ACount.ShouldBe(3); aggregate1.DCount.ShouldBe(1); - + var aggregate2 = await session.Events.FetchLatest(stream2Id); - aggregate2.BCount.ShouldBe(2); + aggregate2!.BCount.ShouldBe(2); } diff --git a/src/Persistence/MartenTests/AggregateHandlerWorkflow/version_source_override.cs b/src/Persistence/MartenTests/AggregateHandlerWorkflow/version_source_override.cs index 1e2d8de9b..dd8a07726 100644 --- a/src/Persistence/MartenTests/AggregateHandlerWorkflow/version_source_override.cs +++ b/src/Persistence/MartenTests/AggregateHandlerWorkflow/version_source_override.cs @@ -16,8 +16,8 @@ namespace MartenTests.AggregateHandlerWorkflow; public class version_source_override : PostgresqlContext, IAsyncLifetime { - private IHost theHost; - private IDocumentStore theStore; + private IHost theHost = null!; + private IDocumentStore theStore = null!; private Guid theStreamId; public async Task InitializeAsync() @@ -59,7 +59,7 @@ private async Task GivenAggregate() private async Task LoadAggregate() { await using var session = theStore.LightweightSession(); - return await session.LoadAsync(theStreamId); + return (await session.LoadAsync(theStreamId))!; } [Fact] diff --git a/src/Persistence/MartenTests/AncillaryStores/ancillary_stores_use_different_databases.cs b/src/Persistence/MartenTests/AncillaryStores/ancillary_stores_use_different_databases.cs index 88ba0f1bd..c43c6f0e0 100644 --- a/src/Persistence/MartenTests/AncillaryStores/ancillary_stores_use_different_databases.cs +++ b/src/Persistence/MartenTests/AncillaryStores/ancillary_stores_use_different_databases.cs @@ -20,11 +20,11 @@ namespace MartenTests.AncillaryStores; public class ancillary_stores_use_different_databases : IAsyncLifetime { - private IHost theHost; + private IHost theHost = null!; - private string playersConnectionString; - private string thingsConnectionString; - private IAgentFamily theStores; + private string playersConnectionString = null!; + private string thingsConnectionString = null!; + private IAgentFamily theStores = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/AncillaryStores/bootstrapping_ancillary_marten_stores_with_wolverine.cs b/src/Persistence/MartenTests/AncillaryStores/bootstrapping_ancillary_marten_stores_with_wolverine.cs index 10570e775..e60d48ae3 100644 --- a/src/Persistence/MartenTests/AncillaryStores/bootstrapping_ancillary_marten_stores_with_wolverine.cs +++ b/src/Persistence/MartenTests/AncillaryStores/bootstrapping_ancillary_marten_stores_with_wolverine.cs @@ -29,11 +29,11 @@ namespace MartenTests.AncillaryStores; public class bootstrapping_ancillary_marten_stores_with_wolverine : IAsyncLifetime { private readonly ITestOutputHelper _output; - private string tenant1ConnectionString; - private string tenant2ConnectionString; - private string tenant3ConnectionString; - private IAgentFamily theFamily; - private IHost theHost; + private string tenant1ConnectionString = null!; + private string tenant2ConnectionString = null!; + private string tenant3ConnectionString = null!; + private IAgentFamily theFamily = null!; + private IHost theHost = null!; public bootstrapping_ancillary_marten_stores_with_wolverine(ITestOutputHelper output) { @@ -277,10 +277,10 @@ public interface IThingStore : IDocumentStore; public class Player { - public string Id { get; set; } + public string Id { get; set; } = null!; } public class Thing { - public string Id { get; set; } + public string Id { get; set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/MartenTests/Bugs/Bug_1427_no_endpoint_error_on_retries.cs b/src/Persistence/MartenTests/Bugs/Bug_1427_no_endpoint_error_on_retries.cs index 53113b8c5..dc769d12c 100644 --- a/src/Persistence/MartenTests/Bugs/Bug_1427_no_endpoint_error_on_retries.cs +++ b/src/Persistence/MartenTests/Bugs/Bug_1427_no_endpoint_error_on_retries.cs @@ -16,7 +16,7 @@ namespace MartenTests.Bugs; public class Bug_1427_no_endpoint_error_on_retries : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/Bugs/Bug_191_marten_aggregate_handler_command_should_not_require_version.cs b/src/Persistence/MartenTests/Bugs/Bug_191_marten_aggregate_handler_command_should_not_require_version.cs index affa1e2e1..a703b7740 100644 --- a/src/Persistence/MartenTests/Bugs/Bug_191_marten_aggregate_handler_command_should_not_require_version.cs +++ b/src/Persistence/MartenTests/Bugs/Bug_191_marten_aggregate_handler_command_should_not_require_version.cs @@ -12,7 +12,7 @@ namespace MartenTests.Bugs; public class Bug_191_marten_aggregate_handler_command_should_not_require_version : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/Bugs/Bug_215_erroneous_failure_ack_on_invoke_async_of_t.cs b/src/Persistence/MartenTests/Bugs/Bug_215_erroneous_failure_ack_on_invoke_async_of_t.cs index 978f92564..f96510984 100644 --- a/src/Persistence/MartenTests/Bugs/Bug_215_erroneous_failure_ack_on_invoke_async_of_t.cs +++ b/src/Persistence/MartenTests/Bugs/Bug_215_erroneous_failure_ack_on_invoke_async_of_t.cs @@ -55,7 +55,7 @@ public static async Task Handle(Lookup lookup, IDocumentSession sess //await session.SaveChangesAsync(cancellationToken); - return await session.LoadAsync(lookup.Id, cancellationToken); + return (await session.LoadAsync(lookup.Id, cancellationToken))!; } } diff --git a/src/Persistence/MartenTests/Bugs/Bug_305_invoke_async_with_return_not_publishing_with_tuple_return_value.cs b/src/Persistence/MartenTests/Bugs/Bug_305_invoke_async_with_return_not_publishing_with_tuple_return_value.cs index ffcc2dc5c..b62b06670 100644 --- a/src/Persistence/MartenTests/Bugs/Bug_305_invoke_async_with_return_not_publishing_with_tuple_return_value.cs +++ b/src/Persistence/MartenTests/Bugs/Bug_305_invoke_async_with_return_not_publishing_with_tuple_return_value.cs @@ -24,7 +24,7 @@ public async Task should_publish_the_return_value() var (tracked, created) = await host.InvokeMessageAndWaitAsync(new CreateItemCommand { Name = "Trevor" }); - created.Name.ShouldBe("Trevor"); + created!.Name.ShouldBe("Trevor"); tracked.Sent.SingleMessage().Name.ShouldBe("Trevor"); tracked.Sent.SingleMessage().Name.ShouldBe("Trevor"); diff --git a/src/Persistence/MartenTests/Bugs/Bug_309_service_dependencies_should_be_deep_on_injected_arguments.cs b/src/Persistence/MartenTests/Bugs/Bug_309_service_dependencies_should_be_deep_on_injected_arguments.cs index 85cd75f30..c319af945 100644 --- a/src/Persistence/MartenTests/Bugs/Bug_309_service_dependencies_should_be_deep_on_injected_arguments.cs +++ b/src/Persistence/MartenTests/Bugs/Bug_309_service_dependencies_should_be_deep_on_injected_arguments.cs @@ -31,7 +31,7 @@ public async Task discover_session_is_required_by_constructor_argument_of_handle using var session = host.DocumentStore().LightweightSession(); - var item = await session.LoadAsync(created.Id); + var item = await session.LoadAsync(created!.Id); item.ShouldNotBeNull(); } } diff --git a/src/Persistence/MartenTests/Bugs/Bug_310_saga_handler_that_returns_another_saga.cs b/src/Persistence/MartenTests/Bugs/Bug_310_saga_handler_that_returns_another_saga.cs index fcf6d4949..5c07f6fc5 100644 --- a/src/Persistence/MartenTests/Bugs/Bug_310_saga_handler_that_returns_another_saga.cs +++ b/src/Persistence/MartenTests/Bugs/Bug_310_saga_handler_that_returns_another_saga.cs @@ -13,7 +13,7 @@ namespace MartenTests.Bugs; public class Bug_310_saga_handler_that_returns_another_saga : PostgresqlContext, IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -48,10 +48,10 @@ public async Task one_saga_spawns_another() using var session = _host.Services.GetRequiredService().LightweightSession(); var saga1 = await session.LoadAsync(id); - saga1.One.ShouldBeTrue(); + saga1!.One.ShouldBeTrue(); var saga2 = await session.LoadAsync(id); - saga2.Two.ShouldBeTrue(); + saga2!.Two.ShouldBeTrue(); saga2.Three.ShouldBeTrue(); } } diff --git a/src/Persistence/MartenTests/Bugs/Bug_581_complex_dependency_graph_transactional_middleware_application.cs b/src/Persistence/MartenTests/Bugs/Bug_581_complex_dependency_graph_transactional_middleware_application.cs index 9b51b1218..b2c8ccf3c 100644 --- a/src/Persistence/MartenTests/Bugs/Bug_581_complex_dependency_graph_transactional_middleware_application.cs +++ b/src/Persistence/MartenTests/Bugs/Bug_581_complex_dependency_graph_transactional_middleware_application.cs @@ -51,11 +51,11 @@ public async Task apply_transactional_middleware_when_session_is_used_internally var martenPersistenceFrameProvider = new MartenPersistenceFrameProvider(); martenPersistenceFrameProvider - .CanApply(handlers.HandlerFor().As().Chain, host.Services.GetRequiredService()).ShouldBeTrue(); + .CanApply(handlers.HandlerFor()!.As().Chain!, host.Services.GetRequiredService()).ShouldBeTrue(); // For middleware too martenPersistenceFrameProvider - .CanApply(handlers.HandlerFor().As().Chain, host.Services.GetRequiredService()).ShouldBeTrue(); + .CanApply(handlers.HandlerFor()!.As().Chain!, host.Services.GetRequiredService()).ShouldBeTrue(); } } @@ -125,7 +125,7 @@ public Task CreateUser(string name) public class User { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public interface IUserRepository diff --git a/src/Persistence/MartenTests/Dcb/boundary_model_workflow_tests.cs b/src/Persistence/MartenTests/Dcb/boundary_model_workflow_tests.cs index a8acf92a4..c8bc89e04 100644 --- a/src/Persistence/MartenTests/Dcb/boundary_model_workflow_tests.cs +++ b/src/Persistence/MartenTests/Dcb/boundary_model_workflow_tests.cs @@ -17,8 +17,8 @@ namespace MartenTests.Dcb; public class boundary_model_workflow_tests : PostgresqlContext, IAsyncLifetime { - private IHost theHost; - private IDocumentStore theStore; + private IHost theHost = null!; + private IDocumentStore theStore = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/Distribution/Support/MultiTenantContext.cs b/src/Persistence/MartenTests/Distribution/Support/MultiTenantContext.cs index 2b14a888b..05549574a 100644 --- a/src/Persistence/MartenTests/Distribution/Support/MultiTenantContext.cs +++ b/src/Persistence/MartenTests/Distribution/Support/MultiTenantContext.cs @@ -26,15 +26,14 @@ public abstract class MultiTenantContext : IAsyncLifetime private readonly List _hosts = new(); private readonly ITestOutputHelper _output; - private bool _hasStarted; - private DocumentStore _tenancyStore; - protected MasterTableTenancy tenancy; - protected string tenant1ConnectionString; - protected string tenant2ConnectionString; - protected string tenant3ConnectionString; - protected string tenant4ConnectionString; - protected IHost theOriginalHost; - internal EventSubscriptionAgentFamily theDistributor; + private DocumentStore _tenancyStore = null!; + protected MasterTableTenancy tenancy = null!; + protected string tenant1ConnectionString = null!; + protected string tenant2ConnectionString = null!; + protected string tenant3ConnectionString = null!; + protected string tenant4ConnectionString = null!; + protected IHost theOriginalHost = null!; + internal EventSubscriptionAgentFamily theDistributor = null!; protected MultiTenantContext(ITestOutputHelper output) { diff --git a/src/Persistence/MartenTests/Distribution/Support/SingleTenantContext.cs b/src/Persistence/MartenTests/Distribution/Support/SingleTenantContext.cs index becce9d37..814a8c22f 100644 --- a/src/Persistence/MartenTests/Distribution/Support/SingleTenantContext.cs +++ b/src/Persistence/MartenTests/Distribution/Support/SingleTenantContext.cs @@ -26,8 +26,8 @@ public abstract class SingleTenantContext : IAsyncLifetime { private readonly List _hosts = new(); private readonly ITestOutputHelper _output; - protected IHost theOriginalHost; - internal EventSubscriptionAgentFamily theProjectionAgents; + protected IHost theOriginalHost = null!; + internal EventSubscriptionAgentFamily theProjectionAgents = null!; public SingleTenantContext(ITestOutputHelper output) { diff --git a/src/Persistence/MartenTests/Distribution/Support/XUnitLogger.cs b/src/Persistence/MartenTests/Distribution/Support/XUnitLogger.cs index a245d8be0..8a2e13b41 100644 --- a/src/Persistence/MartenTests/Distribution/Support/XUnitLogger.cs +++ b/src/Persistence/MartenTests/Distribution/Support/XUnitLogger.cs @@ -26,13 +26,13 @@ public bool IsEnabled(LogLevel logLevel) return logLevel != LogLevel.None; } - public IDisposable BeginScope(TState state) + public IDisposable BeginScope(TState state) where TState : notnull { return new Disposable(); } - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, - Func formatter) + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, + Func formatter) { if (exception is DivideByZeroException) { diff --git a/src/Persistence/MartenTests/Distribution/TripDomain/Arrival.cs b/src/Persistence/MartenTests/Distribution/TripDomain/Arrival.cs index 9f39ffbe7..7c1ba30b4 100644 --- a/src/Persistence/MartenTests/Distribution/TripDomain/Arrival.cs +++ b/src/Persistence/MartenTests/Distribution/TripDomain/Arrival.cs @@ -3,5 +3,5 @@ namespace MartenTests.Distribution.TripDomain; public class Arrival { public int Day { get; set; } - public string State { get; set; } + public string State { get; set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/MartenTests/Distribution/TripDomain/Departure.cs b/src/Persistence/MartenTests/Distribution/TripDomain/Departure.cs index ed79ea2d5..d727f3d72 100644 --- a/src/Persistence/MartenTests/Distribution/TripDomain/Departure.cs +++ b/src/Persistence/MartenTests/Distribution/TripDomain/Departure.cs @@ -3,5 +3,5 @@ namespace MartenTests.Distribution.TripDomain; public class Departure { public int Day { get; set; } - public string State { get; set; } + public string State { get; set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/MartenTests/Distribution/TripDomain/Movement.cs b/src/Persistence/MartenTests/Distribution/TripDomain/Movement.cs index 67af51c92..61c2ef57e 100644 --- a/src/Persistence/MartenTests/Distribution/TripDomain/Movement.cs +++ b/src/Persistence/MartenTests/Distribution/TripDomain/Movement.cs @@ -16,7 +16,7 @@ public override string ToString() return $"{nameof(Direction)}: {Direction}, {nameof(Distance)}: {Distance}"; } - public override bool Equals(object obj) + public override bool Equals(object? obj) { if (ReferenceEquals(null, obj)) { diff --git a/src/Persistence/MartenTests/Distribution/TripDomain/Stop.cs b/src/Persistence/MartenTests/Distribution/TripDomain/Stop.cs index 7063623cc..0c074dba0 100644 --- a/src/Persistence/MartenTests/Distribution/TripDomain/Stop.cs +++ b/src/Persistence/MartenTests/Distribution/TripDomain/Stop.cs @@ -3,6 +3,6 @@ namespace MartenTests.Distribution.TripDomain; public class Stop { public TimeOnly Time { get; set; } - public string State { get; set; } + public string State { get; set; } = null!; public int Duration { get; set; } } \ No newline at end of file diff --git a/src/Persistence/MartenTests/Distribution/TripDomain/Trip.cs b/src/Persistence/MartenTests/Distribution/TripDomain/Trip.cs index 98df9d840..85cf7c737 100644 --- a/src/Persistence/MartenTests/Distribution/TripDomain/Trip.cs +++ b/src/Persistence/MartenTests/Distribution/TripDomain/Trip.cs @@ -17,7 +17,7 @@ public class Trip public double Traveled { get; set; } - public string State { get; set; } + public string State { get; set; } = null!; public bool Active { get; set; } diff --git a/src/Persistence/MartenTests/Distribution/TripDomain/TripEnded.cs b/src/Persistence/MartenTests/Distribution/TripDomain/TripEnded.cs index 0dfd71725..13211f780 100644 --- a/src/Persistence/MartenTests/Distribution/TripDomain/TripEnded.cs +++ b/src/Persistence/MartenTests/Distribution/TripDomain/TripEnded.cs @@ -2,6 +2,6 @@ namespace MartenTests.Distribution.TripDomain; public class TripEnded : IDayEvent { - public string State { get; set; } + public string State { get; set; } = null!; public int Day { get; set; } } \ No newline at end of file diff --git a/src/Persistence/MartenTests/Distribution/TripDomain/TripStream.cs b/src/Persistence/MartenTests/Distribution/TripDomain/TripStream.cs index 64df840c6..fda57434f 100644 --- a/src/Persistence/MartenTests/Distribution/TripDomain/TripStream.cs +++ b/src/Persistence/MartenTests/Distribution/TripDomain/TripStream.cs @@ -68,7 +68,7 @@ public TripStream() } } - public string TenantId { get; set; } + public string TenantId { get; set; } = null!; public static List RandomStreams(int number) { diff --git a/src/Persistence/MartenTests/Distribution/basic_agent_mechanics_multiple_tenants.cs b/src/Persistence/MartenTests/Distribution/basic_agent_mechanics_multiple_tenants.cs index f5fdb3fc5..b12fa2790 100644 --- a/src/Persistence/MartenTests/Distribution/basic_agent_mechanics_multiple_tenants.cs +++ b/src/Persistence/MartenTests/Distribution/basic_agent_mechanics_multiple_tenants.cs @@ -8,6 +8,7 @@ namespace MartenTests.Distribution; +[Trait("Category", "Flaky")] public class basic_agent_mechanics_multiple_tenants(ITestOutputHelper output) : MultiTenantContext(output) { [Fact] diff --git a/src/Persistence/MartenTests/Distribution/basic_agent_mechanics_versioned_composition.cs b/src/Persistence/MartenTests/Distribution/basic_agent_mechanics_versioned_composition.cs index 4cef0bc7c..b44d9000f 100644 --- a/src/Persistence/MartenTests/Distribution/basic_agent_mechanics_versioned_composition.cs +++ b/src/Persistence/MartenTests/Distribution/basic_agent_mechanics_versioned_composition.cs @@ -8,6 +8,7 @@ namespace MartenTests.Distribution; +[Trait("Category", "Flaky")] public class basic_agent_mechanics_versioned_composition(ITestOutputHelper output) : MultiTenantContext(output) { [Fact] diff --git a/src/Persistence/MartenTests/Distribution/with_ancillary_stores.cs b/src/Persistence/MartenTests/Distribution/with_ancillary_stores.cs index 9af5dddd5..07bfbfe67 100644 --- a/src/Persistence/MartenTests/Distribution/with_ancillary_stores.cs +++ b/src/Persistence/MartenTests/Distribution/with_ancillary_stores.cs @@ -29,8 +29,8 @@ public class with_ancillary_stores : IAsyncLifetime { private readonly List _hosts = new(); private readonly ITestOutputHelper _output; - protected IHost theOriginalHost; - internal EventSubscriptionAgentFamily theProjectionAgents; + protected IHost theOriginalHost = null!; + internal EventSubscriptionAgentFamily theProjectionAgents = null!; public with_ancillary_stores(ITestOutputHelper output) { diff --git a/src/Persistence/MartenTests/DurableTcpTransportCompliance.cs b/src/Persistence/MartenTests/DurableTcpTransportCompliance.cs index d7b880f01..f7f484fd2 100644 --- a/src/Persistence/MartenTests/DurableTcpTransportCompliance.cs +++ b/src/Persistence/MartenTests/DurableTcpTransportCompliance.cs @@ -47,9 +47,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Persistence/MartenTests/EventTypeForwarderTests.cs b/src/Persistence/MartenTests/EventTypeForwarderTests.cs index b9f2721e5..a41cb9129 100644 --- a/src/Persistence/MartenTests/EventTypeForwarderTests.cs +++ b/src/Persistence/MartenTests/EventTypeForwarderTests.cs @@ -27,7 +27,7 @@ public void negative_forwarding() } } -public class FakeEvent : IEvent +public class FakeEvent : IEvent where T : notnull { public void SetHeader(string key, object value) { @@ -42,24 +42,24 @@ public object GetHeader(string key) public Guid Id { get; set; } public long Version { get; set; } public long Sequence { get; set; } - object IEvent.Data => Data; + object IEvent.Data => Data!; - public T Data { get; } + public T Data { get; } = default!; public Guid StreamId { get; set; } - public string StreamKey { get; set; } + public string? StreamKey { get; set; } public DateTimeOffset Timestamp { get; set; } - public string TenantId { get; set; } - public Type EventType { get; } - public string EventTypeName { get; set; } - public string DotNetTypeName { get; set; } - public string CausationId { get; set; } - public string CorrelationId { get; set; } - public Dictionary Headers { get; set; } + public string TenantId { get; set; } = null!; + public Type EventType { get; } = null!; + public string EventTypeName { get; set; } = null!; + public string DotNetTypeName { get; set; } = null!; + public string? CausationId { get; set; } + public string? CorrelationId { get; set; } + public Dictionary? Headers { get; set; } public bool IsArchived { get; set; } - public string AggregateTypeName { get; set; } + public string? AggregateTypeName { get; set; } public string? UserName { get; set; } public bool IsSkipped { get; set; } public IReadOnlyList? Tags => null; public void AddTag(TTag tag) where TTag : notnull { } public void AddTag(JasperFx.Events.EventTag tag) { } -} \ No newline at end of file +} diff --git a/src/Persistence/MartenTests/MartenOutbox_end_to_end.cs b/src/Persistence/MartenTests/MartenOutbox_end_to_end.cs index 2a708447e..c0231afde 100644 --- a/src/Persistence/MartenTests/MartenOutbox_end_to_end.cs +++ b/src/Persistence/MartenTests/MartenOutbox_end_to_end.cs @@ -11,7 +11,7 @@ namespace MartenTests; public class MartenOutbox_end_to_end : PostgresqlContext, IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -75,7 +75,7 @@ public record OutboxedMessage public class OutboxedMessageHandler { - private static TaskCompletionSource _source; + private static TaskCompletionSource _source = null!; public static Task WaitForNextMessage() { diff --git a/src/Persistence/MartenTests/MultiTenancy/MultiTenancyFixture.cs b/src/Persistence/MartenTests/MultiTenancy/MultiTenancyFixture.cs index ae26ab48d..d241bfb5a 100644 --- a/src/Persistence/MartenTests/MultiTenancy/MultiTenancyFixture.cs +++ b/src/Persistence/MartenTests/MultiTenancy/MultiTenancyFixture.cs @@ -22,7 +22,7 @@ public class MultiTenancyContext : IClassFixture public MultiTenancyContext(MultiTenancyFixture fixture) { Fixture = fixture; - Runtime = fixture.Host.GetRuntime(); + Runtime = fixture.Host!.GetRuntime(); Stores = Runtime.Stores.MultiTenanted.Single(); } diff --git a/src/Persistence/MartenTests/MultiTenancy/agent_mechanics.cs b/src/Persistence/MartenTests/MultiTenancy/agent_mechanics.cs index bd2ec43aa..bcf7c06cf 100644 --- a/src/Persistence/MartenTests/MultiTenancy/agent_mechanics.cs +++ b/src/Persistence/MartenTests/MultiTenancy/agent_mechanics.cs @@ -29,13 +29,13 @@ await conn.CreateCommand($"delete from control.{DatabaseConstants.NodeAssignment await Fixture.RestartAsync(); - await Fixture.Host.WaitUntilAssumesLeadershipAsync(20.Seconds()); + await Fixture.Host!.WaitUntilAssumesLeadershipAsync(20.Seconds()); // Should be 4 agents, one for the master db, and 3 for the tenants - await Fixture.Host.WaitUntilAssignmentsChangeTo(w => + await Fixture.Host!.WaitUntilAssignmentsChangeTo(w => { w.AgentScheme = PersistenceConstants.AgentScheme; - w.ExpectRunningAgents(Fixture.Host, 4); + w.ExpectRunningAgents(Fixture.Host!, 4); }, 30.Seconds()); } } \ No newline at end of file diff --git a/src/Persistence/MartenTests/MultiTenancy/conjoined_tenancy.cs b/src/Persistence/MartenTests/MultiTenancy/conjoined_tenancy.cs index 3cc13f648..ccd73236d 100644 --- a/src/Persistence/MartenTests/MultiTenancy/conjoined_tenancy.cs +++ b/src/Persistence/MartenTests/MultiTenancy/conjoined_tenancy.cs @@ -12,7 +12,7 @@ namespace MartenTests.MultiTenancy; public class conjoined_tenancy : PostgresqlContext, IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -63,21 +63,21 @@ await _host.ExecuteAndWaitAsync(c => using (var session = store.LightweightSession("one")) { var document = await session.LoadAsync(id); - document.Location.ShouldBe("Andor"); + document!.Location.ShouldBe("Andor"); } // Check the second tenant using (var session = store.LightweightSession("two")) { var document = await session.LoadAsync(id); - document.Location.ShouldBe("Tear"); + document!.Location.ShouldBe("Tear"); } // Check the third tenant using (var session = store.LightweightSession("three")) { var document = await session.LoadAsync(id); - document.Location.ShouldBe("Illian"); + document!.Location.ShouldBe("Illian"); } } @@ -93,8 +93,8 @@ public class TenantedDocument : ITenanted { public Guid Id { get; init; } - public string TenantId { get; set; } - public string Location { get; set; } + public string? TenantId { get; set; } + public string Location { get; set; } = null!; } // A command to create a new document that's multi-tenanted diff --git a/src/Persistence/MartenTests/MultiTenancy/cross_database_message_storage.cs b/src/Persistence/MartenTests/MultiTenancy/cross_database_message_storage.cs index 2e7661478..cec80b852 100644 --- a/src/Persistence/MartenTests/MultiTenancy/cross_database_message_storage.cs +++ b/src/Persistence/MartenTests/MultiTenancy/cross_database_message_storage.cs @@ -31,18 +31,18 @@ public async Task drain_async_smoke_test() await Stores.DrainAsync(); } - public Envelope envelopeFor(string tenantId) + public Envelope envelopeFor(string? tenantId) { var envelope = ObjectMother.Envelope(); - envelope.TenantId = tenantId; + envelope.TenantId = tenantId!; return envelope; } - - public Envelope envelopeFor(string tenantId, int ownerId) + + public Envelope envelopeFor(string? tenantId, int ownerId) { var envelope = ObjectMother.Envelope(); - envelope.TenantId = tenantId; + envelope.TenantId = tenantId!; envelope.OwnerId = ownerId; return envelope; @@ -74,7 +74,7 @@ public async Task mark_as_handled_with_no_tenant() var envelopes = await Stores.Main.Admin.AllIncomingAsync(); var loaded = envelopes.FirstOrDefault(x => x.Id == envelope.Id); - loaded.Status.ShouldBe(EnvelopeStatus.Handled); + loaded!.Status.ShouldBe(EnvelopeStatus.Handled); } [Fact] @@ -118,7 +118,7 @@ public async Task mark_incoming_as_handled_with_a_tenant() var database1 = await Stores.GetDatabaseAsync("tenant1"); var envelopes = await database1.Admin.AllIncomingAsync(); var loaded = envelopes.FirstOrDefault(x => x.Id == envelope.Id); - loaded.Status.ShouldBe(EnvelopeStatus.Handled); + loaded!.Status.ShouldBe(EnvelopeStatus.Handled); } [Fact] @@ -147,7 +147,7 @@ public async Task store_outgoing_with_no_tenant() var envelopes = await Stores.Main.Admin.AllOutgoingAsync(); var loaded = envelopes.FirstOrDefault(x => x.Id == envelope.Id); - loaded.OwnerId.ShouldBe(5); + loaded!.OwnerId.ShouldBe(5); } [Fact] @@ -162,7 +162,7 @@ public async Task store_outgoing_with_a_tenant() var database2 = await Stores.GetDatabaseAsync("tenant2"); var envelopes = await database2.Admin.AllOutgoingAsync(); var loaded = envelopes.FirstOrDefault(x => x.Id == envelope.Id); - loaded.OwnerId.ShouldBe(11); + loaded!.OwnerId.ShouldBe(11); } [Fact] @@ -180,7 +180,7 @@ public async Task increment_incoming_envelope_with_no_tenant() var envelopes = await Stores.Main.Admin.AllIncomingAsync(); var loaded = envelopes.FirstOrDefault(x => x.Id == envelope.Id); - loaded.Attempts.ShouldBe(4); + loaded!.Attempts.ShouldBe(4); } [Fact] @@ -201,7 +201,7 @@ public async Task increment_incoming_envelope_with_a_tenant() var envelopes = await database.Admin.AllIncomingAsync(); var loaded = envelopes.FirstOrDefault(x => x.Id == envelope.Id); - loaded.Attempts.ShouldBe(4); + loaded!.Attempts.ShouldBe(4); } [Fact] @@ -660,16 +660,16 @@ public async Task delete_outgoing_from_mixed_bag_of_tenants() var from2 = envelopes.FirstOrDefault(x => x.TenantId == "tenant2"); var from3 = envelopes.FirstOrDefault(x => x.TenantId == "tenant3"); - await Stores.Outbox.DeleteOutgoingAsync([fromMaster, from1, from2, from3]); + await Stores.Outbox.DeleteOutgoingAsync([fromMaster!, from1!, from2!, from3!]); var all = await Stores.Admin.AllOutgoingAsync(); all.Count.ShouldBe(envelopes.Count - 4); - all.ShouldNotContain(x => x.Id == fromMaster.Id); - all.ShouldNotContain(x => x.Id == from1.Id); - all.ShouldNotContain(x => x.Id == from2.Id); - all.ShouldNotContain(x => x.Id == from3.Id); + all.ShouldNotContain(x => x.Id == fromMaster!.Id); + all.ShouldNotContain(x => x.Id == from1!.Id); + all.ShouldNotContain(x => x.Id == from2!.Id); + all.ShouldNotContain(x => x.Id == from3!.Id); } [Fact] @@ -708,19 +708,19 @@ public async Task move_to_dead_letter_queue() var from3 = envelopes.FirstOrDefault(x => x.TenantId == "tenant3"); - await Stores.Inbox.MoveToDeadLetterStorageAsync(fromMaster, new NotSupportedException()); - await Stores.Inbox.MoveToDeadLetterStorageAsync(from1, new NotSupportedException()); - await Stores.Inbox.MoveToDeadLetterStorageAsync(from2, new NotSupportedException()); - await Stores.Inbox.MoveToDeadLetterStorageAsync(from3, new NotSupportedException()); + await Stores.Inbox.MoveToDeadLetterStorageAsync(fromMaster!, new NotSupportedException()); + await Stores.Inbox.MoveToDeadLetterStorageAsync(from1!, new NotSupportedException()); + await Stores.Inbox.MoveToDeadLetterStorageAsync(from2!, new NotSupportedException()); + await Stores.Inbox.MoveToDeadLetterStorageAsync(from3!, new NotSupportedException()); var db1 = await Stores.GetDatabaseAsync("tenant1"); var db2 = await Stores.GetDatabaseAsync("tenant2"); var db3 = await Stores.GetDatabaseAsync("tenant3"); - (await Stores.Main.DeadLetters.DeadLetterEnvelopeByIdAsync(fromMaster.Id)).ShouldNotBeNull(); - (await db1.DeadLetters.DeadLetterEnvelopeByIdAsync(from1.Id)).ShouldNotBeNull(); - (await db2.DeadLetters.DeadLetterEnvelopeByIdAsync(from2.Id)).ShouldNotBeNull(); - (await db3.DeadLetters.DeadLetterEnvelopeByIdAsync(from3.Id)).ShouldNotBeNull(); + (await Stores.Main.DeadLetters.DeadLetterEnvelopeByIdAsync(fromMaster!.Id)).ShouldNotBeNull(); + (await db1!.DeadLetters.DeadLetterEnvelopeByIdAsync(from1!.Id)).ShouldNotBeNull(); + (await db2!.DeadLetters.DeadLetterEnvelopeByIdAsync(from2!.Id)).ShouldNotBeNull(); + (await db3!.DeadLetters.DeadLetterEnvelopeByIdAsync(from3!.Id)).ShouldNotBeNull(); } [Fact] @@ -759,15 +759,15 @@ public async Task load_dead_letter_envelopes_across_databases() var from3 = envelopes.FirstOrDefault(x => x.TenantId == "tenant3"); - await Stores.Inbox.MoveToDeadLetterStorageAsync(fromMaster, new NotSupportedException()); - await Stores.Inbox.MoveToDeadLetterStorageAsync(from1, new NotSupportedException()); - await Stores.Inbox.MoveToDeadLetterStorageAsync(from2, new NotSupportedException()); - await Stores.Inbox.MoveToDeadLetterStorageAsync(from3, new NotSupportedException()); + await Stores.Inbox.MoveToDeadLetterStorageAsync(fromMaster!, new NotSupportedException()); + await Stores.Inbox.MoveToDeadLetterStorageAsync(from1!, new NotSupportedException()); + await Stores.Inbox.MoveToDeadLetterStorageAsync(from2!, new NotSupportedException()); + await Stores.Inbox.MoveToDeadLetterStorageAsync(from3!, new NotSupportedException()); - (await Stores.DeadLetterEnvelopeByIdAsync(fromMaster.Id)).ShouldNotBeNull(); - (await Stores.DeadLetterEnvelopeByIdAsync(from1.Id)).ShouldNotBeNull(); - (await Stores.DeadLetterEnvelopeByIdAsync(from2.Id)).ShouldNotBeNull(); - (await Stores.DeadLetterEnvelopeByIdAsync(from3.Id)).ShouldNotBeNull(); + (await Stores.DeadLetterEnvelopeByIdAsync(fromMaster!.Id)).ShouldNotBeNull(); + (await Stores.DeadLetterEnvelopeByIdAsync(from1!.Id)).ShouldNotBeNull(); + (await Stores.DeadLetterEnvelopeByIdAsync(from2!.Id)).ShouldNotBeNull(); + (await Stores.DeadLetterEnvelopeByIdAsync(from3!.Id)).ShouldNotBeNull(); } [Fact] @@ -862,7 +862,7 @@ public async Task discard_and_reassign() foreach (var reassign in reassigns) { var loaded = outgoing.FirstOrDefault(x => x.Id == reassign.Id); - loaded.OwnerId.ShouldBe(13); + loaded!.OwnerId.ShouldBe(13); } } } \ No newline at end of file diff --git a/src/Persistence/MartenTests/MultiTenancy/dynamically_spin_up_new_durability_agents_for_new_tenant_databases.cs b/src/Persistence/MartenTests/MultiTenancy/dynamically_spin_up_new_durability_agents_for_new_tenant_databases.cs index c81b79ed1..639f8c05d 100644 --- a/src/Persistence/MartenTests/MultiTenancy/dynamically_spin_up_new_durability_agents_for_new_tenant_databases.cs +++ b/src/Persistence/MartenTests/MultiTenancy/dynamically_spin_up_new_durability_agents_for_new_tenant_databases.cs @@ -18,12 +18,12 @@ namespace MartenTests.MultiTenancy; public class dynamically_spin_up_new_durability_agents_for_new_tenant_databases : IAsyncLifetime { - private IHost _host; - private IDocumentStore theStore; - private string tenant1ConnectionString; - private string tenant2ConnectionString; - private string tenant3ConnectionString; - private string tenant4ConnectionString; + private IHost _host = null!; + private IDocumentStore theStore = null!; + private string tenant1ConnectionString = null!; + private string tenant2ConnectionString = null!; + private string tenant3ConnectionString = null!; + private string tenant4ConnectionString = null!; private async Task CreateDatabaseIfNotExists(NpgsqlConnection conn, string databaseName) { diff --git a/src/Persistence/MartenTests/MultiTenancy/dynamically_spin_up_new_tenant_databases_in_solo_mode.cs b/src/Persistence/MartenTests/MultiTenancy/dynamically_spin_up_new_tenant_databases_in_solo_mode.cs index fd88e824e..24aa848df 100644 --- a/src/Persistence/MartenTests/MultiTenancy/dynamically_spin_up_new_tenant_databases_in_solo_mode.cs +++ b/src/Persistence/MartenTests/MultiTenancy/dynamically_spin_up_new_tenant_databases_in_solo_mode.cs @@ -16,12 +16,12 @@ namespace MartenTests.MultiTenancy; public class dynamically_spin_up_new_tenant_databases_in_solo_mode : IAsyncLifetime { - private IHost _host; - private IDocumentStore theStore; - private string tenant1ConnectionString; - private string tenant2ConnectionString; - private string tenant3ConnectionString; - private string tenant4ConnectionString; + private IHost _host = null!; + private IDocumentStore theStore = null!; + private string tenant1ConnectionString = null!; + private string tenant2ConnectionString = null!; + private string tenant3ConnectionString = null!; + private string tenant4ConnectionString = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/MultiTenancy/end_to_end.cs b/src/Persistence/MartenTests/MultiTenancy/end_to_end.cs index e56cdd8fe..1902d58da 100644 --- a/src/Persistence/MartenTests/MultiTenancy/end_to_end.cs +++ b/src/Persistence/MartenTests/MultiTenancy/end_to_end.cs @@ -15,7 +15,7 @@ public end_to_end(MultiTenancyFixture fixture) : base(fixture) [Fact] public async Task send_tenant_related_message() { - var store = Fixture.Host.Services.GetRequiredService(); + var store = Fixture.Host!.Services.GetRequiredService(); await store.Advanced.Clean.DeleteAllDocumentsAsync(); var tracked = await Fixture.Host.SendMessageAndWaitAsync(new CreateTenantDoc("Tom", 11), @@ -24,14 +24,14 @@ public async Task send_tenant_related_message() using var session = store.LightweightSession("tenant2"); var loaded = await session.LoadAsync("Tom"); - loaded.Number.ShouldBe(11); + loaded!.Number.ShouldBe(11); } } public class TenantDoc { - public string Id { get; set; } - public string Name { get; set; } + public string Id { get; set; } = null!; + public string Name { get; set; } = null!; public int Number { get; set; } } @@ -52,7 +52,7 @@ public static NumberTenantDoc Handle(CreateTenantDoc command, IDocumentSession s public static async Task Handle(NumberTenantDoc command, IDocumentSession session) { var doc = await session.LoadAsync(command.Id); - doc.Number = command.Number; + doc!.Number = command.Number; session.Store(doc); } diff --git a/src/Persistence/MartenTests/MultiTenancy/multi_tenancy_queue_usage.cs b/src/Persistence/MartenTests/MultiTenancy/multi_tenancy_queue_usage.cs index c8b0cf718..b7bb783be 100644 --- a/src/Persistence/MartenTests/MultiTenancy/multi_tenancy_queue_usage.cs +++ b/src/Persistence/MartenTests/MultiTenancy/multi_tenancy_queue_usage.cs @@ -22,13 +22,13 @@ namespace MartenTests.MultiTenancy; public class multi_tenancy_queue_usage : PostgresqlContext, IAsyncLifetime { - private IHost _receiver; - private IDocumentStore theStore; - private string tenant1ConnectionString; - private string tenant2ConnectionString; - private string tenant3ConnectionString; - private string tenant4ConnectionString; - private IHost _sender; + private IHost _receiver = null!; + private IDocumentStore theStore = null!; + private string tenant1ConnectionString = null!; + private string tenant2ConnectionString = null!; + private string tenant3ConnectionString = null!; + private string tenant4ConnectionString = null!; + private IHost _sender = null!; private MultiTenantedQueueListener? theListener; private async Task CreateDatabaseIfNotExists(NpgsqlConnection conn, string databaseName) @@ -142,7 +142,7 @@ public async Task InitializeAsync() theStore = _receiver.Services.GetRequiredService(); await theStore.Advanced.Clean.DeleteAllDocumentsAsync(); - theListener = (MultiTenantedQueueListener)_receiver + theListener = (MultiTenantedQueueListener?)_receiver .GetRuntime() .Endpoints .ActiveListeners() @@ -163,7 +163,7 @@ public async Task DisposeAsync() [Fact] public void has_active_listeners_for_the_existing_databases() { - theListener.IsListeningToDatabase("tenant1").ShouldBeTrue(); + theListener!.IsListeningToDatabase("tenant1").ShouldBeTrue(); theListener.IsListeningToDatabase("tenant2").ShouldBeTrue(); } @@ -176,7 +176,7 @@ public async Task spin_up_new_databases_and_see_listeners_be_created() for (int i = 0; i < 10; i++) { - var has3 = theListener.IsListeningToDatabase("tenant3"); + var has3 = theListener!.IsListeningToDatabase("tenant3"); var has4 = theListener.IsListeningToDatabase("tenant4"); if (has3 && has4) return; diff --git a/src/Persistence/MartenTests/MultiTenancy/using_tenant_specific_queues_and_subscriptions.cs b/src/Persistence/MartenTests/MultiTenancy/using_tenant_specific_queues_and_subscriptions.cs index 57c544bb1..9c09485f4 100644 --- a/src/Persistence/MartenTests/MultiTenancy/using_tenant_specific_queues_and_subscriptions.cs +++ b/src/Persistence/MartenTests/MultiTenancy/using_tenant_specific_queues_and_subscriptions.cs @@ -20,15 +20,16 @@ namespace MartenTests.MultiTenancy; +[Trait("Category", "Flaky")] public class using_tenant_specific_queues_and_subscriptions : PostgresqlContext, IAsyncLifetime { private readonly List _receivers = new(); - private IHost _sender; - private string tenant1ConnectionString; - private string tenant2ConnectionString; - private string tenant3ConnectionString; - private string tenant4ConnectionString; - private IDocumentStore theSenderStore; + private IHost _sender = null!; + private string tenant1ConnectionString = null!; + private string tenant2ConnectionString = null!; + private string tenant3ConnectionString = null!; + private string tenant4ConnectionString = null!; + private IDocumentStore theSenderStore = null!; public async Task InitializeAsync() { @@ -324,9 +325,9 @@ public record ColorsUpdated(string Color, int Number); public class ColorSum { - private Queue _numbers; + private Queue _numbers = null!; - [Identity] public string Color { get; set; } + [Identity] public string Color { get; set; } = null!; public List Numbers { get; set; } = new(); @@ -397,7 +398,7 @@ public static class UpdateColorCountsHandler public static async Task Handle(UpdateColorCounts counts, IDocumentSession session) { var updates = await session.LoadAsync(counts.Id); - foreach (var pair in updates.Updates) + foreach (var pair in updates!.Updates) { var doc = await session.LoadAsync(pair.Key); doc ??= new ColorSum { Color = pair.Key }; diff --git a/src/Persistence/MartenTests/Persistence/ItemCreated.cs b/src/Persistence/MartenTests/Persistence/ItemCreated.cs index 5002fe679..31f7c2506 100644 --- a/src/Persistence/MartenTests/Persistence/ItemCreated.cs +++ b/src/Persistence/MartenTests/Persistence/ItemCreated.cs @@ -3,5 +3,5 @@ public class ItemCreated { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/MartenTests/Persistence/MartenBackedListenerContext.cs b/src/Persistence/MartenTests/Persistence/MartenBackedListenerContext.cs index 1a20d7d23..1f3df320c 100644 --- a/src/Persistence/MartenTests/Persistence/MartenBackedListenerContext.cs +++ b/src/Persistence/MartenTests/Persistence/MartenBackedListenerContext.cs @@ -54,8 +54,8 @@ public class MartenBackedListenerContext : PostgresqlContext, IDisposable, IAsyn private readonly IHandlerPipeline thePipeline = Substitute.For(); protected readonly DocumentStore theStore; protected readonly Uri theUri = "tcp://localhost:1111".ToUri(); - internal DurableReceiver theReceiver; - protected DurabilitySettings theSettings; + internal DurableReceiver theReceiver = null!; + protected DurabilitySettings theSettings = null!; public MartenBackedListenerContext() diff --git a/src/Persistence/MartenTests/Persistence/MartenBackedMessagePersistenceTests.cs b/src/Persistence/MartenTests/Persistence/MartenBackedMessagePersistenceTests.cs index 226b8ba60..34a07fd3e 100644 --- a/src/Persistence/MartenTests/Persistence/MartenBackedMessagePersistenceTests.cs +++ b/src/Persistence/MartenTests/Persistence/MartenBackedMessagePersistenceTests.cs @@ -21,7 +21,7 @@ public class MartenBackedMessagePersistenceTests : PostgresqlContext, IDisposabl private readonly Envelope theEnvelope; private readonly IHost theHost; - private Envelope persisted; + private Envelope persisted = null!; public MartenBackedMessagePersistenceTests() { @@ -54,7 +54,7 @@ public async Task InitializeAsync() persisted = (await persistence.Admin .AllIncomingAsync()) - .FirstOrDefault(x => x.Id == theEnvelope.Id); + .FirstOrDefault(x => x.Id == theEnvelope.Id)!; } public Task DisposeAsync() @@ -73,7 +73,7 @@ public void marten_outbox_is_registered() { var container = theHost.Services.GetRequiredService(); - container.DefaultFor().Lifetime.ShouldBe(ServiceLifetime.Scoped); + container.DefaultFor()!.Lifetime.ShouldBe(ServiceLifetime.Scoped); using var nested = container.Services.CreateScope(); diff --git a/src/Persistence/MartenTests/Persistence/Sagas/MartenSagaHost.cs b/src/Persistence/MartenTests/Persistence/Sagas/MartenSagaHost.cs index 4de6e5fd3..1fdba1969 100644 --- a/src/Persistence/MartenTests/Persistence/Sagas/MartenSagaHost.cs +++ b/src/Persistence/MartenTests/Persistence/Sagas/MartenSagaHost.cs @@ -12,7 +12,7 @@ namespace MartenTests.Persistence.Sagas; public class MartenSagaHost : ISagaHost { - private IHost _host; + private IHost _host = null!; public IHost BuildHost() { @@ -35,21 +35,21 @@ public IHost BuildHost() public Task LoadState(Guid id) where T : Wolverine.Saga { - return _host.DocumentStore().QuerySession().LoadAsync(id); + return _host.DocumentStore().QuerySession().LoadAsync(id)!; } public Task LoadState(int id) where T : Wolverine.Saga { - return _host.DocumentStore().QuerySession().LoadAsync(id); + return _host.DocumentStore().QuerySession().LoadAsync(id)!; } public Task LoadState(long id) where T : Wolverine.Saga { - return _host.DocumentStore().QuerySession().LoadAsync(id); + return _host.DocumentStore().QuerySession().LoadAsync(id)!; } public Task LoadState(string id) where T : Wolverine.Saga { - return _host.DocumentStore().QuerySession().LoadAsync(id); + return _host.DocumentStore().QuerySession().LoadAsync(id)!; } } \ No newline at end of file diff --git a/src/Persistence/MartenTests/Persistence/end_to_end_with_persistence.cs b/src/Persistence/MartenTests/Persistence/end_to_end_with_persistence.cs index 784bad33f..3666953bc 100644 --- a/src/Persistence/MartenTests/Persistence/end_to_end_with_persistence.cs +++ b/src/Persistence/MartenTests/Persistence/end_to_end_with_persistence.cs @@ -123,7 +123,7 @@ public async Task publish_locally() item2 = await session.LoadAsync(item.Id); } - item2.Name.ShouldBe("Shoe"); + item2!.Name.ShouldBe("Shoe"); } var incoming = await theReceiver.Get().Admin.FetchCountsAsync(); diff --git a/src/Persistence/MartenTests/Persistence/marten_durability_end_to_end.cs b/src/Persistence/MartenTests/Persistence/marten_durability_end_to_end.cs index 5ad8802fa..5256aad1c 100644 --- a/src/Persistence/MartenTests/Persistence/marten_durability_end_to_end.cs +++ b/src/Persistence/MartenTests/Persistence/marten_durability_end_to_end.cs @@ -17,15 +17,16 @@ namespace MartenTests.Persistence; +[Trait("Category", "Flaky")] public class marten_durability_end_to_end : IAsyncLifetime { private const string SenderSchemaName = "sender"; private const string ReceiverSchemaName = "receiver"; - private Uri _listener; - private LightweightCache _receivers; - private DocumentStore _receiverStore; - private LightweightCache _senders; - private DocumentStore _sendingStore; + private Uri _listener = null!; + private LightweightCache _receivers = null!; + private DocumentStore _receiverStore = null!; + private LightweightCache _senders = null!; + private DocumentStore _sendingStore = null!; public async Task InitializeAsync() { @@ -133,9 +134,9 @@ public async Task DisposeAsync() _senders.Clear(); _receiverStore.Dispose(); - _receiverStore = null; + _receiverStore = null!; _sendingStore.Dispose(); - _sendingStore = null; + _sendingStore = null!; } protected void StartReceiver(string name) @@ -198,7 +199,7 @@ protected long PersistedIncomingCount() return (long)conn.CreateCommand( $"select count(*) from receiver.{DatabaseConstants.IncomingTable} where {DatabaseConstants.Status} = '{EnvelopeStatus.Incoming}'") - .ExecuteScalar(); + .ExecuteScalar()!; } protected long PersistedOutgoingCount() @@ -208,7 +209,7 @@ protected long PersistedOutgoingCount() return (long)conn.CreateCommand( $"select count(*) from sender.{DatabaseConstants.OutgoingTable}") - .ExecuteScalar(); + .ExecuteScalar()!; } protected async Task StopReceiver(string name) @@ -258,12 +259,12 @@ public async Task sending_resumes_when_the_receiver_is_detected() public class TraceDoc { public Guid Id { get; set; } = Guid.NewGuid(); - public string Name { get; set; } + public string Name { get; set; } = null!; } public class TraceMessage { - public string Name { get; set; } + public string Name { get; set; } = null!; } [WolverineIgnore] diff --git a/src/Persistence/MartenTests/Saga/HappyMealSaga.cs b/src/Persistence/MartenTests/Saga/HappyMealSaga.cs index 316df17e9..dd35e70f9 100644 --- a/src/Persistence/MartenTests/Saga/HappyMealSaga.cs +++ b/src/Persistence/MartenTests/Saga/HappyMealSaga.cs @@ -32,10 +32,10 @@ int order public class HappyMealOrder { - public string Drink { get; set; } - public string Toy { get; set; } - public string SideDish { get; set; } - public string MainDish { get; set; } + public string Drink { get; set; } = null!; + public string Toy { get; set; } = null!; + public string SideDish { get; set; } = null!; + public string MainDish { get; set; } = null!; } public class ToyOnTray @@ -63,7 +63,7 @@ public class HappyMealSaga3 : Wolverine.Saga // document have an "Id" property, but // that can be overridden public int Id { get; set; } - public HappyMealOrder Order { get; set; } + public HappyMealOrder Order { get; set; } = null!; public bool DrinkReady { get; set; } public bool ToyReady { get; set; } diff --git a/src/Persistence/MartenTests/Saga/OrderSagaTests.cs b/src/Persistence/MartenTests/Saga/OrderSagaTests.cs index da8cef2ee..61a8bf30e 100644 --- a/src/Persistence/MartenTests/Saga/OrderSagaTests.cs +++ b/src/Persistence/MartenTests/Saga/OrderSagaTests.cs @@ -38,7 +38,7 @@ public async Task InitializeAsync() ) .UseWolverine(options => { - options.Discovery.IncludeAssembly(Assembly.GetAssembly(typeof(Order))); + options.Discovery.IncludeAssembly(Assembly.GetAssembly(typeof(Order))!); }) .StartAsync(); @@ -52,7 +52,7 @@ public async Task InitializeAsync() public async Task DisposeAsync() { - await _host.StopAsync(); + await _host!.StopAsync(); _host.Dispose(); } diff --git a/src/Persistence/MartenTests/Saga/RevisionedSaga.cs b/src/Persistence/MartenTests/Saga/RevisionedSaga.cs index 513063f48..e6e2e02b1 100644 --- a/src/Persistence/MartenTests/Saga/RevisionedSaga.cs +++ b/src/Persistence/MartenTests/Saga/RevisionedSaga.cs @@ -18,8 +18,8 @@ namespace MartenTests.Saga; public class using_revisioned_sagas : IAsyncLifetime { - private IHost theHost; - + private IHost theHost = null!; + public async Task InitializeAsync() { theHost = await Host.CreateDefaultBuilder() @@ -42,7 +42,7 @@ public void can_override_the_log_level() var runtime = theHost.GetRuntime(); runtime.As().BuildFor(typeof(StartNewRevisionedSaga)); var chain = runtime.Handlers.ChainFor(); - chain.SuccessLogLevel.ShouldBe(LogLevel.None); + chain!.SuccessLogLevel.ShouldBe(LogLevel.None); chain.ProcessingLogLevel.ShouldBe(LogLevel.None); } @@ -97,7 +97,7 @@ public static void Configure(HandlerChain chain) public Guid Id { get; set; } - public int Version { get; set; } + public new int Version { get; set; } public bool One { get; set; } public bool Two { get; set; } diff --git a/src/Persistence/MartenTests/Saga/UserRegistrationSaga.cs b/src/Persistence/MartenTests/Saga/UserRegistrationSaga.cs index e41f7d854..9878f5b42 100644 --- a/src/Persistence/MartenTests/Saga/UserRegistrationSaga.cs +++ b/src/Persistence/MartenTests/Saga/UserRegistrationSaga.cs @@ -28,7 +28,7 @@ public static void NotFound(Subscribed subscribed) NotFoundSubscribed = subscribed; } - public static Subscribed NotFoundSubscribed { get; set; } + public static Subscribed NotFoundSubscribed { get; set; } = null!; } public record Subscribed( diff --git a/src/Persistence/MartenTests/Saga/multiple_sagas_for_same_message.cs b/src/Persistence/MartenTests/Saga/multiple_sagas_for_same_message.cs index 9ced6860d..b1ed7fe11 100644 --- a/src/Persistence/MartenTests/Saga/multiple_sagas_for_same_message.cs +++ b/src/Persistence/MartenTests/Saga/multiple_sagas_for_same_message.cs @@ -11,7 +11,7 @@ namespace MartenTests.Saga; public class multiple_sagas_for_same_message : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/Saga/not_found_usage.cs b/src/Persistence/MartenTests/Saga/not_found_usage.cs index 894b7357b..3a4395b4f 100644 --- a/src/Persistence/MartenTests/Saga/not_found_usage.cs +++ b/src/Persistence/MartenTests/Saga/not_found_usage.cs @@ -13,7 +13,7 @@ namespace MartenTests.Saga; public class not_found_usage : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -93,7 +93,7 @@ public record InvitationExpired(string Id); public class InvitationIssued { - [SagaIdentity] public string Id { get; set; } + [SagaIdentity] public string Id { get; set; } = null!; }; public record InvitationTimeout(string Id) : TimeoutMessage(10.Seconds()); \ No newline at end of file diff --git a/src/Persistence/MartenTests/Saga/resequencer_saga_end_to_end.cs b/src/Persistence/MartenTests/Saga/resequencer_saga_end_to_end.cs index be85df315..e2a7da0ab 100644 --- a/src/Persistence/MartenTests/Saga/resequencer_saga_end_to_end.cs +++ b/src/Persistence/MartenTests/Saga/resequencer_saga_end_to_end.cs @@ -33,7 +33,7 @@ public void Handle(MartenSequencedCommand cmd) public class resequencer_saga_end_to_end : PostgresqlContext, IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/Saga/strong_typed_id_saga.cs b/src/Persistence/MartenTests/Saga/strong_typed_id_saga.cs index 2693b32c6..f57365a1f 100644 --- a/src/Persistence/MartenTests/Saga/strong_typed_id_saga.cs +++ b/src/Persistence/MartenTests/Saga/strong_typed_id_saga.cs @@ -20,7 +20,7 @@ public class OrderSagaWorkflow : Wolverine.Saga { public OrderSagaId Id { get; set; } - public string CustomerName { get; set; } + public string CustomerName { get; set; } = null!; public bool ItemsPicked { get; set; } public bool PaymentProcessed { get; set; } public bool Shipped { get; set; } @@ -83,7 +83,7 @@ public class CompleteOrderStep public class strong_typed_id_saga : PostgresqlContext, IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/Sample/Endpoints.cs b/src/Persistence/MartenTests/Sample/Endpoints.cs index 03d7d4215..221aaf88b 100644 --- a/src/Persistence/MartenTests/Sample/Endpoints.cs +++ b/src/Persistence/MartenTests/Sample/Endpoints.cs @@ -19,7 +19,7 @@ public MartenUsingEndpoint(IQuerySession session, ILogger logger) public Task get_user_id(string id) { _logger.LogDebug("I loaded a user"); - return _session.LoadAsync(id); + return _session.LoadAsync(id)!; } } @@ -39,7 +39,7 @@ public static Task get_user_id( ILogger logger) { logger.LogDebug("I loaded a user"); - return session.LoadAsync(id); + return session.LoadAsync(id)!; } } diff --git a/src/Persistence/MartenTests/Sample/SampleApp.cs b/src/Persistence/MartenTests/Sample/SampleApp.cs index 982a94a17..f8e6d1cee 100644 --- a/src/Persistence/MartenTests/Sample/SampleApp.cs +++ b/src/Persistence/MartenTests/Sample/SampleApp.cs @@ -14,7 +14,7 @@ namespace MartenTests.Sample; public class MessageInvocationTests : PostgresqlContext, IAsyncLifetime { - private IHost theHost; + private IHost theHost = null!; public async Task InitializeAsync() { @@ -91,12 +91,12 @@ public static void Handle(UserCreated message, UserNames names) public class CreateUser { - public string Name; + public string Name = null!; } public class UserCreated { - public string UserName; + public string UserName = null!; } public class UserNames @@ -106,5 +106,5 @@ public class UserNames public class User { - [Identity] public string Name; + [Identity] public string Name = null!; } \ No newline at end of file diff --git a/src/Persistence/MartenTests/ScheduledJobs/MartenDurabilityCompliance.cs b/src/Persistence/MartenTests/ScheduledJobs/MartenDurabilityCompliance.cs index f8c6783c2..219aa9283 100644 --- a/src/Persistence/MartenTests/ScheduledJobs/MartenDurabilityCompliance.cs +++ b/src/Persistence/MartenTests/ScheduledJobs/MartenDurabilityCompliance.cs @@ -34,7 +34,7 @@ protected override void configureSender(WolverineOptions senderOptions) protected override async Task loadItemAsync(IHost receiver, Guid id) { await using var session = receiver.Get().QuerySession(); - return await session.LoadAsync(id); + return (await session.LoadAsync(id))!; } protected override async Task withContext(IHost sender, MessageContext context, @@ -45,7 +45,7 @@ protected override async Task withContext(IHost sender, MessageContext context, await action(context); - await outbox.Session.SaveChangesAsync(); + await outbox.Session!.SaveChangesAsync(); } protected override IReadOnlyList loadAllOutgoingEnvelopes(IHost sender) diff --git a/src/Persistence/MartenTests/TestHelpers/LetterCountsProjection.cs b/src/Persistence/MartenTests/TestHelpers/LetterCountsProjection.cs index 86d7e812c..60641f295 100644 --- a/src/Persistence/MartenTests/TestHelpers/LetterCountsProjection.cs +++ b/src/Persistence/MartenTests/TestHelpers/LetterCountsProjection.cs @@ -6,7 +6,7 @@ namespace MartenTests.TestHelpers; public class LetterCountsProjection: SingleStreamProjection { - public override LetterCounts Evolve(LetterCounts snapshot, Guid id, IEvent e) + public override LetterCounts Evolve(LetterCounts? snapshot, Guid id, IEvent e) { switch (e.Data) @@ -37,6 +37,6 @@ public override LetterCounts Evolve(LetterCounts snapshot, Guid id, IEvent e) break; } - return snapshot; + return snapshot!; } } \ No newline at end of file diff --git a/src/Persistence/MartenTests/TestHelpers/catch_up_and_then_do_nothing.cs b/src/Persistence/MartenTests/TestHelpers/catch_up_and_then_do_nothing.cs index 6349ccd1a..8ceb315ff 100644 --- a/src/Persistence/MartenTests/TestHelpers/catch_up_and_then_do_nothing.cs +++ b/src/Persistence/MartenTests/TestHelpers/catch_up_and_then_do_nothing.cs @@ -14,7 +14,7 @@ namespace MartenTests.TestHelpers; public class catch_up_and_then_do_nothing : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/TestHelpers/catch_up_then_restart.cs b/src/Persistence/MartenTests/TestHelpers/catch_up_then_restart.cs index fd307b2b1..6a419a64b 100644 --- a/src/Persistence/MartenTests/TestHelpers/catch_up_then_restart.cs +++ b/src/Persistence/MartenTests/TestHelpers/catch_up_then_restart.cs @@ -14,7 +14,7 @@ namespace MartenTests.TestHelpers; public class catch_up_then_restart : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/TestHelpers/catch_up_when_using_wolverine_distribution.cs b/src/Persistence/MartenTests/TestHelpers/catch_up_when_using_wolverine_distribution.cs index f8f5a38d6..f14216b87 100644 --- a/src/Persistence/MartenTests/TestHelpers/catch_up_when_using_wolverine_distribution.cs +++ b/src/Persistence/MartenTests/TestHelpers/catch_up_when_using_wolverine_distribution.cs @@ -14,7 +14,7 @@ namespace MartenTests.TestHelpers; public class catch_up_when_using_wolverine_distribution : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/TestHelpers/reset_data_first.cs b/src/Persistence/MartenTests/TestHelpers/reset_data_first.cs index ce9a844ba..7d818251c 100644 --- a/src/Persistence/MartenTests/TestHelpers/reset_data_first.cs +++ b/src/Persistence/MartenTests/TestHelpers/reset_data_first.cs @@ -14,7 +14,7 @@ namespace MartenTests.TestHelpers; public class reset_data_first : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/TestHelpers/second_stage_waiting.cs b/src/Persistence/MartenTests/TestHelpers/second_stage_waiting.cs index 617fdd2c8..3bcc965d6 100644 --- a/src/Persistence/MartenTests/TestHelpers/second_stage_waiting.cs +++ b/src/Persistence/MartenTests/TestHelpers/second_stage_waiting.cs @@ -18,7 +18,7 @@ namespace MartenTests.TestHelpers; public class second_stage_waiting : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -151,7 +151,7 @@ public static class GotFiveHandler public class LetterCountsProjectionWithSideEffects: SingleStreamProjection { - public override LetterCounts Evolve(LetterCounts snapshot, Guid id, IEvent e) + public override LetterCounts Evolve(LetterCounts? snapshot, Guid id, IEvent e) { switch (e.Data) @@ -182,12 +182,12 @@ public override LetterCounts Evolve(LetterCounts snapshot, Guid id, IEvent e) break; } - return snapshot; + return snapshot!; } public override ValueTask RaiseSideEffects(IDocumentOperations operations, IEventSlice slice) { - if (slice.Snapshot.ECount >= 5) + if (slice.Snapshot!.ECount >= 5) { slice.PublishMessage(new GotFive(slice.Snapshot.Id)); } diff --git a/src/Persistence/MartenTests/TestHelpers/wait_for_non_stale_data_after.cs b/src/Persistence/MartenTests/TestHelpers/wait_for_non_stale_data_after.cs index 8031db2f2..23c1673aa 100644 --- a/src/Persistence/MartenTests/TestHelpers/wait_for_non_stale_data_after.cs +++ b/src/Persistence/MartenTests/TestHelpers/wait_for_non_stale_data_after.cs @@ -14,7 +14,7 @@ namespace MartenTests.TestHelpers; public class wait_for_non_stale_data_after : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/basic_marten_integration.cs b/src/Persistence/MartenTests/basic_marten_integration.cs index 47e30ba8b..1a6522908 100644 --- a/src/Persistence/MartenTests/basic_marten_integration.cs +++ b/src/Persistence/MartenTests/basic_marten_integration.cs @@ -20,7 +20,7 @@ namespace MartenTests; public class basic_marten_integration : PostgresqlContext, IAsyncLifetime { - private IHost theHost; + private IHost theHost = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/batch_processing.cs b/src/Persistence/MartenTests/batch_processing.cs index dd768441b..f850aadfc 100644 --- a/src/Persistence/MartenTests/batch_processing.cs +++ b/src/Persistence/MartenTests/batch_processing.cs @@ -14,6 +14,7 @@ namespace MartenTests; +[Trait("Category", "Flaky")] public class batch_processing { diff --git a/src/Persistence/MartenTests/batch_querying_support.cs b/src/Persistence/MartenTests/batch_querying_support.cs index 27a4b2957..54ac31cf1 100644 --- a/src/Persistence/MartenTests/batch_querying_support.cs +++ b/src/Persistence/MartenTests/batch_querying_support.cs @@ -12,7 +12,7 @@ namespace MartenTests; public class batch_querying_support : PostgresqlContext, IAsyncLifetime { - private IHost theHost; + private IHost theHost = null!; public async Task InitializeAsync() { @@ -126,7 +126,7 @@ public class Doc2 public class Doc3 { - public string Id { get; set; } + public string Id { get; set; } = null!; public string Name { get; set; } = "Somebody"; } diff --git a/src/Persistence/MartenTests/end_to_end_publish_messages_through_marten_to_wolverine.cs b/src/Persistence/MartenTests/end_to_end_publish_messages_through_marten_to_wolverine.cs index 11150a4e6..e9bb8800c 100644 --- a/src/Persistence/MartenTests/end_to_end_publish_messages_through_marten_to_wolverine.cs +++ b/src/Persistence/MartenTests/end_to_end_publish_messages_through_marten_to_wolverine.cs @@ -293,7 +293,7 @@ public async Task Populate(IDocumentStore store, CancellationToken cancellation) public class side_effect_messaging_with_inline_projections_and_mix_of_tenanted_and_not_tenanted_elements : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -382,9 +382,9 @@ public static class CustomerChangedHandler public class Customer { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; public bool IsActive { get; set; } - public string Location { get; set; } + public string Location { get; set; } = null!; } public record CustomerAdded(string Name); @@ -423,7 +423,7 @@ public record CustomerChanged(Customer Customer); public class OrderItem { - public string Name { get; set; } + public string Name { get; set; } = null!; public bool Ready { get; set; } } diff --git a/src/Persistence/MartenTests/event_streaming.cs b/src/Persistence/MartenTests/event_streaming.cs index cadbe96b0..3b3c94e17 100644 --- a/src/Persistence/MartenTests/event_streaming.cs +++ b/src/Persistence/MartenTests/event_streaming.cs @@ -25,8 +25,8 @@ namespace MartenTests; public class event_streaming : PostgresqlContext, IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost theReceiver; - private IHost theSender; + private IHost theReceiver = null!; + private IHost theSender = null!; public event_streaming(ITestOutputHelper output) { @@ -235,8 +235,8 @@ public TestOutputMartenLogger(ITestOutputHelper output) _output = output ?? _noopTestOutputHelper; } - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, - Func formatter) + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, + Func formatter) { if (logLevel == LogLevel.Error) { @@ -249,7 +249,7 @@ public bool IsEnabled(LogLevel logLevel) return true; } - public IDisposable BeginScope(TState state) + public IDisposable BeginScope(TState state) where TState : notnull { throw new NotImplementedException(); } diff --git a/src/Persistence/MartenTests/global_entity_defaults.cs b/src/Persistence/MartenTests/global_entity_defaults.cs index efb7962d0..fc317caae 100644 --- a/src/Persistence/MartenTests/global_entity_defaults.cs +++ b/src/Persistence/MartenTests/global_entity_defaults.cs @@ -12,7 +12,7 @@ namespace MartenTests; public class global_entity_defaults : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/handler_actions_with_implied_marten_operations.cs b/src/Persistence/MartenTests/handler_actions_with_implied_marten_operations.cs index d55906485..29a0435db 100644 --- a/src/Persistence/MartenTests/handler_actions_with_implied_marten_operations.cs +++ b/src/Persistence/MartenTests/handler_actions_with_implied_marten_operations.cs @@ -12,8 +12,8 @@ namespace MartenTests; public class handler_actions_with_implied_marten_operations : PostgresqlContext, IAsyncLifetime { - private IHost _host; - private IDocumentStore _store; + private IHost _host = null!; + private IDocumentStore _store = null!; public async Task InitializeAsync() { @@ -80,7 +80,7 @@ public async Task update_document_happy_path() using var session = _store.LightweightSession(); var doc = await session.LoadAsync("Max"); - doc.Number.ShouldBe(10); + doc!.Number.ShouldBe(10); } @@ -241,9 +241,9 @@ public async Task use_enumerable_of_imartenop_as_return_value() using var session = _store.LightweightSession(); - (await session.LoadAsync("red")).Number.ShouldBe(1); - (await session.LoadAsync("blue")).Number.ShouldBe(2); - (await session.LoadAsync("green")).Number.ShouldBe(3); + (await session.LoadAsync("red"))!.Number.ShouldBe(1); + (await session.LoadAsync("blue"))!.Number.ShouldBe(2); + (await session.LoadAsync("green"))!.Number.ShouldBe(3); } } @@ -293,7 +293,7 @@ public static async Task Handle(DeleteMartenDocument command, IDocum { var doc = await session.LoadAsync(command.Name); - return MartenOps.Delete(doc); + return MartenOps.Delete(doc!); } public static IMartenOp Handle(DeleteMartenDocumentByIntId command) @@ -356,7 +356,7 @@ public static IEnumerable Handle(AppendManyNamedDocuments command) public class NamedDocument { - public string Id { get; set; } + public string Id { get; set; } = null!; public int Number { get; set; } } @@ -374,5 +374,5 @@ public class GuidIdDocument } public class StringIdDocument { - public string Id { get; set; } + public string Id { get; set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/MartenTests/handler_actions_with_returned_StartStream.cs b/src/Persistence/MartenTests/handler_actions_with_returned_StartStream.cs index c8ff2aa6c..affb429a9 100644 --- a/src/Persistence/MartenTests/handler_actions_with_returned_StartStream.cs +++ b/src/Persistence/MartenTests/handler_actions_with_returned_StartStream.cs @@ -15,8 +15,8 @@ namespace MartenTests; public class handler_actions_with_returned_StartStream : PostgresqlContext, IAsyncLifetime { - private IHost _host; - private IDocumentStore _store; + private IHost _host = null!; + private IDocumentStore _store = null!; public async Task InitializeAsync() { @@ -60,8 +60,8 @@ public async Task start_stream_by_guid1() public class start_stream_by_string_from_return_value : PostgresqlContext, IAsyncLifetime { - private IHost _host; - private IDocumentStore _store; + private IHost _host = null!; + private IDocumentStore _store = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/idempotency_check_in_marten_envelope_transaction.cs b/src/Persistence/MartenTests/idempotency_check_in_marten_envelope_transaction.cs index 7f1d31aa0..3ff0360b3 100644 --- a/src/Persistence/MartenTests/idempotency_check_in_marten_envelope_transaction.cs +++ b/src/Persistence/MartenTests/idempotency_check_in_marten_envelope_transaction.cs @@ -19,7 +19,7 @@ namespace MartenTests; public class idempotency_check_in_marten_envelope_transaction : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -57,7 +57,7 @@ public async Task happy_path_eager_idempotency() ok.ShouldBeTrue(); var persisted = (await runtime.Storage.Admin.AllIncomingAsync()).Single(x => x.Id == envelope.Id); - persisted.Data.Length.ShouldBe(0); + persisted!.Data!.Length.ShouldBe(0); persisted.Destination.ShouldBe(envelope.Destination); persisted.MessageType.ShouldBe(envelope.MessageType); persisted.Status.ShouldBe(EnvelopeStatus.Handled); @@ -118,7 +118,7 @@ public async Task happy_and_sad_path(IdempotencyStyle idempotency) var sentMessage = tracked1.Executed.SingleEnvelope(); var runtime = host.GetRuntime(); - var circuit = runtime.Endpoints.FindListenerCircuit(sentMessage.Destination); + var circuit = runtime.Endpoints.FindListenerCircuit(sentMessage.Destination!); var tracked2 = await host.TrackActivity() .DoNotAssertOnExceptionsDetected() @@ -126,7 +126,7 @@ public async Task happy_and_sad_path(IdempotencyStyle idempotency) { sentMessage.WasPersistedInInbox = false; sentMessage.Attempts = 0; - return circuit.EnqueueDirectlyAsync([sentMessage]); + return circuit!.EnqueueDirectlyAsync([sentMessage]); }); tracked2.Discarded.SingleEnvelope().ShouldNotBeNull(); @@ -161,7 +161,7 @@ public async Task happy_and_sad_path_with_message_and_destination_tracking(Idemp var sentMessage = tracked1.Executed.SingleEnvelope(); var runtime = host.GetRuntime(); - var circuit = runtime.Endpoints.FindListenerCircuit(sentMessage.Destination); + var circuit = runtime.Endpoints.FindListenerCircuit(sentMessage.Destination!); var tracked2 = await host.TrackActivity() .DoNotAssertOnExceptionsDetected() @@ -169,7 +169,7 @@ public async Task happy_and_sad_path_with_message_and_destination_tracking(Idemp { sentMessage.WasPersistedInInbox = false; sentMessage.Attempts = 0; - return circuit.EnqueueDirectlyAsync([sentMessage]); + return circuit!.EnqueueDirectlyAsync([sentMessage]); }); tracked2.Discarded.SingleEnvelope().ShouldNotBeNull(); diff --git a/src/Persistence/MartenTests/missing_data_handling_with_entity_attributes.cs b/src/Persistence/MartenTests/missing_data_handling_with_entity_attributes.cs index e85343d5a..525541e31 100644 --- a/src/Persistence/MartenTests/missing_data_handling_with_entity_attributes.cs +++ b/src/Persistence/MartenTests/missing_data_handling_with_entity_attributes.cs @@ -14,7 +14,7 @@ namespace MartenTests; // with Marten, so it's here. public class missing_data_handling_with_entity_attributes : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/non_transactional_attribute_opt_out.cs b/src/Persistence/MartenTests/non_transactional_attribute_opt_out.cs index de839ada7..bc866fe34 100644 --- a/src/Persistence/MartenTests/non_transactional_attribute_opt_out.cs +++ b/src/Persistence/MartenTests/non_transactional_attribute_opt_out.cs @@ -28,7 +28,7 @@ public async Task handler_with_non_transactional_attribute_should_not_be_transac // A handler that uses IDocumentSession but is decorated with [NonTransactional] // should NOT have transactional middleware applied - runtime.Handlers.ChainFor() + runtime.Handlers.ChainFor()! .IsTransactional.ShouldBeFalse(); } @@ -48,7 +48,7 @@ public async Task handler_without_non_transactional_attribute_should_still_be_tr // A normal handler that uses IDocumentSession should still get // transactional middleware from AutoApplyTransactions - runtime.Handlers.ChainFor() + runtime.Handlers.ChainFor()! .IsTransactional.ShouldBeTrue(); } @@ -67,7 +67,7 @@ public async Task non_transactional_attribute_on_handler_class_should_opt_out() var runtime = host.GetRuntime(); // [NonTransactional] on the handler class should also opt out - runtime.Handlers.ChainFor() + runtime.Handlers.ChainFor()! .IsTransactional.ShouldBeFalse(); } } diff --git a/src/Persistence/MartenTests/read_aggregate_attribute_usage.cs b/src/Persistence/MartenTests/read_aggregate_attribute_usage.cs index 3333e014f..fa4886440 100644 --- a/src/Persistence/MartenTests/read_aggregate_attribute_usage.cs +++ b/src/Persistence/MartenTests/read_aggregate_attribute_usage.cs @@ -14,9 +14,8 @@ namespace MartenTests; public class read_aggregate_attribute_usage : PostgresqlContext, IAsyncLifetime { - private IHost theHost; - private IDocumentStore theStore; - private Guid theStreamId; + private IHost theHost = null!; + private IDocumentStore theStore = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MartenTests/strong_typed_identifiers.cs b/src/Persistence/MartenTests/strong_typed_identifiers.cs index b183b6291..77b96e01d 100644 --- a/src/Persistence/MartenTests/strong_typed_identifiers.cs +++ b/src/Persistence/MartenTests/strong_typed_identifiers.cs @@ -11,7 +11,7 @@ namespace MartenTests; public class strong_typed_identifiers : PostgresqlContext, IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -61,7 +61,7 @@ public async Task use_with_multiple_entities_so_it_has_to_use_batch_querying() public class Knob { public KnobId Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public record TwistKnob(KnobId Id); diff --git a/src/Persistence/MartenTests/using_an_aggregate_that_handles_commands.cs b/src/Persistence/MartenTests/using_an_aggregate_that_handles_commands.cs index ea1874e5d..fd84c183d 100644 --- a/src/Persistence/MartenTests/using_an_aggregate_that_handles_commands.cs +++ b/src/Persistence/MartenTests/using_an_aggregate_that_handles_commands.cs @@ -58,7 +58,7 @@ internal async Task GivenAggregate() internal async Task LoadAggregate() { await using var session = theStore.LightweightSession(); - return await session.LoadAsync(theStreamId); + return (await session.LoadAsync(theStreamId))!; } internal async Task OnAggregate(Action assertions) diff --git a/src/Persistence/MartenTests/validate_empty_stream_key_on_start_stream.cs b/src/Persistence/MartenTests/validate_empty_stream_key_on_start_stream.cs index c6e679394..6045f5473 100644 --- a/src/Persistence/MartenTests/validate_empty_stream_key_on_start_stream.cs +++ b/src/Persistence/MartenTests/validate_empty_stream_key_on_start_stream.cs @@ -14,8 +14,8 @@ namespace MartenTests; public class validate_empty_stream_key_on_start_stream: PostgresqlContext, IAsyncLifetime { - private IHost _host; - private IDocumentStore _store; + private IHost _host = null!; + private IDocumentStore _store = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/MySql/MySqlTests/Agents/control_queue_tests.cs b/src/Persistence/MySql/MySqlTests/Agents/control_queue_tests.cs index 74b364a82..2ea93f6f4 100644 --- a/src/Persistence/MySql/MySqlTests/Agents/control_queue_tests.cs +++ b/src/Persistence/MySql/MySqlTests/Agents/control_queue_tests.cs @@ -15,9 +15,9 @@ namespace MySqlTests.Agents; [Collection("mysql")] public class control_queue_tests : MySqlContext, IAsyncLifetime { - private static IHost _sender; - private static IHost _receiver; - private static Uri _receiverUri; + private static IHost _sender = null!; + private static IHost _receiver = null!; + private static Uri _receiverUri = null!; public async Task InitializeAsync() { @@ -93,9 +93,9 @@ public async Task send_message_from_one_to_another() .Timeout(10.Seconds()) .ExecuteAndWaitAsync(m => m.EndpointFor(_receiverUri).SendAsync(new MySqlCommand(10))); - tracked.Sent.RecordsInOrder().Single(x => x.Envelope.Message?.GetType() == typeof(MySqlCommand)).ServiceName + tracked.Sent.RecordsInOrder().Single(x => x.Envelope?.Message?.GetType() == typeof(MySqlCommand)).ServiceName .ShouldBe("Sender"); - tracked.Received.RecordsInOrder().Single(x => x.Envelope.Message?.GetType() == typeof(MySqlCommand)) + tracked.Received.RecordsInOrder().Single(x => x.Envelope?.Message?.GetType() == typeof(MySqlCommand)) .ServiceName .ShouldBe("Receiver"); } @@ -108,17 +108,17 @@ public async Task request_reply_message_from_one_to_another() .Timeout(120.Seconds()) .InvokeAndWaitAsync(new MySqlQuery(13), _receiverUri); - result.Number.ShouldBe(13); + result!.Number.ShouldBe(13); - tracked.Sent.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(MySqlQuery)).ServiceName + tracked.Sent.RecordsInOrder().Single(x => x.Envelope?.Message?.GetType() == typeof(MySqlQuery)).ServiceName .ShouldBe("Sender"); - tracked.Received.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(MySqlQuery)).ServiceName + tracked.Received.RecordsInOrder().Single(x => x.Envelope?.Message?.GetType() == typeof(MySqlQuery)).ServiceName .ShouldBe("Receiver"); - tracked.Sent.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(MySqlResult)).ServiceName + tracked.Sent.RecordsInOrder().Single(x => x.Envelope?.Message?.GetType() == typeof(MySqlResult)).ServiceName .ShouldBe("Receiver"); - tracked.Received.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(MySqlResult)) + tracked.Received.RecordsInOrder().Single(x => x.Envelope?.Message?.GetType() == typeof(MySqlResult)) .ServiceName .ShouldBe("Sender"); } diff --git a/src/Persistence/MySql/Wolverine.MySql/MySqlMessageStore.cs b/src/Persistence/MySql/Wolverine.MySql/MySqlMessageStore.cs index 711f78dcd..4ea81cc8e 100644 --- a/src/Persistence/MySql/Wolverine.MySql/MySqlMessageStore.cs +++ b/src/Persistence/MySql/Wolverine.MySql/MySqlMessageStore.cs @@ -57,7 +57,7 @@ public MySqlMessageStore(DatabaseSettings databaseSettings, DurabilitySettings s foreach (var sagaTableDefinition in sagaTypes) { var storage = typeof(DatabaseSagaSchema<,>).CloseAndBuildAs(sagaTableDefinition, - _settings, sagaTableDefinition.SagaType, sagaTableDefinition.IdMember.GetMemberType()); + _settings, sagaTableDefinition.SagaType, sagaTableDefinition.IdMember.GetMemberType()!); _sagaStorage = _sagaStorage.AddOrUpdate(sagaTableDefinition.SagaType, storage); } } diff --git a/src/Persistence/MySql/Wolverine.MySql/Sagas/DatabaseSagaSchema.cs b/src/Persistence/MySql/Wolverine.MySql/Sagas/DatabaseSagaSchema.cs index 2b285afec..cf82c6a98 100644 --- a/src/Persistence/MySql/Wolverine.MySql/Sagas/DatabaseSagaSchema.cs +++ b/src/Persistence/MySql/Wolverine.MySql/Sagas/DatabaseSagaSchema.cs @@ -33,7 +33,7 @@ public DatabaseSagaSchema(SagaTableDefinition definition, DatabaseSettings setti _deleteSql = $"DELETE FROM {settings.SchemaName}.{definition.TableName} WHERE id = @id"; - var table = new Table(new DbObjectName(settings.SchemaName, definition.TableName)); + var table = new Table(new DbObjectName(settings.SchemaName!, definition.TableName)); table.AddColumn("id").AsPrimaryKey(); table.AddColumn(DatabaseConstants.Body, "JSON").NotNull(); table.AddColumn(DatabaseConstants.Version, "INT").DefaultValue(1).NotNull(); diff --git a/src/Persistence/Oracle/Wolverine.Oracle/OracleMessageStore.cs b/src/Persistence/Oracle/Wolverine.Oracle/OracleMessageStore.cs index eb816cd98..dd41c65e3 100644 --- a/src/Persistence/Oracle/Wolverine.Oracle/OracleMessageStore.cs +++ b/src/Persistence/Oracle/Wolverine.Oracle/OracleMessageStore.cs @@ -71,7 +71,7 @@ public OracleMessageStore(DatabaseSettings databaseSettings, DurabilitySettings foreach (var sagaTableDefinition in sagaTypes) { var storage = typeof(OracleSagaSchema<,>).CloseAndBuildAs(sagaTableDefinition, - _settings, sagaTableDefinition.SagaType, sagaTableDefinition.IdMember.GetMemberType()); + _settings, sagaTableDefinition.SagaType, sagaTableDefinition.IdMember.GetMemberType()!); _sagaStorage = _sagaStorage.AddOrUpdate(sagaTableDefinition.SagaType, storage); } diff --git a/src/Persistence/Oracle/Wolverine.Oracle/Transport/OracleQueueSender.cs b/src/Persistence/Oracle/Wolverine.Oracle/Transport/OracleQueueSender.cs index 70f04fc72..dc33ba33f 100644 --- a/src/Persistence/Oracle/Wolverine.Oracle/Transport/OracleQueueSender.cs +++ b/src/Persistence/Oracle/Wolverine.Oracle/Transport/OracleQueueSender.cs @@ -242,7 +242,7 @@ public async Task SendAsync(Envelope envelope, CancellationToken cancellationTok var cmd = conn.CreateCommand(_writeDirectlyToQueueTableSql); cmd.With("id", envelope.Id); cmd.Parameters.Add(new OracleParameter("body", OracleDbType.Blob) { Value = EnvelopeSerializer.Serialize(envelope) }); - cmd.With("type", envelope.MessageType); + cmd.With("type", envelope.MessageType!); cmd.Parameters.Add(new OracleParameter("expires", OracleDbType.TimeStampTZ) { Value = (object?)envelope.DeliverBy ?? DBNull.Value }); await cmd.ExecuteNonQueryAsync(cancellationToken); } @@ -264,7 +264,7 @@ private async Task writeToScheduledTableAsync(Envelope envelope, CancellationTok var cmd = conn.CreateCommand(_writeDirectlyToTheScheduledTable); cmd.With("id", envelope.Id); cmd.Parameters.Add(new OracleParameter("body", OracleDbType.Blob) { Value = EnvelopeSerializer.Serialize(envelope) }); - cmd.With("type", envelope.MessageType); + cmd.With("type", envelope.MessageType!); cmd.Parameters.Add(new OracleParameter("expires", OracleDbType.TimeStampTZ) { Value = (object?)envelope.DeliverBy ?? DBNull.Value }); cmd.Parameters.Add(new OracleParameter("time", OracleDbType.TimeStampTZ) { Value = (object?)envelope.ScheduledTime ?? DBNull.Value }); await cmd.ExecuteNonQueryAsync(cancellationToken); diff --git a/src/Persistence/OrderEventSourcingSample/Alternatives/Signatures.cs b/src/Persistence/OrderEventSourcingSample/Alternatives/Signatures.cs index 1b22d33e0..2aa7e55bd 100644 --- a/src/Persistence/OrderEventSourcingSample/Alternatives/Signatures.cs +++ b/src/Persistence/OrderEventSourcingSample/Alternatives/Signatures.cs @@ -14,7 +14,7 @@ public class MarkItemReady // Order aggregate [Identity] public Guid Id { get; init; } - public string ItemName { get; init; } + public string ItemName { get; init; } = null!; } #endregion @@ -28,7 +28,7 @@ public static class MarkItemReadyHandler [AggregateHandler] public static void Handle(OrderEventSourcingSample.MarkItemReady command, IEventStream stream) { - var order = stream.Aggregate; + var order = stream.Aggregate!; if (order.Items.TryGetValue(command.ItemName, out var item)) { diff --git a/src/Persistence/OrderEventSourcingSample/Order.cs b/src/Persistence/OrderEventSourcingSample/Order.cs index 2ec8e70d6..2d8e36391 100644 --- a/src/Persistence/OrderEventSourcingSample/Order.cs +++ b/src/Persistence/OrderEventSourcingSample/Order.cs @@ -23,7 +23,7 @@ public record ItemReady(string Name); public class Item { - public string Name { get; set; } + public string Name { get; set; } = null!; public bool Ready { get; set; } } @@ -93,7 +93,7 @@ [FromServices] IMartenOutbox outbox // We're also opting into Marten optimistic concurrency checks here .FetchForWriting(command.OrderId, command.Version); - var order = stream.Aggregate; + var order = stream.Aggregate!; if (order.Items.TryGetValue(command.ItemName, out var item)) { @@ -137,7 +137,7 @@ public async Task Handle1(MarkItemReady command, IDocumentSession session) .Events .FetchForWriting(command.OrderId); - var order = stream.Aggregate; + var order = stream.Aggregate!; if (order.Items.TryGetValue(command.ItemName, out var item)) { @@ -169,7 +169,7 @@ public async Task Handle2(MarkItemReady command, IDocumentSession session) // event stream .FetchForWriting(command.OrderId, command.Version); - var order = stream.Aggregate; + var order = stream.Aggregate!; if (order.Items.TryGetValue(command.ItemName, out var item)) { @@ -201,7 +201,7 @@ public async Task Handle3(MarkItemReady command, IDocumentSession session) // event stream .FetchForExclusiveWriting(command.OrderId); - var order = stream.Aggregate; + var order = stream.Aggregate!; if (order.Items.TryGetValue(command.ItemName, out var item)) { @@ -227,7 +227,7 @@ public Task Handle4(MarkItemReady command, IDocumentSession session) { return session.Events.WriteToAggregate(command.OrderId, command.Version, stream => { - var order = stream.Aggregate; + var order = stream.Aggregate!; if (order.Items.TryGetValue(command.ItemName, out var item)) { diff --git a/src/Persistence/OrderEventSourcingSample/Program.cs b/src/Persistence/OrderEventSourcingSample/Program.cs index eef169afb..8e1e2f55a 100644 --- a/src/Persistence/OrderEventSourcingSample/Program.cs +++ b/src/Persistence/OrderEventSourcingSample/Program.cs @@ -17,7 +17,7 @@ builder.Services.AddMarten(opts => { var connectionString = builder.Configuration.GetConnectionString("Marten"); - opts.Connection(connectionString); + opts.Connection(connectionString!); opts.DatabaseSchemaName = "orders"; }) diff --git a/src/Persistence/PersistenceTests/Agents/durability_modes.cs b/src/Persistence/PersistenceTests/Agents/durability_modes.cs index 1adc589b2..3006014ff 100644 --- a/src/Persistence/PersistenceTests/Agents/durability_modes.cs +++ b/src/Persistence/PersistenceTests/Agents/durability_modes.cs @@ -81,7 +81,7 @@ public async ValueTask DisposeAsync() protected async Task stopAsync() { - await _host.StopAsync(); + await _host!.StopAsync(); _host.Dispose(); _host = null; } @@ -99,7 +99,7 @@ public async Task start_in_balanced_mode() // Should be listening on the control endpoint runtime.Endpoints .ActiveListeners() - .Any(x => x.Uri == runtime.Options.Transports.NodeControlEndpoint.Uri) + .Any(x => x.Uri == runtime.Options.Transports.NodeControlEndpoint!.Uri) .ShouldBeTrue(); // Should start up the durable scheduled jobs @@ -114,12 +114,12 @@ public async Task start_in_balanced_mode() var tracker = runtime.Tracker; // All agents should be running here - await _host.WaitUntilAssignmentsChangeTo(w => + await _host!.WaitUntilAssignmentsChangeTo(w => { - w.ExpectRunningAgents(_host, 12); + w.ExpectRunningAgents(_host!, 12); }, 30.Seconds()); - await _host.WaitUntilAssumesLeadershipAsync(30.Seconds()); + await _host!.WaitUntilAssumesLeadershipAsync(30.Seconds()); // Deletes the current node on stop await stopAsync(); @@ -147,9 +147,9 @@ public async Task start_in_solo_mode() node.ShouldBeNull(); // All agents should be running here - await _host.WaitUntilAssignmentsChangeTo(w => + await _host!.WaitUntilAssignmentsChangeTo(w => { - w.ExpectRunningAgents(_host, 12); + w.ExpectRunningAgents(_host!, 12); }, 30.Seconds()); // Deletes the current node on stop @@ -168,7 +168,7 @@ public async Task start_in_serverless_mode() // Should NOT be listening on the control endpoint runtime.Endpoints .ActiveListeners() - .Any(x => x.Uri == runtime.Options.Transports.NodeControlEndpoint.Uri) + .Any(x => x.Uri == runtime.Options.Transports.NodeControlEndpoint!.Uri) .ShouldBeFalse(); // Removes all local endpoints @@ -194,7 +194,7 @@ public async Task start_in_mediator_mode() // Should NOT be listening on the control endpoint runtime.Endpoints .ActiveListeners() - .Any(x => x.Uri == runtime.Options.Transports.NodeControlEndpoint.Uri) + .Any(x => x.Uri == runtime.Options.Transports.NodeControlEndpoint!.Uri) .ShouldBeFalse(); // Should NOT start up the durable scheduled jobs diff --git a/src/Persistence/PersistenceTests/Durability/CheckRecoverableIncomingMessageOperationTests.cs b/src/Persistence/PersistenceTests/Durability/CheckRecoverableIncomingMessageOperationTests.cs index d573ea7c8..efd19de04 100644 --- a/src/Persistence/PersistenceTests/Durability/CheckRecoverableIncomingMessageOperationTests.cs +++ b/src/Persistence/PersistenceTests/Durability/CheckRecoverableIncomingMessageOperationTests.cs @@ -54,7 +54,7 @@ public void not_accepting(ListeningStatus status) [InlineData("Limited by number on server 2", 492, 8, 8)] [InlineData("Limited by queue count and buffered limit", 433, 300, 66)] [InlineData("Already at buffered limit", 505, 300, 0)] - public void determine_page_size(string description, int queueLimit, int serverCount, int expected) + public void determine_page_size(string _, int queueLimit, int serverCount, int expected) { theAgent.QueueCount.Returns(queueLimit); theAgent.Status.Returns(ListeningStatus.Accepting); diff --git a/src/Persistence/PersistenceTests/DurableFixture.cs b/src/Persistence/PersistenceTests/DurableFixture.cs index f8ff4c448..37581fb2c 100644 --- a/src/Persistence/PersistenceTests/DurableFixture.cs +++ b/src/Persistence/PersistenceTests/DurableFixture.cs @@ -15,8 +15,8 @@ namespace PersistenceTests; public abstract class DurableFixture : IAsyncLifetime { - private IHost theReceiver; - private IHost theSender; + private IHost theReceiver = null!; + private IHost theSender = null!; public async Task InitializeAsync() { @@ -258,7 +258,7 @@ public async Task can_send_durably_with_receiver_down() // Shutting it down theReceiver.Dispose(); - theReceiver = null; + theReceiver = null!; var item = new ItemCreated @@ -279,12 +279,12 @@ public async Task can_send_durably_with_receiver_down() public class TriggerMessage { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class CascadedMessage { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class CascadeReceiver @@ -297,7 +297,7 @@ public void Handle(CascadedMessage message) public class ItemCreated { public Guid Id; - public string Name; + public string Name = null!; } public class QuestionHandler @@ -333,9 +333,9 @@ public class ScheduledMessageHandler { public static readonly IList ReceivedMessages = new List(); - private static TaskCompletionSource _source; + private static TaskCompletionSource _source = null!; - public static Task Received { get; private set; } + public static Task Received { get; private set; } = null!; public void Consume(ScheduledMessage message) { diff --git a/src/Persistence/PersistenceTests/ModularMonoliths/end_to_end_modular_monolith.cs b/src/Persistence/PersistenceTests/ModularMonoliths/end_to_end_modular_monolith.cs index 50df1d032..405757597 100644 --- a/src/Persistence/PersistenceTests/ModularMonoliths/end_to_end_modular_monolith.cs +++ b/src/Persistence/PersistenceTests/ModularMonoliths/end_to_end_modular_monolith.cs @@ -40,7 +40,7 @@ public MonolithFixture() ItemsTable.AddColumn("Approved"); } - public IHost Host { get; private set; } + public IHost Host { get; private set; } = null!; public Table ItemsTable { get; } @@ -239,11 +239,11 @@ public async Task use_outbox_with_ancillary_store_with_ef_core() var session = await theHost.SendMessageAndWaitAsync(message); var envelope = session.Sent.SingleEnvelope(); - envelope.Store.Uri.ShouldBe(new Uri("wolverinedb://sqlserver/localhost/master/wolverine")); + envelope.Store!.Uri.ShouldBe(new Uri("wolverinedb://sqlserver/localhost/master/wolverine")); var messageId = envelope.Id; // Message should have been deleted - var stored = await envelope.Store.Outbox.LoadOutgoingAsync(envelope.Destination); + var stored = await envelope.Store.Outbox.LoadOutgoingAsync(envelope.Destination!); stored.Any(x => x.Id == messageId).ShouldBeFalse(); } @@ -253,8 +253,8 @@ public async Task use_inbox_with_ancillary_store_with_ef_core() var message = new StartAndScheduleApproval(Guid.NewGuid(), "Rip in shirt"); var session = await theHost.SendMessageAndWaitAsync(message); var scheduledEnvelope = session.Scheduled.SingleEnvelope(); - - scheduledEnvelope.Store.Uri.ShouldBe(new Uri("wolverinedb://sqlserver/localhost/master/wolverine")); + + scheduledEnvelope.Store!.Uri.ShouldBe(new Uri("wolverinedb://sqlserver/localhost/master/wolverine")); var stored = await scheduledEnvelope.Store.Admin.AllIncomingAsync(); var persisted = stored.Where(x => x.MessageType == TransportConstants.ScheduledEnvelope).Single(); @@ -280,11 +280,11 @@ public async Task use_outbox_with_ancillary_store_with_marten() var session = await theHost.SendMessageAndWaitAsync(message); var envelope = session.Sent.SingleEnvelope(); - envelope.Store.Uri.ShouldBe(new Uri("wolverinedb://postgresql/localhost/postgres/wolverine")); + envelope.Store!.Uri.ShouldBe(new Uri("wolverinedb://postgresql/localhost/postgres/wolverine")); var messageId = envelope.Id; // Message should have been deleted - var stored = await envelope.Store.Outbox.LoadOutgoingAsync(envelope.Destination); + var stored = await envelope.Store.Outbox.LoadOutgoingAsync(envelope.Destination!); stored.Any(x => x.Id == messageId).ShouldBeFalse(); } @@ -295,7 +295,7 @@ public async Task use_inbox_with_ancillary_store_with_marten() var session = await theHost.SendMessageAndWaitAsync(message); var scheduledEnvelope = session.Scheduled.SingleEnvelope(); - scheduledEnvelope.Store.Uri.ShouldBe(new Uri("wolverinedb://postgresql/localhost/postgres/wolverine")); + scheduledEnvelope.Store!.Uri.ShouldBe(new Uri("wolverinedb://postgresql/localhost/postgres/wolverine")); var stored = await scheduledEnvelope.Store.Admin.AllIncomingAsync(); var persisted = stored.Where(x => x.MessageType == TransportConstants.ScheduledEnvelope).Single(); @@ -374,8 +374,8 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) public class Item { public Guid Id { get; set; } - public string Name { get; set; } - + public string Name { get; set; } = null!; + public bool Approved { get; set; } } @@ -387,7 +387,7 @@ public record ApproveThing(Guid Id); public class Thing { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } diff --git a/src/Persistence/PersistenceTests/ModularMonoliths/registration_of_message_stores.cs b/src/Persistence/PersistenceTests/ModularMonoliths/registration_of_message_stores.cs index fa6e25061..9f5a1ac6c 100644 --- a/src/Persistence/PersistenceTests/ModularMonoliths/registration_of_message_stores.cs +++ b/src/Persistence/PersistenceTests/ModularMonoliths/registration_of_message_stores.cs @@ -20,7 +20,6 @@ using Wolverine.SqlServer.Persistence; using Wolverine.Tracking; using Xunit; -using Xunit.Abstractions; namespace PersistenceTests.ModularMonoliths; @@ -38,13 +37,13 @@ namespace PersistenceTests.ModularMonoliths; * */ -public class registration_of_message_stores(ITestOutputHelper Output) : IAsyncLifetime +public class registration_of_message_stores : IAsyncLifetime { - private IHost _host; - private string connectionString1; - private string connectionString2; - private string connectionString3; - private string connectionString4; + private IHost _host = null!; + private string connectionString1 = null!; + private string connectionString2 = null!; + private string connectionString3 = null!; + private string connectionString4 = null!; private async Task CreateDatabaseIfNotExists(NpgsqlConnection conn, string databaseName) { @@ -107,7 +106,7 @@ public async Task for_single_database() (await collection.FindDatabasesAsync([expected])).Single().Uri.ShouldBe(expected); - (await collection.FindDatabaseAsync(expected)).Uri.ShouldBe(expected); + (await collection.FindDatabaseAsync(expected))!.Uri.ShouldBe(expected); collection.Cardinality().ShouldBe(DatabaseCardinality.Single); } @@ -145,8 +144,8 @@ public async Task for_several_ancillary_marten_databases() (await collection.FindDatabasesAsync([expected])).Single().Uri.ShouldBe(expected); - (await collection.FindDatabaseAsync(expected)).Uri.ShouldBe(expected); - + (await collection.FindDatabaseAsync(expected))!.Uri.ShouldBe(expected); + collection.Cardinality().ShouldBe(DatabaseCardinality.Single); } @@ -189,8 +188,8 @@ public async Task ancillary_marten_databases_using_different_databases() (await collection.FindDatabasesAsync([first, main])).Select(x => x.Uri).ShouldBe([first, main]); - (await collection.FindDatabaseAsync(second)).Uri.ShouldBe(second); - + (await collection.FindDatabaseAsync(second))!.Uri.ShouldBe(second); + collection.Cardinality().ShouldBe(DatabaseCardinality.Single); } @@ -225,11 +224,11 @@ public async Task using_static_multi_tenancy() services.Select(x => x.Uri).OrderBy(x => x.ToString()) .ShouldBe([db1, db2, db3, db4, main]); - (await collection.FindDatabaseAsync(db3)).Uri.ShouldBe(db3); - (await collection.FindDatabaseAsync(main)).Uri.ShouldBe(main); + (await collection.FindDatabaseAsync(db3))!.Uri.ShouldBe(db3); + (await collection.FindDatabaseAsync(main))!.Uri.ShouldBe(main); (await collection.FindDatabasesAsync([db1, main])).Select(x => x.Uri).ShouldBe([db1, main]); - + collection.Cardinality().ShouldBe(DatabaseCardinality.StaticMultiple); } @@ -268,8 +267,8 @@ public async Task using_dynamic_multi_tenancy() services.Select(x => x.Uri).OrderBy(x => x.ToString()) .ShouldBe([db1, db2, main]); - (await collection.FindDatabaseAsync(db2)).Uri.ShouldBe(db2); - (await collection.FindDatabaseAsync(main)).Uri.ShouldBe(main); + (await collection.FindDatabaseAsync(db2))!.Uri.ShouldBe(db2); + (await collection.FindDatabaseAsync(main))!.Uri.ShouldBe(main); await _host.AddTenantDatabaseAsync("t3", connectionString3); await _host.AddTenantDatabaseAsync("t4", connectionString4); diff --git a/src/Persistence/PersistenceTests/OutboxedMessageHandler.cs b/src/Persistence/PersistenceTests/OutboxedMessageHandler.cs index d84efdfb5..bb62a926d 100644 --- a/src/Persistence/PersistenceTests/OutboxedMessageHandler.cs +++ b/src/Persistence/PersistenceTests/OutboxedMessageHandler.cs @@ -9,7 +9,7 @@ public record OutboxedMessage public class OutboxedMessageHandler { - private static TaskCompletionSource _source; + private static TaskCompletionSource _source = null!; public static Task WaitForNextMessage() { diff --git a/src/Persistence/PersistenceTests/Postgresql/Transport/DocumentationSamples.cs b/src/Persistence/PersistenceTests/Postgresql/Transport/DocumentationSamples.cs index 83fab4bd6..99367091d 100644 --- a/src/Persistence/PersistenceTests/Postgresql/Transport/DocumentationSamples.cs +++ b/src/Persistence/PersistenceTests/Postgresql/Transport/DocumentationSamples.cs @@ -15,7 +15,7 @@ public static async Task Bootstrapping() builder.UseWolverine(opts => { var connectionString = builder.Configuration.GetConnectionString("sqlserver"); - opts.UseSqlServerPersistenceAndTransport(connectionString, "myapp") + opts.UseSqlServerPersistenceAndTransport(connectionString!, "myapp") // Tell Wolverine to build out all necessary queue or scheduled message // tables on demand as needed diff --git a/src/Persistence/PersistenceTests/Postgresql/Transport/data_operations.cs b/src/Persistence/PersistenceTests/Postgresql/Transport/data_operations.cs index ebeceeed8..b5d5e011b 100644 --- a/src/Persistence/PersistenceTests/Postgresql/Transport/data_operations.cs +++ b/src/Persistence/PersistenceTests/Postgresql/Transport/data_operations.cs @@ -21,11 +21,11 @@ public class data_operations : IAsyncLifetime { public static int count = 0; - private IHost _host; - private SqlServerTransport theTransport; + private IHost _host = null!; + private SqlServerTransport theTransport = null!; private IStatefulResource? theResource; - private SqlServerQueue theQueue; - private IMessageStore theMessageStore; + private SqlServerQueue theQueue = null!; + private IMessageStore theMessageStore = null!; public async Task InitializeAsync() { @@ -66,7 +66,7 @@ public async Task InitializeAsync() theTransport.TryBuildStatefulResource(runtime, out theResource).ShouldBeTrue(); - await theResource.Setup(CancellationToken.None); + await theResource!.Setup(CancellationToken.None); await theResource.ClearState(CancellationToken.None); theQueue = theTransport.Queues["one"]; diff --git a/src/Persistence/PersistenceTests/SampleDbContext.cs b/src/Persistence/PersistenceTests/SampleDbContext.cs index e64c297cf..e6e379636 100644 --- a/src/Persistence/PersistenceTests/SampleDbContext.cs +++ b/src/Persistence/PersistenceTests/SampleDbContext.cs @@ -27,5 +27,5 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) public class Item { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } diff --git a/src/Persistence/PersistenceTests/Samples/DocumentationSamples.cs b/src/Persistence/PersistenceTests/Samples/DocumentationSamples.cs index 501898f3a..6246ed2df 100644 --- a/src/Persistence/PersistenceTests/Samples/DocumentationSamples.cs +++ b/src/Persistence/PersistenceTests/Samples/DocumentationSamples.cs @@ -139,7 +139,7 @@ public static async Task SetupSqlServer(string[] args) { // Setting up Sql Server-backed message storage // This requires a reference to Wolverine.SqlServer - opts.PersistMessagesWithSqlServer(connectionString); + opts.PersistMessagesWithSqlServer(connectionString!); // Other Wolverine configuration }); @@ -170,7 +170,7 @@ public static async Task SetupPostgresql(string[] args) { // Setting up Postgresql-backed message storage // This requires a reference to Wolverine.Postgresql - opts.PersistMessagesWithPostgresql(connectionString); + opts.PersistMessagesWithPostgresql(connectionString!); // Other Wolverine configuration }); @@ -241,7 +241,7 @@ public static async Task options_important_for_modular_monolith() builder.Services.AddMarten(opts => { var connectionString = builder.Configuration.GetConnectionString("marten"); - opts.Connection(connectionString); + opts.Connection(connectionString!); }) // This line of code is adding a PostgreSQL backed transactional inbox/outbox diff --git a/src/Persistence/PersistenceTests/application_of_transaction_middleware.cs b/src/Persistence/PersistenceTests/application_of_transaction_middleware.cs index 2defcb28e..1ee8c2d4b 100644 --- a/src/Persistence/PersistenceTests/application_of_transaction_middleware.cs +++ b/src/Persistence/PersistenceTests/application_of_transaction_middleware.cs @@ -23,9 +23,9 @@ namespace PersistenceTests; public class application_of_transaction_middleware : IAsyncLifetime { - private IHost _host; - private IServiceContainer theContainer; - private HandlerGraph theHandlers; + private IHost _host = null!; + private IServiceContainer theContainer = null!; + private HandlerGraph theHandlers = null!; public async Task InitializeAsync() { @@ -71,7 +71,7 @@ public void marten_document_session_matching(Type messageType, bool expected) var provider = new MartenPersistenceFrameProvider(); var chain = theHandlers.ChainFor(messageType); - provider.CanApply(chain, theContainer).ShouldBe(expected); + provider.CanApply(chain!, theContainer).ShouldBe(expected); } [Theory] diff --git a/src/Persistence/PolecatTests/Subscriptions/subscriptions_end_to_end.cs b/src/Persistence/PolecatTests/Subscriptions/subscriptions_end_to_end.cs index 9b36efae0..e031d127f 100644 --- a/src/Persistence/PolecatTests/Subscriptions/subscriptions_end_to_end.cs +++ b/src/Persistence/PolecatTests/Subscriptions/subscriptions_end_to_end.cs @@ -17,6 +17,7 @@ namespace PolecatTests.Subscriptions; +[Trait("Category", "Flaky")] public class subscriptions_end_to_end { /// diff --git a/src/Persistence/PostgresqlTests/Agents/control_queue_tests.cs b/src/Persistence/PostgresqlTests/Agents/control_queue_tests.cs index 36d4e859b..50aa52050 100644 --- a/src/Persistence/PostgresqlTests/Agents/control_queue_tests.cs +++ b/src/Persistence/PostgresqlTests/Agents/control_queue_tests.cs @@ -15,9 +15,9 @@ namespace PostgresqlTests.Agents; public class control_queue_tests : PostgresqlContext, IAsyncLifetime { - private static IHost _sender; - private static IHost _receiver; - private static Uri _receiverUri; + private static IHost _sender = null!; + private static IHost _receiver = null!; + private static Uri _receiverUri = null!; public async Task InitializeAsync() { @@ -80,10 +80,10 @@ public async Task send_message_from_one_to_another() //.WaitForMessageToBeReceivedAt(_receiver) .ExecuteAndWaitAsync(m => m.EndpointFor(_receiverUri).SendAsync(new Command(10))); - tracked.Sent.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(Command)).ServiceName + tracked.Sent.RecordsInOrder().Single(x => x.Envelope!.Message!.GetType() == typeof(Command)).ServiceName! .ShouldBe("Sender"); - tracked.Received.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(Command)) - .ServiceName + tracked.Received.RecordsInOrder().Single(x => x.Envelope!.Message!.GetType() == typeof(Command)) + .ServiceName! .ShouldBe("Receiver"); } @@ -96,18 +96,18 @@ public async Task request_reply_message_from_one_to_another() .WaitForMessageToBeReceivedAt(_sender) .InvokeAndWaitAsync(new Query(13), _receiverUri); - result.Number.ShouldBe(13); + result!.Number.ShouldBe(13); - tracked.Sent.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(Query)).ServiceName + tracked.Sent.RecordsInOrder().Single(x => x.Envelope!.Message!.GetType() == typeof(Query)).ServiceName! .ShouldBe("Sender"); - tracked.Received.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(Query)).ServiceName + tracked.Received.RecordsInOrder().Single(x => x.Envelope!.Message!.GetType() == typeof(Query)).ServiceName! .ShouldBe("Receiver"); - tracked.Sent.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(Result)).ServiceName + tracked.Sent.RecordsInOrder().Single(x => x.Envelope!.Message!.GetType() == typeof(Result)).ServiceName! .ShouldBe("Receiver"); - tracked.Received.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(Result)) - .ServiceName + tracked.Received.RecordsInOrder().Single(x => x.Envelope!.Message!.GetType() == typeof(Result)) + .ServiceName! .ShouldBe("Sender"); } } diff --git a/src/Persistence/PostgresqlTests/Bugs/Bug_1516_get_the_schema_names_right.cs b/src/Persistence/PostgresqlTests/Bugs/Bug_1516_get_the_schema_names_right.cs index d43e5c60f..dc459fb21 100644 --- a/src/Persistence/PostgresqlTests/Bugs/Bug_1516_get_the_schema_names_right.cs +++ b/src/Persistence/PostgresqlTests/Bugs/Bug_1516_get_the_schema_names_right.cs @@ -35,7 +35,7 @@ public async Task get_the_bleeping_schema_names_right() public class TraceMessage { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class TraceHandler diff --git a/src/Persistence/PostgresqlTests/DocumentationSamples.cs b/src/Persistence/PostgresqlTests/DocumentationSamples.cs index 1b2c85a91..b5786aaad 100644 --- a/src/Persistence/PostgresqlTests/DocumentationSamples.cs +++ b/src/Persistence/PostgresqlTests/DocumentationSamples.cs @@ -16,7 +16,7 @@ public static async Task Bootstrapping() { var connectionString = builder.Configuration.GetConnectionString("postgres"); opts.UsePostgresqlPersistenceAndTransport( - connectionString, + connectionString!, // This argument is the database schema for the envelope storage // If separate logical services are targeting the same physical database, diff --git a/src/Persistence/PostgresqlTests/LocalPostgresqlBackedTransportCompliance.cs b/src/Persistence/PostgresqlTests/LocalPostgresqlBackedTransportCompliance.cs index 8265ae844..9412ce14a 100644 --- a/src/Persistence/PostgresqlTests/LocalPostgresqlBackedTransportCompliance.cs +++ b/src/Persistence/PostgresqlTests/LocalPostgresqlBackedTransportCompliance.cs @@ -21,9 +21,9 @@ public Task InitializeAsync() }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Persistence/PostgresqlTests/MultiTenancy/MultiTenancyContext.cs b/src/Persistence/PostgresqlTests/MultiTenancy/MultiTenancyContext.cs index 4f246e149..ef585f6b2 100644 --- a/src/Persistence/PostgresqlTests/MultiTenancy/MultiTenancyContext.cs +++ b/src/Persistence/PostgresqlTests/MultiTenancy/MultiTenancyContext.cs @@ -13,10 +13,10 @@ namespace PostgresqlTests.MultiTenancy; public abstract class MultiTenancyContext : PostgresqlContext, IAsyncLifetime { - protected IHost theHost; - protected string tenant1ConnectionString; - protected string tenant2ConnectionString; - protected string tenant3ConnectionString; + protected IHost theHost = null!; + protected string tenant1ConnectionString = null!; + protected string tenant2ConnectionString = null!; + protected string tenant3ConnectionString = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/PostgresqlTests/MultiTenancy/multi_tenant_durability_agents.cs b/src/Persistence/PostgresqlTests/MultiTenancy/multi_tenant_durability_agents.cs index 6fb3cef0b..a66c9d6f2 100644 --- a/src/Persistence/PostgresqlTests/MultiTenancy/multi_tenant_durability_agents.cs +++ b/src/Persistence/PostgresqlTests/MultiTenancy/multi_tenant_durability_agents.cs @@ -19,9 +19,9 @@ namespace PostgresqlTests.MultiTenancy; public class multi_tenant_durability_agents : PostgresqlContext, IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost theHost; - private string tenant1ConnectionString; - private string tenant2ConnectionString; + private IHost theHost = null!; + private string tenant1ConnectionString = null!; + private string tenant2ConnectionString = null!; private TenantMessageTracker theTracker = new(); public multi_tenant_durability_agents(ITestOutputHelper output) diff --git a/src/Persistence/PostgresqlTests/PostgresqlMessageStore_DQL_expiration.cs b/src/Persistence/PostgresqlTests/PostgresqlMessageStore_DQL_expiration.cs index f79475176..1e6d425a8 100644 --- a/src/Persistence/PostgresqlTests/PostgresqlMessageStore_DQL_expiration.cs +++ b/src/Persistence/PostgresqlTests/PostgresqlMessageStore_DQL_expiration.cs @@ -37,8 +37,8 @@ public async Task no_expiration_column_normally() var runtime = host.GetRuntime(); - var dlq = await new DeadLettersTable(runtime.Options.Durability, "receiver").FetchExistingAsync(conn); - dlq.ColumnFor(DatabaseConstants.Expires).ShouldBeNull(); + var dlq = await new DeadLettersTable(runtime.Options.Durability, "dlq_expiration").FetchExistingAsync(conn); + dlq!.ColumnFor(DatabaseConstants.Expires).ShouldBeNull(); } [Fact] @@ -65,7 +65,7 @@ public async Task add_expiration_time_column_if_DLQ_expiration_is_enabled() var runtime = host.GetRuntime(); var dlq = await new DeadLettersTable(runtime.Options.Durability, "dlq_expiration").FetchExistingAsync(conn); - var column = dlq.ColumnFor(DatabaseConstants.Expires); + var column = dlq!.ColumnFor(DatabaseConstants.Expires); column.ShouldNotBeNull(); column.AllowNulls.ShouldBeTrue(); } diff --git a/src/Persistence/PostgresqlTests/PostgresqlMessageStore_with_IdAndDestination_Identity.cs b/src/Persistence/PostgresqlTests/PostgresqlMessageStore_with_IdAndDestination_Identity.cs index 72863e323..95710597b 100644 --- a/src/Persistence/PostgresqlTests/PostgresqlMessageStore_with_IdAndDestination_Identity.cs +++ b/src/Persistence/PostgresqlTests/PostgresqlMessageStore_with_IdAndDestination_Identity.cs @@ -74,11 +74,11 @@ public async Task should_have_receive_at_in_primary_keys() var runtime = theHost.GetRuntime(); var incoming = await new IncomingEnvelopeTable(runtime.Options.Durability, "receiver").FetchExistingAsync(conn); - incoming.PrimaryKeyColumns.ShouldContain(DatabaseConstants.Id); + incoming!.PrimaryKeyColumns.ShouldContain(DatabaseConstants.Id); incoming.PrimaryKeyColumns.ShouldContain(DatabaseConstants.ReceivedAt); - + var dlq = await new DeadLettersTable(runtime.Options.Durability, "receiver").FetchExistingAsync(conn); - dlq.PrimaryKeyColumns.ShouldContain(DatabaseConstants.Id); + dlq!.PrimaryKeyColumns.ShouldContain(DatabaseConstants.Id); dlq.PrimaryKeyColumns.ShouldContain(DatabaseConstants.ReceivedAt); } diff --git a/src/Persistence/PostgresqlTests/Sagas/configuring_saga_table_storage.cs b/src/Persistence/PostgresqlTests/Sagas/configuring_saga_table_storage.cs index 44ff74228..c0267a7fc 100644 --- a/src/Persistence/PostgresqlTests/Sagas/configuring_saga_table_storage.cs +++ b/src/Persistence/PostgresqlTests/Sagas/configuring_saga_table_storage.cs @@ -46,11 +46,11 @@ private static async Task dropSchemaAsync() public class RedSaga : Saga { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public class BlueSaga : Saga { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/PostgresqlTests/Sagas/lightweight_saga_persistence.cs b/src/Persistence/PostgresqlTests/Sagas/lightweight_saga_persistence.cs index c5496e66c..bd6f5827e 100644 --- a/src/Persistence/PostgresqlTests/Sagas/lightweight_saga_persistence.cs +++ b/src/Persistence/PostgresqlTests/Sagas/lightweight_saga_persistence.cs @@ -13,7 +13,7 @@ namespace PostgresqlTests.Sagas; public class PostgresqlSagaHost : ISagaHost { - private IHost _host; + private IHost _host = null!; public IHost BuildHost() { @@ -40,7 +40,7 @@ public async Task LoadState(Guid id) where T : Saga var saga = await sagaStorage.LoadAsync(id, tx, CancellationToken.None); await conn.CloseAsync(); - return saga; + return saga!; } public async Task LoadState(int id) where T : Saga @@ -56,7 +56,7 @@ public async Task LoadState(int id) where T : Saga var saga = await sagaStorage.LoadAsync(id, tx, CancellationToken.None); await conn.CloseAsync(); - return saga; + return saga!; } public async Task LoadState(long id) where T : Saga @@ -72,7 +72,7 @@ public async Task LoadState(long id) where T : Saga var saga = await sagaStorage.LoadAsync(id, tx, CancellationToken.None); await conn.CloseAsync(); - return saga; + return saga!; } public async Task LoadState(string id) where T : Saga @@ -88,7 +88,7 @@ public async Task LoadState(string id) where T : Saga var saga = await sagaStorage.LoadAsync(id, tx, CancellationToken.None); await conn.CloseAsync(); - return saga; + return saga!; } } diff --git a/src/Persistence/PostgresqlTests/Sagas/order_saga_example.cs b/src/Persistence/PostgresqlTests/Sagas/order_saga_example.cs index 2893e5234..cde403c9b 100644 --- a/src/Persistence/PostgresqlTests/Sagas/order_saga_example.cs +++ b/src/Persistence/PostgresqlTests/Sagas/order_saga_example.cs @@ -60,7 +60,7 @@ public CompleteOrder Handle(OrderStep2 step2, ILogger logger) IsStep2Completed = true; - return new CompleteOrder(Id); + return new CompleteOrder(Id!); } /// diff --git a/src/Persistence/PostgresqlTests/Sagas/saga_storage_operations.cs b/src/Persistence/PostgresqlTests/Sagas/saga_storage_operations.cs index 04ae32e24..20ff281c6 100644 --- a/src/Persistence/PostgresqlTests/Sagas/saga_storage_operations.cs +++ b/src/Persistence/PostgresqlTests/Sagas/saga_storage_operations.cs @@ -74,7 +74,7 @@ public async Task insert_then_load() using var db2 = await conn.BeginTransactionAsync(); var saga2 = await theSchema.LoadAsync(saga.Id, db2, CancellationToken.None); - saga2.Name.ShouldBe("Xavier Worthy"); + saga2!.Name.ShouldBe("Xavier Worthy"); } [Fact] @@ -99,7 +99,7 @@ public async Task insert_update_then_load() using var db2 = await conn.BeginTransactionAsync(); var saga2 = await theSchema.LoadAsync(saga.Id, db2, CancellationToken.None); - saga2.Name.ShouldBe("Hollywood Brown"); + saga2!.Name.ShouldBe("Hollywood Brown"); } [Fact] @@ -172,5 +172,5 @@ await Should.ThrowAsync(async () => public class LightweightSaga : Saga { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/PostgresqlTests/Transport/basic_functionality.cs b/src/Persistence/PostgresqlTests/Transport/basic_functionality.cs index cba93f0ea..f624e307c 100644 --- a/src/Persistence/PostgresqlTests/Transport/basic_functionality.cs +++ b/src/Persistence/PostgresqlTests/Transport/basic_functionality.cs @@ -27,11 +27,11 @@ public basic_functionality(ITestOutputHelper output) _output = output; } - private IHost theHost; - private PostgresqlTransport theTransport; - private PostgresqlQueue theQueue; - private IMessageStore theMessageStore; - private WolverineRuntime theRuntime; + private IHost theHost = null!; + private PostgresqlTransport theTransport = null!; + private PostgresqlQueue theQueue = null!; + private IMessageStore theMessageStore = null!; + private WolverineRuntime theRuntime = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/PostgresqlTests/Transport/compliance_tests.cs b/src/Persistence/PostgresqlTests/Transport/compliance_tests.cs index 9a479185d..da2a500bc 100644 --- a/src/Persistence/PostgresqlTests/Transport/compliance_tests.cs +++ b/src/Persistence/PostgresqlTests/Transport/compliance_tests.cs @@ -40,9 +40,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } @@ -89,9 +89,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Persistence/PostgresqlTests/Transport/end_to_end_from_scratch.cs b/src/Persistence/PostgresqlTests/Transport/end_to_end_from_scratch.cs index 9b01f9578..7dae7a9d0 100644 --- a/src/Persistence/PostgresqlTests/Transport/end_to_end_from_scratch.cs +++ b/src/Persistence/PostgresqlTests/Transport/end_to_end_from_scratch.cs @@ -44,8 +44,8 @@ public async Task InitializeAsync() }).StartAsync(); } - public IHost Api { get; private set;} - public IHost UI { get; private set;} + public IHost Api { get; private set;} = null!; + public IHost UI { get; private set;} = null!; public async Task DisposeAsync() { diff --git a/src/Persistence/PostgresqlTests/Transport/external_message_tables.cs b/src/Persistence/PostgresqlTests/Transport/external_message_tables.cs index 4aaeff253..a37417c05 100644 --- a/src/Persistence/PostgresqlTests/Transport/external_message_tables.cs +++ b/src/Persistence/PostgresqlTests/Transport/external_message_tables.cs @@ -235,7 +235,7 @@ public static void Configure() var builder = Host.CreateApplicationBuilder(); builder.UseWolverine(opts => { - opts.UsePostgresqlPersistenceAndTransport(builder.Configuration.GetConnectionString("postgres")); + opts.UsePostgresqlPersistenceAndTransport(builder.Configuration.GetConnectionString("postgres")!); // Or // opts.UseSqlServerPersistenceAndTransport(builder.Configuration.GetConnectionString("sqlserver")); @@ -333,7 +333,7 @@ public static void Configure(HandlerChain chain) public static Task WaiterForCall(bool shouldThrow) { - LastReceived = null; + LastReceived = null!; WillBlowUp = shouldThrow; Waiter = new TaskCompletionSource(); return Waiter.Task; @@ -350,5 +350,5 @@ public static void Handle(BlowsUpMessage message) Waiter.SetResult(); } - public static BlowsUpMessage LastReceived { get; set; } + public static BlowsUpMessage LastReceived { get; set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/PostgresqlTests/Transport/inbox_outbox_usage.cs b/src/Persistence/PostgresqlTests/Transport/inbox_outbox_usage.cs index 1c15531a2..ec28531a1 100644 --- a/src/Persistence/PostgresqlTests/Transport/inbox_outbox_usage.cs +++ b/src/Persistence/PostgresqlTests/Transport/inbox_outbox_usage.cs @@ -15,7 +15,7 @@ namespace PostgresqlTests.Transport; [Collection("Postgresql")] public class inbox_outbox_usage : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/PostgresqlTests/Transport/stateful_resource_smoke_tests.cs b/src/Persistence/PostgresqlTests/Transport/stateful_resource_smoke_tests.cs index 69bd6057e..980d8d1ed 100644 --- a/src/Persistence/PostgresqlTests/Transport/stateful_resource_smoke_tests.cs +++ b/src/Persistence/PostgresqlTests/Transport/stateful_resource_smoke_tests.cs @@ -15,10 +15,6 @@ namespace PostgresqlTests.Transport; [Collection("sqlserver")] public class stateful_resource_smoke_tests : IAsyncLifetime { - private IHost _host; - private IStatefulResource? theResource; - private PostgresqlTransport theTransport; - public async Task InitializeAsync() { await using var conn = new NpgsqlConnection(Servers.PostgresConnectionString); diff --git a/src/Persistence/PostgresqlTests/bumping_stale_inbox_messages.cs b/src/Persistence/PostgresqlTests/bumping_stale_inbox_messages.cs index c6c98d84f..01e44b508 100644 --- a/src/Persistence/PostgresqlTests/bumping_stale_inbox_messages.cs +++ b/src/Persistence/PostgresqlTests/bumping_stale_inbox_messages.cs @@ -18,7 +18,7 @@ namespace PostgresqlTests; public class bumping_stale_inbox_messages : IAsyncLifetime { - private IHost theHost; + private IHost theHost = null!; public async Task InitializeAsync() { @@ -44,8 +44,8 @@ public async Task got_the_right_column() await conn.OpenAsync(); var table = await new Table(new DbObjectName("stale_outbox", DatabaseConstants.IncomingTable)).FetchExistingAsync(conn); - - table.HasColumn(DatabaseConstants.Timestamp).ShouldBeTrue(); + + table!.HasColumn(DatabaseConstants.Timestamp).ShouldBeTrue(); } diff --git a/src/Persistence/PostgresqlTests/bumping_stale_outbox_messages.cs b/src/Persistence/PostgresqlTests/bumping_stale_outbox_messages.cs index 21f58dd75..212b0835c 100644 --- a/src/Persistence/PostgresqlTests/bumping_stale_outbox_messages.cs +++ b/src/Persistence/PostgresqlTests/bumping_stale_outbox_messages.cs @@ -18,7 +18,7 @@ namespace PostgresqlTests; public class bumping_stale_outbox_messages : IAsyncLifetime { - private IHost theHost; + private IHost theHost = null!; public async Task InitializeAsync() { @@ -44,8 +44,8 @@ public async Task got_the_right_column() await conn.OpenAsync(); var table = await new Table(new DbObjectName("stale_outbox", DatabaseConstants.OutgoingTable)).FetchExistingAsync(conn); - - table.HasColumn(DatabaseConstants.Timestamp).ShouldBeTrue(); + + table!.HasColumn(DatabaseConstants.Timestamp).ShouldBeTrue(); } diff --git a/src/Persistence/PostgresqlTests/compliance_using_table_partitioning.cs b/src/Persistence/PostgresqlTests/compliance_using_table_partitioning.cs index ff596d15f..cc4e831c5 100644 --- a/src/Persistence/PostgresqlTests/compliance_using_table_partitioning.cs +++ b/src/Persistence/PostgresqlTests/compliance_using_table_partitioning.cs @@ -105,7 +105,7 @@ public async Task delete_old_log_node_records() using var conn = new NpgsqlConnection(Servers.PostgresConnectionString); await conn.OpenAsync(); await conn.CreateCommand( - $"update receiver.{DatabaseConstants.NodeRecordTableName} set timestamp = :time where node_number = 2") + $"update receiver_partitioned.{DatabaseConstants.NodeRecordTableName} set timestamp = :time where node_number = 2") .With("time", DateTimeOffset.UtcNow.Subtract(10.Days())) .ExecuteNonQueryAsync(); await conn.CloseAsync(); diff --git a/src/Persistence/PostgresqlTests/message_store_initialization_and_configuration.cs b/src/Persistence/PostgresqlTests/message_store_initialization_and_configuration.cs index 2d2aa79cb..2c4f80f60 100644 --- a/src/Persistence/PostgresqlTests/message_store_initialization_and_configuration.cs +++ b/src/Persistence/PostgresqlTests/message_store_initialization_and_configuration.cs @@ -19,7 +19,7 @@ namespace PostgresqlTests; public class message_store_initialization_and_configuration : PostgresqlContext, IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -93,7 +93,7 @@ public async Task stores_the_current_node_on_startup() var current = nodes.Single(); current.NodeId.ShouldBe(runtime.Options.UniqueNodeId); - current.ControlUri.ShouldBe(runtime.Options.Transports.NodeControlEndpoint.Uri); + current.ControlUri.ShouldBe(runtime.Options.Transports.NodeControlEndpoint!.Uri); } @@ -102,7 +102,7 @@ public async Task deletes_the_node_on_shutdown() { await _host.StopAsync(); _host.Dispose(); - _host = null; + _host = null!; var settings = new DatabaseSettings { diff --git a/src/Persistence/RavenDbTests/DocumentationSamples.cs b/src/Persistence/RavenDbTests/DocumentationSamples.cs index 5a91ed58e..70646edab 100644 --- a/src/Persistence/RavenDbTests/DocumentationSamples.cs +++ b/src/Persistence/RavenDbTests/DocumentationSamples.cs @@ -44,8 +44,8 @@ public class Order : Saga { // Just use this for the identity // of RavenDb backed sagas - public string Id { get; set; } - + public string Id { get; set; } = null!; + // Handle and Start methods... } diff --git a/src/Persistence/RavenDbTests/leadership_locking.cs b/src/Persistence/RavenDbTests/leadership_locking.cs index e9010d282..1b40bc3e7 100644 --- a/src/Persistence/RavenDbTests/leadership_locking.cs +++ b/src/Persistence/RavenDbTests/leadership_locking.cs @@ -13,8 +13,8 @@ namespace RavenDbTests; public class leadership_locking : IAsyncLifetime { private readonly DatabaseFixture _fixture; - private IDocumentStore _store; - private IHost _host; + private IDocumentStore _store = null!; + private IHost _host = null!; public leadership_locking(DatabaseFixture fixture) { @@ -49,16 +49,16 @@ public async Task DisposeAsync() [Fact] public async Task try_to_lock_happy_path() { - var store = _host.Services.GetService(); + var store = _host.Services.GetService()!; store.Nodes.HasLeadershipLock().ShouldBeFalse(); - + var gotLock = await store.Nodes.TryAttainLeadershipLockAsync(CancellationToken.None); gotLock.ShouldBeTrue(); - + store.Nodes.HasLeadershipLock().ShouldBeTrue(); await store.Nodes.ReleaseLeadershipLockAsync(); - + store.Nodes.HasLeadershipLock().ShouldBeFalse(); } @@ -66,16 +66,16 @@ public async Task try_to_lock_happy_path() public async Task lock_is_exclusive() { using var host2 = await buildHost(); - var store2 = host2.Services.GetService(); - - var store = _host.Services.GetService(); + var store2 = host2.Services.GetService()!; + + var store = _host.Services.GetService()!; store.Nodes.HasLeadershipLock().ShouldBeFalse(); - + var gotLock = await store.Nodes.TryAttainLeadershipLockAsync(CancellationToken.None); gotLock.ShouldBeTrue(); - + store.Nodes.HasLeadershipLock().ShouldBeTrue(); - + (await store2.Nodes.TryAttainLeadershipLockAsync(CancellationToken.None)) .ShouldBeFalse(); store2.Nodes.HasLeadershipLock().ShouldBeFalse(); diff --git a/src/Persistence/RavenDbTests/message_store_compliance.cs b/src/Persistence/RavenDbTests/message_store_compliance.cs index 49b9908d7..e86fbc03d 100644 --- a/src/Persistence/RavenDbTests/message_store_compliance.cs +++ b/src/Persistence/RavenDbTests/message_store_compliance.cs @@ -65,7 +65,7 @@ public class DatabaseCollection : ICollectionFixture public class message_store_compliance : MessageStoreCompliance { private readonly DatabaseFixture _fixture; - private IDocumentStore _store; + private IDocumentStore _store = null!; public message_store_compliance(DatabaseFixture fixture) { diff --git a/src/Persistence/RavenDbTests/message_store_compliance_with_message_identity_using_id_and_destination.cs b/src/Persistence/RavenDbTests/message_store_compliance_with_message_identity_using_id_and_destination.cs index ac2d6bb97..51955199d 100644 --- a/src/Persistence/RavenDbTests/message_store_compliance_with_message_identity_using_id_and_destination.cs +++ b/src/Persistence/RavenDbTests/message_store_compliance_with_message_identity_using_id_and_destination.cs @@ -17,7 +17,7 @@ namespace RavenDbTests; public class message_store_compliance_with_message_identity_using_id_and_destination : MessageStoreCompliance { private readonly DatabaseFixture _fixture; - private IDocumentStore _store; + private IDocumentStore _store = null!; public message_store_compliance_with_message_identity_using_id_and_destination(DatabaseFixture fixture) { diff --git a/src/Persistence/RavenDbTests/playing.cs b/src/Persistence/RavenDbTests/playing.cs index d36e2987d..fdec7333f 100644 --- a/src/Persistence/RavenDbTests/playing.cs +++ b/src/Persistence/RavenDbTests/playing.cs @@ -10,11 +10,11 @@ namespace RavenDbTests; -public class playing +public class Playing { private readonly ITestOutputHelper _output; - public playing(ITestOutputHelper output) + public Playing(ITestOutputHelper output) { _output = output; } @@ -30,8 +30,6 @@ public async Task try_to_persist_envelope() ExpiresAt = DateTimeOffset.UtcNow + 5.Minutes() }; - string lockId = "lock1"; - PrintWork(store); // var envelope = ObjectMother.Envelope(); diff --git a/src/Persistence/RavenDbTests/ravendb_durability_end_to_end.cs b/src/Persistence/RavenDbTests/ravendb_durability_end_to_end.cs index 599dc16c7..984af6e5d 100644 --- a/src/Persistence/RavenDbTests/ravendb_durability_end_to_end.cs +++ b/src/Persistence/RavenDbTests/ravendb_durability_end_to_end.cs @@ -24,12 +24,12 @@ public class ravendb_durability_end_to_end : RavenTestDriver, IAsyncLifetime { private const string SenderSchemaName = "sender"; private const string ReceiverSchemaName = "receiver"; - private Uri _listener; - private LightweightCache _receivers; + private Uri _listener = null!; + private LightweightCache _receivers = null!; - private LightweightCache _senders; - private IDocumentStore _receiverStore; - private IDocumentStore _senderStore; + private LightweightCache _senders = null!; + private IDocumentStore _receiverStore = null!; + private IDocumentStore _senderStore = null!; public async Task InitializeAsync() { @@ -230,13 +230,13 @@ public async Task sending_resumes_when_the_receiver_is_detected() public class TraceDoc { - public string Id { get; set; } - public string Name { get; set; } + public string Id { get; set; } = null!; + public string Name { get; set; } = null!; } public class TraceMessage { - public string Name { get; set; } + public string Name { get; set; } = null!; } [WolverineIgnore] diff --git a/src/Persistence/RavenDbTests/saga_storage_compliance.cs b/src/Persistence/RavenDbTests/saga_storage_compliance.cs index 8b699eb1a..7b806704d 100644 --- a/src/Persistence/RavenDbTests/saga_storage_compliance.cs +++ b/src/Persistence/RavenDbTests/saga_storage_compliance.cs @@ -13,7 +13,7 @@ namespace RavenDbTests; public class RavenDbSagaHost : RavenTestDriver, ISagaHost { - private IDocumentStore _store; + private IDocumentStore _store = null!; public IHost BuildHost() { @@ -25,7 +25,7 @@ public IHost BuildHost() { opts.Durability.Mode = DurabilityMode.Solo; - opts.CodeGeneration.GeneratedCodeOutputPath = AppContext.BaseDirectory.ParentDirectory().ParentDirectory().ParentDirectory().AppendPath("Internal", "Generated"); + opts.CodeGeneration.GeneratedCodeOutputPath = AppContext.BaseDirectory.ParentDirectory()!.ParentDirectory()!.ParentDirectory()!.AppendPath("Internal", "Generated"); opts.CodeGeneration.TypeLoadMode = TypeLoadMode.Auto; // Shouldn't be necessary, but apparently is. Type scanning is not working diff --git a/src/Persistence/RavenDbTests/transactional_middleware.cs b/src/Persistence/RavenDbTests/transactional_middleware.cs index 92840c052..9326bb7a8 100644 --- a/src/Persistence/RavenDbTests/transactional_middleware.cs +++ b/src/Persistence/RavenDbTests/transactional_middleware.cs @@ -63,6 +63,6 @@ public static IRavenDbOp Handle(RecordTeam command) public class Team { - public string Id { get; set; } + public string Id { get; set; } = null!; public int YearFounded { get; set; } } \ No newline at end of file diff --git a/src/Persistence/SharedPersistenceModels/Items/Item.cs b/src/Persistence/SharedPersistenceModels/Items/Item.cs index 35c2846b1..b676dc163 100644 --- a/src/Persistence/SharedPersistenceModels/Items/Item.cs +++ b/src/Persistence/SharedPersistenceModels/Items/Item.cs @@ -3,8 +3,8 @@ namespace SharedPersistenceModels.Items; public class Item : Entity { public Guid Id { get; set; } - public string Name { get; set; } - + public string Name { get; set; } = null!; + public bool Approved { get; set; } public void Approve() @@ -25,7 +25,6 @@ public interface IEntity public abstract class Entity : IEntity { - private IReadOnlyList _events; public List Events { get; } = new(); IReadOnlyList IEntity.Events => Events.OfType().ToList(); diff --git a/src/Persistence/SharedPersistenceModels/Items/ItemEndpoints.cs b/src/Persistence/SharedPersistenceModels/Items/ItemEndpoints.cs index cc1ab32c5..2cf60199b 100644 --- a/src/Persistence/SharedPersistenceModels/Items/ItemEndpoints.cs +++ b/src/Persistence/SharedPersistenceModels/Items/ItemEndpoints.cs @@ -7,7 +7,7 @@ namespace SharedPersistenceModels.Items; public static class ItemEndpoints { [WolverineGet("/item1/{id}")] - public static ValueTask GetItem(Guid id, ItemsDbContext dbContext) => dbContext.Items.FindAsync(id); + public static async ValueTask GetItem(Guid id, ItemsDbContext dbContext) => (await dbContext.Items.FindAsync(id))!; [WolverineGet("/item2/{id}")] public static Item GetItem2(Guid id, [Entity] Item item) => item; diff --git a/src/Persistence/SqlServerTests/Agents/control_queue_tests.cs b/src/Persistence/SqlServerTests/Agents/control_queue_tests.cs index 1bd7de6e4..d66c303f0 100644 --- a/src/Persistence/SqlServerTests/Agents/control_queue_tests.cs +++ b/src/Persistence/SqlServerTests/Agents/control_queue_tests.cs @@ -15,16 +15,16 @@ namespace SqlServerTests.Agents; public class control_queue_tests : SqlServerContext, IAsyncLifetime { - private static IHost _sender; - private static IHost _receiver; - private static Uri _receiverUri; + private static IHost _sender = null!; + private static IHost _receiver = null!; + private static Uri _receiverUri = null!; - public async Task InitializeAsync() + public new async Task InitializeAsync() { await dropControlSchema(); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { await _sender.StopAsync(); _sender.Dispose(); @@ -80,10 +80,10 @@ public async Task send_message_from_one_to_another() .Timeout(10.Seconds()) .ExecuteAndWaitAsync(m => m.EndpointFor(_receiverUri).SendAsync(new Command(10))); - tracked.Sent.RecordsInOrder().Single(x => x.Envelope.Message?.GetType() == typeof(Command)).ServiceName + tracked.Sent.RecordsInOrder().Single(x => x.Envelope!.Message?.GetType() == typeof(Command)).ServiceName! .ShouldBe("Sender"); - tracked.Received.RecordsInOrder().Single(x => x.Envelope.Message?.GetType() == typeof(Command)) - .ServiceName + tracked.Received.RecordsInOrder().Single(x => x.Envelope!.Message?.GetType() == typeof(Command)) + .ServiceName! .ShouldBe("Receiver"); } @@ -95,18 +95,18 @@ public async Task request_reply_message_from_one_to_another() .Timeout(120.Seconds()) .InvokeAndWaitAsync(new Query(13), _receiverUri); - result.Number.ShouldBe(13); + result!.Number.ShouldBe(13); - tracked.Sent.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(Query)).ServiceName + tracked.Sent.RecordsInOrder().Single(x => x.Envelope!.Message!.GetType() == typeof(Query)).ServiceName! .ShouldBe("Sender"); - tracked.Received.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(Query)).ServiceName + tracked.Received.RecordsInOrder().Single(x => x.Envelope!.Message!.GetType() == typeof(Query)).ServiceName! .ShouldBe("Receiver"); - tracked.Sent.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(Result)).ServiceName + tracked.Sent.RecordsInOrder().Single(x => x.Envelope!.Message!.GetType() == typeof(Result)).ServiceName! .ShouldBe("Receiver"); - tracked.Received.RecordsInOrder().Single(x => x.Envelope.Message.GetType() == typeof(Result)) - .ServiceName + tracked.Received.RecordsInOrder().Single(x => x.Envelope!.Message!.GetType() == typeof(Result)) + .ServiceName! .ShouldBe("Sender"); } } diff --git a/src/Persistence/SqlServerTests/MultiTenancy/MultiTenancyContext.cs b/src/Persistence/SqlServerTests/MultiTenancy/MultiTenancyContext.cs index 84dcb3326..0e4fe5342 100644 --- a/src/Persistence/SqlServerTests/MultiTenancy/MultiTenancyContext.cs +++ b/src/Persistence/SqlServerTests/MultiTenancy/MultiTenancyContext.cs @@ -10,10 +10,10 @@ namespace SqlServerTests.MultiTenancy; public abstract class MultiTenancyContext : SqlServerContext, IAsyncLifetime { - protected IHost theHost; - protected string tenant1ConnectionString; - protected string tenant2ConnectionString; - protected string tenant3ConnectionString; + protected IHost theHost = null!; + protected string tenant1ConnectionString = null!; + protected string tenant2ConnectionString = null!; + protected string tenant3ConnectionString = null!; public new async Task InitializeAsync() { diff --git a/src/Persistence/SqlServerTests/MultiTenancy/static_multi_tenancy.cs b/src/Persistence/SqlServerTests/MultiTenancy/static_multi_tenancy.cs index d1a0f10a1..7f6306ce1 100644 --- a/src/Persistence/SqlServerTests/MultiTenancy/static_multi_tenancy.cs +++ b/src/Persistence/SqlServerTests/MultiTenancy/static_multi_tenancy.cs @@ -149,11 +149,11 @@ public async Task have_all_the_correct_durability_agents() public class RedSaga : Saga { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public class BlueSaga : Saga { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } diff --git a/src/Persistence/SqlServerTests/Persistence/ItemCreated.cs b/src/Persistence/SqlServerTests/Persistence/ItemCreated.cs index 804223d0c..b784f3e71 100644 --- a/src/Persistence/SqlServerTests/Persistence/ItemCreated.cs +++ b/src/Persistence/SqlServerTests/Persistence/ItemCreated.cs @@ -3,5 +3,5 @@ public class ItemCreated { public Guid Id; - public string Name; + public string Name = null!; } \ No newline at end of file diff --git a/src/Persistence/SqlServerTests/Persistence/SqlServerBackedListenerContext.cs b/src/Persistence/SqlServerTests/Persistence/SqlServerBackedListenerContext.cs index 3bec2aca8..8798767ec 100644 --- a/src/Persistence/SqlServerTests/Persistence/SqlServerBackedListenerContext.cs +++ b/src/Persistence/SqlServerTests/Persistence/SqlServerBackedListenerContext.cs @@ -19,7 +19,7 @@ public class SqlServerBackedListenerContext : SqlServerContext protected readonly IList theEnvelopes = new List(); private readonly IHandlerPipeline thePipeline = Substitute.For(); protected readonly Uri theUri = "tcp://localhost:1111".ToUri(); - protected IMessageDatabase thePersistence; + protected new IMessageDatabase thePersistence; internal DurableReceiver theReceiver; protected DurabilitySettings theSettings; diff --git a/src/Persistence/SqlServerTests/Persistence/SqlServerBackedMessageStoreTests.cs b/src/Persistence/SqlServerTests/Persistence/SqlServerBackedMessageStoreTests.cs index f75b032cc..6ffed890f 100644 --- a/src/Persistence/SqlServerTests/Persistence/SqlServerBackedMessageStoreTests.cs +++ b/src/Persistence/SqlServerTests/Persistence/SqlServerBackedMessageStoreTests.cs @@ -17,10 +17,10 @@ namespace SqlServerTests.Persistence; public class SqlServerBackedMessageStoreTests : SqlServerContext, IAsyncLifetime { - private Envelope persisted; - private Envelope theEnvelope; + private Envelope persisted = null!; + private Envelope theEnvelope = null!; - private IHost theHost; + private IHost theHost = null!; public override async Task DisposeAsync() { @@ -46,7 +46,7 @@ protected override async Task initialize() var persistor = theHost.GetRuntime().Storage.As(); persisted = (await persistor.Admin.AllIncomingAsync()) - .FirstOrDefault(x => x.Id == theEnvelope.Id); + .FirstOrDefault(x => x.Id == theEnvelope.Id)!; } [Fact] diff --git a/src/Persistence/SqlServerTests/Persistence/SqlServerMessageStore_DQL_expiration.cs b/src/Persistence/SqlServerTests/Persistence/SqlServerMessageStore_DQL_expiration.cs index 841deb354..cab71c694 100644 --- a/src/Persistence/SqlServerTests/Persistence/SqlServerMessageStore_DQL_expiration.cs +++ b/src/Persistence/SqlServerTests/Persistence/SqlServerMessageStore_DQL_expiration.cs @@ -33,7 +33,7 @@ public async Task no_expiration_column_normally() var runtime = host.GetRuntime(); var dlq = await new DeadLettersTable(runtime.Options.Durability, "target").FetchExistingAsync(conn); - dlq.ColumnFor(DatabaseConstants.Expires).ShouldBeNull(); + dlq!.ColumnFor(DatabaseConstants.Expires).ShouldBeNull(); } [Fact] @@ -54,7 +54,7 @@ public async Task add_expiration_time_column_if_DLQ_expiration_is_enabled() var runtime = host.GetRuntime(); var dlq = await new DeadLettersTable(runtime.Options.Durability, "dlq_expiration").FetchExistingAsync(conn); - var column = dlq.ColumnFor(DatabaseConstants.Expires); + var column = dlq!.ColumnFor(DatabaseConstants.Expires); column.ShouldNotBeNull(); column.AllowNulls.ShouldBeTrue(); } diff --git a/src/Persistence/SqlServerTests/Persistence/SqlServerMessageStore_with_IdAndDestination_Identity.cs b/src/Persistence/SqlServerTests/Persistence/SqlServerMessageStore_with_IdAndDestination_Identity.cs index 76b29970d..500a9473b 100644 --- a/src/Persistence/SqlServerTests/Persistence/SqlServerMessageStore_with_IdAndDestination_Identity.cs +++ b/src/Persistence/SqlServerTests/Persistence/SqlServerMessageStore_with_IdAndDestination_Identity.cs @@ -60,11 +60,11 @@ public async Task should_have_receive_at_in_primary_keys() var runtime = theHost.GetRuntime(); var incoming = await new IncomingEnvelopeTable(runtime.Options.Durability, "receiver2").FetchExistingAsync(conn); - incoming.PrimaryKeyColumns.ShouldContain(DatabaseConstants.Id); + incoming!.PrimaryKeyColumns.ShouldContain(DatabaseConstants.Id); incoming.PrimaryKeyColumns.ShouldContain(DatabaseConstants.ReceivedAt); - + var dlq = await new DeadLettersTable(runtime.Options.Durability, "receiver2").FetchExistingAsync(conn); - dlq.PrimaryKeyColumns.ShouldContain(DatabaseConstants.Id); + dlq!.PrimaryKeyColumns.ShouldContain(DatabaseConstants.Id); dlq.PrimaryKeyColumns.ShouldContain(DatabaseConstants.ReceivedAt); } diff --git a/src/Persistence/SqlServerTests/Sagas/configuring_saga_table_storage.cs b/src/Persistence/SqlServerTests/Sagas/configuring_saga_table_storage.cs index 038a0857f..cf9c7b9d5 100644 --- a/src/Persistence/SqlServerTests/Sagas/configuring_saga_table_storage.cs +++ b/src/Persistence/SqlServerTests/Sagas/configuring_saga_table_storage.cs @@ -52,11 +52,11 @@ private static async Task dropSchemaAsync() public class RedSaga : Saga { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public class BlueSaga : Saga { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/SqlServerTests/Sagas/lightweight_saga_persistence.cs b/src/Persistence/SqlServerTests/Sagas/lightweight_saga_persistence.cs index ecf9a7141..712c6c66a 100644 --- a/src/Persistence/SqlServerTests/Sagas/lightweight_saga_persistence.cs +++ b/src/Persistence/SqlServerTests/Sagas/lightweight_saga_persistence.cs @@ -14,7 +14,7 @@ namespace SqlServerTests.Sagas; public class SqlServerSagaHost : ISagaHost { - private IHost _host; + private IHost _host = null!; public IHost BuildHost() { @@ -41,7 +41,7 @@ public async Task LoadState(Guid id) where T : Saga var saga = await sagaStorage.LoadAsync(id, tx, CancellationToken.None); await conn.CloseAsync(); - return saga; + return saga!; } public async Task LoadState(int id) where T : Saga @@ -57,7 +57,7 @@ public async Task LoadState(int id) where T : Saga var saga = await sagaStorage.LoadAsync(id, tx, CancellationToken.None); await conn.CloseAsync(); - return saga; + return saga!; } public async Task LoadState(long id) where T : Saga @@ -73,7 +73,7 @@ public async Task LoadState(long id) where T : Saga var saga = await sagaStorage.LoadAsync(id, tx, CancellationToken.None); await conn.CloseAsync(); - return saga; + return saga!; } public async Task LoadState(string id) where T : Saga @@ -89,7 +89,7 @@ public async Task LoadState(string id) where T : Saga var saga = await sagaStorage.LoadAsync(id, tx, CancellationToken.None); await conn.CloseAsync(); - return saga; + return saga!; } } diff --git a/src/Persistence/SqlServerTests/Sagas/order_saga_example.cs b/src/Persistence/SqlServerTests/Sagas/order_saga_example.cs index 7e3f4ecec..3b2a0e5ff 100644 --- a/src/Persistence/SqlServerTests/Sagas/order_saga_example.cs +++ b/src/Persistence/SqlServerTests/Sagas/order_saga_example.cs @@ -60,7 +60,7 @@ public CompleteOrder Handle(OrderStep2 step2, ILogger logger) IsStep2Completed = true; - return new CompleteOrder(Id); + return new CompleteOrder(Id!); } /// diff --git a/src/Persistence/SqlServerTests/Sagas/saga_storage_operations.cs b/src/Persistence/SqlServerTests/Sagas/saga_storage_operations.cs index c2ff6ea0d..f4d3b1098 100644 --- a/src/Persistence/SqlServerTests/Sagas/saga_storage_operations.cs +++ b/src/Persistence/SqlServerTests/Sagas/saga_storage_operations.cs @@ -75,7 +75,7 @@ public async Task insert_then_load() using var db2 = await conn.BeginTransactionAsync(); var saga2 = await _theSchema.LoadAsync(saga.Id, db2, CancellationToken.None); - saga2.Name.ShouldBe("Xavier Worthy"); + saga2!.Name.ShouldBe("Xavier Worthy"); } [Fact] @@ -100,7 +100,7 @@ public async Task insert_update_then_load() using var db2 = await conn.BeginTransactionAsync(); var saga2 = await _theSchema.LoadAsync(saga.Id, db2, CancellationToken.None); - saga2.Name.ShouldBe("Hollywood Brown"); + saga2!.Name.ShouldBe("Hollywood Brown"); } [Fact] @@ -161,5 +161,5 @@ await Should.ThrowAsync(async () => public class LightweightSaga : Saga { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/SqlServerTests/ScheduledJobs/SqlServerDurabilityCompliance.cs b/src/Persistence/SqlServerTests/ScheduledJobs/SqlServerDurabilityCompliance.cs index 69ce19667..644d9f81b 100644 --- a/src/Persistence/SqlServerTests/ScheduledJobs/SqlServerDurabilityCompliance.cs +++ b/src/Persistence/SqlServerTests/ScheduledJobs/SqlServerDurabilityCompliance.cs @@ -52,14 +52,14 @@ protected override async Task loadItemAsync(IHost receiver, Guid id await using var conn = new SqlConnection(Servers.SqlServerConnectionString); conn.Open(); - var name = (string)(await conn + var name = (string?)(await conn .CreateCommand("select name from receiver.item_created where id = @id") .With("id", id) .ExecuteScalarAsync()); if (name.IsEmpty()) { - return null; + return null!; } return new ItemCreated @@ -163,17 +163,17 @@ private Task persist(SqlTransaction tx, Item item) public class CreateItemCommand { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class ItemCreatedEvent { - public Item Item { get; set; } + public Item Item { get; set; } = null!; } public class Item { public Guid Id; - public string Name; + public string Name = null!; } } \ No newline at end of file diff --git a/src/Persistence/SqlServerTests/SqlServerContext.cs b/src/Persistence/SqlServerTests/SqlServerContext.cs index b7d23c439..3195f564a 100644 --- a/src/Persistence/SqlServerTests/SqlServerContext.cs +++ b/src/Persistence/SqlServerTests/SqlServerContext.cs @@ -9,7 +9,7 @@ namespace SqlServerTests; public abstract class SqlServerContext : IAsyncLifetime { - protected SqlServerMessageStore thePersistence; + protected SqlServerMessageStore thePersistence = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/SqlServerTests/Transport/DocumentationSamples.cs b/src/Persistence/SqlServerTests/Transport/DocumentationSamples.cs index df420f206..4b10e528f 100644 --- a/src/Persistence/SqlServerTests/Transport/DocumentationSamples.cs +++ b/src/Persistence/SqlServerTests/Transport/DocumentationSamples.cs @@ -15,7 +15,7 @@ public static async Task Bootstrapping() builder.UseWolverine(opts => { var connectionString = builder.Configuration.GetConnectionString("sqlserver"); - opts.UseSqlServerPersistenceAndTransport(connectionString, "myapp") + opts.UseSqlServerPersistenceAndTransport(connectionString!, "myapp") // Tell Wolverine to build out all necessary queue or scheduled message // tables on demand as needed diff --git a/src/Persistence/SqlServerTests/Transport/compliance_tests.cs b/src/Persistence/SqlServerTests/Transport/compliance_tests.cs index 615066102..a916668bd 100644 --- a/src/Persistence/SqlServerTests/Transport/compliance_tests.cs +++ b/src/Persistence/SqlServerTests/Transport/compliance_tests.cs @@ -43,9 +43,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } @@ -91,9 +91,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Persistence/SqlServerTests/Transport/data_operations.cs b/src/Persistence/SqlServerTests/Transport/data_operations.cs index fd127845a..3876ca0c1 100644 --- a/src/Persistence/SqlServerTests/Transport/data_operations.cs +++ b/src/Persistence/SqlServerTests/Transport/data_operations.cs @@ -20,11 +20,11 @@ public class data_operations : IAsyncLifetime { public static int count = 0; - private IHost _host; - private SqlServerTransport theTransport; + private IHost _host = null!; + private SqlServerTransport theTransport = null!; private IStatefulResource? theResource; - private SqlServerQueue theQueue; - private IMessageStore theMessageStore; + private SqlServerQueue theQueue = null!; + private IMessageStore theMessageStore = null!; public async Task InitializeAsync() { @@ -65,7 +65,7 @@ public async Task InitializeAsync() theTransport.TryBuildStatefulResource(runtime, out theResource).ShouldBeTrue(); - await theResource.Setup(CancellationToken.None); + await theResource!.Setup(CancellationToken.None); await theResource.ClearState(CancellationToken.None); theQueue = theTransport.Queues["one"]; diff --git a/src/Persistence/SqlServerTests/Transport/inbox_outbox_usage.cs b/src/Persistence/SqlServerTests/Transport/inbox_outbox_usage.cs index 4871cf7c6..50dc3a2b6 100644 --- a/src/Persistence/SqlServerTests/Transport/inbox_outbox_usage.cs +++ b/src/Persistence/SqlServerTests/Transport/inbox_outbox_usage.cs @@ -13,7 +13,7 @@ namespace SqlServerTests.Transport; public class inbox_outbox_usage : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/SqlServerTests/Transport/stateful_resource_smoke_tests.cs b/src/Persistence/SqlServerTests/Transport/stateful_resource_smoke_tests.cs index ab6b7c5f4..a69b72984 100644 --- a/src/Persistence/SqlServerTests/Transport/stateful_resource_smoke_tests.cs +++ b/src/Persistence/SqlServerTests/Transport/stateful_resource_smoke_tests.cs @@ -14,10 +14,6 @@ namespace SqlServerTests.Transport; public class stateful_resource_smoke_tests : IAsyncLifetime { - private IHost _host; - private SqlServerTransport theTransport; - private IStatefulResource? theResource; - public async Task InitializeAsync() { await using var conn = new SqlConnection(Servers.SqlServerConnectionString); diff --git a/src/Persistence/SqlServerTests/Transport/with_multiple_hosts.cs b/src/Persistence/SqlServerTests/Transport/with_multiple_hosts.cs index ff9f44510..0177fea34 100644 --- a/src/Persistence/SqlServerTests/Transport/with_multiple_hosts.cs +++ b/src/Persistence/SqlServerTests/Transport/with_multiple_hosts.cs @@ -13,8 +13,8 @@ namespace SqlServerTests.Transport; public class with_multiple_hosts : IAsyncLifetime { - private IHost _sender; - private IHost _listener; + private IHost _sender = null!; + private IHost _listener = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/SqlServerTests/bumping_stale_inbox_messages.cs b/src/Persistence/SqlServerTests/bumping_stale_inbox_messages.cs index 67e339dc4..789cdfa7e 100644 --- a/src/Persistence/SqlServerTests/bumping_stale_inbox_messages.cs +++ b/src/Persistence/SqlServerTests/bumping_stale_inbox_messages.cs @@ -18,7 +18,7 @@ namespace SqlServerTests; public class bumping_stale_inbox_messages : IAsyncLifetime { - private IHost theHost; + private IHost theHost = null!; public async Task InitializeAsync() { @@ -45,7 +45,7 @@ public async Task got_the_right_column() var table = await new Table(new DbObjectName("stale_outbox", DatabaseConstants.IncomingTable)).FetchExistingAsync(conn); - table.HasColumn(DatabaseConstants.Timestamp).ShouldBeTrue(); + table!.HasColumn(DatabaseConstants.Timestamp).ShouldBeTrue(); } diff --git a/src/Persistence/SqlServerTests/bumping_stale_outbox_messages.cs b/src/Persistence/SqlServerTests/bumping_stale_outbox_messages.cs index a9ea8123a..9477315fe 100644 --- a/src/Persistence/SqlServerTests/bumping_stale_outbox_messages.cs +++ b/src/Persistence/SqlServerTests/bumping_stale_outbox_messages.cs @@ -18,7 +18,7 @@ namespace SqlServerTests; public class bumping_stale_outbox_messages : IAsyncLifetime { - private IHost theHost; + private IHost theHost = null!; public async Task InitializeAsync() { @@ -45,7 +45,7 @@ public async Task got_the_right_column() var table = await new Table(new DbObjectName("stale_outbox", DatabaseConstants.OutgoingTable)).FetchExistingAsync(conn); - table.HasColumn(DatabaseConstants.Timestamp).ShouldBeTrue(); + table!.HasColumn(DatabaseConstants.Timestamp).ShouldBeTrue(); } diff --git a/src/Persistence/SqlServerTests/message_store_initialization_and_configuration.cs b/src/Persistence/SqlServerTests/message_store_initialization_and_configuration.cs index 9423dd93b..fc48aaa62 100644 --- a/src/Persistence/SqlServerTests/message_store_initialization_and_configuration.cs +++ b/src/Persistence/SqlServerTests/message_store_initialization_and_configuration.cs @@ -21,9 +21,9 @@ namespace SqlServerTests; public class message_store_initialization_and_configuration : SqlServerContext, IAsyncLifetime { - private IHost _host; + private IHost _host = null!; - public async Task InitializeAsync() + public new async Task InitializeAsync() { await dropSchema(); @@ -44,7 +44,7 @@ private static async Task dropSchema() await conn.CloseAsync(); } - public async Task DisposeAsync() + public override async Task DisposeAsync() { if (_host != null) { @@ -95,7 +95,7 @@ public async Task stores_the_current_node_on_startup() var current = nodes.Single(); current.NodeId.ShouldBe(runtime.Options.UniqueNodeId); - current.ControlUri.ShouldBe(runtime.Options.Transports.NodeControlEndpoint.Uri); + current.ControlUri.ShouldBe(runtime.Options.Transports.NodeControlEndpoint!.Uri); } @@ -104,7 +104,7 @@ public async Task deletes_the_node_on_shutdown() { await _host.StopAsync(); _host.Dispose(); - _host = null; + _host = null!; var settings = new DatabaseSettings { diff --git a/src/Persistence/SqlServerTests/solo_mode_does_not_release_orphaned_messages.cs b/src/Persistence/SqlServerTests/solo_mode_does_not_release_orphaned_messages.cs index 5cdae0179..dbc5bbc8b 100644 --- a/src/Persistence/SqlServerTests/solo_mode_does_not_release_orphaned_messages.cs +++ b/src/Persistence/SqlServerTests/solo_mode_does_not_release_orphaned_messages.cs @@ -14,8 +14,8 @@ namespace SqlServerTests; public class solo_mode_does_not_release_orphaned_messages : IAsyncLifetime { - private IHost theSoloHost; - private IHost theBalancedHost; + private IHost theSoloHost = null!; + private IHost theBalancedHost = null!; private const string SoloSchema = "solo_orphan"; private const string BalancedSchema = "balanced_orphan"; diff --git a/src/Persistence/SqlServerTests/sqlserver_durability_end_to_end.cs b/src/Persistence/SqlServerTests/sqlserver_durability_end_to_end.cs index df68143b2..8c3685bbd 100644 --- a/src/Persistence/SqlServerTests/sqlserver_durability_end_to_end.cs +++ b/src/Persistence/SqlServerTests/sqlserver_durability_end_to_end.cs @@ -23,10 +23,10 @@ public class sqlserver_durability_end_to_end : IAsyncLifetime { private const string SenderSchemaName = "sender"; private const string ReceiverSchemaName = "receiver"; - private Uri _listener; - private LightweightCache _receivers; + private Uri _listener = null!; + private LightweightCache _receivers = null!; - private LightweightCache _senders; + private LightweightCache _senders = null!; public async Task InitializeAsync() { @@ -162,7 +162,7 @@ protected int ReceivedMessageCount() { using var conn = new SqlConnection(Servers.SqlServerConnectionString); conn.Open(); - return (int)conn.CreateCommand("select count(*) from receiver.trace_doc").ExecuteScalar(); + return (int)conn.CreateCommand("select count(*) from receiver.trace_doc").ExecuteScalar()!; } protected async Task WaitForMessagesToBeProcessed(int count) @@ -172,7 +172,7 @@ protected async Task WaitForMessagesToBeProcessed(int count) for (var i = 0; i < 200; i++) { - var actual = (int)conn.CreateCommand("select count(*) from receiver.trace_doc").ExecuteScalar(); + var actual = (int)conn.CreateCommand("select count(*) from receiver.trace_doc").ExecuteScalar()!; var envelopeCount = PersistedIncomingCount(); Trace.WriteLine($"waitForMessages: {actual} actual & {envelopeCount} incoming envelopes"); @@ -196,7 +196,7 @@ protected long PersistedIncomingCount() return (int)conn.CreateCommand( $"select count(*) from receiver.{DatabaseConstants.IncomingTable} where {DatabaseConstants.Status} = '{EnvelopeStatus.Incoming}'") - .ExecuteScalar(); + .ExecuteScalar()!; } protected long PersistedOutgoingCount() @@ -206,7 +206,7 @@ protected long PersistedOutgoingCount() return (int)conn.CreateCommand( $"select count(*) from sender.{DatabaseConstants.OutgoingTable}") - .ExecuteScalar(); + .ExecuteScalar()!; } protected async Task StopReceiver(string name) @@ -256,12 +256,12 @@ public async Task sending_resumes_when_the_receiver_is_detected() public class TraceDoc { public Guid Id { get; set; } = Guid.NewGuid(); - public string Name { get; set; } + public string Name { get; set; } = null!; } public class TraceMessage { - public string Name { get; set; } + public string Name { get; set; } = null!; } [WolverineIgnore] diff --git a/src/Persistence/SqliteTests/DocumentationSamples.cs b/src/Persistence/SqliteTests/DocumentationSamples.cs index 419560342..f1e0bc88f 100644 --- a/src/Persistence/SqliteTests/DocumentationSamples.cs +++ b/src/Persistence/SqliteTests/DocumentationSamples.cs @@ -21,7 +21,7 @@ public static async Task SetupSqliteStorage(string[] args) { // Setting up SQLite-backed message storage // This requires a reference to Wolverine.Sqlite - opts.PersistMessagesWithSqlite(connectionString); + opts.PersistMessagesWithSqlite(connectionString!); // Other Wolverine configuration }); @@ -66,7 +66,7 @@ public static async Task UsingSqliteTransport() builder.UseWolverine(opts => { var connectionString = builder.Configuration.GetConnectionString("sqlite"); - opts.UseSqlitePersistenceAndTransport(connectionString) + opts.UseSqlitePersistenceAndTransport(connectionString!) // Tell Wolverine to build out all necessary queue or scheduled message // tables on demand as needed diff --git a/src/Persistence/SqliteTests/Sagas/saga_storage_operations.cs b/src/Persistence/SqliteTests/Sagas/saga_storage_operations.cs index c74dda13e..b30a4979b 100644 --- a/src/Persistence/SqliteTests/Sagas/saga_storage_operations.cs +++ b/src/Persistence/SqliteTests/Sagas/saga_storage_operations.cs @@ -99,7 +99,7 @@ public async Task insert_then_load() using var db2 = await conn.BeginTransactionAsync(); var saga2 = await _theSchema.LoadAsync(saga.Id, db2, CancellationToken.None); - saga2.Name.ShouldBe("Xavier Worthy"); + saga2!.Name.ShouldBe("Xavier Worthy"); } [Fact] @@ -123,7 +123,7 @@ public async Task insert_update_then_load() using var db2 = await conn.BeginTransactionAsync(); var saga2 = await _theSchema.LoadAsync(saga.Id, db2, CancellationToken.None); - saga2.Name.ShouldBe("Hollywood Brown"); + saga2!.Name.ShouldBe("Hollywood Brown"); } [Fact] @@ -189,5 +189,5 @@ await Should.ThrowAsync(async () => public class LightweightSaga : Saga { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } diff --git a/src/Persistence/SqliteTests/Transport/basic_functionality.cs b/src/Persistence/SqliteTests/Transport/basic_functionality.cs index 1b7517648..9b65ee0b3 100644 --- a/src/Persistence/SqliteTests/Transport/basic_functionality.cs +++ b/src/Persistence/SqliteTests/Transport/basic_functionality.cs @@ -30,11 +30,11 @@ public basic_functionality(ITestOutputHelper output) _connectionString = _database.ConnectionString; } - private IHost theHost; - private SqliteTransport theTransport; - private SqliteQueue theQueue; - private IMessageStore theMessageStore; - private WolverineRuntime theRuntime; + private IHost theHost = null!; + private SqliteTransport theTransport = null!; + private SqliteQueue theQueue = null!; + private IMessageStore theMessageStore = null!; + private WolverineRuntime theRuntime = null!; public async Task InitializeAsync() { diff --git a/src/Persistence/SqliteTests/message_store_initialization_and_configuration.cs b/src/Persistence/SqliteTests/message_store_initialization_and_configuration.cs index f0176e589..f1efe8822 100644 --- a/src/Persistence/SqliteTests/message_store_initialization_and_configuration.cs +++ b/src/Persistence/SqliteTests/message_store_initialization_and_configuration.cs @@ -18,7 +18,7 @@ namespace SqliteTests; public class message_store_initialization_and_configuration : SqliteContext, IAsyncLifetime { - private IHost _host; + private IHost _host = null!; private readonly string _connectionString; private readonly SqliteTestDatabase _database; @@ -91,7 +91,7 @@ public async Task stores_the_current_node_on_startup() var current = nodes.Single(); current.NodeId.ShouldBe(runtime.Options.UniqueNodeId); - current.ControlUri.ShouldBe(runtime.Options.Transports.NodeControlEndpoint.Uri); + current.ControlUri.ShouldBe(runtime.Options.Transports.NodeControlEndpoint!.Uri); } [Fact] @@ -99,7 +99,7 @@ public async Task deletes_the_node_on_shutdown() { await _host.StopAsync(); _host.Dispose(); - _host = null; + _host = null!; var settings = new DatabaseSettings { diff --git a/src/Persistence/Wolverine.CosmosDb/Internals/Durability/CosmosDbDurabilityAgent.Incoming.cs b/src/Persistence/Wolverine.CosmosDb/Internals/Durability/CosmosDbDurabilityAgent.Incoming.cs index 5bda8499e..0beb0fd41 100644 --- a/src/Persistence/Wolverine.CosmosDb/Internals/Durability/CosmosDbDurabilityAgent.Incoming.cs +++ b/src/Persistence/Wolverine.CosmosDb/Internals/Durability/CosmosDbDurabilityAgent.Incoming.cs @@ -36,7 +36,7 @@ private async Task tryRecoverIncomingMessages() { var receivedAt = new Uri(listenerStr); var circuit = _runtime.Endpoints.FindListenerCircuit(receivedAt); - if (circuit.Status != ListeningStatus.Accepting) + if (circuit!.Status != ListeningStatus.Accepting) { continue; } diff --git a/src/Persistence/Wolverine.CosmosDb/Internals/Transport/CosmosDbControlTransport.cs b/src/Persistence/Wolverine.CosmosDb/Internals/Transport/CosmosDbControlTransport.cs index 38ed34322..52f35953a 100644 --- a/src/Persistence/Wolverine.CosmosDb/Internals/Transport/CosmosDbControlTransport.cs +++ b/src/Persistence/Wolverine.CosmosDb/Internals/Transport/CosmosDbControlTransport.cs @@ -34,7 +34,7 @@ public CosmosDbControlTransport(Container container, WolverineOptions options) public bool TryBuildBrokerUsage(out BrokerDescription description) { - description = default; + description = default!; return false; } diff --git a/src/Persistence/Wolverine.EntityFrameworkCore/Codegen/EFCorePersistenceFrameProvider.cs b/src/Persistence/Wolverine.EntityFrameworkCore/Codegen/EFCorePersistenceFrameProvider.cs index 000012ea6..be42e0cac 100644 --- a/src/Persistence/Wolverine.EntityFrameworkCore/Codegen/EFCorePersistenceFrameProvider.cs +++ b/src/Persistence/Wolverine.EntityFrameworkCore/Codegen/EFCorePersistenceFrameProvider.cs @@ -99,14 +99,14 @@ public Frame DetermineDeleteFrame(Variable sagaId, Variable saga, IServiceContai public Frame DetermineDeleteFrame(Variable variable, IServiceContainer container) { - return DetermineDeleteFrame(null, variable, container); + return DetermineDeleteFrame(null!, variable, container); } public Frame DetermineStorageActionFrame(Type entityType, Variable action, IServiceContainer container) { var dbContextType = DetermineDbContextType(entityType, container); - var method = typeof(EfCoreStorageActionApplier).GetMethod("ApplyAction") + var method = typeof(EfCoreStorageActionApplier).GetMethod("ApplyAction")! .MakeGenericMethod(entityType, dbContextType); var call = new MethodCall(typeof(EfCoreStorageActionApplier), method); @@ -303,10 +303,10 @@ public bool CanApply(IChain chain, IServiceContainer container) foreach (var candidate in candidates) { - var dbContext = (DbContext)nested.ServiceProvider.GetService(candidate); + var dbContext = (DbContext)nested.ServiceProvider.GetService(candidate)!; try { - if (dbContext.Model.FindEntityType(entityType) != null) + if (dbContext!.Model.FindEntityType(entityType) != null) { _dbContextTypes = _dbContextTypes.AddOrUpdate(entityType, candidate); return candidate; diff --git a/src/Persistence/Wolverine.EntityFrameworkCore/Codegen/EnrollDbContextInTransaction.cs b/src/Persistence/Wolverine.EntityFrameworkCore/Codegen/EnrollDbContextInTransaction.cs index f2f41054f..9df0fc91a 100644 --- a/src/Persistence/Wolverine.EntityFrameworkCore/Codegen/EnrollDbContextInTransaction.cs +++ b/src/Persistence/Wolverine.EntityFrameworkCore/Codegen/EnrollDbContextInTransaction.cs @@ -12,11 +12,11 @@ internal class EnrollDbContextInTransaction : AsyncFrame { private readonly Type _dbContextType; private readonly IdempotencyStyle _idempotencyStyle; - private Variable _dbContext; - private Variable _cancellation; + private Variable _dbContext = null!; + private Variable _cancellation = null!; private Variable _envelopeTransaction; private Variable? _context; - private Variable _scrapers; + private Variable _scrapers = null!; public EnrollDbContextInTransaction(Type dbContextType, IdempotencyStyle idempotencyStyle) { @@ -31,7 +31,7 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) writer.WriteLine(""); writer.WriteComment( "Enroll the DbContext & IMessagingContext in the outgoing Wolverine outbox transaction"); - writer.Write($"var {_envelopeTransaction.Usage} = new {typeof(EfCoreEnvelopeTransaction).FullNameInCode()}({_dbContext.Usage}, {_context.Usage}, {_scrapers.Usage});"); + writer.Write($"var {_envelopeTransaction.Usage} = new {typeof(EfCoreEnvelopeTransaction).FullNameInCode()}({_dbContext.Usage}, {_context!.Usage}, {_scrapers.Usage});"); writer.Write( $"await {_context.Usage}.{nameof(MessageContext.EnlistInOutboxAsync)}({_envelopeTransaction.Usage}).ConfigureAwait(false);"); diff --git a/src/Persistence/Wolverine.EntityFrameworkCore/Codegen/StartDatabaseTransactionForDbContext.cs b/src/Persistence/Wolverine.EntityFrameworkCore/Codegen/StartDatabaseTransactionForDbContext.cs index dcb96d7bf..a658c35f2 100644 --- a/src/Persistence/Wolverine.EntityFrameworkCore/Codegen/StartDatabaseTransactionForDbContext.cs +++ b/src/Persistence/Wolverine.EntityFrameworkCore/Codegen/StartDatabaseTransactionForDbContext.cs @@ -14,8 +14,8 @@ internal class StartDatabaseTransactionForDbContext : AsyncFrame private readonly Type _dbContextType; private readonly IdempotencyStyle _idempotencyStyle; - private Variable _dbContext; - private Variable _cancellation; + private Variable _dbContext = null!; + private Variable _cancellation = null!; private Variable? _context; public StartDatabaseTransactionForDbContext(Type dbContextType, IdempotencyStyle idempotencyStyle) @@ -31,17 +31,17 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) // EF Core can only do eager idempotent checks if (_idempotencyStyle == IdempotencyStyle.Eager || _idempotencyStyle == IdempotencyStyle.Optimistic) { - writer.Write($"await {_context.Usage}.{nameof(MessageContext.AssertEagerIdempotencyAsync)}({_cancellation.Usage}).ConfigureAwait(false);"); + writer.Write($"await {_context!.Usage}.{nameof(MessageContext.AssertEagerIdempotencyAsync)}({_cancellation.Usage}).ConfigureAwait(false);"); } writer.Write($"BLOCK:if ({_dbContext.Usage}.Database.CurrentTransaction == null)"); writer.Write($"await {_dbContext.Usage}.Database.BeginTransactionAsync({_cancellation.Usage}).ConfigureAwait(false);"); writer.FinishBlock(); - + // EF Core can only do eager idempotent checks if (_idempotencyStyle == IdempotencyStyle.Eager || _idempotencyStyle == IdempotencyStyle.Optimistic) { - writer.Write($"await {_context.Usage}.{nameof(MessageContext.AssertEagerIdempotencyAsync)}({_cancellation.Usage}).ConfigureAwait(false);"); + writer.Write($"await {_context!.Usage}.{nameof(MessageContext.AssertEagerIdempotencyAsync)}({_cancellation.Usage}).ConfigureAwait(false);"); } Next?.GenerateCode(method, writer); diff --git a/src/Persistence/Wolverine.EntityFrameworkCore/Internals/EfCoreEnvelopeTransaction.cs b/src/Persistence/Wolverine.EntityFrameworkCore/Internals/EfCoreEnvelopeTransaction.cs index 583f76917..cd97b2ed4 100644 --- a/src/Persistence/Wolverine.EntityFrameworkCore/Internals/EfCoreEnvelopeTransaction.cs +++ b/src/Persistence/Wolverine.EntityFrameworkCore/Internals/EfCoreEnvelopeTransaction.cs @@ -17,13 +17,13 @@ public class EfCoreEnvelopeTransaction : IEnvelopeTransaction { private readonly MessageContext _messaging; private readonly IDomainEventScraper[] _scrapers; - private readonly IMessageDatabase _database; - + private readonly IMessageDatabase _database = null!; + public EfCoreEnvelopeTransaction(DbContext dbContext, MessageContext messaging, IEnumerable scrapers) { _messaging = messaging; _scrapers = scrapers.ToArray(); - if (!messaging.TryFindMessageDatabase(out _database)) + if (!messaging.TryFindMessageDatabase(out _database!)) { throw new InvalidOperationException( "This Wolverine application is not using Database backed message persistence. Please configure the message persistence"); diff --git a/src/Persistence/Wolverine.EntityFrameworkCore/Internals/IDbContextBuilder.cs b/src/Persistence/Wolverine.EntityFrameworkCore/Internals/IDbContextBuilder.cs index 5720e07d7..59e585fba 100644 --- a/src/Persistence/Wolverine.EntityFrameworkCore/Internals/IDbContextBuilder.cs +++ b/src/Persistence/Wolverine.EntityFrameworkCore/Internals/IDbContextBuilder.cs @@ -41,7 +41,7 @@ public interface IDbContextBuilder : IDbContextBuilder where T : DbContext internal class CreateTenantedDbContext : MethodCall where T : DbContext { - public CreateTenantedDbContext() : base(typeof(IDbContextBuilder), ReflectionHelper.GetMethod>(x => x.BuildAndEnrollAsync(null, CancellationToken.None))) + public CreateTenantedDbContext() : base(typeof(IDbContextBuilder), ReflectionHelper.GetMethod>(x => x.BuildAndEnrollAsync(null!, CancellationToken.None))!) { } } diff --git a/src/Persistence/Wolverine.EntityFrameworkCore/Internals/TenantedDbContextBuilderByConnectionString.cs b/src/Persistence/Wolverine.EntityFrameworkCore/Internals/TenantedDbContextBuilderByConnectionString.cs index 8c9f1f4a8..0e398961d 100644 --- a/src/Persistence/Wolverine.EntityFrameworkCore/Internals/TenantedDbContextBuilderByConnectionString.cs +++ b/src/Persistence/Wolverine.EntityFrameworkCore/Internals/TenantedDbContextBuilderByConnectionString.cs @@ -66,7 +66,7 @@ public async ValueTask BuildAndEnrollAsync(MessageContext messaging, Cancella builder.UseApplicationServiceProvider(_serviceProvider); builder.ReplaceService(); - _configuration(builder, new ConnectionString(connectionString), new TenantId(messaging.TenantId)); + _configuration(builder, new ConnectionString(connectionString), new TenantId(messaging.TenantId!)); var dbContext = _constructor(builder.Options); var transaction = new EfCoreEnvelopeTransaction(dbContext, messaging, _domainScrapers); @@ -178,7 +178,7 @@ private async Task findConnectionString(string? tenantId) connectionString = databaseSettings.ConnectionString ?? databaseSettings.DataSource?.ConnectionString; } - _connectionStrings = _connectionStrings.AddOrUpdate(tenantId, connectionString); + _connectionStrings = _connectionStrings.AddOrUpdate(tenantId, connectionString!); return connectionString!; } @@ -195,7 +195,7 @@ public DbContextOptions BuildOptionsForMain() var builder = new DbContextOptionsBuilder(); builder.UseApplicationServiceProvider(_serviceProvider); builder.ReplaceService(); - _configuration(builder, new ConnectionString(connectionString), new TenantId(StorageConstants.DefaultTenantId)); + _configuration(builder, new ConnectionString(connectionString!), new TenantId(StorageConstants.DefaultTenantId)); return builder.Options; } diff --git a/src/Persistence/Wolverine.EntityFrameworkCore/Internals/TenantedDbContextBuilderByDbDataSource.cs b/src/Persistence/Wolverine.EntityFrameworkCore/Internals/TenantedDbContextBuilderByDbDataSource.cs index 8bd3007f7..e1a01b9a5 100644 --- a/src/Persistence/Wolverine.EntityFrameworkCore/Internals/TenantedDbContextBuilderByDbDataSource.cs +++ b/src/Persistence/Wolverine.EntityFrameworkCore/Internals/TenantedDbContextBuilderByDbDataSource.cs @@ -67,7 +67,7 @@ public async ValueTask BuildAndEnrollAsync(MessageContext messaging, Cancella builder.UseApplicationServiceProvider(_serviceProvider); builder.ReplaceService(); - _configuration(builder, dataSource, new TenantId(messaging.TenantId)); + _configuration(builder, dataSource, new TenantId(messaging.TenantId!)); var dbContext = _constructor(builder.Options); @@ -183,7 +183,7 @@ public DbContextOptions BuildOptionsForMain() var builder = new DbContextOptionsBuilder(); builder.UseApplicationServiceProvider(_serviceProvider); builder.ReplaceService(); - _configuration(builder, dataSource, new TenantId(StorageConstants.DefaultTenantId)); + _configuration(builder, dataSource!, new TenantId(StorageConstants.DefaultTenantId)); return builder.Options; } @@ -247,7 +247,7 @@ private async Task findDataSource(string? tenantId) dataSource = databaseSettings.DataSource; } - _dataSources = _dataSources.AddOrUpdate(tenantId, dataSource); + _dataSources = _dataSources.AddOrUpdate(tenantId, dataSource!); return dataSource!; } diff --git a/src/Persistence/Wolverine.Marten/AggregateHandlerAttribute.cs b/src/Persistence/Wolverine.Marten/AggregateHandlerAttribute.cs index f7ebf11fa..2eb932989 100644 --- a/src/Persistence/Wolverine.Marten/AggregateHandlerAttribute.cs +++ b/src/Persistence/Wolverine.Marten/AggregateHandlerAttribute.cs @@ -119,25 +119,25 @@ public bool TryInferMessageIdentity(IChain chain, out PropertyInfo property) { if (AggregateHandling.TryLoad(chain, out var handling)) { - property = handling.AggregateId.VariableType == typeof(string) - ? inputType.GetProperty(nameof(IEvent.StreamKey)) - : inputType.GetProperty(nameof(IEvent.StreamId)); - + property = handling.AggregateId!.VariableType == typeof(string) + ? inputType!.GetProperty(nameof(IEvent.StreamKey))! + : inputType!.GetProperty(nameof(IEvent.StreamId))!; + } - + return property != null; } - + var aggregateType = AggregateType ?? AggregateHandling.DetermineAggregateType(chain); - var idMember = AggregateHandling.DetermineAggregateIdMember(aggregateType, inputType); - property = idMember as PropertyInfo; + var idMember = AggregateHandling.DetermineAggregateIdMember(aggregateType, inputType!); + property = (idMember as PropertyInfo)!; return property != null; } private OnMissing? _onMissing; public bool Required { get; set; } - public string MissingMessage { get; set; } + public string MissingMessage { get; set; } = null!; public OnMissing OnMissing { @@ -146,7 +146,7 @@ public OnMissing OnMissing } } -internal class ApplyEventsFromAsyncEnumerableFrame : AsyncFrame, IReturnVariableAction +internal class ApplyEventsFromAsyncEnumerableFrame : AsyncFrame, IReturnVariableAction where T : notnull { private readonly Variable _returnValue; private Variable? _stream; diff --git a/src/Persistence/Wolverine.Marten/AggregateHandling.cs b/src/Persistence/Wolverine.Marten/AggregateHandling.cs index 54f821441..c5afdf804 100644 --- a/src/Persistence/Wolverine.Marten/AggregateHandling.cs +++ b/src/Persistence/Wolverine.Marten/AggregateHandling.cs @@ -26,8 +26,8 @@ internal record AggregateHandling(IDataRequirement Requirement) { private static readonly Type _versioningBaseType = typeof(AggregateVersioning<>); - public Type AggregateType { get; init; } - public Variable AggregateId { get; init; } + public Type AggregateType { get; init; } = null!; + public Variable AggregateId { get; init; } = null!; public ConcurrencyStyle LoadStyle { get; init; } public Variable? Version { get; init; } @@ -103,7 +103,7 @@ public static bool TryLoad(IChain chain, out AggregateHandling handling) } } - handling = default; + handling = default!; return false; } @@ -119,12 +119,12 @@ public static bool TryLoad(IChain chain, out AggregateHandling handling) if (raw is List list) { - handling = list.FirstOrDefault(x => x.AggregateType == typeof(T)); + handling = list.FirstOrDefault(x => x.AggregateType == typeof(T))!; return handling != null; } } - handling = default; + handling = default!; return false; } @@ -275,7 +275,7 @@ internal Variable RelayAggregateToHandlerMethod(Variable eventStream, IChain cha Type aggregateType) { Variable aggregateVariable = new MemberAccessVariable(eventStream, - typeof(IEventStream<>).MakeGenericType(aggregateType).GetProperty(nameof(IEventStream.Aggregate))); + typeof(IEventStream<>).MakeGenericType(aggregateType).GetProperty(nameof(IEventStream.Aggregate))!); if (Requirement.Required) @@ -303,7 +303,7 @@ internal Variable RelayAggregateToHandlerMethod(Variable eventStream, IChain cha else if (Parameter != null) { // Use name-based matching to avoid accidentally setting the wrong same-type parameter - firstCall.TrySetArgument(Parameter.Name, aggregateVariable); + firstCall.TrySetArgument(Parameter.Name!, aggregateVariable); } else { @@ -313,7 +313,7 @@ internal Variable RelayAggregateToHandlerMethod(Variable eventStream, IChain cha // Store deferred assignment for middleware methods added later (Before/After) if (Parameter != null) { - StoreDeferredMiddlewareVariable(chain, Parameter.Name, aggregateVariable); + StoreDeferredMiddlewareVariable(chain, Parameter.Name!, aggregateVariable); } // Also do immediate relay for any middleware already present @@ -321,7 +321,7 @@ internal Variable RelayAggregateToHandlerMethod(Variable eventStream, IChain cha { if (Parameter != null) { - if (!methodCall.TrySetArgument(Parameter.Name, aggregateVariable)) + if (!methodCall.TrySetArgument(Parameter.Name!, aggregateVariable)) { methodCall.TrySetArgument(aggregateVariable); } @@ -367,7 +367,7 @@ internal static MemberInfo DetermineVersionMember(Type aggregateType) // The first arg doesn't matter var versioning = _versioningBaseType.CloseAndBuildAs(AggregationScope.SingleStream, aggregateType); - return versioning.VersionMember; + return versioning.VersionMember!; } internal static void StoreDeferredMiddlewareVariable(IChain chain, string parameterName, Variable variable) diff --git a/src/Persistence/Wolverine.Marten/BoundaryModelAttribute.cs b/src/Persistence/Wolverine.Marten/BoundaryModelAttribute.cs index fd6ff998e..dd3edb9b5 100644 --- a/src/Persistence/Wolverine.Marten/BoundaryModelAttribute.cs +++ b/src/Persistence/Wolverine.Marten/BoundaryModelAttribute.cs @@ -31,7 +31,7 @@ public class BoundaryModelAttribute : WolverineParameterAttribute, IDataRequirem private OnMissing? _onMissing; public bool Required { get; set; } - public string MissingMessage { get; set; } + public string MissingMessage { get; set; } = null!; public OnMissing OnMissing { @@ -113,16 +113,16 @@ public override Variable Modify(IChain chain, ParameterInfo parameter, IServiceC if (parameter.ParameterType == aggregateType || parameter.ParameterType.IsNullable() && parameter.ParameterType.GetInnerTypeFromNullable() == aggregateType) { - firstCall.TrySetArgument(parameter.Name, aggregateVariable); + firstCall.TrySetArgument(parameter.Name!, aggregateVariable); } // Store deferred assignment for middleware methods (Before/After) - AggregateHandling.StoreDeferredMiddlewareVariable(chain, parameter.Name, aggregateVariable); + AggregateHandling.StoreDeferredMiddlewareVariable(chain, parameter.Name!, aggregateVariable); // Also do immediate relay for any middleware already present foreach (var methodCall in chain.Middleware.OfType()) { - if (!methodCall.TrySetArgument(parameter.Name, aggregateVariable)) + if (!methodCall.TrySetArgument(parameter.Name!, aggregateVariable)) { methodCall.TrySetArgument(aggregateVariable); } diff --git a/src/Persistence/Wolverine.Marten/Codegen/AncillaryOutboxFactoryFrame.cs b/src/Persistence/Wolverine.Marten/Codegen/AncillaryOutboxFactoryFrame.cs index 47c367765..2e9c5e434 100644 --- a/src/Persistence/Wolverine.Marten/Codegen/AncillaryOutboxFactoryFrame.cs +++ b/src/Persistence/Wolverine.Marten/Codegen/AncillaryOutboxFactoryFrame.cs @@ -11,7 +11,7 @@ internal class AncillaryOutboxFactoryFrame : SyncFrame { private readonly Type _storeType; private readonly Type _factoryType; - private Variable _outerFactory; + private Variable _outerFactory = null!; public AncillaryOutboxFactoryFrame(Type storeType) { diff --git a/src/Persistence/Wolverine.Marten/Codegen/BoundaryEventCapture.cs b/src/Persistence/Wolverine.Marten/Codegen/BoundaryEventCapture.cs index 1307e45f4..1e91cb156 100644 --- a/src/Persistence/Wolverine.Marten/Codegen/BoundaryEventCapture.cs +++ b/src/Persistence/Wolverine.Marten/Codegen/BoundaryEventCapture.cs @@ -26,7 +26,7 @@ internal static MethodInfo FindMethod(Type responseType) { return responseType.CanBeCastTo>() ? ReflectionHelper.GetMethod>(x => x.AppendMany(new List()))! - : ReflectionHelper.GetMethod>(x => x.AppendOne(null))!; + : ReflectionHelper.GetMethod>(x => x.AppendOne(null!))!; } } diff --git a/src/Persistence/Wolverine.Marten/Codegen/CreateDocumentSessionFrame.cs b/src/Persistence/Wolverine.Marten/Codegen/CreateDocumentSessionFrame.cs index 11410e853..f8cc4851d 100644 --- a/src/Persistence/Wolverine.Marten/Codegen/CreateDocumentSessionFrame.cs +++ b/src/Persistence/Wolverine.Marten/Codegen/CreateDocumentSessionFrame.cs @@ -69,7 +69,7 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) writer.BlankLine(); writer.WriteComment("This message handler is configured for Eager idempotency checks"); - writer.Write($"await {_context.Usage}.{nameof(MessageContext.AssertEagerIdempotencyAsync)}({_cancellation.Usage});"); + writer.Write($"await {_context!.Usage}.{nameof(MessageContext.AssertEagerIdempotencyAsync)}({_cancellation!.Usage});"); } Next?.GenerateCode(method, writer); diff --git a/src/Persistence/Wolverine.Marten/Codegen/LoadAggregateFrame.cs b/src/Persistence/Wolverine.Marten/Codegen/LoadAggregateFrame.cs index a4bd3f1be..e9624160f 100644 --- a/src/Persistence/Wolverine.Marten/Codegen/LoadAggregateFrame.cs +++ b/src/Persistence/Wolverine.Marten/Codegen/LoadAggregateFrame.cs @@ -60,21 +60,21 @@ public void WriteCodeToEnlistInBatchQuery(GeneratedMethod method, ISourceWriter { if (_att.IsNaturalKey) { - writer.WriteLine($"var {_batchQueryItem.Usage} = {NaturalKeyFetchForWriting(_batchQuery!.Usage)};"); + writer.WriteLine($"var {_batchQueryItem!.Usage} = {NaturalKeyFetchForWriting(_batchQuery!.Usage)};"); return; } if (_att.LoadStyle == ConcurrencyStyle.Exclusive) { - writer.WriteLine($"var {_batchQueryItem.Usage} = {_batchQuery!.Usage}.Events.FetchForExclusiveWriting<{_att.AggregateType.FullNameInCode()}>({_rawIdentity.Usage});"); + writer.WriteLine($"var {_batchQueryItem!.Usage} = {_batchQuery!.Usage}.Events.FetchForExclusiveWriting<{_att.AggregateType.FullNameInCode()}>({_rawIdentity.Usage});"); } else if (_version == null) { - writer.WriteLine($"var {_batchQueryItem.Usage} = {_batchQuery!.Usage}.Events.FetchForWriting<{_att.AggregateType.FullNameInCode()}>({_rawIdentity.Usage});"); + writer.WriteLine($"var {_batchQueryItem!.Usage} = {_batchQuery!.Usage}.Events.FetchForWriting<{_att.AggregateType.FullNameInCode()}>({_rawIdentity.Usage});"); } else { - writer.WriteLine($"var {_batchQueryItem.Usage} = {_batchQuery!.Usage}.Events.FetchForWriting<{_att.AggregateType.FullNameInCode()}>({_rawIdentity.Usage}, {_version.Usage});"); + writer.WriteLine($"var {_batchQueryItem!.Usage} = {_batchQuery!.Usage}.Events.FetchForWriting<{_att.AggregateType.FullNameInCode()}>({_rawIdentity.Usage}, {_version.Usage});"); } } @@ -113,15 +113,15 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) } else if (_att.LoadStyle == ConcurrencyStyle.Exclusive) { - writer.WriteLine($"var {Stream.Usage} = await {_session!.Usage}.Events.FetchForExclusiveWriting<{_att.AggregateType.FullNameInCode()}>({_rawIdentity.Usage}, {_token.Usage});"); + writer.WriteLine($"var {Stream.Usage} = await {_session!.Usage}.Events.FetchForExclusiveWriting<{_att.AggregateType.FullNameInCode()}>({_rawIdentity.Usage}, {_token!.Usage});"); } else if (_version == null) { - writer.WriteLine($"var {Stream.Usage} = await {_session!.Usage}.Events.FetchForWriting<{_att.AggregateType.FullNameInCode()}>({_rawIdentity.Usage}, {_token.Usage});"); + writer.WriteLine($"var {Stream.Usage} = await {_session!.Usage}.Events.FetchForWriting<{_att.AggregateType.FullNameInCode()}>({_rawIdentity.Usage}, {_token!.Usage});"); } else { - writer.WriteLine($"var {Stream.Usage} = await {_session!.Usage}.Events.FetchForWriting<{_att.AggregateType.FullNameInCode()}>({_rawIdentity.Usage}, {_version.Usage}, {_token.Usage});"); + writer.WriteLine($"var {Stream.Usage} = await {_session!.Usage}.Events.FetchForWriting<{_att.AggregateType.FullNameInCode()}>({_rawIdentity.Usage}, {_version.Usage}, {_token!.Usage});"); } } else diff --git a/src/Persistence/Wolverine.Marten/Codegen/LoadBoundaryFrame.cs b/src/Persistence/Wolverine.Marten/Codegen/LoadBoundaryFrame.cs index 7303da80d..361000612 100644 --- a/src/Persistence/Wolverine.Marten/Codegen/LoadBoundaryFrame.cs +++ b/src/Persistence/Wolverine.Marten/Codegen/LoadBoundaryFrame.cs @@ -42,7 +42,7 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) { writer.WriteComment("Loading DCB boundary model via FetchForWritingByTags"); writer.WriteLine( - $"var {Boundary.Usage} = await {_session!.Usage}.Events.FetchForWritingByTags<{_aggregateType.FullNameInCode()}>({_query.Usage}, {_token!.Usage});"); + $"var {Boundary.Usage} = await {_session!.Usage}.Events.FetchForWritingByTags<{_aggregateType.FullNameInCode()}>({_query!.Usage}, {_token!.Usage});"); Next?.GenerateCode(method, writer); } diff --git a/src/Persistence/Wolverine.Marten/Codegen/MartenQueryingFrame.cs b/src/Persistence/Wolverine.Marten/Codegen/MartenQueryingFrame.cs index f15d8d82f..24d81cff7 100644 --- a/src/Persistence/Wolverine.Marten/Codegen/MartenQueryingFrame.cs +++ b/src/Persistence/Wolverine.Marten/Codegen/MartenQueryingFrame.cs @@ -70,8 +70,8 @@ private static (int, IReadOnlyList frames) sortThroughFrames(IG internal class MartenBatchFrame : AsyncFrame { - private Variable _session; - private Variable _cancellation; + private Variable _session = null!; + private Variable _cancellation = null!; private List _operations = new(); diff --git a/src/Persistence/Wolverine.Marten/Codegen/MissingAggregateCheckFrame.cs b/src/Persistence/Wolverine.Marten/Codegen/MissingAggregateCheckFrame.cs index 364db51d8..04ab77366 100644 --- a/src/Persistence/Wolverine.Marten/Codegen/MissingAggregateCheckFrame.cs +++ b/src/Persistence/Wolverine.Marten/Codegen/MissingAggregateCheckFrame.cs @@ -9,12 +9,9 @@ namespace Wolverine.Marten.Codegen; internal class MissingAggregateCheckFrame : SyncFrame { - private readonly MemberInfo _aggregateIdMember; private readonly Type _aggregateType; private readonly Variable _identity; - private readonly Type _commandType; private readonly Variable _eventStream; - private Variable? _command; public MissingAggregateCheckFrame(Type aggregateType, Variable identity, Variable eventStream) @@ -22,15 +19,14 @@ public MissingAggregateCheckFrame(Type aggregateType, Variable identity, _aggregateType = aggregateType; _identity = identity; _eventStream = eventStream; - + uses.Add(identity); uses.Add(eventStream); } public override IEnumerable FindVariables(IMethodVariables chain) { - _command = chain.FindVariable(_commandType); - yield return _command; + yield break; } public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) diff --git a/src/Persistence/Wolverine.Marten/Codegen/OpenMartenSessionFrame.cs b/src/Persistence/Wolverine.Marten/Codegen/OpenMartenSessionFrame.cs index 687ac2106..2fb5a7c6b 100644 --- a/src/Persistence/Wolverine.Marten/Codegen/OpenMartenSessionFrame.cs +++ b/src/Persistence/Wolverine.Marten/Codegen/OpenMartenSessionFrame.cs @@ -14,7 +14,7 @@ internal class OpenMartenSessionFrame : AsyncFrame private Variable? _context; private Variable? _factory; private Variable? _martenFactory; - private Variable _tenantId; + private Variable _tenantId = null!; private bool _justCast; public OpenMartenSessionFrame(Type sessionType) diff --git a/src/Persistence/Wolverine.Marten/Codegen/RegisterEventsFrame.cs b/src/Persistence/Wolverine.Marten/Codegen/RegisterEventsFrame.cs index 6207dc0d7..9eb8a668a 100644 --- a/src/Persistence/Wolverine.Marten/Codegen/RegisterEventsFrame.cs +++ b/src/Persistence/Wolverine.Marten/Codegen/RegisterEventsFrame.cs @@ -6,7 +6,7 @@ namespace Wolverine.Marten.Codegen; -internal class RegisterEventsFrame : MethodCall +internal class RegisterEventsFrame : MethodCall where T : notnull { public RegisterEventsFrame(Variable returnVariable) : base(typeof(IEventStream), FindMethod(returnVariable.VariableType)) @@ -19,6 +19,6 @@ internal static MethodInfo FindMethod(Type responseType) { return responseType.CanBeCastTo>() ? ReflectionHelper.GetMethod>(x => x.AppendMany(new List()))! - : ReflectionHelper.GetMethod>(x => x.AppendOne(null))!; + : ReflectionHelper.GetMethod>(x => x.AppendOne(null!))!; } } \ No newline at end of file diff --git a/src/Persistence/Wolverine.Marten/Codegen/SessionVariableSource.cs b/src/Persistence/Wolverine.Marten/Codegen/SessionVariableSource.cs index 97ed65d29..b76c03ab7 100644 --- a/src/Persistence/Wolverine.Marten/Codegen/SessionVariableSource.cs +++ b/src/Persistence/Wolverine.Marten/Codegen/SessionVariableSource.cs @@ -36,7 +36,7 @@ public Variable Create(Type type) internal class DocumentOperationsFrame : SyncFrame { - private Variable _session; + private Variable _session = null!; public DocumentOperationsFrame() { @@ -74,7 +74,7 @@ public Variable Create(Type type) internal class EventStoreOperationsFrame : SyncFrame { - private Variable _session; + private Variable _session = null!; public EventStoreOperationsFrame() { diff --git a/src/Persistence/Wolverine.Marten/Distribution/EventStoreAgents.cs b/src/Persistence/Wolverine.Marten/Distribution/EventStoreAgents.cs index ac6ccfa49..a63a6c3d7 100644 --- a/src/Persistence/Wolverine.Marten/Distribution/EventStoreAgents.cs +++ b/src/Persistence/Wolverine.Marten/Distribution/EventStoreAgents.cs @@ -33,7 +33,7 @@ public async ValueTask DisposeAsync() await entry.Value.StopAllAsync(); entry.Value.SafeDispose(); } - catch (Exception e) + catch (Exception) { // TODO -- probably want to log this just in case } diff --git a/src/Persistence/Wolverine.Marten/Distribution/EventSubscriptionAgentFamily.cs b/src/Persistence/Wolverine.Marten/Distribution/EventSubscriptionAgentFamily.cs index 7aaf2e9e0..5983faa9e 100644 --- a/src/Persistence/Wolverine.Marten/Distribution/EventSubscriptionAgentFamily.cs +++ b/src/Persistence/Wolverine.Marten/Distribution/EventSubscriptionAgentFamily.cs @@ -22,12 +22,12 @@ public static Uri UriFor(EventStoreIdentity storeIdentity, DatabaseId databaseId public EventSubscriptionAgentFamily(IEnumerable stores, IEnumerable> observers) { + _observers = observers.ToArray(); + foreach (var store in stores) { _stores = _stores.AddOrUpdate(store.Identity.ToString(), new EventStoreAgents(store, _observers)); } - - _observers = observers.ToArray(); } public string Scheme => SchemeName; diff --git a/src/Persistence/Wolverine.Marten/IMartenOp.cs b/src/Persistence/Wolverine.Marten/IMartenOp.cs index dd8470d0c..a1d58b1c6 100644 --- a/src/Persistence/Wolverine.Marten/IMartenOp.cs +++ b/src/Persistence/Wolverine.Marten/IMartenOp.cs @@ -50,7 +50,7 @@ public void Apply(IReadOnlyList chains, GenerationRules rules, IServiceC internal class ForEachMartenOpFrame : SyncFrame { private readonly Variable _collection; - private Variable _session; + private Variable _session = null!; public ForEachMartenOpFrame(Variable collection) { diff --git a/src/Persistence/Wolverine.Marten/MartenIntegration.cs b/src/Persistence/Wolverine.Marten/MartenIntegration.cs index eee759d4e..0c0928c0b 100644 --- a/src/Persistence/Wolverine.Marten/MartenIntegration.cs +++ b/src/Persistence/Wolverine.Marten/MartenIntegration.cs @@ -130,7 +130,7 @@ public string? MessageStorageSchemaName /// public AutoCreate? AutoCreate { get; set; } - public EventForwardingTransform SubscribeToEvent() + public EventForwardingTransform SubscribeToEvent() where T : notnull { return new EventForwardingTransform(EventRouter); } @@ -147,7 +147,7 @@ public void Configure(IServiceProvider services, StoreOptions options) if (mapping.DocumentType.CanBeCastTo()) { mapping.UseNumericRevisions = true; - mapping.Metadata.Revision.Member = mapping.DocumentType.GetProperty(nameof(Saga.Version)); + mapping.Metadata.Revision.Member = mapping.DocumentType.GetProperty(nameof(Saga.Version))!; } }); } @@ -159,7 +159,7 @@ internal class EventWrapperForwarder : IHandledTypeRule { public bool TryFindHandledType(Type concreteType, out Type handlerType) { - handlerType = concreteType.FindInterfaceThatCloses(typeof(IEvent<>)); + handlerType = concreteType.FindInterfaceThatCloses(typeof(IEvent<>))!; return handlerType != null; } } @@ -212,7 +212,7 @@ public IEnumerable FindRoutes(Type messageType, IWolverineRuntime public List Transformers { get; } = []; } -internal class EventUnwrappingMessageRoute : TransformedMessageRoute, T> +internal class EventUnwrappingMessageRoute : TransformedMessageRoute, T> where T : notnull { public EventUnwrappingMessageRoute(IMessageRoute inner) : base(e => e.Data, inner) { @@ -231,10 +231,10 @@ public interface IEventForwarding /// published to Wolverine with its normal routing rules /// /// - EventForwardingTransform SubscribeToEvent(); + EventForwardingTransform SubscribeToEvent() where T : notnull; } -public class EventForwardingTransform +public class EventForwardingTransform where TSource : notnull { private readonly MartenEventRouter _martenEventWrapper; diff --git a/src/Persistence/Wolverine.Marten/MartenMessageDatabaseSource.cs b/src/Persistence/Wolverine.Marten/MartenMessageDatabaseSource.cs index 0bc478582..a54a113ac 100644 --- a/src/Persistence/Wolverine.Marten/MartenMessageDatabaseSource.cs +++ b/src/Persistence/Wolverine.Marten/MartenMessageDatabaseSource.cs @@ -170,7 +170,7 @@ private PostgresqlMessageStore createTenantWolverineStore(IMartenDatabase databa database.As().DataSource, _runtime.LoggerFactory.CreateLogger()) { - Name = database.Identifier ?? new NpgsqlConnectionStringBuilder(settings.ConnectionString).Database + Name = database.Identifier ?? new NpgsqlConnectionStringBuilder(settings.ConnectionString).Database! }; store.TenantIds.AddRange(database.TenantIds.Distinct()); diff --git a/src/Persistence/Wolverine.Marten/Persistence/Sagas/LoadDocumentFrame.cs b/src/Persistence/Wolverine.Marten/Persistence/Sagas/LoadDocumentFrame.cs index f1a6a98ea..3c21cb6e0 100644 --- a/src/Persistence/Wolverine.Marten/Persistence/Sagas/LoadDocumentFrame.cs +++ b/src/Persistence/Wolverine.Marten/Persistence/Sagas/LoadDocumentFrame.cs @@ -110,7 +110,7 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) internal class UpdateSagaRevisionFrame : SyncFrame { - private Variable _session; + private Variable _session = null!; public Variable Saga { get; } public UpdateSagaRevisionFrame(Variable saga) diff --git a/src/Persistence/Wolverine.Marten/Persistence/Sagas/MartenPersistenceFrameProvider.cs b/src/Persistence/Wolverine.Marten/Persistence/Sagas/MartenPersistenceFrameProvider.cs index 7a88302ff..c2446da2e 100644 --- a/src/Persistence/Wolverine.Marten/Persistence/Sagas/MartenPersistenceFrameProvider.cs +++ b/src/Persistence/Wolverine.Marten/Persistence/Sagas/MartenPersistenceFrameProvider.cs @@ -114,7 +114,7 @@ public Frame DetermineDeleteFrame(Variable variable, IServiceContainer container public Frame DetermineStorageActionFrame(Type entityType, Variable action, IServiceContainer container) { - var method = typeof(MartenStorageActionApplier).GetMethod("ApplyAction") + var method = typeof(MartenStorageActionApplier).GetMethod("ApplyAction")! .MakeGenericMethod(entityType); var call = new MethodCall(typeof(MartenStorageActionApplier), method); @@ -132,8 +132,8 @@ public Frame[] DetermineFrameToNullOutMaybeSoftDeleted(Variable entity) internal class SetVariableToNullIfSoftDeletedFrame : AsyncFrame { private Variable _entity; - private Variable _documentSession; - private Variable _entityMetadata; + private Variable _documentSession = null!; + private Variable _entityMetadata = null!; public SetVariableToNullIfSoftDeletedFrame(Variable entity) { @@ -168,7 +168,7 @@ public override IEnumerable FindVariables(IMethodVariables chain) public static class MartenStorageActionApplier { - public static void ApplyAction(IDocumentSession session, IStorageAction action) + public static void ApplyAction(IDocumentSession session, IStorageAction action) where T : notnull { if (action.Entity == null) return; @@ -193,7 +193,7 @@ public static void ApplyAction(IDocumentSession session, IStorageAction ac internal class DocumentSessionSaveChanges : MethodCall { - public DocumentSessionSaveChanges() : base(typeof(IDocumentSession), ReflectionHelper.GetMethod(x => x.SaveChangesAsync(default))) + public DocumentSessionSaveChanges() : base(typeof(IDocumentSession), ReflectionHelper.GetMethod(x => x.SaveChangesAsync(default))!) { CommentText = "Save all pending changes to this Marten session"; } diff --git a/src/Persistence/Wolverine.Marten/Publishing/MartenToWolverineMessageBatch.cs b/src/Persistence/Wolverine.Marten/Publishing/MartenToWolverineMessageBatch.cs index 15f9f5335..e9ab96737 100644 --- a/src/Persistence/Wolverine.Marten/Publishing/MartenToWolverineMessageBatch.cs +++ b/src/Persistence/Wolverine.Marten/Publishing/MartenToWolverineMessageBatch.cs @@ -6,7 +6,9 @@ namespace Wolverine.Marten.Publishing; +#pragma warning disable CS9113 // Parameter is unread internal class MartenToWolverineMessageBatch(MessageContext Context, DocumentSessionBase Session) : IMessageBatch +#pragma warning restore CS9113 { public ValueTask PublishAsync(T message, string tenantId) { diff --git a/src/Persistence/Wolverine.Marten/ReadAggregateAttribute.cs b/src/Persistence/Wolverine.Marten/ReadAggregateAttribute.cs index 9e3fc6a4a..1c1ab57b4 100644 --- a/src/Persistence/Wolverine.Marten/ReadAggregateAttribute.cs +++ b/src/Persistence/Wolverine.Marten/ReadAggregateAttribute.cs @@ -41,7 +41,7 @@ public ReadAggregateAttribute(string argumentName) : base(argumentName) /// public bool Required { get; set; } = true; - public string MissingMessage { get; set; } + public string MissingMessage { get; set; } = null!; public OnMissing OnMissing { @@ -71,7 +71,7 @@ public override Variable Modify(IChain chain, ParameterInfo parameter, IServiceC } var frame = new FetchLatestAggregateFrame(parameter.ParameterType, identity); - frame.Aggregate.OverrideName(parameter.Name); + frame.Aggregate.OverrideName(parameter.Name!); Variable returnVariable; if (Required) @@ -90,7 +90,7 @@ public override Variable Modify(IChain chain, ParameterInfo parameter, IServiceC } // Store deferred assignment for middleware methods added later (Before/After) - AggregateHandling.StoreDeferredMiddlewareVariable(chain, parameter.Name, returnVariable); + AggregateHandling.StoreDeferredMiddlewareVariable(chain, parameter.Name!, returnVariable); return returnVariable; } @@ -128,10 +128,10 @@ public override Variable Modify(IChain chain, ParameterInfo parameter, IServiceC internal class FetchLatestAggregateFrame : AsyncFrame, IBatchableFrame { private readonly Variable _identity; - private Variable _session; - private Variable _token; - private Variable _batchQuery; - private Variable _batchQueryItem; + private Variable _session = null!; + private Variable _token = null!; + private Variable _batchQuery = null!; + private Variable _batchQueryItem = null!; public FetchLatestAggregateFrame(Type aggregateType, Variable identity) { diff --git a/src/Persistence/Wolverine.Marten/Subscriptions/InnerDataInvoker.cs b/src/Persistence/Wolverine.Marten/Subscriptions/InnerDataInvoker.cs index 70e0432b3..5545eb930 100644 --- a/src/Persistence/Wolverine.Marten/Subscriptions/InnerDataInvoker.cs +++ b/src/Persistence/Wolverine.Marten/Subscriptions/InnerDataInvoker.cs @@ -5,7 +5,7 @@ namespace Wolverine.Marten.Subscriptions; -internal class InnerDataInvoker : IMessageInvoker +internal class InnerDataInvoker : IMessageInvoker where T : notnull { private readonly IMessageInvoker _inner; @@ -27,7 +27,7 @@ public Task InvokeAsync(object message, MessageBus bus, CancellationToken cancel { if (message is IEvent e) { - return _inner.InvokeAsync(e.Data, bus, cancellation, timeout, options); + return _inner.InvokeAsync(e.Data!, bus, cancellation, timeout, options); } return Task.CompletedTask; diff --git a/src/Persistence/Wolverine.Marten/UpdatedAggregate.cs b/src/Persistence/Wolverine.Marten/UpdatedAggregate.cs index 8d0e69b22..3a6f16ee1 100644 --- a/src/Persistence/Wolverine.Marten/UpdatedAggregate.cs +++ b/src/Persistence/Wolverine.Marten/UpdatedAggregate.cs @@ -70,7 +70,7 @@ public static void ConfigureResponse(IChain chain) internal class FetchLatestByGuid : MethodCall where T : class { - public FetchLatestByGuid(Variable id) : base(typeof(IEventStoreOperations), ReflectionHelper.GetMethod(x => x.FetchLatest(Guid.Empty, CancellationToken.None))) + public FetchLatestByGuid(Variable id) : base(typeof(IEventStoreOperations), ReflectionHelper.GetMethod(x => x.FetchLatest(Guid.Empty, CancellationToken.None))!) { if (id.VariableType != typeof(Guid)) { @@ -84,7 +84,7 @@ public FetchLatestByGuid(Variable id) : base(typeof(IEventStoreOperations), Refl internal class FetchLatestByString : MethodCall where T : class { - public FetchLatestByString(Variable id) : base(typeof(IEventStoreOperations), ReflectionHelper.GetMethod(x => x.FetchLatest("", CancellationToken.None))) + public FetchLatestByString(Variable id) : base(typeof(IEventStoreOperations), ReflectionHelper.GetMethod(x => x.FetchLatest("", CancellationToken.None))!) { if (id.VariableType != typeof(string)) { diff --git a/src/Persistence/Wolverine.Marten/WolverineOptionsMartenExtensions.cs b/src/Persistence/Wolverine.Marten/WolverineOptionsMartenExtensions.cs index 5cf3c4814..d86e1c5fe 100644 --- a/src/Persistence/Wolverine.Marten/WolverineOptionsMartenExtensions.cs +++ b/src/Persistence/Wolverine.Marten/WolverineOptionsMartenExtensions.cs @@ -192,7 +192,7 @@ internal static IMessageStore BuildMultiTenantedMessageDatabase( AutoCreate = autoCreate ?? store.Options.AutoCreateSchemaObjects, Role = MessageStoreRole.Main, CommandQueuesEnabled = true, - DataSource = masterDataSource ?? NpgsqlDataSource.Create(masterDatabaseConnectionString) + DataSource = masterDataSource ?? NpgsqlDataSource.Create(masterDatabaseConnectionString!) }; var dataSource = findMasterDataSource(store, runtime, masterSettings, serviceProvider); diff --git a/src/Persistence/Wolverine.Marten/WriteAggregateAttribute.cs b/src/Persistence/Wolverine.Marten/WriteAggregateAttribute.cs index 46e453971..39a5d59e2 100644 --- a/src/Persistence/Wolverine.Marten/WriteAggregateAttribute.cs +++ b/src/Persistence/Wolverine.Marten/WriteAggregateAttribute.cs @@ -38,7 +38,7 @@ public WriteAggregateAttribute(string? routeOrParameterName) private OnMissing? _onMissing; public bool Required { get; set; } = true; - public string MissingMessage { get; set; } + public string MissingMessage { get; set; } = null!; public OnMissing OnMissing { @@ -223,7 +223,7 @@ public bool TryInferMessageIdentity(IChain chain, out PropertyInfo property) var inputType = chain.InputType(); if (inputType == null) { - property = default; + property = default!; return false; } @@ -232,12 +232,12 @@ public bool TryInferMessageIdentity(IChain chain, out PropertyInfo property) { if (handling.AggregateId is MemberAccessVariable mav) { - property = mav.Member as PropertyInfo; + property = (mav.Member as PropertyInfo)!; return property != null; } } - property = null; + property = null!; return false; } } \ No newline at end of file diff --git a/src/Persistence/Wolverine.Postgresql/PostgresqlBackedPersistence.cs b/src/Persistence/Wolverine.Postgresql/PostgresqlBackedPersistence.cs index 1dcc7aab8..0565ca8d6 100644 --- a/src/Persistence/Wolverine.Postgresql/PostgresqlBackedPersistence.cs +++ b/src/Persistence/Wolverine.Postgresql/PostgresqlBackedPersistence.cs @@ -213,7 +213,7 @@ public IMessageStore BuildMessageStore(IWolverineRuntime runtime) var sagaTables = runtime.Services.GetServices().ToArray(); - var mainSource = DataSource ?? NpgsqlDataSource.Create(ConnectionString); + var mainSource = DataSource ?? NpgsqlDataSource.Create(ConnectionString!); var logger = runtime.LoggerFactory.CreateLogger(); if (UseMasterTableTenancy) diff --git a/src/Persistence/Wolverine.Postgresql/PostgresqlMessageStore.cs b/src/Persistence/Wolverine.Postgresql/PostgresqlMessageStore.cs index 75f2b3934..7e3258ad6 100644 --- a/src/Persistence/Wolverine.Postgresql/PostgresqlMessageStore.cs +++ b/src/Persistence/Wolverine.Postgresql/PostgresqlMessageStore.cs @@ -75,7 +75,7 @@ public PostgresqlMessageStore(DatabaseSettings databaseSettings, DurabilitySetti foreach (var sagaTableDefinition in sagaTypes) { - var storage = typeof(DatabaseSagaSchema<,>).CloseAndBuildAs(sagaTableDefinition, _settings, sagaTableDefinition.SagaType, sagaTableDefinition.IdMember.GetMemberType()); + var storage = typeof(DatabaseSagaSchema<,>).CloseAndBuildAs(sagaTableDefinition, _settings, sagaTableDefinition.SagaType, sagaTableDefinition.IdMember.GetMemberType()!); _sagaStorage = _sagaStorage.AddOrUpdate(sagaTableDefinition.SagaType, storage); } } @@ -298,6 +298,18 @@ from pg_catalog.pg_class c } } + protected override async Task afterTruncateEnvelopeDataAsync(DbConnection conn) + { + if (Durability.EnableInboxPartitioning) + { + // After deleting data from partitioned tables, PostgreSQL's pg_class.reltuples + // statistics become stale. FetchCountsAsync() uses these stats for fast partition + // estimates, so we must run ANALYZE to update them after bulk deletes. + await conn.CreateCommand($"ANALYZE {SchemaName}.{DatabaseConstants.IncomingTable}") + .ExecuteNonQueryAsync(_cancellation); + } + } + public override async Task DiscardAndReassignOutgoingAsync(Envelope[] discards, Envelope[] reassigned, int nodeId) { await using var cmd = CreateCommand(_discardAndReassignOutgoingSql) @@ -349,7 +361,7 @@ public override async Task ExistsAsync(Envelope envelope, CancellationToke .With("id", envelope.Id) .ExecuteScalarAsync(cancellation); - return ((long)count) > 0; + return ((long)count!) > 0; } else { @@ -357,10 +369,10 @@ public override async Task ExistsAsync(Envelope envelope, CancellationToke var count = await conn .CreateCommand($"select count(id) from {SchemaName}.{DatabaseConstants.IncomingTable} where id = :id and {DatabaseConstants.ReceivedAt} = :destination") .With("id", envelope.Id) - .With("destination", envelope.Destination.ToString()) + .With("destination", envelope.Destination!.ToString()) .ExecuteScalarAsync(cancellation); - return ((long)count) > 0; + return ((long)count!) > 0; } } @@ -461,16 +473,16 @@ public override DatabaseDescriptor Describe() descriptor.TenantIds.AddRange(TenantIds); - descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Host)); + descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Host!)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Port)); - descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Database)); - descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Username)); - descriptor.Properties.Add(OptionsValue.Read(builder, x => x.ApplicationName)); + descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Database!)); + descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Username!)); + descriptor.Properties.Add(OptionsValue.Read(builder, x => x.ApplicationName!)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Enlist)); - descriptor.Properties.Add(OptionsValue.Read(builder, x => x.SearchPath)); - descriptor.Properties.Add(OptionsValue.Read(builder, x => x.ClientEncoding)); + descriptor.Properties.Add(OptionsValue.Read(builder, x => x.SearchPath!)); + descriptor.Properties.Add(OptionsValue.Read(builder, x => x.ClientEncoding!)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Encoding)); - descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Timezone)); + descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Timezone!)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.SslMode)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.SslNegotiation)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.CheckCertificateRevocation)); @@ -489,7 +501,7 @@ public override DatabaseDescriptor Describe() descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Timeout)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.CommandTimeout)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.CancellationTimeout)); - descriptor.Properties.Add(OptionsValue.Read(builder, x => x.TargetSessionAttributes)); + descriptor.Properties.Add(OptionsValue.Read(builder, x => x.TargetSessionAttributes!)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.LoadBalanceHosts)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.HostRecheckSeconds)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.KeepAlive)); @@ -503,7 +515,7 @@ public override DatabaseDescriptor Describe() descriptor.Properties.Add(OptionsValue.Read(builder, x => x.MaxAutoPrepare)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.AutoPrepareMinUsages)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.NoResetOnClose)); - descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Options)); + descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Options!)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.ArrayNullabilityMode)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.Multiplexing)); descriptor.Properties.Add(OptionsValue.Read(builder, x => x.WriteCoalescingBufferThresholdBytes)); diff --git a/src/Persistence/Wolverine.Postgresql/PostgresqlNodePersistence.cs b/src/Persistence/Wolverine.Postgresql/PostgresqlNodePersistence.cs index 697de7806..e27eaa306 100644 --- a/src/Persistence/Wolverine.Postgresql/PostgresqlNodePersistence.cs +++ b/src/Persistence/Wolverine.Postgresql/PostgresqlNodePersistence.cs @@ -379,7 +379,7 @@ internal class AdvisoryLock : IAdvisoryLock private readonly List _locks = new(); private readonly ILogger _logger; private readonly NpgsqlDataSource _source; - private NpgsqlConnection _conn; + private NpgsqlConnection? _conn; public AdvisoryLock(NpgsqlDataSource source, ILogger logger, string databaseName) { diff --git a/src/Persistence/Wolverine.Postgresql/PostgresqlTenantedMessageStore.cs b/src/Persistence/Wolverine.Postgresql/PostgresqlTenantedMessageStore.cs index bc2c24f9b..7b5a08210 100644 --- a/src/Persistence/Wolverine.Postgresql/PostgresqlTenantedMessageStore.cs +++ b/src/Persistence/Wolverine.Postgresql/PostgresqlTenantedMessageStore.cs @@ -29,7 +29,7 @@ public PostgresqlTenantedMessageStore(IWolverineRuntime runtime, PostgresqlBacke } public DatabaseCardinality Cardinality => _persistence.DataSourceTenancy?.Cardinality ?? - _persistence.ConnectionStringTenancy.Cardinality; + _persistence.ConnectionStringTenancy!.Cardinality; public async ValueTask FindAsync(string tenantId) { if (_stores.TryFind(tenantId, out var store)) @@ -44,7 +44,7 @@ public async ValueTask FindAsync(string tenantId) } else { - var connectionString = await _persistence.ConnectionStringTenancy.FindAsync(tenantId); + var connectionString = await _persistence.ConnectionStringTenancy!.FindAsync(tenantId); store = buildTenantStoreForConnectionString(connectionString); } diff --git a/src/Persistence/Wolverine.Postgresql/Sagas/DatabaseSagaSchema.cs b/src/Persistence/Wolverine.Postgresql/Sagas/DatabaseSagaSchema.cs index f65a451a0..a04d3899d 100644 --- a/src/Persistence/Wolverine.Postgresql/Sagas/DatabaseSagaSchema.cs +++ b/src/Persistence/Wolverine.Postgresql/Sagas/DatabaseSagaSchema.cs @@ -31,7 +31,7 @@ public DatabaseSagaSchema(SagaTableDefinition definition, DatabaseSettings setti _deleteSql = $"delete from {settings.SchemaName}.{definition.TableName} where id = @id"; - var table = new Table(new DbObjectName(settings.SchemaName, definition.TableName)); + var table = new Table(new DbObjectName(settings.SchemaName!, definition.TableName)); table.AddColumn("id").AsPrimaryKey(); table.AddColumn(DatabaseConstants.Body, "jsonb").NotNull(); table.AddColumn(DatabaseConstants.Version, "int").DefaultValue(1).NotNull(); @@ -73,13 +73,13 @@ public async Task InsertAsync(T saga, DbTransaction transaction, CancellationTok await EnsureStorageExistsAsync(cancellationToken); await transaction.CreateCommand(_insertSql).As() - .With("id", id) + .With("id", id!) .With("body", JsonSerializer.SerializeToUtf8Bytes(saga), NpgsqlDbType.Jsonb) .ExecuteNonQueryAsync(cancellationToken); saga.Version = 1; } - + public async Task UpdateAsync(T saga, DbTransaction transaction, CancellationToken cancellationToken) { await EnsureStorageExistsAsync(cancellationToken); @@ -87,7 +87,7 @@ public async Task UpdateAsync(T saga, DbTransaction transaction, CancellationTok var id = IdSource(saga); var count = await transaction.CreateCommand(_updateSql).As() .With("body", JsonSerializer.SerializeToUtf8Bytes(saga), NpgsqlDbType.Jsonb) - .With("id", id) + .With("id", id!) .With("version", saga.Version) .ExecuteNonQueryAsync(cancellationToken); @@ -103,7 +103,7 @@ public async Task DeleteAsync(T saga, DbTransaction transaction, CancellationTok await EnsureStorageExistsAsync(cancellationToken); await transaction .CreateCommand(_deleteSql) - .With("id", IdSource(saga)) + .With("id", IdSource(saga)!) .ExecuteNonQueryAsync(cancellationToken); } @@ -111,7 +111,7 @@ await transaction { await EnsureStorageExistsAsync(cancellationToken); await using var reader = await tx.CreateCommand(_loadSql) - .With("id", id) + .With("id", id!) .ExecuteReaderAsync(cancellationToken); if (!await reader.ReadAsync(cancellationToken)) diff --git a/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlQueue.cs b/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlQueue.cs index 76c5cd594..6189fbd87 100644 --- a/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlQueue.cs +++ b/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlQueue.cs @@ -252,7 +252,7 @@ await forEveryDatabase(async (source, _) => try { - count += (long)await conn.CreateCommand($"select count(*) from {QueueTable.Identifier}").ExecuteScalarAsync(); + count += (long)(await conn.CreateCommand($"select count(*) from {QueueTable.Identifier}").ExecuteScalarAsync())!; } finally { @@ -271,7 +271,7 @@ await forEveryDatabase(async (source, _) => await using var conn = await source.OpenConnectionAsync(); try { - count += (long)await conn.CreateCommand($"select count(*) from {ScheduledTable.Identifier}").ExecuteScalarAsync(); + count += (long)(await conn.CreateCommand($"select count(*) from {ScheduledTable.Identifier}").ExecuteScalarAsync())!; } finally { diff --git a/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlQueueListener.cs b/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlQueueListener.cs index bae20b4e9..97330c47b 100644 --- a/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlQueueListener.cs +++ b/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlQueueListener.cs @@ -153,7 +153,7 @@ public async Task MoveScheduledToReadyQueueAsync(CancellationToken cancell batch.Connection = conn; count = (long)(await batch - .ExecuteScalarAsync(cancellationToken)); + .ExecuteScalarAsync(cancellationToken))!; } finally { diff --git a/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlQueueSender.cs b/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlQueueSender.cs index dc8667b74..fb2640b6f 100644 --- a/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlQueueSender.cs +++ b/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlQueueSender.cs @@ -105,9 +105,9 @@ public async Task ScheduleRetryAsync(Envelope envelope, CancellationToken cancel await conn.CreateCommand($"delete from {_queue.Parent.MessageStorageSchemaName}.{DatabaseConstants.IncomingTable} where id = :id;" + _writeDirectlyToTheScheduledTable) .With("id", envelope.Id) .With("body", EnvelopeSerializer.Serialize(envelope)) - .With("type", envelope.MessageType) - .With("expires", envelope.DeliverBy) - .With("time", envelope.ScheduledTime) + .With("type", envelope.MessageType!) + .With("expires", envelope.DeliverBy!) + .With("time", envelope.ScheduledTime!) .ExecuteNonQueryAsync(cancellationToken); @@ -216,8 +216,8 @@ public async Task SendAsync(Envelope envelope, CancellationToken cancellationTok await conn.CreateCommand(_writeDirectlyToQueueTableSql) .With("id", envelope.Id) .With("body", EnvelopeSerializer.Serialize(envelope)) - .With("type", envelope.MessageType) - .With("expires", envelope.DeliverBy) + .With("type", envelope.MessageType!) + .With("expires", envelope.DeliverBy!) .ExecuteNonQueryAsync(cancellationToken); } catch (NpgsqlException e) @@ -239,9 +239,9 @@ private async Task scheduleMessageAsync(Envelope envelope, CancellationToken can await conn.CreateCommand(_writeDirectlyToTheScheduledTable) .With("id", envelope.Id) .With("body", EnvelopeSerializer.Serialize(envelope)) - .With("type", envelope.MessageType) - .With("expires", envelope.DeliverBy) - .With("time", envelope.ScheduledTime) + .With("type", envelope.MessageType!) + .With("expires", envelope.DeliverBy!) + .With("time", envelope.ScheduledTime!) .ExecuteNonQueryAsync(cancellationToken); } } \ No newline at end of file diff --git a/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlTransport.cs b/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlTransport.cs index 38964476e..620814804 100644 --- a/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlTransport.cs +++ b/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlTransport.cs @@ -128,16 +128,16 @@ public override IEnumerable DiagnosticColumns() public async Task SystemTimeAsync() { - NpgsqlDataSource dataSource = null; + NpgsqlDataSource? dataSource = null; if (Store is PostgresqlMessageStore store) { dataSource = store.NpgsqlDataSource; } - await using var conn = await dataSource.OpenConnectionAsync(); + await using var conn = await dataSource!.OpenConnectionAsync(); try { - var raw = (DateTime)await conn.CreateCommand("select (now())::timestamp").ExecuteScalarAsync(); + var raw = (DateTime)(await conn.CreateCommand("select (now())::timestamp").ExecuteScalarAsync())!; return new DateTimeOffset(raw, 0.Hours()); } finally diff --git a/src/Persistence/Wolverine.Postgresql/Transport/TenantedPostgresqlQueue.cs b/src/Persistence/Wolverine.Postgresql/Transport/TenantedPostgresqlQueue.cs index 37a1411fc..fd18b2369 100644 --- a/src/Persistence/Wolverine.Postgresql/Transport/TenantedPostgresqlQueue.cs +++ b/src/Persistence/Wolverine.Postgresql/Transport/TenantedPostgresqlQueue.cs @@ -11,7 +11,7 @@ internal class TenantedPostgresqlQueue : Endpoint, IDatabaseBackedEndpoint private readonly PostgresqlQueue _parent; private readonly NpgsqlDataSource _dataSource; private readonly string _databaseName; - private PostgresqlQueueSender _sender; + private PostgresqlQueueSender _sender = null!; public TenantedPostgresqlQueue(PostgresqlQueue parent, NpgsqlDataSource dataSource, string databaseName) : base(PostgresqlQueue.ToUri(parent.Name, databaseName), EndpointRole.Application) { diff --git a/src/Persistence/Wolverine.RDBMS/ConnectionSource.cs b/src/Persistence/Wolverine.RDBMS/ConnectionSource.cs index 3c4a752f3..a8040c859 100644 --- a/src/Persistence/Wolverine.RDBMS/ConnectionSource.cs +++ b/src/Persistence/Wolverine.RDBMS/ConnectionSource.cs @@ -26,7 +26,7 @@ public static async ValueTask Create(IMessageStore messageStore, MessageConte } else { - var store = await tenantedStore.Source.FindAsync(context.TenantId); + var store = await tenantedStore.Source.FindAsync(context.TenantId!); if (store is IConnectionSource s3) return s3.CreateConnection(); } } diff --git a/src/Persistence/Wolverine.RDBMS/Durability/BumpStaleIncomingEnvelopesOperation.cs b/src/Persistence/Wolverine.RDBMS/Durability/BumpStaleIncomingEnvelopesOperation.cs index e9bf7165f..fcb304251 100644 --- a/src/Persistence/Wolverine.RDBMS/Durability/BumpStaleIncomingEnvelopesOperation.cs +++ b/src/Persistence/Wolverine.RDBMS/Durability/BumpStaleIncomingEnvelopesOperation.cs @@ -16,7 +16,7 @@ public BumpStaleIncomingEnvelopesOperation(DbObjectName incomingTable, Durabilit { _incomingTable = incomingTable; _durability = durability; - _timestamp = utcNow.Subtract(_durability.InboxStaleTime.Value); + _timestamp = utcNow.Subtract(_durability.InboxStaleTime!.Value); } public string Description => "Bump stale or stuck inbox messages to be picked up by other nodes"; diff --git a/src/Persistence/Wolverine.RDBMS/Durability/BumpStaleOutgoingEnvelopesOperation.cs b/src/Persistence/Wolverine.RDBMS/Durability/BumpStaleOutgoingEnvelopesOperation.cs index 35e2c060d..c77cbcd7f 100644 --- a/src/Persistence/Wolverine.RDBMS/Durability/BumpStaleOutgoingEnvelopesOperation.cs +++ b/src/Persistence/Wolverine.RDBMS/Durability/BumpStaleOutgoingEnvelopesOperation.cs @@ -16,7 +16,7 @@ public BumpStaleOutgoingEnvelopesOperation(DbObjectName outgoingTable, Durabilit { _outgoingTable = outgoingTable; _durability = durability; - _timestamp = utcNow.Subtract(_durability.OutboxStaleTime.Value); + _timestamp = utcNow.Subtract(_durability.OutboxStaleTime!.Value); } public string Description => "Bump stale or stuck outbox messages to be picked up by other nodes"; diff --git a/src/Persistence/Wolverine.RDBMS/Durability/PersistNodeRecord.cs b/src/Persistence/Wolverine.RDBMS/Durability/PersistNodeRecord.cs index 2640f29ea..84d717a0d 100644 --- a/src/Persistence/Wolverine.RDBMS/Durability/PersistNodeRecord.cs +++ b/src/Persistence/Wolverine.RDBMS/Durability/PersistNodeRecord.cs @@ -24,7 +24,7 @@ public void ConfigureCommand(DbCommandBuilder builder) foreach (var @event in _events) { builder.Append("insert into "); - builder.Append(_settings.SchemaName); + builder.Append(_settings.SchemaName!); builder.Append('.'); builder.Append(DatabaseConstants.NodeRecordTableName); builder.Append(" (node_number, event_name, description) values ("); @@ -32,7 +32,7 @@ public void ConfigureCommand(DbCommandBuilder builder) builder.Append(", "); builder.AppendParameter(@event.RecordType.ToString()); builder.Append(", "); - builder.AppendParameter(@event.Description); + builder.AppendParameter(@event.Description!); builder.Append(");"); } } diff --git a/src/Persistence/Wolverine.RDBMS/DurabilityAgent.cs b/src/Persistence/Wolverine.RDBMS/DurabilityAgent.cs index 7b49706f7..fb62efc1d 100644 --- a/src/Persistence/Wolverine.RDBMS/DurabilityAgent.cs +++ b/src/Persistence/Wolverine.RDBMS/DurabilityAgent.cs @@ -24,10 +24,7 @@ internal class DurabilityAgent : IAgent private readonly IWolverineRuntime _runtime; private readonly DurabilitySettings _settings; private Timer? _expirationTimer; - private DateTimeOffset? _lastDeadLetterQueueCheck; - - private DateTimeOffset? _lastNodeRecordPruneTime; - private PersistenceMetrics _metrics; + private PersistenceMetrics _metrics = null!; private Timer? _recoveryTimer; private Timer? _scheduledJobTimer; @@ -155,6 +152,10 @@ public static Uri AddMarkerType(Uri uri, Type markerType) return new Uri($"{uri}{markerType.Name}"); } +#pragma warning disable CS0649 // Field is never assigned to + private DateTimeOffset? _lastNodeRecordPruneTime; +#pragma warning restore CS0649 + private bool isTimeToPruneNodeEventRecords() { if (_lastNodeRecordPruneTime == null) diff --git a/src/Persistence/Wolverine.RDBMS/IMessageDatabase.cs b/src/Persistence/Wolverine.RDBMS/IMessageDatabase.cs index e286387c6..017e118c9 100644 --- a/src/Persistence/Wolverine.RDBMS/IMessageDatabase.cs +++ b/src/Persistence/Wolverine.RDBMS/IMessageDatabase.cs @@ -40,7 +40,7 @@ public static bool TryFindMessageDatabase(this MessageContext context, out IMess return true; } - database = tenantedMessageStore.Source.FindAsync(context.TenantId).GetAwaiter().GetResult() as IMessageDatabase; + database = tenantedMessageStore.Source.FindAsync(context.TenantId!).GetAwaiter().GetResult() as IMessageDatabase; return database != null; } diff --git a/src/Persistence/Wolverine.RDBMS/MessageDatabase.Admin.cs b/src/Persistence/Wolverine.RDBMS/MessageDatabase.Admin.cs index 243f5f57a..706ce8467 100644 --- a/src/Persistence/Wolverine.RDBMS/MessageDatabase.Admin.cs +++ b/src/Persistence/Wolverine.RDBMS/MessageDatabase.Admin.cs @@ -151,6 +151,8 @@ await tx.CreateCommand($"delete from {SchemaName}.{DatabaseConstants.NodeRecordT } await tx.CommitAsync(_cancellation); + + await afterTruncateEnvelopeDataAsync(conn); } catch (Exception e) { @@ -158,4 +160,13 @@ await tx.CreateCommand($"delete from {SchemaName}.{DatabaseConstants.NodeRecordT "Failure trying to execute the statements to clear envelope storage", e); } } + + /// + /// Hook called after envelope data has been truncated and the transaction committed. + /// Override to perform provider-specific cleanup such as updating table statistics. + /// + protected virtual Task afterTruncateEnvelopeDataAsync(DbConnection conn) + { + return Task.CompletedTask; + } } \ No newline at end of file diff --git a/src/Persistence/Wolverine.RDBMS/MessageDatabase.Incoming.cs b/src/Persistence/Wolverine.RDBMS/MessageDatabase.Incoming.cs index 8a9bccc6d..ff2f6ac02 100644 --- a/src/Persistence/Wolverine.RDBMS/MessageDatabase.Incoming.cs +++ b/src/Persistence/Wolverine.RDBMS/MessageDatabase.Incoming.cs @@ -27,7 +27,7 @@ public Task ReassignIncomingAsync(int ownerId, IReadOnlyList incoming) builder.Append($" where {DatabaseConstants.Id} = "); builder.AppendParameter(envelope.Id); builder.Append($" and {DatabaseConstants.ReceivedAt} = "); - builder.AppendParameter(envelope.Destination.ToString()); + builder.AppendParameter(envelope.Destination!.ToString()); builder.Append(";"); } @@ -59,7 +59,7 @@ public async Task MoveToDeadLetterStorageAsync(Envelope envelope, Exception? exc builder.Append($"delete from {SchemaName}.{DatabaseConstants.IncomingTable} WHERE id = "); builder.AppendParameter(envelope.Id); builder.Append($" and {DatabaseConstants.ReceivedAt} = "); - builder.AppendParameter(envelope.Destination.ToString()); + builder.AppendParameter(envelope.Destination!.ToString()); builder.Append(';'); DatabasePersistence.ConfigureDeadLetterCommands(Durability, envelope, exception, builder, this); @@ -80,7 +80,7 @@ public Task MarkIncomingEnvelopeAsHandledAsync(Envelope envelope) return CreateCommand(_markEnvelopeAsHandledById) .With("id", envelope.Id) .With("keepUntil", keepUntil) - .With("uri", envelope.Destination.ToString()) + .With("uri", envelope.Destination!.ToString()) .ExecuteNonQueryAsync(_cancellation); } @@ -99,7 +99,7 @@ public async Task MarkIncomingEnvelopeAsHandledAsync(IReadOnlyList env builder.Append(" and "); builder.Append(DatabaseConstants.ReceivedAt); builder.Append( " = "); - builder.AppendParameter(envelope.Destination.ToString()); + builder.AppendParameter(envelope.Destination!.ToString()); builder.Append(";"); } @@ -128,7 +128,7 @@ public Task IncrementIncomingEnvelopeAttemptsAsync(Envelope envelope) return CreateCommand(_incrementIncomingEnvelopeAttempts) .With("attempts", envelope.Attempts) .With("id", envelope.Id) - .With("uri", envelope.Destination.ToString()) + .With("uri", envelope.Destination!.ToString()) .ExecuteNonQueryAsync(_cancellation); } diff --git a/src/Persistence/Wolverine.RDBMS/MessageDatabase.Scheduled.cs b/src/Persistence/Wolverine.RDBMS/MessageDatabase.Scheduled.cs index 8867801fd..66c79c8ee 100644 --- a/src/Persistence/Wolverine.RDBMS/MessageDatabase.Scheduled.cs +++ b/src/Persistence/Wolverine.RDBMS/MessageDatabase.Scheduled.cs @@ -16,7 +16,7 @@ public Task ScheduleExecutionAsync(Envelope envelope) .With("time", envelope.ScheduledTime!.Value) .With("attempts", envelope.Attempts) .With("id", envelope.Id) - .With("uri", envelope.Destination.ToString()) + .With("uri", envelope.Destination!.ToString()) .ExecuteNonQueryAsync(_cancellation); } diff --git a/src/Persistence/Wolverine.RDBMS/MessageDatabase.Tenants.cs b/src/Persistence/Wolverine.RDBMS/MessageDatabase.Tenants.cs index e36b48198..f0bf9deac 100644 --- a/src/Persistence/Wolverine.RDBMS/MessageDatabase.Tenants.cs +++ b/src/Persistence/Wolverine.RDBMS/MessageDatabase.Tenants.cs @@ -48,7 +48,7 @@ public async Task TryFindTenantConnectionString(string tenantId) _hasAppliedDefaults = true; } - string value = null; + string? value = null; await using var conn = CreateConnection(); await conn.OpenAsync(_cancellation); @@ -67,7 +67,7 @@ await conn.CreateCommand( await reader.CloseAsync(); - return value; + return value!; } finally { diff --git a/src/Persistence/Wolverine.RDBMS/MessageDatabase.cs b/src/Persistence/Wolverine.RDBMS/MessageDatabase.cs index e9cdf2809..1ea7aa8ff 100644 --- a/src/Persistence/Wolverine.RDBMS/MessageDatabase.cs +++ b/src/Persistence/Wolverine.RDBMS/MessageDatabase.cs @@ -97,7 +97,7 @@ public IAgent BuildAgent(IWolverineRuntime runtime) public Uri Uri { get; protected set; } = new Uri("null://null"); - public IAdvisoryLock AdvisoryLock { get; protected set; } + public IAdvisoryLock AdvisoryLock { get; protected set; } = null!; public ILogger Logger { get; } diff --git a/src/Persistence/Wolverine.RDBMS/Sagas/DatabaseSagaStorage.cs b/src/Persistence/Wolverine.RDBMS/Sagas/DatabaseSagaStorage.cs index c294fb3c0..4973ac1a2 100644 --- a/src/Persistence/Wolverine.RDBMS/Sagas/DatabaseSagaStorage.cs +++ b/src/Persistence/Wolverine.RDBMS/Sagas/DatabaseSagaStorage.cs @@ -18,24 +18,24 @@ public DatabaseSagaStorage(DbConnection connection, DbTransaction tx, IDatabaseS public Task InsertAsync(TSaga saga, CancellationToken cancellationToken) { - return _schema.InsertAsync(saga, _tx, cancellationToken); + return _schema.InsertAsync(saga, _tx!, cancellationToken); } public Task UpdateAsync(TSaga saga, CancellationToken cancellationToken) { - return _schema.UpdateAsync(saga, _tx, cancellationToken); + return _schema.UpdateAsync(saga, _tx!, cancellationToken); } public Task DeleteAsync(TSaga saga, CancellationToken cancellationToken) { - return _schema.DeleteAsync(saga, _tx, cancellationToken); + return _schema.DeleteAsync(saga, _tx!, cancellationToken); } public async Task SaveChangesAsync(CancellationToken cancellationToken) { try { - await _tx.CommitAsync(cancellationToken); + await _tx!.CommitAsync(cancellationToken); _tx = null; } finally @@ -56,6 +56,6 @@ public ValueTask DisposeAsync() public Task LoadAsync(TId id, CancellationToken cancellationToken) { - return _schema.LoadAsync(id, _tx, cancellationToken); + return _schema.LoadAsync(id, _tx!, cancellationToken); } } \ No newline at end of file diff --git a/src/Persistence/Wolverine.RDBMS/Sagas/SagaTableDefinition.cs b/src/Persistence/Wolverine.RDBMS/Sagas/SagaTableDefinition.cs index ab57e8f59..073643f17 100644 --- a/src/Persistence/Wolverine.RDBMS/Sagas/SagaTableDefinition.cs +++ b/src/Persistence/Wolverine.RDBMS/Sagas/SagaTableDefinition.cs @@ -35,7 +35,7 @@ private static string defaultTableName(Type documentType) var parts = new List { nameToAlias.ToLower() }; if (documentType.IsNested) { - parts.Insert(0, documentType.DeclaringType.Name.ToLower()); + parts.Insert(0, documentType.DeclaringType!.Name.ToLower()); } return string.Join("_", parts); diff --git a/src/Persistence/Wolverine.RDBMS/Transport/DatabaseControlTransport.cs b/src/Persistence/Wolverine.RDBMS/Transport/DatabaseControlTransport.cs index 5350a3ca6..8557bbe29 100644 --- a/src/Persistence/Wolverine.RDBMS/Transport/DatabaseControlTransport.cs +++ b/src/Persistence/Wolverine.RDBMS/Transport/DatabaseControlTransport.cs @@ -41,7 +41,7 @@ public DatabaseControlTransport(IMessageDatabase database, WolverineOptions opti public bool TryBuildBrokerUsage(out BrokerDescription description) { - description = default; + description = default!; return false; } diff --git a/src/Persistence/Wolverine.RDBMS/Transport/ExternalMessageTable.cs b/src/Persistence/Wolverine.RDBMS/Transport/ExternalMessageTable.cs index 7aee1d11c..287231ca4 100644 --- a/src/Persistence/Wolverine.RDBMS/Transport/ExternalMessageTable.cs +++ b/src/Persistence/Wolverine.RDBMS/Transport/ExternalMessageTable.cs @@ -47,7 +47,7 @@ protected override ISender CreateSender(IWolverineRuntime runtime) public DbObjectName TableName { get; init; } public string IdColumnName { get; set; } = "id"; public string JsonBodyColumnName { get; set; } = "body"; - public string MessageTypeColumnName { get; set; } = null; + public string MessageTypeColumnName { get; set; } = null!; public string TimestampColumnName { get; set; } = "timestamp"; public bool AllowWolverineControl { get; set; } = true; diff --git a/src/Persistence/Wolverine.RavenDb/Internals/AgentAssignment.cs b/src/Persistence/Wolverine.RavenDb/Internals/AgentAssignment.cs index 562508b39..4dc997690 100644 --- a/src/Persistence/Wolverine.RavenDb/Internals/AgentAssignment.cs +++ b/src/Persistence/Wolverine.RavenDb/Internals/AgentAssignment.cs @@ -19,9 +19,9 @@ public AgentAssignment(Uri agentUri, Guid nodeId) AgentUri = agentUri; } - public Uri AgentUri { get; set; } + public Uri AgentUri { get; set; } = null!; - public string Id { get; set; } + public string Id { get; set; } = null!; public Guid NodeId { get; set; } } \ No newline at end of file diff --git a/src/Persistence/Wolverine.RavenDb/Internals/BuildAsyncDocumentSession.cs b/src/Persistence/Wolverine.RavenDb/Internals/BuildAsyncDocumentSession.cs index 6229f83df..0a7e5cd0c 100644 --- a/src/Persistence/Wolverine.RavenDb/Internals/BuildAsyncDocumentSession.cs +++ b/src/Persistence/Wolverine.RavenDb/Internals/BuildAsyncDocumentSession.cs @@ -21,7 +21,7 @@ public Variable Create(Type type) internal class BuildAsyncDocumentSession : MethodCall { - public BuildAsyncDocumentSession() : base(typeof(IDocumentStore), ReflectionHelper.GetMethod(x => x.OpenAsyncSession())) + public BuildAsyncDocumentSession() : base(typeof(IDocumentStore), ReflectionHelper.GetMethod(x => x.OpenAsyncSession())!) { } } \ No newline at end of file diff --git a/src/Persistence/Wolverine.RavenDb/Internals/DeadLetterMessage.cs b/src/Persistence/Wolverine.RavenDb/Internals/DeadLetterMessage.cs index 642f2f9d5..e870570da 100644 --- a/src/Persistence/Wolverine.RavenDb/Internals/DeadLetterMessage.cs +++ b/src/Persistence/Wolverine.RavenDb/Internals/DeadLetterMessage.cs @@ -14,14 +14,14 @@ public DeadLetterMessage(Envelope envelope, Exception? exception) { Id = "dlq/" + envelope.Id.ToString(); EnvelopeId = envelope.Id; - MessageType = envelope.MessageType; - ReceivedAt = envelope.Destination; + MessageType = envelope.MessageType!; + ReceivedAt = envelope.Destination!; SentAt = envelope.SentAt; ScheduledTime = envelope.ScheduledTime; - Source = envelope.Source; - ExceptionType = exception?.GetType().FullNameInCode(); - ExceptionMessage = exception?.Message; - + Source = envelope.Source!; + ExceptionType = exception?.GetType().FullNameInCode()!; + ExceptionMessage = exception?.Message!; + // TODO -- need to harden this one Body = EnvelopeSerializer.Serialize(envelope); } @@ -29,21 +29,21 @@ public DeadLetterMessage(Envelope envelope, Exception? exception) public DateTimeOffset? ScheduledTime { get; set; } // Maps to the Envelope.Id - public string Id { get; set; } + public string Id { get; set; } = null!; public Guid EnvelopeId { get; set; } - public string MessageType { get; set; } - public Uri ReceivedAt { get; set; } - public string Source { get; set; } - public string ExceptionType { get; set; } - public string ExceptionMessage { get; set; } - public DateTimeOffset? SentAt { get; set; } + public string MessageType { get; set; } = null!; + public Uri ReceivedAt { get; set; } = null!; + public string Source { get; set; } = null!; + public string ExceptionType { get; set; } = null!; + public string ExceptionMessage { get; set; } = null!; + public DateTimeOffset? SentAt { get; set; } public bool Replayable { get; set; } - public byte[] Body { get; set; } + public byte[] Body { get; set; } = null!; public DateTimeOffset ExpirationTime { get; set; } public DeadLetterEnvelope ToEnvelope() { var envelope = EnvelopeSerializer.Deserialize(Body); - return new DeadLetterEnvelope(EnvelopeId, ScheduledTime, envelope, MessageType, ReceivedAt.ToString(), Source, ExceptionType, ExceptionMessage, SentAt.Value, Replayable); + return new DeadLetterEnvelope(EnvelopeId, ScheduledTime, envelope, MessageType, ReceivedAt.ToString(), Source, ExceptionType, ExceptionMessage, SentAt!.Value, Replayable); } } \ No newline at end of file diff --git a/src/Persistence/Wolverine.RavenDb/Internals/Durability/RavenDbDurabilityAgent.Incoming.cs b/src/Persistence/Wolverine.RavenDb/Internals/Durability/RavenDbDurabilityAgent.Incoming.cs index 8ec21b112..3903dd911 100644 --- a/src/Persistence/Wolverine.RavenDb/Internals/Durability/RavenDbDurabilityAgent.Incoming.cs +++ b/src/Persistence/Wolverine.RavenDb/Internals/Durability/RavenDbDurabilityAgent.Incoming.cs @@ -22,7 +22,7 @@ private async Task tryRecoverIncomingMessages() foreach (var listener in listeners.Where(x => x.ReceivedAt != null)) { var receivedAt = listener.ReceivedAt!; - var circuit = _runtime.Endpoints.FindListenerCircuit(receivedAt); + var circuit = _runtime.Endpoints.FindListenerCircuit(receivedAt)!; if (circuit.Status != ListeningStatus.Accepting) { continue; diff --git a/src/Persistence/Wolverine.RavenDb/Internals/Durability/RavenDbDurabilityAgent.cs b/src/Persistence/Wolverine.RavenDb/Internals/Durability/RavenDbDurabilityAgent.cs index 9f13d4083..ebbb2e678 100644 --- a/src/Persistence/Wolverine.RavenDb/Internals/Durability/RavenDbDurabilityAgent.cs +++ b/src/Persistence/Wolverine.RavenDb/Internals/Durability/RavenDbDurabilityAgent.cs @@ -27,7 +27,7 @@ public partial class RavenDbDurabilityAgent : IAgent private readonly CancellationTokenSource _cancellation = new(); private readonly CancellationTokenSource _combined; - private PersistenceMetrics _metrics; + private PersistenceMetrics _metrics = null!; public RavenDbDurabilityAgent(IDocumentStore store, IWolverineRuntime runtime, RavenDbMessageStore parent) { diff --git a/src/Persistence/Wolverine.RavenDb/Internals/IncomingMessage.cs b/src/Persistence/Wolverine.RavenDb/Internals/IncomingMessage.cs index dc87d7a64..283de07f5 100644 --- a/src/Persistence/Wolverine.RavenDb/Internals/IncomingMessage.cs +++ b/src/Persistence/Wolverine.RavenDb/Internals/IncomingMessage.cs @@ -24,7 +24,7 @@ public IncomingMessage(Envelope envelope, RavenDbMessageStore store) public Guid EnvelopeId { get; set; } - public string Id { get; set; } + public string Id { get; set; } = null!; public EnvelopeStatus Status { get; set; } = EnvelopeStatus.Incoming; public int OwnerId { get; set; } public DateTimeOffset? ExecutionTime { get; set; } diff --git a/src/Persistence/Wolverine.RavenDb/Internals/OutgoingMessage.cs b/src/Persistence/Wolverine.RavenDb/Internals/OutgoingMessage.cs index 1098d0e14..192e54669 100644 --- a/src/Persistence/Wolverine.RavenDb/Internals/OutgoingMessage.cs +++ b/src/Persistence/Wolverine.RavenDb/Internals/OutgoingMessage.cs @@ -20,7 +20,7 @@ public OutgoingMessage(Envelope envelope) DeliverBy = envelope.DeliverBy?.ToUniversalTime(); } - public string Id { get; set; } + public string Id { get; set; } = null!; public int OwnerId { get; set; } public Uri? Destination { get; set; } public DateTimeOffset? DeliverBy { get; set; } diff --git a/src/Persistence/Wolverine.RavenDb/Internals/RavenDbMessageStore.Locking.cs b/src/Persistence/Wolverine.RavenDb/Internals/RavenDbMessageStore.Locking.cs index f5bff4948..656baaf40 100644 --- a/src/Persistence/Wolverine.RavenDb/Internals/RavenDbMessageStore.Locking.cs +++ b/src/Persistence/Wolverine.RavenDb/Internals/RavenDbMessageStore.Locking.cs @@ -6,11 +6,11 @@ namespace Wolverine.RavenDb.Internals; // TODO -- harden all locking methods public partial class RavenDbMessageStore { - private string _leaderLockId; - private string _scheduledLockId; + private string _leaderLockId = null!; + private string _scheduledLockId = null!; private long _lastScheduledLockIndex = 0; private DistributedLock? _scheduledLock; - private IWolverineRuntime _runtime; + private IWolverineRuntime _runtime = null!; private DistributedLock? _leaderLock; private long _lastLockIndex = 0; diff --git a/src/Persistence/Wolverine.RavenDb/Internals/RavenDbMessageStore.cs b/src/Persistence/Wolverine.RavenDb/Internals/RavenDbMessageStore.cs index 865943521..862f9b085 100644 --- a/src/Persistence/Wolverine.RavenDb/Internals/RavenDbMessageStore.cs +++ b/src/Persistence/Wolverine.RavenDb/Internals/RavenDbMessageStore.cs @@ -14,13 +14,13 @@ public partial class RavenDbMessageStore : IMessageStoreWithAgentSupport { private readonly IDocumentStore _store; private readonly WolverineOptions _options; - private readonly Func _identity = e => $"{e.Id}/{e.Destination.ToString().Replace(":/", "")}"; + private readonly Func _identity = e => $"{e.Id}/{e.Destination!.ToString().Replace(":/", "")}"; public RavenDbMessageStore(IDocumentStore store, WolverineOptions options) { _identity = options.Durability.MessageIdentity == MessageIdentity.IdOnly ? e => e.Id.ToString() - : e => $"{e.Id}/{e.Destination.ToString().Replace(":/", "").TrimEnd('/')}"; + : e => $"{e.Id}/{e.Destination!.ToString().Replace(":/", "").TrimEnd('/')}"; _store = store; _options = options; diff --git a/src/Persistence/Wolverine.RavenDb/Internals/RavenDbOutbox.cs b/src/Persistence/Wolverine.RavenDb/Internals/RavenDbOutbox.cs index d3a48f4c3..313297c89 100644 --- a/src/Persistence/Wolverine.RavenDb/Internals/RavenDbOutbox.cs +++ b/src/Persistence/Wolverine.RavenDb/Internals/RavenDbOutbox.cs @@ -26,5 +26,5 @@ public async Task SaveChangesAsync(CancellationToken cancellation = default) await FlushOutgoingMessagesAsync(); } - public IAsyncDocumentSession Session { get; private set; } + public IAsyncDocumentSession Session { get; private set; } = null!; } \ No newline at end of file diff --git a/src/Persistence/Wolverine.RavenDb/Internals/RavenDbPersistenceFrameProvider.cs b/src/Persistence/Wolverine.RavenDb/Internals/RavenDbPersistenceFrameProvider.cs index 63c10762a..9e3c3dc81 100644 --- a/src/Persistence/Wolverine.RavenDb/Internals/RavenDbPersistenceFrameProvider.cs +++ b/src/Persistence/Wolverine.RavenDb/Internals/RavenDbPersistenceFrameProvider.cs @@ -107,7 +107,7 @@ public Frame DetermineDeleteFrame(Variable variable, IServiceContainer container public Frame DetermineStorageActionFrame(Type entityType, Variable action, IServiceContainer container) { - var method = typeof(RavenDbStorageActionApplier).GetMethod("ApplyAction") + var method = typeof(RavenDbStorageActionApplier).GetMethod("ApplyAction")! .MakeGenericMethod(entityType); var call = new MethodCall(typeof(RavenDbStorageActionApplier), method); @@ -141,7 +141,7 @@ public static async Task ApplyAction(IAsyncDocumentSession session, IStorageA internal class DeleteDocumentFrame : SyncFrame { private readonly Variable _saga; - private Variable _session; + private Variable _session = null!; public DeleteDocumentFrame(Variable saga) { diff --git a/src/Persistence/Wolverine.RavenDb/Internals/TransactionalFrame.cs b/src/Persistence/Wolverine.RavenDb/Internals/TransactionalFrame.cs index d745eb556..ca65aad7c 100644 --- a/src/Persistence/Wolverine.RavenDb/Internals/TransactionalFrame.cs +++ b/src/Persistence/Wolverine.RavenDb/Internals/TransactionalFrame.cs @@ -62,7 +62,7 @@ public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) writer.WriteComment("message context to support the outbox functionality"); writer.Write( $"using var {Session!.Usage} = {_store!.Usage}.{nameof(IDocumentStore.OpenAsyncSession)}();"); - writer.Write($"{_context.Usage}.{nameof(MessageContext.EnlistInOutbox)}(new {typeof(RavenDbEnvelopeTransaction).FullName}({Session!.Usage}, {_context.Usage}));"); + writer.Write($"{_context!.Usage}.{nameof(MessageContext.EnlistInOutbox)}(new {typeof(RavenDbEnvelopeTransaction).FullName}({Session!.Usage}, {_context.Usage}));"); if (_chain is SagaChain) { diff --git a/src/Persistence/Wolverine.SqlServer/Persistence/SqlServerMessageStore.cs b/src/Persistence/Wolverine.SqlServer/Persistence/SqlServerMessageStore.cs index ac5699618..01c84f526 100644 --- a/src/Persistence/Wolverine.SqlServer/Persistence/SqlServerMessageStore.cs +++ b/src/Persistence/Wolverine.SqlServer/Persistence/SqlServerMessageStore.cs @@ -39,7 +39,7 @@ public class SqlServerMessageStore : MessageDatabase public SqlServerMessageStore(DatabaseSettings database, DurabilitySettings settings, ILogger logger, IEnumerable sagaTypes) - : base(database, SqlClientFactory.Instance.CreateDataSource(database.ConnectionString), settings, logger, new SqlServerMigrator(), SqlServerProvider.Instance) + : base(database, SqlClientFactory.Instance.CreateDataSource(database.ConnectionString!), settings, logger, new SqlServerMigrator(), SqlServerProvider.Instance) { _findAtLargeEnvelopesSql = $"select top (@limit) {DatabaseConstants.IncomingFields} from {database.SchemaName}.{DatabaseConstants.IncomingTable} where owner_id = {TransportConstants.AnyNode} and status = '{EnvelopeStatus.Incoming}' and {DatabaseConstants.ReceivedAt} = @address"; @@ -50,7 +50,7 @@ public SqlServerMessageStore(DatabaseSettings database, DurabilitySettings setti foreach (var sagaTableDefinition in sagaTypes) { - var storage = typeof(DatabaseSagaSchema<,>).CloseAndBuildAs(sagaTableDefinition, _settings, sagaTableDefinition.IdMember.GetMemberType(), sagaTableDefinition.SagaType); + var storage = typeof(DatabaseSagaSchema<,>).CloseAndBuildAs(sagaTableDefinition, _settings, sagaTableDefinition.IdMember.GetMemberType()!, sagaTableDefinition.SagaType); _sagaStorage = _sagaStorage.AddOrUpdate(sagaTableDefinition.SagaType, storage); } @@ -270,7 +270,7 @@ public override async Task ExistsAsync(Envelope envelope, CancellationToke var count = await conn .CreateCommand($"select count(id) from {SchemaName}.{DatabaseConstants.IncomingTable} where id = @id and {DatabaseConstants.ReceivedAt} = @destination") .With("id", envelope.Id) - .With("destination", envelope.Destination.ToString()) + .With("destination", envelope.Destination!.ToString()) .ExecuteScalarAsync(cancellation); return ((int)count) > 0; @@ -351,7 +351,7 @@ protected override Task deleteMany(DbTransaction tx, Guid[] ids, DbObjectName ta } var batch = builder.Compile(); - batch.Connection = (SqlConnection)tx.Connection; + batch.Connection = (SqlConnection)tx.Connection!; batch.Transaction = (SqlTransaction)tx; return batch.ExecuteNonQueryAsync(); @@ -427,7 +427,7 @@ public override DatabaseDescriptor Describe() ServerName = builder.DataSource ?? string.Empty, DatabaseName = builder.InitialCatalog ?? string.Empty, Subject = GetType().FullNameInCode(), - SchemaOrNamespace = _settings.SchemaName, + SchemaOrNamespace = _settings.SchemaName!, SubjectUri = SubjectUri }; diff --git a/src/Persistence/Wolverine.SqlServer/Sagas/DatabaseSagaSchema.cs b/src/Persistence/Wolverine.SqlServer/Sagas/DatabaseSagaSchema.cs index c3e9d035c..9eda75ace 100644 --- a/src/Persistence/Wolverine.SqlServer/Sagas/DatabaseSagaSchema.cs +++ b/src/Persistence/Wolverine.SqlServer/Sagas/DatabaseSagaSchema.cs @@ -31,7 +31,7 @@ public DatabaseSagaSchema(SagaTableDefinition definition, DatabaseSettings setti _deleteSql = $"delete from {settings.SchemaName}.{definition.TableName} where id = @id"; - var table = new Table(new DbObjectName(settings.SchemaName, definition.TableName)); + var table = new Table(new DbObjectName(settings.SchemaName!, definition.TableName)); table.AddColumn("id").AsPrimaryKey(); table.AddColumn(DatabaseConstants.Body, "varbinary(max)").NotNull(); table.AddColumn(DatabaseConstants.Version, "int").DefaultValue(1).NotNull(); @@ -73,20 +73,20 @@ public async Task InsertAsync(TSaga saga, DbTransaction transaction, Cancellatio await ensureStorageExistsAsync(cancellationToken); await transaction.CreateCommand(_insertSql) - .With("id", id) + .With("id", id!) .With("body", JsonSerializer.SerializeToUtf8Bytes(saga)) .ExecuteNonQueryAsync(cancellationToken); saga.Version = 1; } - + public async Task UpdateAsync(TSaga saga, DbTransaction transaction, CancellationToken cancellationToken) { await ensureStorageExistsAsync(cancellationToken); var id = IdSource(saga); var count = await transaction.CreateCommand(_updateSql) - .With("id", id) + .With("id", id!) .With("body", JsonSerializer.SerializeToUtf8Bytes(saga)) .With("version", saga.Version) .ExecuteNonQueryAsync(cancellationToken); @@ -103,7 +103,7 @@ public async Task DeleteAsync(TSaga saga, DbTransaction transaction, Cancellatio await ensureStorageExistsAsync(cancellationToken); await transaction .CreateCommand(_deleteSql) - .With("id", IdSource(saga)) + .With("id", IdSource(saga)!) .ExecuteNonQueryAsync(cancellationToken); } @@ -111,7 +111,7 @@ await transaction { await ensureStorageExistsAsync(cancellationToken); await using var reader = await tx.CreateCommand(_loadSql) - .With("id", id) + .With("id", id!) .ExecuteReaderAsync(cancellationToken); if (!await reader.ReadAsync(cancellationToken)) diff --git a/src/Persistence/Wolverine.SqlServer/SqlServerTenantedMessageStore.cs b/src/Persistence/Wolverine.SqlServer/SqlServerTenantedMessageStore.cs index ea6cc2a82..9d0c1d6cd 100644 --- a/src/Persistence/Wolverine.SqlServer/SqlServerTenantedMessageStore.cs +++ b/src/Persistence/Wolverine.SqlServer/SqlServerTenantedMessageStore.cs @@ -33,7 +33,7 @@ public SqlServerTenantedMessageStore(IWolverineRuntime runtime, SqlServerBackedP _runtime = runtime; } - public ITenantedSource DataSource { get; set; } + public ITenantedSource DataSource { get; set; } = null!; public DatabaseCardinality Cardinality => DataSource.Cardinality; public async ValueTask FindAsync(string tenantId) @@ -90,9 +90,9 @@ public Task RefreshLiteAsync() public async Task RefreshAsync(bool withMigration) { - await _persistence.ConnectionStringTenancy.RefreshAsync(); + await _persistence.ConnectionStringTenancy!.RefreshAsync(); - foreach (var assignment in _persistence.ConnectionStringTenancy.AllActiveByTenant()) + foreach (var assignment in _persistence.ConnectionStringTenancy!.AllActiveByTenant()) { // TODO -- some idempotency if (!_stores.Contains(assignment.TenantId)) diff --git a/src/Persistence/Wolverine.SqlServer/Transport/MultiTenantedQueueListener.cs b/src/Persistence/Wolverine.SqlServer/Transport/MultiTenantedQueueListener.cs index 243341da3..c17180aa8 100644 --- a/src/Persistence/Wolverine.SqlServer/Transport/MultiTenantedQueueListener.cs +++ b/src/Persistence/Wolverine.SqlServer/Transport/MultiTenantedQueueListener.cs @@ -67,7 +67,7 @@ public async Task StartAsync() private async Task startListening(SqlServerMessageStore store) { - var listener = new SqlServerQueueListener(_queue, _runtime, _receiver, store.Settings.ConnectionString, store.Name); + var listener = new SqlServerQueueListener(_queue, _runtime, _receiver, store.Settings.ConnectionString!, store.Name); _listeners = _listeners.AddOrUpdate(store.Name, listener); await listener.StartAsync(); diff --git a/src/Persistence/Wolverine.SqlServer/Transport/MultiTenantedQueueSender.cs b/src/Persistence/Wolverine.SqlServer/Transport/MultiTenantedQueueSender.cs index 9ed66a6e5..a02f929c5 100644 --- a/src/Persistence/Wolverine.SqlServer/Transport/MultiTenantedQueueSender.cs +++ b/src/Persistence/Wolverine.SqlServer/Transport/MultiTenantedQueueSender.cs @@ -69,12 +69,12 @@ private async ValueTask resolveSender(Envelope envelope) else { var sqlServerStore = (SqlServerMessageStore)database; - sender = new SqlServerQueueSender(_queue, sqlServerStore.Settings.ConnectionString, database.Name); + sender = new SqlServerQueueSender(_queue, sqlServerStore.Settings.ConnectionString!, database.Name); _byDatabase = _byDatabase.AddOrUpdate(database.Name, sender); if (_queue.Parent.AutoProvision) { - await _queue.EnsureSchemaExists(database.Name, sqlServerStore.Settings.ConnectionString); + await _queue.EnsureSchemaExists(database.Name, sqlServerStore.Settings.ConnectionString!); } } diff --git a/src/Persistence/Wolverine.SqlServer/Transport/SqlServerQueue.cs b/src/Persistence/Wolverine.SqlServer/Transport/SqlServerQueue.cs index e227547e2..a4fe6ac06 100644 --- a/src/Persistence/Wolverine.SqlServer/Transport/SqlServerQueue.cs +++ b/src/Persistence/Wolverine.SqlServer/Transport/SqlServerQueue.cs @@ -142,13 +142,13 @@ private async ValueTask forEveryDatabase(Func action) // Multi-tenant mode - iterate over all tenant databases foreach (var database in Parent.Databases.ActiveDatabases().OfType()) { - await action(database.Settings.ConnectionString, database.Identifier); + await action(database.Settings.ConnectionString!, database.Identifier); } } else { // Single-tenant mode - use the transport's connection string - await action(Parent.Settings.ConnectionString, Parent.Settings.SchemaName ?? "wolverine"); + await action(Parent.Settings.ConnectionString!, Parent.Settings.SchemaName ?? "wolverine"); } } @@ -257,8 +257,8 @@ await forEveryDatabase(async (connectionString, _) => try { - count += (int)await conn.CreateCommand($"select count(*) from {QueueTable.Identifier}") - .ExecuteScalarAsync(); + count += (int)(await conn.CreateCommand($"select count(*) from {QueueTable.Identifier}") + .ExecuteScalarAsync())!; } finally { @@ -279,8 +279,8 @@ await forEveryDatabase(async (connectionString, _) => try { - count += (int)await conn.CreateCommand($"select count(*) from {ScheduledTable.Identifier}") - .ExecuteScalarAsync(); + count += (int)(await conn.CreateCommand($"select count(*) from {ScheduledTable.Identifier}") + .ExecuteScalarAsync())!; } finally { @@ -408,8 +408,8 @@ public async Task SendAsync(Envelope envelope, CancellationToken cancellationTok await conn.CreateCommand(_writeDirectlyToQueueTableSql!) .With("id", envelope.Id) .With("body", EnvelopeSerializer.Serialize(envelope)) - .With("type", envelope.MessageType) - .With("expires", envelope.DeliverBy) + .With("type", envelope.MessageType!) + .With("expires", envelope.DeliverBy!) .ExecuteNonQueryAsync(cancellationToken); await conn.CloseAsync(); } @@ -429,9 +429,9 @@ private async Task scheduleMessageAsync(Envelope envelope, CancellationToken can await conn.CreateCommand(_writeDirectlyToTheScheduledTable!) .With("id", envelope.Id) .With("body", EnvelopeSerializer.Serialize(envelope)) - .With("type", envelope.MessageType) - .With("expires", envelope.DeliverBy) - .With("time", envelope.ScheduledTime) + .With("type", envelope.MessageType!) + .With("expires", envelope.DeliverBy!) + .With("time", envelope.ScheduledTime!) .ExecuteNonQueryAsync(cancellationToken); await conn.CloseAsync(); } diff --git a/src/Persistence/Wolverine.SqlServer/Transport/SqlServerQueueListener.cs b/src/Persistence/Wolverine.SqlServer/Transport/SqlServerQueueListener.cs index 622f95916..444041c6c 100644 --- a/src/Persistence/Wolverine.SqlServer/Transport/SqlServerQueueListener.cs +++ b/src/Persistence/Wolverine.SqlServer/Transport/SqlServerQueueListener.cs @@ -29,7 +29,7 @@ internal class SqlServerQueueListener : IListener private readonly string _deleteExpiredSql; public SqlServerQueueListener(SqlServerQueue queue, IWolverineRuntime runtime, IReceiver receiver) - : this(queue, runtime, receiver, queue.Parent.Settings.ConnectionString, null) + : this(queue, runtime, receiver, queue.Parent.Settings.ConnectionString!, null) { } diff --git a/src/Persistence/Wolverine.SqlServer/Transport/SqlServerQueueSender.cs b/src/Persistence/Wolverine.SqlServer/Transport/SqlServerQueueSender.cs index af1df0e51..811d39cf2 100644 --- a/src/Persistence/Wolverine.SqlServer/Transport/SqlServerQueueSender.cs +++ b/src/Persistence/Wolverine.SqlServer/Transport/SqlServerQueueSender.cs @@ -19,7 +19,7 @@ internal class SqlServerQueueSender : ISqlServerQueueSender private readonly string _deleteFromIncomingAndScheduleSql; // Strictly for testing - public SqlServerQueueSender(SqlServerQueue queue) : this(queue, queue.Parent.Settings.ConnectionString, null) + public SqlServerQueueSender(SqlServerQueue queue) : this(queue, queue.Parent.Settings.ConnectionString!, null) { Destination = queue.Uri; } @@ -90,9 +90,9 @@ public async Task ScheduleRetryAsync(Envelope envelope, CancellationToken cancel await conn.CreateCommand(_deleteFromIncomingAndScheduleSql) .With("id", envelope.Id) .With("body", EnvelopeSerializer.Serialize(envelope)) - .With("type", envelope.MessageType) - .With("expires", envelope.DeliverBy) - .With("time", envelope.ScheduledTime) + .With("type", envelope.MessageType!) + .With("expires", envelope.DeliverBy!) + .With("time", envelope.ScheduledTime!) .ExecuteNonQueryAsync(cancellationToken); } finally @@ -200,8 +200,8 @@ public async Task SendAsync(Envelope envelope, CancellationToken cancellationTok await conn.CreateCommand(_writeDirectlyToQueueTableSql) .With("id", envelope.Id) .With("body", EnvelopeSerializer.Serialize(envelope)) - .With("type", envelope.MessageType) - .With("expires", envelope.DeliverBy) + .With("type", envelope.MessageType!) + .With("expires", envelope.DeliverBy!) .ExecuteNonQueryAsync(cancellationToken); } catch (SqlException e) @@ -224,9 +224,9 @@ private async Task scheduleMessageAsync(Envelope envelope, CancellationToken can await conn.CreateCommand(_writeDirectlyToTheScheduledTable) .With("id", envelope.Id) .With("body", EnvelopeSerializer.Serialize(envelope)) - .With("type", envelope.MessageType) - .With("expires", envelope.DeliverBy) - .With("time", envelope.ScheduledTime) + .With("type", envelope.MessageType!) + .With("expires", envelope.DeliverBy!) + .With("time", envelope.ScheduledTime!) .ExecuteNonQueryAsync(cancellationToken); } } diff --git a/src/Persistence/Wolverine.SqlServer/Transport/SqlServerTransport.cs b/src/Persistence/Wolverine.SqlServer/Transport/SqlServerTransport.cs index 0020427f0..36cdc4169 100644 --- a/src/Persistence/Wolverine.SqlServer/Transport/SqlServerTransport.cs +++ b/src/Persistence/Wolverine.SqlServer/Transport/SqlServerTransport.cs @@ -101,7 +101,7 @@ public override async ValueTask ConnectAsync(IWolverineRuntime runtime) internal DatabaseSettings Settings { get; set; } - internal SqlServerMessageStore Storage { get; set; } + internal SqlServerMessageStore Storage { get; set; } = null!; internal MultiTenantedMessageStore? Databases { get; set; } @@ -117,6 +117,6 @@ public async Task SystemTimeAsync() await using var conn = new SqlConnection(Settings.ConnectionString); await conn.OpenAsync(); - return (DateTimeOffset)await conn.CreateCommand("select SYSDATETIMEOFFSET()").ExecuteScalarAsync(); + return (DateTimeOffset)(await conn.CreateCommand("select SYSDATETIMEOFFSET()").ExecuteScalarAsync())!; } } diff --git a/src/Persistence/Wolverine.Sqlite/SqliteMessageStore.cs b/src/Persistence/Wolverine.Sqlite/SqliteMessageStore.cs index 32cf369e5..41026afa5 100644 --- a/src/Persistence/Wolverine.Sqlite/SqliteMessageStore.cs +++ b/src/Persistence/Wolverine.Sqlite/SqliteMessageStore.cs @@ -64,12 +64,12 @@ public SqliteMessageStore(DatabaseSettings databaseSettings, DurabilitySettings foreach (var sagaTableDefinition in sagaTypes) { - var storage = typeof(DatabaseSagaSchema<,>).CloseAndBuildAs(sagaTableDefinition, _settings, sagaTableDefinition.SagaType, sagaTableDefinition.IdMember.GetMemberType()); + var storage = typeof(DatabaseSagaSchema<,>).CloseAndBuildAs(sagaTableDefinition, _settings, sagaTableDefinition.SagaType, sagaTableDefinition.IdMember.GetMemberType()!); _sagaStorage = _sagaStorage.AddOrUpdate(sagaTableDefinition.SagaType, storage); } } - public DbDataSource DataSource { get; } + public new DbDataSource DataSource { get; } public async Task> SchemaTablesAsync(CancellationToken ct = default) { @@ -379,7 +379,7 @@ public override DatabaseDescriptor Describe() descriptor.TenantIds.AddRange(TenantIds); - descriptor.Properties.Add(new OptionsValue { Name = "DataSource", Value = builder.DataSource }); + descriptor.Properties.Add(new OptionsValue { Name = "DataSource", Value = builder.DataSource! }); descriptor.Properties.Add(new OptionsValue { Name = "Mode", Value = builder.Mode.ToString() }); descriptor.Properties.Add(new OptionsValue { Name = "Cache", Value = builder.Cache.ToString() }); diff --git a/src/Persistence/Wolverine.Sqlite/Transport/SqliteQueueSender.cs b/src/Persistence/Wolverine.Sqlite/Transport/SqliteQueueSender.cs index fbb396dce..d30f78b25 100644 --- a/src/Persistence/Wolverine.Sqlite/Transport/SqliteQueueSender.cs +++ b/src/Persistence/Wolverine.Sqlite/Transport/SqliteQueueSender.cs @@ -99,7 +99,7 @@ private async Task writeToScheduledTableAsync(Envelope envelope, CancellationTok await conn.CreateCommand(_writeDirectlyToTheScheduledTable) .With("id", $"{envelope.Id:D}") .With("body", EnvelopeSerializer.Serialize(envelope)) - .With("type", envelope.MessageType) + .With("type", envelope.MessageType!) .With("time", scheduledTime.UtcDateTime.ToString(SqliteDateTimeFormat)) .ExecuteNonQueryAsync(cancellationToken); } @@ -123,8 +123,8 @@ private async Task sendAsync(Envelope envelope, DbConnection conn, CancellationT await conn.CreateCommand(_writeDirectlyToQueueTableSql) .With("id", $"{envelope.Id:D}") .With("body", EnvelopeSerializer.Serialize(envelope)) - .With("type", envelope.MessageType) - .With("expires", envelope.DeliverBy?.UtcDateTime.ToString(SqliteDateTimeFormat)) + .With("type", envelope.MessageType!) + .With("expires", (envelope.DeliverBy?.UtcDateTime.ToString(SqliteDateTimeFormat))!) .ExecuteNonQueryAsync(cancellation); } @@ -135,7 +135,7 @@ public async Task ScheduleRetryAsync(Envelope envelope, CancellationToken cancel await conn.CreateCommand(_deleteFromIncomingAndScheduleSql) .With("id", $"{envelope.Id:D}") .With("body", EnvelopeSerializer.Serialize(envelope)) - .With("type", envelope.MessageType) + .With("type", envelope.MessageType!) .With("time", (envelope.ScheduledTime ?? DateTimeOffset.UtcNow).UtcDateTime.ToString(SqliteDateTimeFormat)) .ExecuteNonQueryAsync(cancellationToken); } diff --git a/src/Persistence/Wolverine.Sqlite/Transport/SqliteTransport.cs b/src/Persistence/Wolverine.Sqlite/Transport/SqliteTransport.cs index 9b6357691..9b7259f11 100644 --- a/src/Persistence/Wolverine.Sqlite/Transport/SqliteTransport.cs +++ b/src/Persistence/Wolverine.Sqlite/Transport/SqliteTransport.cs @@ -122,7 +122,7 @@ public async Task SystemTimeAsync() await using var conn = await Store.DataSource.OpenConnectionAsync().ConfigureAwait(false); - var raw = (string)await conn.CreateCommand("select datetime('now')").ExecuteScalarAsync(); - return new DateTimeOffset(DateTime.SpecifyKind(DateTime.Parse(raw), DateTimeKind.Utc)); + var raw = (string?)await conn.CreateCommand("select datetime('now')").ExecuteScalarAsync(); + return new DateTimeOffset(DateTime.SpecifyKind(DateTime.Parse(raw!), DateTimeKind.Utc)); } } diff --git a/src/Samples/CQRSWithMarten/TeleHealth.Common/AppointmentProjection.cs b/src/Samples/CQRSWithMarten/TeleHealth.Common/AppointmentProjection.cs index 597a9196b..b00fa285d 100644 --- a/src/Samples/CQRSWithMarten/TeleHealth.Common/AppointmentProjection.cs +++ b/src/Samples/CQRSWithMarten/TeleHealth.Common/AppointmentProjection.cs @@ -14,7 +14,7 @@ public async Task Create(AppointmentRequested requested, IQuerySess { var patient = await session.LoadAsync(requested.PatientId); - return new Appointment(patient.FirstName, patient.LastName) + return new Appointment(patient!.FirstName, patient.LastName) { Status = AppointmentStatus.Requested }; @@ -29,7 +29,7 @@ public void Apply(AppointmentRouted routed, Appointment appointment) public async Task Apply(AppointmentScheduled scheduled, Appointment appointment, IQuerySession session) { var provider = await session.LoadAsync(scheduled.ProviderId); - appointment.ProviderName = $"{provider.FirstName} {provider.LastName}"; + appointment.ProviderName = $"{provider!.FirstName} {provider.LastName}"; appointment.Status = AppointmentStatus.Scheduled; appointment.EstimatedTime = scheduled.EstimatedTime; } diff --git a/src/Samples/CQRSWithMarten/TeleHealth.Common/Appointments.cs b/src/Samples/CQRSWithMarten/TeleHealth.Common/Appointments.cs index bca1b8879..8642c81eb 100644 --- a/src/Samples/CQRSWithMarten/TeleHealth.Common/Appointments.cs +++ b/src/Samples/CQRSWithMarten/TeleHealth.Common/Appointments.cs @@ -9,8 +9,8 @@ namespace TeleHealth.Common; public class Patient { public Guid Id { get; set; } - public string FirstName { get; set; } - public string LastName { get; set; } + public string FirstName { get; set; } = null!; + public string LastName { get; set; } = null!; } public record AppointmentRequested(Guid PatientId); @@ -91,7 +91,7 @@ public Appointment(string firstName, string lastName) public string LastName { get; } public AppointmentStatus Status { get; set; } - public string ProviderName { get; set; } + public string ProviderName { get; set; } = null!; public DateTimeOffset? EstimatedTime { get; set; } public Guid BoardId { get; set; } } \ No newline at end of file diff --git a/src/Samples/CQRSWithMarten/TeleHealth.Common/BoardView.cs b/src/Samples/CQRSWithMarten/TeleHealth.Common/BoardView.cs index 929a6601f..abc4f971e 100644 --- a/src/Samples/CQRSWithMarten/TeleHealth.Common/BoardView.cs +++ b/src/Samples/CQRSWithMarten/TeleHealth.Common/BoardView.cs @@ -15,9 +15,9 @@ public class BoardView public DateTimeOffset? Finished { get; set; } - public string CloseReason { get; set; } + public string CloseReason { get; set; } = null!; - public string Name { get; set; } + public string Name { get; set; } = null!; public Guid Id { get; set; } @@ -58,7 +58,7 @@ public void RemoveProvider(Guid providerShiftId) public class BoardAppointment { public Guid AppointmentId { get; set; } - public string PatientName { get; set; } + public string PatientName { get; set; } = null!; public DateTimeOffset OriginalEstimatedTime { get; set; } public DateTimeOffset CurrentEstimatedTime { get; set; } public AppointmentStatus Status { get; set; } @@ -69,7 +69,7 @@ public class BoardAppointment public class BoardProvider { - public Provider Provider { get; set; } + public Provider Provider { get; set; } = null!; public Guid ShiftId { get; set; } public ProviderStatus Status { get; set; } } \ No newline at end of file diff --git a/src/Samples/CQRSWithMarten/TeleHealth.Common/BoardViewProjection.cs b/src/Samples/CQRSWithMarten/TeleHealth.Common/BoardViewProjection.cs index b17063b60..823db5183 100644 --- a/src/Samples/CQRSWithMarten/TeleHealth.Common/BoardViewProjection.cs +++ b/src/Samples/CQRSWithMarten/TeleHealth.Common/BoardViewProjection.cs @@ -44,7 +44,7 @@ public async Task Apply(IEvent @event, BoardView view, IQuery var patient = await session.LoadAsync(routed.PatientId); var appointment = new BoardAppointment { - PatientName = $"{patient.FirstName} {patient.LastName}", + PatientName = $"{patient!.FirstName} {patient.LastName}", OriginalEstimatedTime = routed.EstimatedTime, CurrentEstimatedTime = routed.EstimatedTime, Status = AppointmentStatus.Requested, @@ -90,7 +90,7 @@ public async Task Apply(IEvent joined, BoardView view, IQuerySes var provider = await session.LoadAsync(joined.Data.ProviderId); var boardProvider = new BoardProvider { - Provider = provider, + Provider = provider!, ShiftId = joined.StreamId, Status = ProviderStatus.Ready }; diff --git a/src/Samples/CQRSWithMarten/TeleHealth.Common/Boards.cs b/src/Samples/CQRSWithMarten/TeleHealth.Common/Boards.cs index 74fc2521b..baf0e274a 100644 --- a/src/Samples/CQRSWithMarten/TeleHealth.Common/Boards.cs +++ b/src/Samples/CQRSWithMarten/TeleHealth.Common/Boards.cs @@ -22,13 +22,13 @@ public Board(BoardOpened opened) } public Guid Id { get; set; } - public string Name { get; } + public string Name { get; } = null!; public DateTimeOffset Activated { get; set; } public DateTimeOffset? Finished { get; set; } public DateOnly Date { get; set; } public DateTimeOffset? Closed { get; set; } - public string CloseReason { get; private set; } + public string CloseReason { get; private set; } = null!; public void Apply(BoardFinished finished) { diff --git a/src/Samples/CQRSWithMarten/TeleHealth.Common/ProviderShift.cs b/src/Samples/CQRSWithMarten/TeleHealth.Common/ProviderShift.cs index dfdada60f..1cd83fe86 100644 --- a/src/Samples/CQRSWithMarten/TeleHealth.Common/ProviderShift.cs +++ b/src/Samples/CQRSWithMarten/TeleHealth.Common/ProviderShift.cs @@ -10,7 +10,7 @@ public class ProviderShift public Guid BoardId { get; private set; } public Guid ProviderId { get; init; } public ProviderStatus Status { get; private set; } - public string Name { get; init; } + public string Name { get; init; } = null!; public Guid? AppointmentId { get; set; } // The Create & Apply methods are conventional targets @@ -26,7 +26,7 @@ public static async Task Create( return new ProviderShift { - Name = $"{provider.FirstName} {provider.LastName}", + Name = $"{provider!.FirstName} {provider.LastName}", Status = ProviderStatus.Ready, ProviderId = joined.ProviderId, BoardId = joined.BoardId diff --git a/src/Samples/CQRSWithMarten/TeleHealth.Common/Providers.cs b/src/Samples/CQRSWithMarten/TeleHealth.Common/Providers.cs index 4ee3d02dd..efaef6a16 100644 --- a/src/Samples/CQRSWithMarten/TeleHealth.Common/Providers.cs +++ b/src/Samples/CQRSWithMarten/TeleHealth.Common/Providers.cs @@ -25,8 +25,8 @@ public enum ProviderStatus public class Provider { public Guid Id { get; set; } - public string FirstName { get; set; } - public string LastName { get; set; } + public string FirstName { get; set; } = null!; + public string LastName { get; set; } = null!; public bool CanJoin(Board board) { diff --git a/src/Samples/CQRSWithMarten/TeleHealth.Tests/GettingStarted.cs b/src/Samples/CQRSWithMarten/TeleHealth.Tests/GettingStarted.cs index 6075c76b4..73af8d891 100644 --- a/src/Samples/CQRSWithMarten/TeleHealth.Tests/GettingStarted.cs +++ b/src/Samples/CQRSWithMarten/TeleHealth.Tests/GettingStarted.cs @@ -105,6 +105,6 @@ public async Task start_a_new_shift() var shift = await session.Events.AggregateStreamAsync(shiftId, timestamp: DateTime.Today.AddHours(13)); - shift.Name.ShouldBe("Larry Bird"); + shift!.Name.ShouldBe("Larry Bird"); } } \ No newline at end of file diff --git a/src/Samples/CQRSWithMarten/TeleHealth.Tests/TestOutputMartenLogger.cs b/src/Samples/CQRSWithMarten/TeleHealth.Tests/TestOutputMartenLogger.cs index 7ad74695b..b62c72f96 100644 --- a/src/Samples/CQRSWithMarten/TeleHealth.Tests/TestOutputMartenLogger.cs +++ b/src/Samples/CQRSWithMarten/TeleHealth.Tests/TestOutputMartenLogger.cs @@ -17,8 +17,8 @@ public TestOutputMartenLogger(ITestOutputHelper output) _output = output ?? _noopTestOutputHelper; } - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, - Func formatter) + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, + Func formatter) { if (logLevel == LogLevel.Error) { @@ -31,7 +31,7 @@ public bool IsEnabled(LogLevel logLevel) return true; } - public IDisposable BeginScope(TState state) + public IDisposable BeginScope(TState state) where TState : notnull { throw new NotImplementedException(); } diff --git a/src/Samples/CQRSWithMarten/TeleHealth.WebApi/Program.cs b/src/Samples/CQRSWithMarten/TeleHealth.WebApi/Program.cs index 56a0bf3e1..af57005d4 100644 --- a/src/Samples/CQRSWithMarten/TeleHealth.WebApi/Program.cs +++ b/src/Samples/CQRSWithMarten/TeleHealth.WebApi/Program.cs @@ -65,7 +65,7 @@ .Configuration .GetConnectionString("marten"); - opts.Connection(connString); + opts.Connection(connString!); // There will be more here later... diff --git a/src/Samples/CQRSWithMarten/TeleHealth.WebApi/ProviderShiftEndpoint.cs b/src/Samples/CQRSWithMarten/TeleHealth.WebApi/ProviderShiftEndpoint.cs index d921565bb..d5b5fbe24 100644 --- a/src/Samples/CQRSWithMarten/TeleHealth.WebApi/ProviderShiftEndpoint.cs +++ b/src/Samples/CQRSWithMarten/TeleHealth.WebApi/ProviderShiftEndpoint.cs @@ -33,7 +33,7 @@ public static class StartProviderShiftEndpoint var board = await session.LoadAsync(command.BoardId); var provider = await session.LoadAsync(command.ProviderId); - if (board == null || provider == null) return (board, provider, Results.BadRequest()); + if (board == null || provider == null) return (board!, provider!, Results.BadRequest()); // This just means "full speed ahead" return (board, provider, WolverineContinue.Result()); @@ -146,8 +146,8 @@ public async Task Post( HttpContext.RequestAborted); // The current state - var shift = stream.Aggregate; - + var shift = stream.Aggregate!; + if (shift.Status != ProviderStatus.Charting) { // Obviously do something smarter in your app, but you diff --git a/src/Samples/ChaosSender/MessageRecord.cs b/src/Samples/ChaosSender/MessageRecord.cs index ade9d9784..3e5de304f 100644 --- a/src/Samples/ChaosSender/MessageRecord.cs +++ b/src/Samples/ChaosSender/MessageRecord.cs @@ -12,5 +12,5 @@ public static MessageRecord For(ITrackedMessage message) } public Guid Id { get; set; } - public string TypeName { get; set; } + public string TypeName { get; set; } = null!; } \ No newline at end of file diff --git a/src/Samples/CommandBus/HandlerCode.cs b/src/Samples/CommandBus/HandlerCode.cs index 37abbe3b8..a6a7dbe51 100644 --- a/src/Samples/CommandBus/HandlerCode.cs +++ b/src/Samples/CommandBus/HandlerCode.cs @@ -15,7 +15,7 @@ public class Reservation { public Guid Id { get; set; } public DateTimeOffset Time { get; set; } - public string RestaurantName { get; set; } + public string RestaurantName { get; set; } = null!; public bool IsConfirmed { get; set; } } diff --git a/src/Samples/DocumentationSamples/CascadingSamples.cs b/src/Samples/DocumentationSamples/CascadingSamples.cs index 7313f9caf..f1c1da4d2 100644 --- a/src/Samples/DocumentationSamples/CascadingSamples.cs +++ b/src/Samples/DocumentationSamples/CascadingSamples.cs @@ -61,7 +61,7 @@ public ValueTask GatherResponse() public class DirectionRequest { - public string Direction { get; set; } + public string Direction { get; set; } = null!; } public class GoNorth; @@ -83,7 +83,7 @@ public object Consume(DirectionRequest request) } // This does nothing - return null; + return null!; } } diff --git a/src/Samples/DocumentationSamples/CompoundHandlerSamples.cs b/src/Samples/DocumentationSamples/CompoundHandlerSamples.cs index 2ac5826a5..9787f755d 100644 --- a/src/Samples/DocumentationSamples/CompoundHandlerSamples.cs +++ b/src/Samples/DocumentationSamples/CompoundHandlerSamples.cs @@ -22,7 +22,7 @@ public MissingOrderException(Guid commandOrderId) public class Customer { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } #region sample_ShipOrderHandler @@ -40,7 +40,7 @@ public static class ShipOrderHandler var customer = await session.LoadAsync(command.CustomerId); - return (order, customer); + return (order, customer!); } // By making this method completely synchronous and having it just receive the diff --git a/src/Samples/DocumentationSamples/EndpointConfiguration.cs b/src/Samples/DocumentationSamples/EndpointConfiguration.cs index c513de6e4..9f65b93bd 100644 --- a/src/Samples/DocumentationSamples/EndpointConfiguration.cs +++ b/src/Samples/DocumentationSamples/EndpointConfiguration.cs @@ -42,7 +42,7 @@ public async Task configure_subscriptions() public class CustomSerializer : IMessageSerializer { - public string ContentType { get; } + public string ContentType { get; } = null!; public byte[] Write(Envelope envelope) { diff --git a/src/Samples/DocumentationSamples/EnqueueSamples.cs b/src/Samples/DocumentationSamples/EnqueueSamples.cs index 7a186c96a..ff4729352 100644 --- a/src/Samples/DocumentationSamples/EnqueueSamples.cs +++ b/src/Samples/DocumentationSamples/EnqueueSamples.cs @@ -63,7 +63,7 @@ public static async Task configure_local_conventions() // Or you can customize the usage of queues // per message type - .Named(type => type.Namespace) + .Named(type => type.Namespace!) // Optionally configure the local queues .CustomizeQueues((type, listener) => { listener.Sequential(); }); diff --git a/src/Samples/DocumentationSamples/HappyMealSaga.cs b/src/Samples/DocumentationSamples/HappyMealSaga.cs index cfcd9e9e9..9e133002b 100644 --- a/src/Samples/DocumentationSamples/HappyMealSaga.cs +++ b/src/Samples/DocumentationSamples/HappyMealSaga.cs @@ -7,24 +7,24 @@ namespace DocumentationSamples; public class HappyMealOrder { - public string Drink { get; set; } - public string Toy { get; set; } - public string SideDish { get; set; } - public string MainDish { get; set; } + public string Drink { get; set; } = null!; + public string Toy { get; set; } = null!; + public string SideDish { get; set; } = null!; + public string MainDish { get; set; } = null!; } #endregion public class FetchDrink { - public string DrinkName { get; set; } + public string DrinkName { get; set; } = null!; } public class FetchFries; public class FetchToy { - public string ToyName { get; set; } + public string ToyName { get; set; } = null!; } public class MakeHamburger; @@ -50,7 +50,7 @@ public class HappyMealSaga : Saga // document have an "Id" property, but // that can be overridden public int Id { get; set; } - public HappyMealOrder Order { get; set; } + public HappyMealOrder Order { get; set; } = null!; public bool DrinkReady { get; set; } public bool ToyReady { get; set; } @@ -101,7 +101,7 @@ public class HappyMealSagaNoTuple : Saga // document have an "Id" property, but // that can be overridden public int Id { get; set; } - public HappyMealOrder Order { get; set; } + public HappyMealOrder Order { get; set; } = null!; public bool DrinkReady { get; set; } public bool ToyReady { get; set; } @@ -143,7 +143,7 @@ public class HappyMealSagaAllLocal : Saga // document have an "Id" property, but // that can be overridden public int Id { get; set; } - public HappyMealOrder Order { get; set; } + public HappyMealOrder Order { get; set; } = null!; public bool DrinkReady { get; set; } public bool ToyReady { get; set; } @@ -204,7 +204,7 @@ public class HappyMealSaga2 : Saga // document have an "Id" property, but // that can be overridden public int Id { get; set; } - public HappyMealOrder Order { get; set; } + public HappyMealOrder Order { get; set; } = null!; public bool DrinkReady { get; set; } public bool ToyReady { get; set; } @@ -273,7 +273,7 @@ public class HappyMealSaga3 : Saga // document have an "Id" property, but // that can be overridden public int Id { get; set; } - public HappyMealOrder Order { get; set; } + public HappyMealOrder Order { get; set; } = null!; public bool DrinkReady { get; set; } public bool ToyReady { get; set; } diff --git a/src/Samples/DocumentationSamples/MessageVersioning.cs b/src/Samples/DocumentationSamples/MessageVersioning.cs index e8e8ad697..69d794803 100644 --- a/src/Samples/DocumentationSamples/MessageVersioning.cs +++ b/src/Samples/DocumentationSamples/MessageVersioning.cs @@ -14,8 +14,8 @@ namespace FirstTry public class PersonBorn { - public string FirstName { get; set; } - public string LastName { get; set; } + public string FirstName { get; set; } = null!; + public string LastName { get; set; } = null!; // This is obviously a contrived example // so just let this go for now;) @@ -49,8 +49,8 @@ namespace SecondTry [MessageIdentity("person-born")] public class PersonBorn { - public string FirstName { get; set; } - public string LastName { get; set; } + public string FirstName { get; set; } = null!; + public string LastName { get; set; } = null!; public int Day { get; set; } public int Month { get; set; } public int Year { get; set; } @@ -80,8 +80,8 @@ namespace ThirdTry [MessageIdentity("person-born", Version = 2)] public class PersonBornV2 { - public string FirstName { get; set; } - public string LastName { get; set; } + public string FirstName { get; set; } = null!; + public string LastName { get; set; } = null!; public DateTime Birthday { get; set; } } @@ -91,8 +91,8 @@ public class PersonBornV2 public class PersonBorn : IForwardsTo { - public string FirstName { get; set; } - public string LastName { get; set; } + public string FirstName { get; set; } = null!; + public string LastName { get; set; } = null!; public int Day { get; set; } public int Month { get; set; } public int Year { get; set; } @@ -130,8 +130,8 @@ public static void Handle(PersonBornV2 person) public class MyCustomWriter : IMessageSerializer { - public Type DotNetType { get; } - public string? ContentType { get; } + public Type DotNetType { get; } = null!; + public string ContentType { get; } = null!; public byte[] Write(Envelope model) { @@ -143,7 +143,7 @@ public object ReadFromData(Type messageType, Envelope envelope) throw new NotImplementedException(); } - public object? ReadFromData(byte[]? data) + public object ReadFromData(byte[] data) { throw new NotImplementedException(); } diff --git a/src/Samples/DocumentationSamples/Middleware.cs b/src/Samples/DocumentationSamples/Middleware.cs index 55bb5222d..2144d325b 100644 --- a/src/Samples/DocumentationSamples/Middleware.cs +++ b/src/Samples/DocumentationSamples/Middleware.cs @@ -158,7 +158,7 @@ public class StopwatchFrame : SyncFrame { private readonly IChain _chain; private readonly Variable _stopwatch; - private Variable _logger; + private Variable _logger = null!; public StopwatchFrame(IChain chain) { diff --git a/src/Samples/DocumentationSamples/MissingHandlerSample.cs b/src/Samples/DocumentationSamples/MissingHandlerSample.cs index f429b5d45..ee459d199 100644 --- a/src/Samples/DocumentationSamples/MissingHandlerSample.cs +++ b/src/Samples/DocumentationSamples/MissingHandlerSample.cs @@ -15,7 +15,7 @@ public ValueTask HandleAsync(IEnvelopeLifecycle context, IWolverineRuntime root) { var bus = new MessageBus(root); return bus.PublishAsync(new PostInSlack("Incidents", - $"Got an unknown message with type '{context.Envelope.MessageType}' and id {context.Envelope.Id}")); + $"Got an unknown message with type '{context.Envelope!.MessageType}' and id {context.Envelope.Id}")); } } diff --git a/src/Samples/DocumentationSamples/PublishingSamples.cs b/src/Samples/DocumentationSamples/PublishingSamples.cs index 446f7660a..c4cfd9d9e 100644 --- a/src/Samples/DocumentationSamples/PublishingSamples.cs +++ b/src/Samples/DocumentationSamples/PublishingSamples.cs @@ -242,9 +242,9 @@ public record Answer public class InvoiceCreated { public DateTimeOffset Time { get; set; } - public string Purchaser { get; set; } + public string Purchaser { get; set; } = null!; public double Amount { get; set; } - public string Item { get; set; } + public string Item { get; set; } = null!; } public class SomeMessage; @@ -280,7 +280,7 @@ public record ImageGenerated(Guid Id, byte[] Image); public class Customer { - public string Id { get; set; } + public string Id { get; set; } = null!; public bool PremiumMembership { get; set; } } @@ -288,15 +288,13 @@ public class ImageSaga : Saga { public Guid Id { get; set; } - public string CustomerId { get; set; } + public string CustomerId { get; set; } = null!; public Task Handle(ImageGenerated generated) { // look up the customer, figure out how to send the // image to their client. throw new NotImplementedException("Not done yet:)"); - - MarkCompleted(); } } @@ -309,7 +307,7 @@ public static Task LoadAsync( IDocumentSession session, CancellationToken cancellationToken) { - return session.LoadAsync(request.CustomerId, cancellationToken); + return session.LoadAsync(request.CustomerId, cancellationToken)!; } public static (RoutedToEndpointMessage, ImageSaga) Handle( diff --git a/src/Samples/DocumentationSamples/StubbingHandlers.cs b/src/Samples/DocumentationSamples/StubbingHandlers.cs index d7d3df780..a64504c74 100644 --- a/src/Samples/DocumentationSamples/StubbingHandlers.cs +++ b/src/Samples/DocumentationSamples/StubbingHandlers.cs @@ -17,7 +17,7 @@ public static async Task configure() builder.UseWolverine(opts => { opts - .UseRabbitMq(builder.Configuration.GetConnectionString("rabbit")) + .UseRabbitMq(builder.Configuration.GetConnectionString("rabbit")!) .AutoProvision(); // Just showing that EstimateDelivery is handled by diff --git a/src/Samples/DocumentationSamples/TestingSupportSamples.cs b/src/Samples/DocumentationSamples/TestingSupportSamples.cs index 79aefeb1e..76d11d77d 100644 --- a/src/Samples/DocumentationSamples/TestingSupportSamples.cs +++ b/src/Samples/DocumentationSamples/TestingSupportSamples.cs @@ -106,7 +106,7 @@ public void handle_a_debit_that_makes_the_account_have_a_low_balance() messages .ShouldHaveMessageOfType(delivery => { - delivery.ScheduleDelay.Value.ShouldNotBe(TimeSpan.Zero); + delivery!.ScheduleDelay!.Value.ShouldNotBe(TimeSpan.Zero); }) .AccountId.ShouldBe(account.Id); @@ -250,7 +250,7 @@ await Task.Delay( public class When_message_is_sent : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Samples/EFCoreSample/ItemService.Tests/end_to_end.cs b/src/Samples/EFCoreSample/ItemService.Tests/end_to_end.cs index 656191cd6..962c03402 100644 --- a/src/Samples/EFCoreSample/ItemService.Tests/end_to_end.cs +++ b/src/Samples/EFCoreSample/ItemService.Tests/end_to_end.cs @@ -97,6 +97,6 @@ public async Task fetch_through_entity_attribute() await context.SaveChangesAsync(); var response = await host.GetAsJson("/api/item/" + id); - response.Name.ShouldBe(name); + response!.Name.ShouldBe(name); } } \ No newline at end of file diff --git a/src/Samples/EFCoreSample/ItemService/CreateItemCommand.cs b/src/Samples/EFCoreSample/ItemService/CreateItemCommand.cs index 8851791ed..f9efe92dc 100644 --- a/src/Samples/EFCoreSample/ItemService/CreateItemCommand.cs +++ b/src/Samples/EFCoreSample/ItemService/CreateItemCommand.cs @@ -2,5 +2,5 @@ namespace ItemService; public class CreateItemCommand { - public string Name { get; set; } + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Samples/EFCoreSample/ItemService/CreateItemWithDbContextNotIntegratedWithOutboxCommandHandler.cs b/src/Samples/EFCoreSample/ItemService/CreateItemWithDbContextNotIntegratedWithOutboxCommandHandler.cs index 5ace6d359..d4fb064b3 100644 --- a/src/Samples/EFCoreSample/ItemService/CreateItemWithDbContextNotIntegratedWithOutboxCommandHandler.cs +++ b/src/Samples/EFCoreSample/ItemService/CreateItemWithDbContextNotIntegratedWithOutboxCommandHandler.cs @@ -4,7 +4,7 @@ namespace ItemService; public class CreateItemWithDbContextNotIntegratedWithOutboxCommand { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class ItemCreatedInDbContextNotIntegratedWithOutbox diff --git a/src/Samples/EFCoreSample/ItemService/Item.cs b/src/Samples/EFCoreSample/ItemService/Item.cs index 45bfa288b..5c3c5ce72 100644 --- a/src/Samples/EFCoreSample/ItemService/Item.cs +++ b/src/Samples/EFCoreSample/ItemService/Item.cs @@ -2,6 +2,6 @@ namespace ItemService; public class Item { - public string Name { get; set; } + public string Name { get; set; } = null!; public Guid Id { get; set; } } \ No newline at end of file diff --git a/src/Samples/EFCoreSample/ItemService/Program.cs b/src/Samples/EFCoreSample/ItemService/Program.cs index 80b7df467..ab94df3c0 100644 --- a/src/Samples/EFCoreSample/ItemService/Program.cs +++ b/src/Samples/EFCoreSample/ItemService/Program.cs @@ -39,7 +39,7 @@ { // Setting up Sql Server-backed message storage // This requires a reference to Wolverine.SqlServer - opts.PersistMessagesWithSqlServer(connectionString, "wolverine"); + opts.PersistMessagesWithSqlServer(connectionString!, "wolverine"); // Set up Entity Framework Core as the support // for Wolverine's transactional middleware diff --git a/src/Samples/InMemoryMediator/CreateItemCommand.cs b/src/Samples/InMemoryMediator/CreateItemCommand.cs index 44b7f7373..68cccbc0c 100644 --- a/src/Samples/InMemoryMediator/CreateItemCommand.cs +++ b/src/Samples/InMemoryMediator/CreateItemCommand.cs @@ -2,5 +2,5 @@ namespace InMemoryMediator; public class CreateItemCommand { - public string Name { get; set; } + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Samples/InMemoryMediator/Item.cs b/src/Samples/InMemoryMediator/Item.cs index b63fdfba7..3d4dc8b92 100644 --- a/src/Samples/InMemoryMediator/Item.cs +++ b/src/Samples/InMemoryMediator/Item.cs @@ -2,6 +2,6 @@ namespace InMemoryMediator; public class Item { - public string Name { get; set; } + public string Name { get; set; } = null!; public Guid Id { get; set; } } \ No newline at end of file diff --git a/src/Samples/InMemoryMediator/Program.cs b/src/Samples/InMemoryMediator/Program.cs index e0e7767fa..a8763d673 100644 --- a/src/Samples/InMemoryMediator/Program.cs +++ b/src/Samples/InMemoryMediator/Program.cs @@ -16,7 +16,7 @@ builder.Host.UseWolverine(opts => { - opts.PersistMessagesWithSqlServer(connectionString); + opts.PersistMessagesWithSqlServer(connectionString!); // If you're also using EF Core, you may want this as well opts.UseEntityFrameworkCoreTransactions(); diff --git a/src/Samples/IncidentService/IncidentService.Tests/when_logging_an_incident.cs b/src/Samples/IncidentService/IncidentService.Tests/when_logging_an_incident.cs index d7eb9542b..1ad11e803 100644 --- a/src/Samples/IncidentService/IncidentService.Tests/when_logging_an_incident.cs +++ b/src/Samples/IncidentService/IncidentService.Tests/when_logging_an_incident.cs @@ -61,7 +61,7 @@ public async Task happy_path_end_to_end() // This wallpapers over the exact projection lifecycle.... var incident = await session.Events.FetchLatest(response.Value); - incident.Status.ShouldBe(IncidentStatus.Pending); + incident!.Status.ShouldBe(IncidentStatus.Pending); } #endregion diff --git a/src/Samples/IncidentService/IncidentService/Program.cs b/src/Samples/IncidentService/IncidentService/Program.cs index e37c8cdec..a26cd85de 100644 --- a/src/Samples/IncidentService/IncidentService/Program.cs +++ b/src/Samples/IncidentService/IncidentService/Program.cs @@ -20,7 +20,7 @@ builder.Services.AddMarten(opts => { var connectionString = builder.Configuration.GetConnectionString("Marten"); - opts.Connection(connectionString); + opts.Connection(connectionString!); opts.DatabaseSchemaName = "incidents"; opts.Projections.Snapshot(SnapshotLifecycle.Inline); diff --git a/src/Samples/KitchenSink/MartenAndRabbitMessages/Issue.cs b/src/Samples/KitchenSink/MartenAndRabbitMessages/Issue.cs index 402cb481b..f2d7ed565 100644 --- a/src/Samples/KitchenSink/MartenAndRabbitMessages/Issue.cs +++ b/src/Samples/KitchenSink/MartenAndRabbitMessages/Issue.cs @@ -6,8 +6,8 @@ public class Issue public Guid? AssigneeId { get; set; } public Guid? OriginatorId { get; set; } - public string Title { get; set; } - public string Description { get; set; } + public string Title { get; set; } = null!; + public string Description { get; set; } = null!; public bool IsOpen { get; set; } public DateTimeOffset Opened { get; set; } diff --git a/src/Samples/Middleware/AppWithMiddleware.Tests/try_out_the_middleware.cs b/src/Samples/Middleware/AppWithMiddleware.Tests/try_out_the_middleware.cs index 364dd6f7c..73421e4e2 100644 --- a/src/Samples/Middleware/AppWithMiddleware.Tests/try_out_the_middleware.cs +++ b/src/Samples/Middleware/AppWithMiddleware.Tests/try_out_the_middleware.cs @@ -65,7 +65,7 @@ public async Task hit() var account2 = await session.LoadAsync(account.Id); // Should be 1000 + 100 - account2.Balance.ShouldBe(900); + account2!.Balance.ShouldBe(900); } [Fact] diff --git a/src/Samples/MultiTenantedTodoService/MultiTenantedTodoWebService.Tests/end_to_end.cs b/src/Samples/MultiTenantedTodoService/MultiTenantedTodoWebService.Tests/end_to_end.cs index 168d36bc4..4d24edc78 100644 --- a/src/Samples/MultiTenantedTodoService/MultiTenantedTodoWebService.Tests/end_to_end.cs +++ b/src/Samples/MultiTenantedTodoService/MultiTenantedTodoWebService.Tests/end_to_end.cs @@ -15,7 +15,7 @@ namespace MultiTenantedTodoWebService.Tests; public class end_to_end : IAsyncLifetime { - private IAlbaHost _host; + private IAlbaHost _host = null!; private async Task createDatabaseIfNotExists(NpgsqlConnection conn, string databaseName) { diff --git a/src/Samples/OrderManagement/Orders/PlaceOrderHandler.cs b/src/Samples/OrderManagement/Orders/PlaceOrderHandler.cs index c58275283..35ae95f69 100644 --- a/src/Samples/OrderManagement/Orders/PlaceOrderHandler.cs +++ b/src/Samples/OrderManagement/Orders/PlaceOrderHandler.cs @@ -55,6 +55,6 @@ ILogger logger var order = await session.LoadAsync(orderId); - return [order, orderPlaced]; + return [order!, orderPlaced]; } } \ No newline at end of file diff --git a/src/Samples/OrderManagement/RetailClient/Customer.cs b/src/Samples/OrderManagement/RetailClient/Customer.cs index 94d42f689..ab4931414 100644 --- a/src/Samples/OrderManagement/RetailClient/Customer.cs +++ b/src/Samples/OrderManagement/RetailClient/Customer.cs @@ -2,7 +2,7 @@ namespace RetailClient; public class Customer { - public string Id { get; set; } - public string Email { get; set; } - public string Name { get; set; } + public string Id { get; set; } = null!; + public string Email { get; set; } = null!; + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Samples/OrderManagement/RetailClient/Program.cs b/src/Samples/OrderManagement/RetailClient/Program.cs index 5c473d885..ec1b1d16c 100644 --- a/src/Samples/OrderManagement/RetailClient/Program.cs +++ b/src/Samples/OrderManagement/RetailClient/Program.cs @@ -1,4 +1,5 @@ -// See https://aka.ms/new-console-template for more information +#pragma warning disable CS0436 // Type conflicts with imported type +// See https://aka.ms/new-console-template for more information using IntegrationTests; using JasperFx.Events; diff --git a/src/Samples/OrderSagaSample/Program.cs b/src/Samples/OrderSagaSample/Program.cs index fbea32f99..662ee5233 100644 --- a/src/Samples/OrderSagaSample/Program.cs +++ b/src/Samples/OrderSagaSample/Program.cs @@ -16,7 +16,7 @@ builder.Services.AddMarten(opts => { var connectionString = builder.Configuration.GetConnectionString("Marten"); - opts.Connection(connectionString); + opts.Connection(connectionString!); opts.DatabaseSchemaName = "orders"; }) diff --git a/src/Samples/Quickstart/Issue.cs b/src/Samples/Quickstart/Issue.cs index f6746f807..661eca811 100644 --- a/src/Samples/Quickstart/Issue.cs +++ b/src/Samples/Quickstart/Issue.cs @@ -6,8 +6,8 @@ public class Issue public Guid? AssigneeId { get; set; } public Guid? OriginatorId { get; set; } - public string Title { get; set; } - public string Description { get; set; } + public string Title { get; set; } = null!; + public string Description { get; set; } = null!; public bool IsOpen { get; set; } public DateTimeOffset Opened { get; set; } diff --git a/src/Samples/Quickstart/IssueCreatedHandler.cs b/src/Samples/Quickstart/IssueCreatedHandler.cs index 590aa304e..8926c76bb 100644 --- a/src/Samples/Quickstart/IssueCreatedHandler.cs +++ b/src/Samples/Quickstart/IssueCreatedHandler.cs @@ -44,7 +44,7 @@ public static class UserAssignedHandler public static void Handle(IssueAssigned assigned, UserRepository users, IssueRepository issues) { var issue = issues.Get(assigned.Id); - var user = users.Get(issue.AssigneeId.Value); + var user = users.Get(issue.AssigneeId!.Value); var message = BuildEmailMessage(issue, user); using var client = new SmtpClient(); client.SendAsync(message, "some token"); diff --git a/src/Samples/Quickstart/User.cs b/src/Samples/Quickstart/User.cs index 65583d9fb..3f9b686e0 100644 --- a/src/Samples/Quickstart/User.cs +++ b/src/Samples/Quickstart/User.cs @@ -3,6 +3,6 @@ namespace Quickstart; public class User { public Guid Id { get; set; } - public string Email { get; set; } - public string Name { get; set; } + public string Email { get; set; } = null!; + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Samples/TodoWebService/TodoWebService/Program.cs b/src/Samples/TodoWebService/TodoWebService/Program.cs index e48794943..fba247ed4 100644 --- a/src/Samples/TodoWebService/TodoWebService/Program.cs +++ b/src/Samples/TodoWebService/TodoWebService/Program.cs @@ -12,7 +12,7 @@ // Adding Marten for persistence builder.Services.AddMarten(opts => { - opts.Connection(builder.Configuration.GetConnectionString("Marten")); + opts.Connection(builder.Configuration.GetConnectionString("Marten")!); opts.DatabaseSchemaName = "todo"; }) .IntegrateWithWolverine(); diff --git a/src/Samples/TodoWebService/TodoWebServiceTests/end_to_end.cs b/src/Samples/TodoWebService/TodoWebServiceTests/end_to_end.cs index 0973b52c7..a9f831a56 100644 --- a/src/Samples/TodoWebService/TodoWebServiceTests/end_to_end.cs +++ b/src/Samples/TodoWebService/TodoWebServiceTests/end_to_end.cs @@ -12,7 +12,7 @@ namespace TodoWebServiceTests; public class end_to_end : IAsyncLifetime { - private IAlbaHost _host; + private IAlbaHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Samples/WebApiWithMarten/Order.cs b/src/Samples/WebApiWithMarten/Order.cs index 6fa94df93..c0a011648 100644 --- a/src/Samples/WebApiWithMarten/Order.cs +++ b/src/Samples/WebApiWithMarten/Order.cs @@ -10,7 +10,7 @@ namespace WebApiWithMarten; public class Order { public Guid Id { get; set; } - public string Description { get; set; } + public string Description { get; set; } = null!; } public record CreateOrder(string Description); diff --git a/src/Samples/WebApiWithMarten/Program.cs b/src/Samples/WebApiWithMarten/Program.cs index be9e48d5f..4322b95a0 100644 --- a/src/Samples/WebApiWithMarten/Program.cs +++ b/src/Samples/WebApiWithMarten/Program.cs @@ -16,7 +16,7 @@ .Configuration .GetConnectionString("postgres"); - opts.Connection(connectionString); + opts.Connection(connectionString!); opts.DatabaseSchemaName = "orders"; }) // Optionally add Marten/Postgresql integration diff --git a/src/Testing/BackPressureTests/BackPressureTests.csproj b/src/Testing/BackPressureTests/BackPressureTests.csproj index cdde4f7c2..083d0fde9 100644 --- a/src/Testing/BackPressureTests/BackPressureTests.csproj +++ b/src/Testing/BackPressureTests/BackPressureTests.csproj @@ -1,6 +1,7 @@ + enable false diff --git a/src/Testing/BackPressureTests/Harness.cs b/src/Testing/BackPressureTests/Harness.cs index fb87bbb8f..4ee1c73e8 100644 --- a/src/Testing/BackPressureTests/Harness.cs +++ b/src/Testing/BackPressureTests/Harness.cs @@ -18,7 +18,7 @@ namespace BackPressureTests; public class MassSender(IHost sender) { private readonly CancellationTokenSource _cancellation = new(); - private Task _task; + private Task _task = null!; public void Cancel() { @@ -51,9 +51,9 @@ public void StartPublishing(int maximum = 5000, TimeSpan? time = null) public class Harness : IAsyncLifetime, IWolverineActivator { - private IHost _sender; + private IHost _sender = null!; private XUnitObserver theObserver; - private IHost _receiver; + private IHost _receiver = null!; public static bool GoSlow { get; set; } = true; public Harness(ITestOutputHelper output) diff --git a/src/Testing/CoreTests/Acceptance/batch_processing.cs b/src/Testing/CoreTests/Acceptance/batch_processing.cs index 69feab7b7..118fc39e5 100644 --- a/src/Testing/CoreTests/Acceptance/batch_processing.cs +++ b/src/Testing/CoreTests/Acceptance/batch_processing.cs @@ -12,7 +12,7 @@ namespace CoreTests.Acceptance; public class batch_processing : IAsyncLifetime { - private IHost theHost; + private IHost theHost = null!; public async Task InitializeAsync() { @@ -67,7 +67,7 @@ public void connects_to_the_local_queue() { var runtime = theHost.GetRuntime(); var localQueue = runtime.Endpoints.EndpointFor(new Uri("local://items")); - localQueue.MaxDegreeOfParallelism.ShouldBe(1); + localQueue!.MaxDegreeOfParallelism.ShouldBe(1); } [Fact] @@ -78,11 +78,11 @@ public void create_batched_message_handler_for_the_element_type() .As() .BuildFor(typeof(Item)) .ShouldBeOfType() - .Handler + .Handler! .ShouldBeOfType>(); - handler.Chain.MessageType.ShouldBe(typeof(Item[])); - handler.Queue.Uri.ShouldBe(new Uri("local://items")); + handler!.Chain!.MessageType.ShouldBe(typeof(Item[])); + handler.Queue!.Uri.ShouldBe(new Uri("local://items")); } [Fact] diff --git a/src/Testing/CoreTests/Acceptance/exporting_service_capabilities.cs b/src/Testing/CoreTests/Acceptance/exporting_service_capabilities.cs index 327190ba2..91ae274eb 100644 --- a/src/Testing/CoreTests/Acceptance/exporting_service_capabilities.cs +++ b/src/Testing/CoreTests/Acceptance/exporting_service_capabilities.cs @@ -7,7 +7,7 @@ namespace CoreTests.Acceptance; public class exporting_service_capabilities : IntegrationContext, IAsyncLifetime { - private ServiceCapabilities theCapabilities; + private ServiceCapabilities theCapabilities = null!; public exporting_service_capabilities(DefaultApp @default) : base(@default) { diff --git a/src/Testing/CoreTests/Acceptance/local_invoke_does_not_publish_the_return_value.cs b/src/Testing/CoreTests/Acceptance/local_invoke_does_not_publish_the_return_value.cs index 341903eea..06e9547ca 100644 --- a/src/Testing/CoreTests/Acceptance/local_invoke_does_not_publish_the_return_value.cs +++ b/src/Testing/CoreTests/Acceptance/local_invoke_does_not_publish_the_return_value.cs @@ -16,7 +16,7 @@ public async Task should_not_publish_the_return_value_when_invoking_locally() var name = "Chris Jones"; var (tracked, response) = await host.InvokeMessageAndWaitAsync(new InvokeCommand(name)); - response.Name.ShouldBe(name); + response!.Name.ShouldBe(name); tracked.Sent.MessagesOf().Any().ShouldBeFalse(); } diff --git a/src/Testing/CoreTests/Acceptance/logging_configuration.cs b/src/Testing/CoreTests/Acceptance/logging_configuration.cs index fbf30493d..b6f0ea9b3 100644 --- a/src/Testing/CoreTests/Acceptance/logging_configuration.cs +++ b/src/Testing/CoreTests/Acceptance/logging_configuration.cs @@ -17,10 +17,10 @@ public logging_configuration(DefaultApp @default) : base(@default) [Fact] public void wolverine_logging_attribute_impacts_handler_chain() { - var chain = Handlers.HandlerFor().As() + var chain = Handlers.HandlerFor()!.As() .Chain; - chain.TelemetryEnabled.ShouldBeFalse(); + chain!.TelemetryEnabled.ShouldBeFalse(); chain.SuccessLogLevel.ShouldBe(LogLevel.None); chain.ProcessingLogLevel.ShouldBe(LogLevel.Trace); } diff --git a/src/Testing/CoreTests/Acceptance/middleware_usage.cs b/src/Testing/CoreTests/Acceptance/middleware_usage.cs index e697cd129..1e1b9a467 100644 --- a/src/Testing/CoreTests/Acceptance/middleware_usage.cs +++ b/src/Testing/CoreTests/Acceptance/middleware_usage.cs @@ -339,7 +339,7 @@ public async Task use_implied_middleware_that_is_inner_type() public class MiddlewareActivity { - public string Name { get; set; } + public string Name { get; set; } = null!; public bool Finished { get; set; } } @@ -377,7 +377,7 @@ public void After(Recorder recorder) public class DisposableSpecialMiddleware : IDisposable { private readonly Recorder _recorder; - private DisposableThing _thing; + private DisposableThing _thing = null!; public DisposableSpecialMiddleware(Recorder recorder) { @@ -587,12 +587,12 @@ public Task BeforeAsync(NumberedMessage message, Recorder r public class RunsScoredMessage : NumberedMessage { - public string Batter { get; set; } + public string Batter { get; set; } = null!; } public class StrikeoutsMessage : NumberedMessage { - public string Pitcher { get; set; } + public string Pitcher { get; set; } = null!; } public static class MessageMatchingMiddleware diff --git a/src/Testing/CoreTests/Acceptance/missing_handlers.cs b/src/Testing/CoreTests/Acceptance/missing_handlers.cs index 3c2fdab0c..6de49ff6c 100644 --- a/src/Testing/CoreTests/Acceptance/missing_handlers.cs +++ b/src/Testing/CoreTests/Acceptance/missing_handlers.cs @@ -45,7 +45,7 @@ public class RecordingMissingHandler : IMissingHandler public ValueTask HandleAsync(IEnvelopeLifecycle context, IWolverineRuntime root) { - Recorded.Add(context.Envelope); + Recorded.Add(context.Envelope!); root.ShouldNotBeNull(); @@ -59,7 +59,7 @@ public class RecordingMissingHandler2 : IMissingHandler public ValueTask HandleAsync(IEnvelopeLifecycle context, IWolverineRuntime root) { - Recorded.Add(context.Envelope); + Recorded.Add(context.Envelope!); root.ShouldNotBeNull(); @@ -73,7 +73,7 @@ public class RecordingMissingHandler3 : IMissingHandler public ValueTask HandleAsync(IEnvelopeLifecycle context, IWolverineRuntime root) { - Recorded.Add(context.Envelope); + Recorded.Add(context.Envelope!); root.ShouldNotBeNull(); diff --git a/src/Testing/CoreTests/Acceptance/multi_tenancy.cs b/src/Testing/CoreTests/Acceptance/multi_tenancy.cs index cff08dbb1..cda61c370 100644 --- a/src/Testing/CoreTests/Acceptance/multi_tenancy.cs +++ b/src/Testing/CoreTests/Acceptance/multi_tenancy.cs @@ -12,7 +12,7 @@ namespace CoreTests.Acceptance; public class multi_tenancy : IAsyncLifetime { private TenantedMessageTracker theTracker = new TenantedMessageTracker(); - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -94,23 +94,23 @@ public static (TenantedResult, TenantedMessage2) Handle(TenantedMessage1 message { tenantId.Value.ShouldBe(envelope.TenantId); - tracker.TrackedOne[message.Id] = envelope.TenantId; - return (new TenantedResult(envelope.TenantId), new TenantedMessage2(message.Id)); + tracker.TrackedOne[message.Id] = envelope.TenantId!; + return (new TenantedResult(envelope.TenantId!), new TenantedMessage2(message.Id)); } public static TenantedMessage3 Handle(TenantedMessage2 message, Envelope envelope, TenantedMessageTracker tracker, TenantId tenantId) { tenantId.Value.ShouldBe(envelope.TenantId); - - tracker.TrackedTwo[message.Id] = envelope.TenantId; + + tracker.TrackedTwo[message.Id] = envelope.TenantId!; return new TenantedMessage3(message.Id); } public static void Handle(TenantedMessage3 message, Envelope envelope, TenantedMessageTracker tracker, TenantId tenantId) { tenantId.Value.ShouldBe(envelope.TenantId); - - tracker.TrackedThree[message.Id] = envelope.TenantId; + + tracker.TrackedThree[message.Id] = envelope.TenantId!; } public static void Handle(TenantedResult result) => Debug.WriteLine("Got a tracked result"); diff --git a/src/Testing/CoreTests/Acceptance/overriding_delivery_options_when_sending.cs b/src/Testing/CoreTests/Acceptance/overriding_delivery_options_when_sending.cs index 7db38b19f..b6c3be25f 100644 --- a/src/Testing/CoreTests/Acceptance/overriding_delivery_options_when_sending.cs +++ b/src/Testing/CoreTests/Acceptance/overriding_delivery_options_when_sending.cs @@ -24,7 +24,7 @@ public void deliver_by_mechanics() var envelope = theSendingRuntime.RoutingFor(typeof(MessageWithSpecialAttribute)) .RouteForPublish(new MessageWithSpecialAttribute(), null).Single(); - envelope.DeliverBy.Value.ShouldBeGreaterThan(DateTimeOffset.UtcNow); + envelope.DeliverBy!.Value.ShouldBeGreaterThan(DateTimeOffset.UtcNow); } [Fact] diff --git a/src/Testing/CoreTests/Acceptance/publish_versus_send_mechanics.cs b/src/Testing/CoreTests/Acceptance/publish_versus_send_mechanics.cs index b2cddef18..a9894d1aa 100644 --- a/src/Testing/CoreTests/Acceptance/publish_versus_send_mechanics.cs +++ b/src/Testing/CoreTests/Acceptance/publish_versus_send_mechanics.cs @@ -35,21 +35,21 @@ public async Task publish_message_with_no_known_subscribers() [Fact] public async Task publish_with_known_subscribers() { - var session = await Host.ExecuteAndWaitAsync(async c => + var session = (await Host.ExecuteAndWaitAsync(async c => { await c.PublishAsync(new Message1()); await c.PublishAsync(new Message2()); - }); + }))!; session .FindEnvelopesWithMessageType(MessageEventType.Sent) .Single() - .Envelope.Destination + .Envelope!.Destination .ShouldBe("local://one".ToUri()); session .FindEnvelopesWithMessageType(MessageEventType.Sent) - .Select(x => x.Envelope.Destination).OrderBy(x => x.ToString()) + .Select(x => x.Envelope!.Destination).OrderBy(x => x!.ToString()) .ShouldHaveTheSameElementsAs("local://one".ToUri(), "local://two".ToUri()); } diff --git a/src/Testing/CoreTests/Acceptance/remote_invocation.cs b/src/Testing/CoreTests/Acceptance/remote_invocation.cs index 9d4f930ae..4132e44cb 100644 --- a/src/Testing/CoreTests/Acceptance/remote_invocation.cs +++ b/src/Testing/CoreTests/Acceptance/remote_invocation.cs @@ -14,15 +14,15 @@ namespace CoreTests.Acceptance; public class remote_invocation : IAsyncLifetime { - private IHost _receiver1; + private IHost _receiver1 = null!; private int _receiver1Port; - private IHost _receiver2; + private IHost _receiver2 = null!; private int _receiver2Port; - private IHost _sender; + private IHost _sender = null!; public async Task InitializeAsync() { @@ -118,13 +118,13 @@ public async Task happy_path_with_auto_routing() var send = session.FindEnvelopesWithMessageType() .Single(x => x.MessageEventType == MessageEventType.Sent); - send.Envelope.DeliverBy.ShouldNotBeNull(); + send!.Envelope!.DeliverBy.ShouldNotBeNull(); var envelope = session.Received.SingleEnvelope(); envelope.Source.ShouldBe("Receiver1"); envelope.Message.ShouldBe(response); - response.Name.ShouldBe("Croaker"); + response!.Name.ShouldBe("Croaker"); } [Fact] @@ -155,13 +155,13 @@ public async Task happy_path_with_explicit_endpoint_name() var send = session.FindEnvelopesWithMessageType() .Single(x => x.MessageEventType == MessageEventType.Sent); - send.Envelope.DeliverBy.ShouldNotBeNull(); + send!.Envelope!.DeliverBy.ShouldNotBeNull(); var envelope = session.Received.SingleEnvelope(); envelope.Source.ShouldBe("Receiver2"); envelope.Message.ShouldBe(response); - response.Name.ShouldBe("Croaker"); + response!.Name.ShouldBe("Croaker"); } [Fact] @@ -182,13 +182,13 @@ public async Task happy_path_with_explicit_endpoint_name_with_response_and_deliv var send = session.FindEnvelopesWithMessageType() .Single(x => x.MessageEventType == MessageEventType.Sent); - send.Envelope.DeliverBy.ShouldNotBeNull(); + send!.Envelope!.DeliverBy.ShouldNotBeNull(); var envelope = session.Received.SingleEnvelope(); envelope.Source.ShouldBe("Receiver2"); envelope.Message.ShouldBe(response); envelope.TenantId.ShouldBe("TheTenant"); - response.Name.ShouldBe("Croaker"); + response!.Name.ShouldBe("Croaker"); } [Fact] @@ -204,7 +204,7 @@ public async Task happy_path_with_explicit_endpoint_name_and_delivery_options() var send = session.FindEnvelopesWithMessageType() .Single(x => x.MessageEventType == MessageEventType.Sent); - send.Envelope.DeliverBy.ShouldNotBeNull(); + send!.Envelope!.DeliverBy.ShouldNotBeNull(); var envelope = session.Received.SingleEnvelope(); envelope.Source.ShouldBe("Receiver2"); @@ -216,7 +216,7 @@ public async Task happy_path_with_explicit_uri_destination() { var destination = new Uri("tcp://localhost:" + _receiver2Port); - Response1 response = default; + Response1 response = default!; Func fetch = async c => response = await c.EndpointFor(destination).InvokeAsync(new Request1 { Name = "Croaker" }); @@ -229,13 +229,13 @@ public async Task happy_path_with_explicit_uri_destination() var send = session.FindEnvelopesWithMessageType() .Single(x => x.MessageEventType == MessageEventType.Sent); - send.Envelope.DeliverBy.ShouldNotBeNull(); + send!.Envelope!.DeliverBy.ShouldNotBeNull(); var envelope = session.Received.SingleEnvelope(); envelope.Source.ShouldBe("Receiver2"); envelope.Message.ShouldBe(response); - response.Name.ShouldBe("Croaker"); + response!.Name.ShouldBe("Croaker"); } [Fact] @@ -280,7 +280,7 @@ public async Task happy_path_send_and_wait_with_auto_routing() var send = session.FindEnvelopesWithMessageType() .Single(x => x.MessageEventType == MessageEventType.Sent); - send.Envelope.DeliverBy.ShouldNotBeNull(); + send!.Envelope!.DeliverBy.ShouldNotBeNull(); var envelope = session.Received.SingleEnvelope(); envelope.Source.ShouldBe("Receiver1"); @@ -298,7 +298,7 @@ public async Task happy_path_send_and_wait_to_specific_endpoint() var send = session.FindEnvelopesWithMessageType() .Single(x => x.MessageEventType == MessageEventType.Sent); - send.Envelope.DeliverBy.ShouldNotBeNull(); + send!.Envelope!.DeliverBy.ShouldNotBeNull(); var envelope = session.Received.SingleEnvelope(); envelope.Source.ShouldBe("Receiver2"); @@ -318,7 +318,7 @@ public async Task happy_path_send_and_wait_to_specific_endpoint_by_uri() var send = session.FindEnvelopesWithMessageType() .Single(x => x.MessageEventType == MessageEventType.Sent); - send.Envelope.DeliverBy.ShouldNotBeNull(); + send!.Envelope!.DeliverBy.ShouldNotBeNull(); var envelope = session.Received.SingleEnvelope(); envelope.Source.ShouldBe("Receiver2"); @@ -426,44 +426,44 @@ public async Task always_publish_response_should_also_publish_on_remote_request_ public class Request1 { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class Request2 { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class Request3 { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class Request4 { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class RequestWithNoHandler; public class Response1 { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class Response3 { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class AlwaysPublishRequest { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class AlwaysPublishResponse { - public string Name { get; set; } + public string Name { get; set; } = null!; } public static class AlwaysPublishResponseReceivedHandler diff --git a/src/Testing/CoreTests/Acceptance/sticky_message_handlers.cs b/src/Testing/CoreTests/Acceptance/sticky_message_handlers.cs index 3ce35be16..09ecac59c 100644 --- a/src/Testing/CoreTests/Acceptance/sticky_message_handlers.cs +++ b/src/Testing/CoreTests/Acceptance/sticky_message_handlers.cs @@ -128,7 +128,7 @@ public class when_building_a_handler_chain_for_sticky_handlers public when_building_a_handler_chain_for_sticky_handlers() { - theOptions.Transports.ForScheme("stub").TryGetEndpoint("stub://green".ToUri()) + theOptions.Transports.ForScheme("stub")!.TryGetEndpoint("stub://green".ToUri())! .EndpointName = "green"; var blue = new HandlerCall(typeof(BlueStickyHandler), nameof(BlueStickyHandler.Handle)); @@ -244,7 +244,7 @@ public static class BlueStickyHandler { public static StickyMessageResponse Handle(StickyMessage message, Envelope envelope) { - return new StickyMessageResponse("blue", message, envelope.Destination); + return new StickyMessageResponse("blue", message, envelope.Destination!); } } @@ -253,7 +253,7 @@ public static class GreenStickyHandler { public static StickyMessageResponse Handle(StickyMessage message, Envelope envelope) { - return new StickyMessageResponse("green", message, envelope.Destination); + return new StickyMessageResponse("green", message, envelope.Destination!); } } @@ -285,7 +285,7 @@ public static class BlueSticky2Handler { public static StickyMessageResponse Handle(StickyMessage2 message, Envelope envelope) { - return new StickyMessageResponse("blue", message, envelope.Destination); + return new StickyMessageResponse("blue", message, envelope.Destination!); } } @@ -293,7 +293,7 @@ public static class GreenSticky2Handler { public static StickyMessageResponse Handle(StickyMessage2 message, Envelope envelope) { - return new StickyMessageResponse("green", message, envelope.Destination); + return new StickyMessageResponse("green", message, envelope.Destination!); } } diff --git a/src/Testing/CoreTests/Acceptance/using_ISendMyself_as_cascading_message.cs b/src/Testing/CoreTests/Acceptance/using_ISendMyself_as_cascading_message.cs index e92fe6bcb..db753d2ac 100644 --- a/src/Testing/CoreTests/Acceptance/using_ISendMyself_as_cascading_message.cs +++ b/src/Testing/CoreTests/Acceptance/using_ISendMyself_as_cascading_message.cs @@ -38,7 +38,7 @@ public async Task using_DelayedMessage_as_cascading() .Distinct() .Single().Envelope; - envelope.Status.ShouldBe(EnvelopeStatus.Scheduled); + envelope!.Status.ShouldBe(EnvelopeStatus.Scheduled); } [Fact] @@ -68,8 +68,8 @@ public async Task using_respond() envelope.Message.ShouldBeOfType() .Number.ShouldBe(58); - envelope.Source.ShouldBe("Receiver"); - envelope.Destination.Port.ShouldBe(senderPort); + envelope!.Source.ShouldBe("Receiver"); + envelope.Destination!.Port.ShouldBe(senderPort); } } diff --git a/src/Testing/CoreTests/Acceptance/using_custom_response.cs b/src/Testing/CoreTests/Acceptance/using_custom_response.cs index 7d798911d..79ec45df4 100644 --- a/src/Testing/CoreTests/Acceptance/using_custom_response.cs +++ b/src/Testing/CoreTests/Acceptance/using_custom_response.cs @@ -38,21 +38,21 @@ public async Task use_response_that_returns_ValueTask() public async Task use_synchronous_response_expect_response() { var (session, message) = await Host.InvokeMessageAndWaitAsync(new SendTag1("blue")); - message.Tag.ShouldBe("blue"); + message!.Tag.ShouldBe("blue"); } [Fact] public async Task use_response_that_returns_Task_expect_response() { var (session, message) = await Host.InvokeMessageAndWaitAsync(new SendTag2("green")); - message.Tag.ShouldBe("green"); + message!.Tag.ShouldBe("green"); } - + [Fact] public async Task use_response_that_returns_ValueTask_expect_response() { var (session, message) = await Host.InvokeMessageAndWaitAsync(new SendTag3("purple")); - message.Tag.ShouldBe("purple"); + message!.Tag.ShouldBe("purple"); } } diff --git a/src/Testing/CoreTests/Acceptance/using_side_effect_as_return_values.cs b/src/Testing/CoreTests/Acceptance/using_side_effect_as_return_values.cs index be161b116..400caf207 100644 --- a/src/Testing/CoreTests/Acceptance/using_side_effect_as_return_values.cs +++ b/src/Testing/CoreTests/Acceptance/using_side_effect_as_return_values.cs @@ -23,7 +23,7 @@ public async Task using_side_effect_as_return_value() var chain = graph.ChainFor(); // Adds the dependency from the methods - chain.ServiceDependencies(host.Services.GetRequiredService(), Type.EmptyTypes).ShouldContain(typeof(Recorder)); + chain!.ServiceDependencies(host.Services.GetRequiredService(), Type.EmptyTypes).ShouldContain(typeof(Recorder)); var recorder = host.Services.GetRequiredService(); diff --git a/src/Testing/CoreTests/Acceptance/using_with_keyed_services.cs b/src/Testing/CoreTests/Acceptance/using_with_keyed_services.cs index 503d0d4ad..aa9a6d540 100644 --- a/src/Testing/CoreTests/Acceptance/using_with_keyed_services.cs +++ b/src/Testing/CoreTests/Acceptance/using_with_keyed_services.cs @@ -9,7 +9,7 @@ namespace CoreTests.Acceptance; public class using_with_keyed_services : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -64,7 +64,7 @@ public async Task use_multiple_parameters_on_handler() public class using_with_keyed_services_and_lamar : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Testing/CoreTests/Acceptance/warn_if_using_wolverine_before_app_is_started.cs b/src/Testing/CoreTests/Acceptance/warn_if_using_wolverine_before_app_is_started.cs index 8cd80457d..ce12359fb 100644 --- a/src/Testing/CoreTests/Acceptance/warn_if_using_wolverine_before_app_is_started.cs +++ b/src/Testing/CoreTests/Acceptance/warn_if_using_wolverine_before_app_is_started.cs @@ -15,9 +15,9 @@ public async Task will_throw_on_operations() var theBus = host.MessageBus(); - await Should.ThrowAsync(async () => theBus.SendAsync(new Message1())); - await Should.ThrowAsync(async () => theBus.PublishAsync(new Message1())); - await Should.ThrowAsync(async () => theBus.InvokeAsync(new Message1())); + await Should.ThrowAsync(async () => _ = theBus.SendAsync(new Message1())); + await Should.ThrowAsync(async () => _ = theBus.PublishAsync(new Message1())); + await Should.ThrowAsync(async () => _ = theBus.InvokeAsync(new Message1())); } } \ No newline at end of file diff --git a/src/Testing/CoreTests/Acceptance/wolverine_as_command_bus.cs b/src/Testing/CoreTests/Acceptance/wolverine_as_command_bus.cs index 66f9185e3..984184a9e 100644 --- a/src/Testing/CoreTests/Acceptance/wolverine_as_command_bus.cs +++ b/src/Testing/CoreTests/Acceptance/wolverine_as_command_bus.cs @@ -36,7 +36,7 @@ public bool IsEnabled(LogLevel logLevel) return true; } - public IDisposable BeginScope(TState state) + public IDisposable BeginScope(TState state) where TState : notnull { return Substitute.For(); } @@ -195,7 +195,7 @@ public class WorkTracker { private readonly TaskCompletionSource _message1 = new(); private readonly TaskCompletionSource _message2 = new(); - public Message5 LastMessage; + public Message5 LastMessage = null!; public Task Message1 => _message1.Task; public Task Message2 => _message2.Task; diff --git a/src/Testing/CoreTests/Bugs/Bug_1182_infinite_loop_codegen.cs b/src/Testing/CoreTests/Bugs/Bug_1182_infinite_loop_codegen.cs index d9d0adf2d..efc496b6a 100644 --- a/src/Testing/CoreTests/Bugs/Bug_1182_infinite_loop_codegen.cs +++ b/src/Testing/CoreTests/Bugs/Bug_1182_infinite_loop_codegen.cs @@ -30,7 +30,7 @@ public async Task do_not_go_into_infinite_loop() }; var ex = Should.Throw(() => builder.GenerateAllCode()); - ex.InnerException.InnerException.ShouldBeOfType(); + ex.InnerException!.InnerException!.ShouldBeOfType(); } } diff --git a/src/Testing/CoreTests/Bugs/Bug_2056_saga_code_generation.cs b/src/Testing/CoreTests/Bugs/Bug_2056_saga_code_generation.cs index 92234e7c0..44bb22772 100644 --- a/src/Testing/CoreTests/Bugs/Bug_2056_saga_code_generation.cs +++ b/src/Testing/CoreTests/Bugs/Bug_2056_saga_code_generation.cs @@ -11,7 +11,7 @@ namespace CoreTests.Bugs; public class Bug_2056_saga_code_generation : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Testing/CoreTests/Bugs/Bug_2073_completed_saga_still_persisted.cs b/src/Testing/CoreTests/Bugs/Bug_2073_completed_saga_still_persisted.cs index a091ffd2d..11f3a1d08 100644 --- a/src/Testing/CoreTests/Bugs/Bug_2073_completed_saga_still_persisted.cs +++ b/src/Testing/CoreTests/Bugs/Bug_2073_completed_saga_still_persisted.cs @@ -9,7 +9,7 @@ namespace CoreTests.Bugs; public class Bug_2073_completed_saga_still_persisted : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Testing/CoreTests/Bugs/Bug_263_return_string_from_load_async.cs b/src/Testing/CoreTests/Bugs/Bug_263_return_string_from_load_async.cs index 043097acb..6ce266f79 100644 --- a/src/Testing/CoreTests/Bugs/Bug_263_return_string_from_load_async.cs +++ b/src/Testing/CoreTests/Bugs/Bug_263_return_string_from_load_async.cs @@ -32,5 +32,5 @@ public void Handle(StringUsingCommand command, string text) Recorded = $"{command.Name}:{text}"; } - public static string Recorded { get; set; } + public static string Recorded { get; set; } = null!; } \ No newline at end of file diff --git a/src/Testing/CoreTests/Bugs/Bug_263_returning_string_from_middleware_method.cs b/src/Testing/CoreTests/Bugs/Bug_263_returning_string_from_middleware_method.cs index a7f5a3420..f65c8d5ea 100644 --- a/src/Testing/CoreTests/Bugs/Bug_263_returning_string_from_middleware_method.cs +++ b/src/Testing/CoreTests/Bugs/Bug_263_returning_string_from_middleware_method.cs @@ -32,7 +32,7 @@ public void Handle(Bug263 command, string text, Context context) context.ShouldNotBeNull(); } - public static string Received { get; set; } + public static string Received { get; set; } = null!; } public class Context; \ No newline at end of file diff --git a/src/Testing/CoreTests/Bugs/Bug_516_allow_for_middleware_to_overwrite_the_original_message.cs b/src/Testing/CoreTests/Bugs/Bug_516_allow_for_middleware_to_overwrite_the_original_message.cs index 6f16a0032..ce587f1bc 100644 --- a/src/Testing/CoreTests/Bugs/Bug_516_allow_for_middleware_to_overwrite_the_original_message.cs +++ b/src/Testing/CoreTests/Bugs/Bug_516_allow_for_middleware_to_overwrite_the_original_message.cs @@ -42,5 +42,5 @@ public static void Handle(ReplacedMessage message) Handled = message; } - public static ReplacedMessage Handled { get; set; } + public static ReplacedMessage Handled { get; set; } = null!; } \ No newline at end of file diff --git a/src/Testing/CoreTests/Compilation/CompilationContext.cs b/src/Testing/CoreTests/Compilation/CompilationContext.cs index 4d2097dd2..0ec31022c 100644 --- a/src/Testing/CoreTests/Compilation/CompilationContext.cs +++ b/src/Testing/CoreTests/Compilation/CompilationContext.cs @@ -9,10 +9,10 @@ namespace CoreTests.Compilation; public abstract class CompilationContext : IDisposable { - private IHost _host; + private IHost _host = null!; - protected Envelope theEnvelope; + protected Envelope theEnvelope = null!; public void Dispose() { @@ -39,13 +39,13 @@ public MessageHandler HandlerFor(Action? configure = _host = WolverineHost.For(configure); } - return _host.Get().HandlerFor(typeof(TMessage)).As(); + return _host.Get().HandlerFor(typeof(TMessage))!.As(); } public async Task Execute(TMessage message) { var handler = HandlerFor(); - theEnvelope = new Envelope(message); + theEnvelope = new Envelope(message!); var context = new MessageContext(_host.Get()); context.ReadEnvelope(theEnvelope, InvocationCallback.Instance); diff --git a/src/Testing/CoreTests/Compilation/can_compile_a_handler_chain_for_an_inner_type.cs b/src/Testing/CoreTests/Compilation/can_compile_a_handler_chain_for_an_inner_type.cs index 8aa53aaf6..8a9c62241 100644 --- a/src/Testing/CoreTests/Compilation/can_compile_a_handler_chain_for_an_inner_type.cs +++ b/src/Testing/CoreTests/Compilation/can_compile_a_handler_chain_for_an_inner_type.cs @@ -20,7 +20,7 @@ public void does_not_blow_up() { _output.WriteLine(Host.Services.GetRequiredService().Options.DescribeHandlerMatch(typeof(ThingWithInner.InnerHandler))); - var chain = Handlers.ChainFor(); + var chain = Handlers.ChainFor()!; var call = chain.Handlers.First(x => x.HandlerType == typeof(ThingWithInner.InnerHandler)); call.ShouldNotBeNull(); } diff --git a/src/Testing/CoreTests/Compilation/can_customize_handler_chains_with_attributes.cs b/src/Testing/CoreTests/Compilation/can_customize_handler_chains_with_attributes.cs index 7d978f202..55769cbab 100644 --- a/src/Testing/CoreTests/Compilation/can_customize_handler_chains_with_attributes.cs +++ b/src/Testing/CoreTests/Compilation/can_customize_handler_chains_with_attributes.cs @@ -19,14 +19,14 @@ private void forMessage(Action action) opts.IncludeType(); opts.IncludeType(); }); - var chain = runtime.Get().HandlerFor().As().Chain; - action(chain); + var chain = runtime.Get().HandlerFor()!.As().Chain; + action(chain!); } [Fact] public void apply_attribute_on_class() { - forMessage(chain => chain.SourceCode.ShouldContain("// fake frame here")); + forMessage(chain => chain.SourceCode!.ShouldContain("// fake frame here")); } [Fact] @@ -34,7 +34,7 @@ public void apply_attribute_on_message_type() { forMessage(chain => { - chain.SourceCode.ShouldContain("// fake frame here"); + chain.SourceCode!.ShouldContain("// fake frame here"); chain.Failures.MaximumAttempts.ShouldBe(5); }); } @@ -42,7 +42,7 @@ public void apply_attribute_on_message_type() [Fact] public void apply_attribute_on_method() { - forMessage(chain => chain.SourceCode.ShouldContain("// fake frame here")); + forMessage(chain => chain.SourceCode!.ShouldContain("// fake frame here")); } } diff --git a/src/Testing/CoreTests/Compilation/enumerable_dependencies.cs b/src/Testing/CoreTests/Compilation/enumerable_dependencies.cs index 1259b4450..1e67c925f 100644 --- a/src/Testing/CoreTests/Compilation/enumerable_dependencies.cs +++ b/src/Testing/CoreTests/Compilation/enumerable_dependencies.cs @@ -22,7 +22,7 @@ public async Task can_use_mixed_scoping_of_array_elements() opts.Services.AddScoped(); opts.CodeGeneration.GeneratedCodeOutputPath = AppContext.BaseDirectory - .ParentDirectory().ParentDirectory().ParentDirectory().AppendPath("Internal", "Generated"); + .ParentDirectory()!.ParentDirectory()!.ParentDirectory()!.AppendPath("Internal", "Generated"); opts.CodeGeneration.TypeLoadMode = TypeLoadMode.Auto; diff --git a/src/Testing/CoreTests/Compilation/handler_that_uses_ilogger.cs b/src/Testing/CoreTests/Compilation/handler_that_uses_ilogger.cs index e2f7f79df..8c4adb535 100644 --- a/src/Testing/CoreTests/Compilation/handler_that_uses_ilogger.cs +++ b/src/Testing/CoreTests/Compilation/handler_that_uses_ilogger.cs @@ -27,7 +27,7 @@ public async Task can_compile_with_ilogger_dependency_Bug_666() var graph = host.Services.GetRequiredService(); var chain = graph.ChainFor(); - _output.WriteLine(chain.SourceCode); + _output.WriteLine(chain!.SourceCode); } } diff --git a/src/Testing/CoreTests/Compilation/handler_with_optional_side_effect.cs b/src/Testing/CoreTests/Compilation/handler_with_optional_side_effect.cs index 6e6b47612..5475d46b0 100644 --- a/src/Testing/CoreTests/Compilation/handler_with_optional_side_effect.cs +++ b/src/Testing/CoreTests/Compilation/handler_with_optional_side_effect.cs @@ -26,7 +26,7 @@ public async Task can_compile_correctly_for_handler_with_optional_side_effect_re var graph = host.Services.GetRequiredService(); var chain = graph.ChainFor(); - _output.WriteLine(chain.SourceCode); + _output.WriteLine(chain!.SourceCode); } [Fact] @@ -40,7 +40,7 @@ public async Task can_compile_correctly_for_handler_with_optional_side_effect_re var graph = host.Services.GetRequiredService(); var chain = graph.ChainFor(); - _output.WriteLine(chain.SourceCode); + _output.WriteLine(chain!.SourceCode); } } diff --git a/src/Testing/CoreTests/Compilation/simple_async_message_handlers.cs b/src/Testing/CoreTests/Compilation/simple_async_message_handlers.cs index 7cf06c791..8b1963235 100644 --- a/src/Testing/CoreTests/Compilation/simple_async_message_handlers.cs +++ b/src/Testing/CoreTests/Compilation/simple_async_message_handlers.cs @@ -51,10 +51,10 @@ public async Task execute_the_simplest_possible_instance_chain() public class AsyncHandler { - public static Message1 LastMessage1; - public static Message2 LastMessage2; - public static Envelope LastEnvelope; - public static IMessageContext LastContext; + public static Message1 LastMessage1 = null!; + public static Message2 LastMessage2 = null!; + public static Envelope LastEnvelope = null!; + public static IMessageContext LastContext = null!; public static Task Handle(Message1 message) { diff --git a/src/Testing/CoreTests/Configuration/HandlerChainSpecificationExtensions.cs b/src/Testing/CoreTests/Configuration/HandlerChainSpecificationExtensions.cs index e9c0ee034..8221debbb 100644 --- a/src/Testing/CoreTests/Configuration/HandlerChainSpecificationExtensions.cs +++ b/src/Testing/CoreTests/Configuration/HandlerChainSpecificationExtensions.cs @@ -12,7 +12,7 @@ public static void ShouldHaveHandler(this HandlerChain chain, Expression x.Method.Name == method.Name).ShouldBeTrue(); + chain.Handlers.Any(x => x.Method.Name == method!.Name).ShouldBeTrue(); } public static void ShouldHaveHandler(this HandlerChain chain, string methodName) diff --git a/src/Testing/CoreTests/Configuration/SenderConfigurationTests.cs b/src/Testing/CoreTests/Configuration/SenderConfigurationTests.cs index 8ebddddf2..c338f77c0 100644 --- a/src/Testing/CoreTests/Configuration/SenderConfigurationTests.cs +++ b/src/Testing/CoreTests/Configuration/SenderConfigurationTests.cs @@ -131,7 +131,7 @@ public class ExtendedMessage : BaseMessage; public class ColorMessage { - public string Color { get; set; } + public string Color { get; set; } = null!; } } diff --git a/src/Testing/CoreTests/Configuration/TopicRoutingTester.cs b/src/Testing/CoreTests/Configuration/TopicRoutingTester.cs index 776943420..fd6e6eb0f 100644 --- a/src/Testing/CoreTests/Configuration/TopicRoutingTester.cs +++ b/src/Testing/CoreTests/Configuration/TopicRoutingTester.cs @@ -13,7 +13,7 @@ public class TopicMessage1; public class ColorMessagee { - public string Color { get; set; } + public string Color { get; set; } = null!; } [MessageIdentity("one")] diff --git a/src/Testing/CoreTests/Configuration/auditing_determination.cs b/src/Testing/CoreTests/Configuration/auditing_determination.cs index 71f65758b..329c5cc2e 100644 --- a/src/Testing/CoreTests/Configuration/auditing_determination.cs +++ b/src/Testing/CoreTests/Configuration/auditing_determination.cs @@ -32,7 +32,7 @@ public void finds_audit_members_from_attributes() public void adds_the_audit_to_activity_code() { var chain = chainFor(); - var lines = chain.SourceCode.ReadLines(); + var lines = chain.SourceCode!.ReadLines(); lines.Any(x => x.Contains("Activity.Current?.SetTag(\"name\", auditedMessage.Name)")).ShouldBeTrue(); lines.Any(x => x.Contains("Activity.Current?.SetTag(\"account.id\", auditedMessage.AccountId)")).ShouldBeTrue(); @@ -47,7 +47,7 @@ public void adds_the_log_start_message_to_code() }); var chain = chainFor(); - var lines = chain.SourceCode.ReadLines(); + var lines = chain.SourceCode!.ReadLines(); var expected = "Log(Microsoft.Extensions.Logging.LogLevel.Information, \"Starting to process CoreTests.Configuration.AuditedMessage ({Id}) with Name: {Name}, AccountIdentifier: {AccountId}\", context.Envelope.Id, auditedMessage.Name, auditedMessage.AccountId)"; @@ -91,7 +91,7 @@ public void use_audit_member_named_id_and_disambiguate() - chain.SourceCode.ShouldContain("\"Starting to process CoreTests.Configuration.AuditedMessage2 ({EnvelopeId} with Id: {Id}, AccountIdentifier: {AccountId}\""); + chain.SourceCode!.ShouldContain("\"Starting to process CoreTests.Configuration.AuditedMessage2 ({EnvelopeId} with Id: {Id}, AccountIdentifier: {AccountId}\""); /* ((Microsoft.Extensions.Logging.ILogger)_loggerForMessage).Log(Microsoft.Extensions.Logging.LogLevel.Information, "Starting to process CoreTests.Configuration.AuditedMessage2 ({EnvelopeId} with Id: {Id}, AccountIdentifier: {AccountId}", context.Envelope.Id, auditedMessage2.Id, auditedMessage2.AccountId); @@ -104,7 +104,7 @@ public void use_audit_member_named_id_and_disambiguate() public class AuditedMessage { [Audit] - public string Name { get; set; } + public string Name { get; set; } = null!; [Audit("AccountIdentifier")] public int AccountId; } @@ -129,7 +129,7 @@ public void Handle(DebitAccount message, ILogger logger, Envelope envelope) public class AuditedMessage2 { [Audit] - public string Id { get; set; } + public string Id { get; set; } = null!; [Audit("AccountIdentifier")] public int AccountId; } diff --git a/src/Testing/CoreTests/Configuration/bootstrapping_specs.cs b/src/Testing/CoreTests/Configuration/bootstrapping_specs.cs index 6fff7f6ca..cb0ed68d0 100644 --- a/src/Testing/CoreTests/Configuration/bootstrapping_specs.cs +++ b/src/Testing/CoreTests/Configuration/bootstrapping_specs.cs @@ -30,7 +30,7 @@ public void registers_the_supplemental_code_files() with(_ => {}); var container = Host.Services.GetRequiredService(); - container.DefaultFor() + container.DefaultFor()! .Lifetime.ShouldBe(ServiceLifetime.Singleton); container.GetAllInstances() @@ -58,7 +58,7 @@ public void can_customize_source_code_generation() chainFor() - .ShouldHaveHandler(x => x.Handle(null, null)); + .ShouldHaveHandler(x => x.Handle(null!, null!)); } [Fact] @@ -93,13 +93,13 @@ public void application_service_registrations_win() opts.Services.AddScoped(); }).Start(); - host.Services.GetRequiredService().DefaultFor().ImplementationType.ShouldBe(typeof(AppsModuleService)); + host.Services.GetRequiredService().DefaultFor()!.ImplementationType.ShouldBe(typeof(AppsModuleService)); } [Fact] public void handler_classes_are_scoped() { - Host.Get().DefaultFor() + Host.Get().DefaultFor()! .Lifetime.ShouldBe(ServiceLifetime.Scoped); } diff --git a/src/Testing/CoreTests/Configuration/configuring_endpoints.cs b/src/Testing/CoreTests/Configuration/configuring_endpoints.cs index 3bc4fc069..1df47a814 100644 --- a/src/Testing/CoreTests/Configuration/configuring_endpoints.cs +++ b/src/Testing/CoreTests/Configuration/configuring_endpoints.cs @@ -82,7 +82,7 @@ private Endpoint findEndpoint(string uri) var endpoint = theOptions.Transports .TryGetEndpoint(uri.ToUri()); - endpoint.Compile(theRuntime); + endpoint!.Compile(theRuntime); return endpoint; } @@ -102,7 +102,7 @@ public void can_override_message_batch_size() { var allEndpoints = theOptions.Transports.AllEndpoints(); var endpoint = allEndpoints.FirstOrDefault(x => x.EndpointName == "sender"); - endpoint.MessageBatchSize.ShouldBe(111); + endpoint!.MessageBatchSize.ShouldBe(111); } [Fact] @@ -253,7 +253,7 @@ public void select_reply_endpoint_with_one_listener() theOptions.PublishAllMessages().ToPort(3333); - theTcpTransport.ReplyEndpoint() + theTcpTransport.ReplyEndpoint()! .Uri.ShouldBe("tcp://localhost:2222".ToUri()); } @@ -265,7 +265,7 @@ public void select_reply_endpoint_with_multiple_listeners_and_one_designated_rep theOptions.ListenAtPort(5555); theOptions.PublishAllMessages().ToPort(3333); - theTcpTransport.ReplyEndpoint() + theTcpTransport.ReplyEndpoint()! .Uri.ShouldBe("tcp://localhost:4444".ToUri()); } diff --git a/src/Testing/CoreTests/Configuration/configuring_idempotency_style.cs b/src/Testing/CoreTests/Configuration/configuring_idempotency_style.cs index df96906bf..fd3cc19fc 100644 --- a/src/Testing/CoreTests/Configuration/configuring_idempotency_style.cs +++ b/src/Testing/CoreTests/Configuration/configuring_idempotency_style.cs @@ -27,12 +27,12 @@ public async Task transactional_middleware_overrides_if_it_has_explicit_value() var runtime = host.GetRuntime(); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.Eager); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.Optimistic); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.Eager); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.Optimistic); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.None); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.None); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.None); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.None); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.None); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.None); } [Fact] @@ -60,16 +60,16 @@ public async Task use_transactional_policies_to_eager() var runtime = host.GetRuntime(); // Just seeing that this caught - runtime.Handlers.ChainFor().IsTransactional.ShouldBeTrue(); + runtime.Handlers.ChainFor()!.IsTransactional.ShouldBeTrue(); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.Eager); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.Eager); // Override by transactional attribute! - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.Optimistic); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.Optimistic); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.Eager); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.Eager); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.Eager); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.Eager); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.Eager); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.Eager); } @@ -92,14 +92,14 @@ public async Task use_transactional_policies_to_optimistic() await host.InvokeAsync(new TM4(Guid.NewGuid())); var runtime = host.GetRuntime(); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.Eager); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.Eager); // Override by transactional attribute! - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.Optimistic); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.Optimistic); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.Optimistic); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.Optimistic); - runtime.Handlers.ChainFor().Idempotency.ShouldBe(IdempotencyStyle.Optimistic); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.Optimistic); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.Optimistic); + runtime.Handlers.ChainFor()!.Idempotency.ShouldBe(IdempotencyStyle.Optimistic); } } diff --git a/src/Testing/CoreTests/Configuration/configuring_middleware.cs b/src/Testing/CoreTests/Configuration/configuring_middleware.cs index 37822530a..ea9afa274 100644 --- a/src/Testing/CoreTests/Configuration/configuring_middleware.cs +++ b/src/Testing/CoreTests/Configuration/configuring_middleware.cs @@ -27,9 +27,9 @@ protected async Task applyMiddleware(Action assertions) using var host = await Host.CreateDefaultBuilder() .UseWolverine(opts => { opts.Policies.AddMiddleware(); }).StartAsync(); - var chain = host.GetRuntime().Handlers.HandlerFor().As().Chain; + var chain = host.GetRuntime().Handlers.HandlerFor()!.As().Chain; - assertions(chain); + assertions(chain!); } [Fact] @@ -72,8 +72,8 @@ public async Task find_message_type_of_middleware() }) .StartAsync(); - var chain = host.GetRuntime().Handlers.HandlerFor().As().Chain; - chain.Middleware[1].ShouldBeOfType().Variable.VariableType + var chain = host.GetRuntime().Handlers.HandlerFor()!.As().Chain; + chain!.Middleware[1].ShouldBeOfType().Variable.VariableType .ShouldBe(typeof(MiddlewareWithMessage)); chain.Middleware[2].ShouldBeCallWithMessageTo(typeof(MiddlewareWithMessage), "Before"); diff --git a/src/Testing/CoreTests/Configuration/configuring_return_value_actions.cs b/src/Testing/CoreTests/Configuration/configuring_return_value_actions.cs index 00b2174da..6ed905cd8 100644 --- a/src/Testing/CoreTests/Configuration/configuring_return_value_actions.cs +++ b/src/Testing/CoreTests/Configuration/configuring_return_value_actions.cs @@ -13,7 +13,7 @@ namespace CoreTests.Configuration; public class configuring_return_value_actions { private readonly HandlerChain - theChain = HandlerChain.For(x => x.Handle(null, null, null), null); + theChain = HandlerChain.For(x => x.Handle(null!, null!, null!), null!); public class ReturnVariableActionTests @@ -111,9 +111,9 @@ public class when_calling_method_on_return_variable public when_calling_method_on_return_variable() { - theVariable.CallMethodOnReturnVariable(x => x.Execute(null), "some description" ); + theVariable.CallMethodOnReturnVariable(x => x.Execute(null!), "some description" ); - var chain = HandlerChain.For(x => x.Handle(null), new HandlerGraph()); + var chain = HandlerChain.For(x => x.Handle(null!), new HandlerGraph()); theVariableAction = theVariable.ReturnAction(chain); } @@ -170,9 +170,9 @@ public class when_calling_method_on_return_variable_if_not_null public when_calling_method_on_return_variable_if_not_null() { - theVariable.CallMethodOnReturnVariableIfNotNull(x => x.Execute(null), "some description" ); + theVariable.CallMethodOnReturnVariableIfNotNull(x => x.Execute(null!), "some description" ); - var chain = HandlerChain.For(x => x.Handle(null), new HandlerGraph()); + var chain = HandlerChain.For(x => x.Handle(null!), new HandlerGraph()); theVariableAction = theVariable.ReturnAction(chain); var wrapper = theVariableAction.ShouldBeOfType>().Frames().Single().ShouldBeOfType(); diff --git a/src/Testing/CoreTests/Configuration/environment_sensitive_configuration.cs b/src/Testing/CoreTests/Configuration/environment_sensitive_configuration.cs index 85d2d262e..01fa3479e 100644 --- a/src/Testing/CoreTests/Configuration/environment_sensitive_configuration.cs +++ b/src/Testing/CoreTests/Configuration/environment_sensitive_configuration.cs @@ -147,5 +147,5 @@ public async Task optimized_mode_uses_given_prod_config_for_non_local_env() public class RegisteredMarker { - public string Name { get; set; } + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Testing/CoreTests/Configuration/find_handlers_with_the_default_handler_discovery.cs b/src/Testing/CoreTests/Configuration/find_handlers_with_the_default_handler_discovery.cs index 953d0c529..de36eb58b 100644 --- a/src/Testing/CoreTests/Configuration/find_handlers_with_the_default_handler_discovery.cs +++ b/src/Testing/CoreTests/Configuration/find_handlers_with_the_default_handler_discovery.cs @@ -36,7 +36,7 @@ public void can_find_handlers_from_static_classes() [Fact] public void does_not_find_handlers_that_do_not_match_the_type_naming_convention() { - chainFor().ShouldNotHaveHandler(x => x.Handle(null)); + chainFor().ShouldNotHaveHandler(x => x.Handle(null!)); } [Fact] @@ -70,7 +70,7 @@ public void ignore_method_marked_as_NotHandler() [Fact] public void will_find_methods_with_parameters_other_than_the_message() { - chainFor().ShouldHaveHandler(x => x.Handle(null, null)); + chainFor().ShouldHaveHandler(x => x.Handle(null!, null!)); } [Fact] @@ -111,7 +111,7 @@ public void Handle(MarkedMessage message) [Fact] public void finds_handlers_that_implement_IWolverineHandler() { - chainFor().ShouldHaveHandler(x => x.Handle(null)); + chainFor().ShouldHaveHandler(x => x.Handle(null!)); } } @@ -134,7 +134,7 @@ public void extra_suffix() { withTypeDiscovery(x => x.Includes.WithNameSuffix("Watcher")); - chainFor().ShouldHaveHandler(x => x.Handle(null)); + chainFor().ShouldHaveHandler(x => x.Handle(null!)); } [Fact] @@ -160,7 +160,7 @@ public void DoWork(DifferentNameMessage message) [Fact] public void use_WolverineHandler_attribute_on_method() { - chainFor().ShouldHaveHandler(x => x.DoWork(null)); + chainFor().ShouldHaveHandler(x => x.DoWork(null!)); } [Fact] diff --git a/src/Testing/CoreTests/ConfiguredMessageExtensionsTests.cs b/src/Testing/CoreTests/ConfiguredMessageExtensionsTests.cs index df9127dbb..bacb3c5b0 100644 --- a/src/Testing/CoreTests/ConfiguredMessageExtensionsTests.cs +++ b/src/Testing/CoreTests/ConfiguredMessageExtensionsTests.cs @@ -90,7 +90,7 @@ public void to_endpoint() message.Message.ShouldBe(inner); message.EndpointName.ShouldBe("foo"); - message.DeliveryOptions.DeliverBy.HasValue.ShouldBeTrue(); + message.DeliveryOptions!.DeliverBy.HasValue.ShouldBeTrue(); } [Fact] @@ -102,7 +102,7 @@ public void to_uri() message.Message.ShouldBe(inner); message.Destination.ShouldBe(destination); - message.DeliveryOptions.DeliverBy.HasValue.ShouldBeTrue(); + message.DeliveryOptions!.DeliverBy.HasValue.ShouldBeTrue(); } [Fact] @@ -126,7 +126,7 @@ public async Task chaining_to_topic() var message = inner.WithTenantId("one").ToTopic("blue"); message.Message.ShouldBeSameAs(inner); message.Topic.ShouldBe("blue"); - message.Options.TenantId.ShouldBe("one"); + message.Options!.TenantId.ShouldBe("one"); var bus = Substitute.For(); await message.As().ApplyAsync(bus); diff --git a/src/Testing/CoreTests/DeliveryOptionsTests.cs b/src/Testing/CoreTests/DeliveryOptionsTests.cs index caae8e51d..a50797701 100644 --- a/src/Testing/CoreTests/DeliveryOptionsTests.cs +++ b/src/Testing/CoreTests/DeliveryOptionsTests.cs @@ -142,7 +142,7 @@ public void override_scheduled_time() options.Override(envelope); - envelope.ScheduledTime.Value.ShouldBe(options.ScheduledTime.Value); + envelope.ScheduledTime!.Value.ShouldBe(options.ScheduledTime!.Value); } [Fact] @@ -170,7 +170,7 @@ public void override_delivery_by_time() options.Override(envelope); - envelope.DeliverBy.Value.ShouldBe(options.DeliverBy.Value); + envelope.DeliverBy!.Value.ShouldBe(options.DeliverBy!.Value); } [Fact] diff --git a/src/Testing/CoreTests/EnvelopeTests.cs b/src/Testing/CoreTests/EnvelopeTests.cs index b5fbabfc6..5ed71b061 100644 --- a/src/Testing/CoreTests/EnvelopeTests.cs +++ b/src/Testing/CoreTests/EnvelopeTests.cs @@ -352,7 +352,7 @@ public void set_schedule_delay() ScheduleDelay = 1.Days() }; - envelope.ScheduledTime.Value.Date.ShouldBe(DateTime.UtcNow.AddDays(1).Date); + envelope.ScheduledTime!.Value.Date.ShouldBe(DateTime.UtcNow.AddDays(1).Date); envelope.ScheduleDelay.ShouldBe(1.Days()); } @@ -364,7 +364,7 @@ public void set_deliver_within() DeliverWithin = 1.Days() }; - envelope.DeliverBy.Value.Date.ShouldBe(DateTime.UtcNow.AddDays(1).Date); + envelope.DeliverBy!.Value.Date.ShouldBe(DateTime.UtcNow.AddDays(1).Date); envelope.DeliverWithin.ShouldBe(1.Days()); } @@ -458,7 +458,7 @@ public when_building_delivery_options_to_mimic_an_envelope() [Fact] public void ack_requested() { - theOptions.AckRequested.Value.ShouldBeTrue(); + theOptions.AckRequested!.Value.ShouldBeTrue(); } [Fact] @@ -470,7 +470,7 @@ public void deduplication_id() [Fact] public void deliver_by() { - theOptions.DeliverBy.Value.ShouldBe(theEnvelope.DeliverBy.Value); + theOptions.DeliverBy!.Value.ShouldBe(theEnvelope.DeliverBy!.Value); } [Fact] @@ -500,7 +500,7 @@ public void tenant_id() [Fact] public void scheduled_time() { - theOptions.ScheduledTime.Value.ShouldBe(theEnvelope.ScheduledTime.Value); + theOptions.ScheduledTime!.Value.ShouldBe(theEnvelope.ScheduledTime!.Value); } [Fact] @@ -600,7 +600,7 @@ public void status_should_be_handled() [Fact] public void keep_until_should_be_set() { - theHandledEnvelope.KeepUntil.Value.ShouldBe(now.AddMinutes(5)); + theHandledEnvelope.KeepUntil!.Value.ShouldBe(now.AddMinutes(5)); } [Fact] diff --git a/src/Testing/CoreTests/ErrorHandling/CircuitBreakerTests.cs b/src/Testing/CoreTests/ErrorHandling/CircuitBreakerTests.cs index 6f06b0317..68aec1be8 100644 --- a/src/Testing/CoreTests/ErrorHandling/CircuitBreakerTests.cs +++ b/src/Testing/CoreTests/ErrorHandling/CircuitBreakerTests.cs @@ -19,10 +19,10 @@ public class CircuitBreakerTests PauseTime = 5.Minutes() }; - private CircuitBreaker _breaker; + private CircuitBreaker _breaker = null!; internal IExceptionMatch theExceptionMatch = new AlwaysMatches(); - private DateTimeOffset theStartingTime; + private readonly DateTimeOffset theStartingTime = DateTimeOffset.UtcNow; internal CircuitBreaker theBreaker { diff --git a/src/Testing/CoreTests/ErrorHandling/CustomActionIndefinitelyIntegrationTests.cs b/src/Testing/CoreTests/ErrorHandling/CustomActionIndefinitelyIntegrationTests.cs index 8953cb918..3d8ebd2fb 100644 --- a/src/Testing/CoreTests/ErrorHandling/CustomActionIndefinitelyIntegrationTests.cs +++ b/src/Testing/CoreTests/ErrorHandling/CustomActionIndefinitelyIntegrationTests.cs @@ -24,7 +24,7 @@ public async Task InitializeAsync() { if (ex is SpecialExceptionForIntegration) { - if (lifecycle.Envelope.Attempts > 3) + if (lifecycle.Envelope!.Attempts > 3) { runtime.MessageTracking.DiscardedEnvelope(lifecycle.Envelope); await lifecycle.CompleteAsync(); @@ -48,17 +48,17 @@ public async Task InitializeAsync() await lifecycle.MoveToDeadLetterQueueAsync(ex); // MoveToDeadLetterQueueAsync doesn't track MovedToErrorQueue, // so we need to call it manually (similar to MoveToErrorQueue continuation) - runtime.MessageTracking.MovedToErrorQueue(lifecycle.Envelope, ex); + runtime.MessageTracking.MovedToErrorQueue(lifecycle.Envelope!, ex); return; } // Otherwise requeue up to the specified max attempts - if (lifecycle.Envelope.Attempts >= 5) + if (lifecycle.Envelope!.Attempts >= 5) { await lifecycle.MoveToDeadLetterQueueAsync(ex); // MoveToDeadLetterQueueAsync doesn't track MovedToErrorQueue, // so we need to call it manually (similar to MoveToErrorQueue continuation) - runtime.MessageTracking.MovedToErrorQueue(lifecycle.Envelope, ex); + runtime.MessageTracking.MovedToErrorQueue(lifecycle.Envelope!, ex); return; } @@ -164,7 +164,7 @@ public class WaitForDiscardedMessage : ITrackedCondition public void Record(EnvelopeRecord record) { - if (record.Envelope.Message is T && record.MessageEventType == MessageEventType.Discarded) + if (record.Envelope!.Message is T && record.MessageEventType == MessageEventType.Discarded) { _found = true; } @@ -182,7 +182,7 @@ public class WaitForDeadLetteredMessage : ITrackedCondition public void Record(EnvelopeRecord record) { - if (record.Envelope.Message is T && record.MessageEventType == MessageEventType.MovedToErrorQueue) + if (record.Envelope!.Message is T && record.MessageEventType == MessageEventType.MovedToErrorQueue) { _found = true; } diff --git a/src/Testing/CoreTests/ErrorHandling/ErrorHandlingContext.cs b/src/Testing/CoreTests/ErrorHandling/ErrorHandlingContext.cs index 36fe2ac76..7e9adfb49 100644 --- a/src/Testing/CoreTests/ErrorHandling/ErrorHandlingContext.cs +++ b/src/Testing/CoreTests/ErrorHandling/ErrorHandlingContext.cs @@ -10,8 +10,8 @@ public class ErrorHandlingContext : IDisposable { protected readonly ErrorCausingMessage theMessage = new(); - private ITrackedSession _session; - private IHost _host; + private ITrackedSession _session = null!; + private IHost _host = null!; public ErrorHandlingContext() { @@ -43,14 +43,14 @@ protected async Task afterProcessingIsComplete() ConfigureOptions(_ => {}); } - _session = await _host + _session = await _host! .TrackActivity() .DoNotAssertOnExceptionsDetected() .SendMessageAndWaitAsync(theMessage); - return _session.AllRecordsInOrder().Where(x => !(x.Envelope.Message is FailureAcknowledgement)).LastOrDefault( + return _session.AllRecordsInOrder().Where(x => !(x.Envelope!.Message is FailureAcknowledgement)).LastOrDefault( x => - x.MessageEventType == MessageEventType.MessageSucceeded || x.MessageEventType == MessageEventType.MovedToErrorQueue); + x.MessageEventType == MessageEventType.MessageSucceeded || x.MessageEventType == MessageEventType.MovedToErrorQueue)!; } protected async Task shouldSucceedOnAttempt(int attempt) @@ -60,12 +60,12 @@ protected async Task shouldSucceedOnAttempt(int attempt) ConfigureOptions(_ => {}); } - var session = await _host + var session = await _host! .TrackActivity() .DoNotAssertOnExceptionsDetected() .SendMessageAndWaitAsync(theMessage); - var record = session.AllRecordsInOrder().Where(x => !(x.Envelope.Message is FailureAcknowledgement)) + var record = session.AllRecordsInOrder().Where(x => !(x.Envelope!.Message is FailureAcknowledgement)) .LastOrDefault(x => x.MessageEventType == MessageEventType.MessageSucceeded || x.MessageEventType == MessageEventType.MovedToErrorQueue); @@ -101,12 +101,12 @@ protected async Task shouldMoveToErrorQueueOnAttempt(int attempt) ConfigureOptions(_ => {}); } - var session = await _host + var session = await _host! .TrackActivity() .DoNotAssertOnExceptionsDetected() .SendMessageAndWaitAsync(theMessage); - var record = session.AllRecordsInOrder().Where(x => !(x.Envelope.Message is FailureAcknowledgement)) + var record = session.AllRecordsInOrder().Where(x => !(x.Envelope!.Message is FailureAcknowledgement)) .LastOrDefault(x => x.MessageEventType == MessageEventType.MessageSucceeded || x.MessageEventType == MessageEventType.MovedToErrorQueue); diff --git a/src/Testing/CoreTests/ErrorHandling/LambdaContinuationTests.cs b/src/Testing/CoreTests/ErrorHandling/LambdaContinuationTests.cs index 78cc04356..79bd12f7b 100644 --- a/src/Testing/CoreTests/ErrorHandling/LambdaContinuationTests.cs +++ b/src/Testing/CoreTests/ErrorHandling/LambdaContinuationTests.cs @@ -76,10 +76,8 @@ public async Task execute_as_inline_with_try_again() [Fact] public void source_mechanics_passes_along_invoke_usage() { - var wasCalled = false; var source = new UserDefinedContinuationSource((_, _, _) => { - wasCalled = true; return new ValueTask(); }) { diff --git a/src/Testing/CoreTests/ErrorHandling/custom_error_action_raises_new_message.cs b/src/Testing/CoreTests/ErrorHandling/custom_error_action_raises_new_message.cs index 3c21897fb..de7fcf6fd 100644 --- a/src/Testing/CoreTests/ErrorHandling/custom_error_action_raises_new_message.cs +++ b/src/Testing/CoreTests/ErrorHandling/custom_error_action_raises_new_message.cs @@ -12,8 +12,8 @@ namespace CoreTests.ErrorHandling; public class custom_error_action_raises_new_message_1 : IAsyncLifetime { - private IHost theReceiver; - private IHost theSender; + private IHost theReceiver = null!; + private IHost theSender = null!; public async Task InitializeAsync() { @@ -84,7 +84,7 @@ public ShippingOrderFailurePolicy() : base( } public override async ValueTask ExecuteAsync(IEnvelopeLifecycle lifecycle, IWolverineRuntime runtime, - DateTimeOffset now, Activity activity) + DateTimeOffset now, Activity? activity) { if (lifecycle.Envelope?.Message is ShipOrder cmd) { @@ -98,8 +98,8 @@ await lifecycle public class custom_error_action_raises_new_message_2 : IAsyncLifetime { - private IHost theReceiver; - private IHost theSender; + private IHost theReceiver = null!; + private IHost theSender = null!; public async Task InitializeAsync() { diff --git a/src/Testing/CoreTests/IntegrationContext.cs b/src/Testing/CoreTests/IntegrationContext.cs index bf35c6401..54b55f847 100644 --- a/src/Testing/CoreTests/IntegrationContext.cs +++ b/src/Testing/CoreTests/IntegrationContext.cs @@ -48,7 +48,7 @@ public DefaultApp() public void Dispose() { Host?.Dispose(); - Host = null; + Host = null!; } public void RecycleIfNecessary() @@ -61,7 +61,7 @@ public void RecycleIfNecessary() public HandlerChain ChainFor() { - return Host.Get().HandlerFor().As().Chain; + return Host.Get().HandlerFor()!.As().Chain!; } } @@ -96,7 +96,7 @@ protected void with(Action configuration) protected HandlerChain chainFor() { - return Handlers.HandlerFor().As().Chain; + return Handlers.HandlerFor()!.As().Chain!; } } diff --git a/src/Testing/CoreTests/Persistence/Sagas/in_memory_saga.cs b/src/Testing/CoreTests/Persistence/Sagas/in_memory_saga.cs index 15dc8a947..300dbdbc7 100644 --- a/src/Testing/CoreTests/Persistence/Sagas/in_memory_saga.cs +++ b/src/Testing/CoreTests/Persistence/Sagas/in_memory_saga.cs @@ -9,7 +9,7 @@ namespace CoreTests.Persistence.Sagas; public class InMemorySagaHost : ISagaHost { - private IHost _host; + private IHost _host = null!; public IHost BuildHost() { @@ -26,25 +26,25 @@ public IHost BuildHost() public Task LoadState(Guid id) where T : Saga { var loadState = _host.Services.GetRequiredService().Load(id); - return Task.FromResult(loadState); + return Task.FromResult(loadState)!; } public Task LoadState(int id) where T : Saga { var loadState = _host.Services.GetRequiredService().Load(id); - return Task.FromResult(loadState); + return Task.FromResult(loadState)!; } public Task LoadState(long id) where T : Saga { var loadState = _host.Services.GetRequiredService().Load(id); - return Task.FromResult(loadState); + return Task.FromResult(loadState)!; } public Task LoadState(string id) where T : Saga { var loadState = _host.Services.GetRequiredService().Load(id); - return Task.FromResult(loadState); + return Task.FromResult(loadState)!; } } diff --git a/src/Testing/CoreTests/Persistence/Sagas/saga_action_discovery.cs b/src/Testing/CoreTests/Persistence/Sagas/saga_action_discovery.cs index 16322c86c..706315ed9 100644 --- a/src/Testing/CoreTests/Persistence/Sagas/saga_action_discovery.cs +++ b/src/Testing/CoreTests/Persistence/Sagas/saga_action_discovery.cs @@ -27,7 +27,7 @@ public saga_action_discovery(DefaultApp @default, ITestOutputHelper output) : ba _output.WriteLine(handlerChain.SourceCode); } - return handlerChain; + return handlerChain!; } [Fact] @@ -41,22 +41,22 @@ public void automatic_audit_of_saga_message_saga_id() { // Force it to compile var handler = Handlers.HandlerFor(); - + var handlerChain = chainFor(); - handlerChain.SourceCode.ShouldContain("System.Diagnostics.Activity.Current?.SetTag(\"Id\", sagaMessage2.Id);"); - + handlerChain.SourceCode!.ShouldContain("System.Diagnostics.Activity.Current?.SetTag(\"Id\", sagaMessage2.Id);"); + handlerChain.AuditedMembers.Single().MemberName .ShouldBe(nameof(SagaMessage2.Id)); } - + [Fact] public void automatic_audit_of_saga_message_saga_id_with_override() { // Force it to compile var handler = Handlers.HandlerFor(); - + var handlerChain = chainFor(); - handlerChain.SourceCode.ShouldContain("System.Diagnostics.Activity.Current?.SetTag(\"id\", sagaMessage1.Id);"); + handlerChain.SourceCode!.ShouldContain("System.Diagnostics.Activity.Current?.SetTag(\"id\", sagaMessage1.Id);"); handlerChain.AuditedMembers.Single().MemberName .ShouldBe("StreamId"); @@ -75,8 +75,8 @@ public void applies_the_saga_id_member_as_an_identity_member() var handlerChain = chainFor(); handlerChain.TryInferMessageIdentity(out var property).ShouldBeTrue(); - - property + + property! .Name.ShouldBe(nameof(SagaMessage1.Id)); handlerChain.InputType().ShouldBe(typeof(SagaMessage1)); diff --git a/src/Testing/CoreTests/Persistence/Sagas/saga_not_found_usages.cs b/src/Testing/CoreTests/Persistence/Sagas/saga_not_found_usages.cs index 18c985cfd..ffaa18cce 100644 --- a/src/Testing/CoreTests/Persistence/Sagas/saga_not_found_usages.cs +++ b/src/Testing/CoreTests/Persistence/Sagas/saga_not_found_usages.cs @@ -32,7 +32,7 @@ public async Task not_found_not_called_if_the_saga_is_found() { withApplication(); - SteppedSaga.NotFoundCommand = null; + SteppedSaga.NotFoundCommand = null!; var id = Guid.NewGuid(); await send(new GuidStart { Id = id }); @@ -85,7 +85,7 @@ public class SteppedSaga : Saga public bool ThreeCompleted { get; set; } public bool FourCompleted { get; set; } - public static CompleteOne NotFoundCommand { get; set; } + public static CompleteOne NotFoundCommand { get; set; } = null!; public void Start(GuidStart start) { @@ -106,7 +106,7 @@ public static void NotFound(CompleteOne one) public CompleteFour StartOrHandle(CompleteTwo two, Envelope envelope) { - Id = Guid.Parse(envelope.SagaId); + Id = Guid.Parse(envelope.SagaId!); TwoCompleted = true; return new CompleteFour(); } diff --git a/src/Testing/CoreTests/Persistence/StorageSamples.cs b/src/Testing/CoreTests/Persistence/StorageSamples.cs index 55a0e1a68..fb0552072 100644 --- a/src/Testing/CoreTests/Persistence/StorageSamples.cs +++ b/src/Testing/CoreTests/Persistence/StorageSamples.cs @@ -10,7 +10,7 @@ public class StorageSamples public class Item { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public interface IProfanityDetector diff --git a/src/Testing/CoreTests/Persistence/using_storage_return_types_and_entity_attributes.cs b/src/Testing/CoreTests/Persistence/using_storage_return_types_and_entity_attributes.cs index b30621b63..04fd1a473 100644 --- a/src/Testing/CoreTests/Persistence/using_storage_return_types_and_entity_attributes.cs +++ b/src/Testing/CoreTests/Persistence/using_storage_return_types_and_entity_attributes.cs @@ -39,8 +39,8 @@ public async Task use_multiple_storage_actions_of_different_types() await Host.InvokeMessageAndWaitAsync(command); var persistor = Host.Services.GetRequiredService(); - persistor.Load(command.Id).Name.ShouldBe(command.TeamName); - persistor.Load(command.Id).Name.ShouldBe(command.PlayerName); + persistor.Load(command.Id)!.Name.ShouldBe(command.TeamName); + persistor.Load(command.Id)!.Name.ShouldBe(command.PlayerName); } [Fact] @@ -58,13 +58,13 @@ public async Task use_tuple_of_multiple_actions_of_same_entity() public class Team { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public class Player { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public record CreateTeamAndPlayer(Guid Id, string TeamName, string PlayerName); @@ -73,7 +73,7 @@ public record CreateMultiplePositions(string First, string Second); public class Position { - public string Id { get; set; } + public string Id { get; set; } = null!; } public static class CreateMultiplePositionsHandler diff --git a/src/Testing/CoreTests/Runtime/Agents/AgentRestrictionsTests.cs b/src/Testing/CoreTests/Runtime/Agents/AgentRestrictionsTests.cs index 623286ed2..c645edd10 100644 --- a/src/Testing/CoreTests/Runtime/Agents/AgentRestrictionsTests.cs +++ b/src/Testing/CoreTests/Runtime/Agents/AgentRestrictionsTests.cs @@ -44,7 +44,7 @@ public void can_bi_directionally_json_serialize_with_STJ() var restrictions2 = JsonSerializer.Deserialize(json); - restrictions.Current.ShouldBe(restrictions2.Current); + restrictions.Current.ShouldBe(restrictions2!.Current); } [Fact] diff --git a/src/Testing/CoreTests/Runtime/Agents/AssignAgentTests.cs b/src/Testing/CoreTests/Runtime/Agents/AssignAgentTests.cs index 0f51ead8f..4a3027f97 100644 --- a/src/Testing/CoreTests/Runtime/Agents/AssignAgentTests.cs +++ b/src/Testing/CoreTests/Runtime/Agents/AssignAgentTests.cs @@ -7,7 +7,7 @@ namespace CoreTests.Runtime.Agents; public class AssignAgentTests : IAsyncLifetime { - private AgentCommands theCascadingMessages; + private AgentCommands theCascadingMessages = null!; private readonly AssignAgent theCommand = new(new Uri("blue://one"), NodeDestination.Standin()); private readonly MockWolverineRuntime theRuntime = new(); diff --git a/src/Testing/CoreTests/Runtime/Agents/ReassignAgentTests.cs b/src/Testing/CoreTests/Runtime/Agents/ReassignAgentTests.cs index 78ca1719c..89382adc7 100644 --- a/src/Testing/CoreTests/Runtime/Agents/ReassignAgentTests.cs +++ b/src/Testing/CoreTests/Runtime/Agents/ReassignAgentTests.cs @@ -7,7 +7,7 @@ namespace CoreTests.Runtime.Agents; public class ReassignAgentTests : IAsyncLifetime { - private AgentCommands theCascadingMessages; + private AgentCommands theCascadingMessages = null!; private readonly ReassignAgent theCommand = new(new Uri("blue://one"), NodeDestination.Standin(), NodeDestination.Standin()); private readonly MockWolverineRuntime theRuntime = new(); diff --git a/src/Testing/CoreTests/Runtime/Agents/StopRemoteAgentTests.cs b/src/Testing/CoreTests/Runtime/Agents/StopRemoteAgentTests.cs index 2572738ca..a6edaf90e 100644 --- a/src/Testing/CoreTests/Runtime/Agents/StopRemoteAgentTests.cs +++ b/src/Testing/CoreTests/Runtime/Agents/StopRemoteAgentTests.cs @@ -7,7 +7,7 @@ namespace CoreTests.Runtime.Agents; public class StopRemoteAgentTests : IAsyncLifetime { - private AgentCommands theCascadingMessages; + private AgentCommands theCascadingMessages = null!; private readonly StopRemoteAgent theCommand = new(new Uri("blue://one"), new NodeDestination(Guid.NewGuid(), new Uri("control://one"))); private readonly MockWolverineRuntime theRuntime = new(); diff --git a/src/Testing/CoreTests/Runtime/Agents/applying_restrictions.cs b/src/Testing/CoreTests/Runtime/Agents/applying_restrictions.cs index f658f4fa3..21530f444 100644 --- a/src/Testing/CoreTests/Runtime/Agents/applying_restrictions.cs +++ b/src/Testing/CoreTests/Runtime/Agents/applying_restrictions.cs @@ -83,8 +83,8 @@ public void add_pinned_restriction_with_current_assignments_that_does_not_move() var node3 = grid.WithNode(3, Guid.NewGuid()).HasCapabilities(capabilities); var node4 = grid.WithNode(4, Guid.NewGuid()).HasCapabilities(capabilities); - grid.NodeFor(4).Assign(blue10); - grid.NodeFor(3).Assign(blue11); + grid.NodeFor(4)!.Assign(blue10); + grid.NodeFor(3)!.Assign(blue11); var restrictions = new AgentRestrictions([]); restrictions.PinAgent(blue10, 4); @@ -114,8 +114,8 @@ public void add_pinned_restriction_with_current_assignments_that_forces_a_move() var node3 = grid.WithNode(3, Guid.NewGuid()).HasCapabilities(capabilities); var node4 = grid.WithNode(4, Guid.NewGuid()).HasCapabilities(capabilities); - grid.NodeFor(1).Assign(blue10); - grid.NodeFor(2).Assign(blue11); + grid.NodeFor(1)!.Assign(blue10); + grid.NodeFor(2)!.Assign(blue11); var restrictions = new AgentRestrictions([]); restrictions.PinAgent(blue10, 4); @@ -254,9 +254,9 @@ public void mixed_pins_and_pauses() blue12Agent.IsPaused.ShouldBeTrue(); blue12Agent.AssignedNode.ShouldBeNull(); - grid.AgentFor(blue2).AssignedNode.AssignedId.ShouldBe(3); + grid.AgentFor(blue2).AssignedNode!.AssignedId.ShouldBe(3); grid.AgentFor(blue3).AssignedNode.ShouldNotBeNull(); - grid.AgentFor(blue4).AssignedNode.AssignedId.ShouldBe(3); + grid.AgentFor(blue4).AssignedNode!.AssignedId.ShouldBe(3); grid.AgentFor(blue5).AssignedNode.ShouldNotBeNull(); grid.AgentFor(blue6).AssignedNode.ShouldNotBeNull(); grid.AgentFor(blue7).AssignedNode.ShouldNotBeNull(); diff --git a/src/Testing/CoreTests/Runtime/CommandBusTests.cs b/src/Testing/CoreTests/Runtime/CommandBusTests.cs index bc170da15..e055984ed 100644 --- a/src/Testing/CoreTests/Runtime/CommandBusTests.cs +++ b/src/Testing/CoreTests/Runtime/CommandBusTests.cs @@ -15,7 +15,7 @@ public void use_current_activity_root_id_as_correlation_id_if_exists() try { var bus = new MessageBus(new MockWolverineRuntime()); - bus.CorrelationId.ShouldBe(activity.RootId); + bus.CorrelationId.ShouldBe(activity!.RootId); } finally { diff --git a/src/Testing/CoreTests/Runtime/Handlers/HandlerCallTester.cs b/src/Testing/CoreTests/Runtime/Handlers/HandlerCallTester.cs index dd17e940a..2e0c20878 100644 --- a/src/Testing/CoreTests/Runtime/Handlers/HandlerCallTester.cs +++ b/src/Testing/CoreTests/Runtime/Handlers/HandlerCallTester.cs @@ -8,8 +8,8 @@ public class HandlerCallTester [Fact] public void could_handle() { - var handler1 = HandlerCall.For(x => x.Interface(null)); - var handler2 = HandlerCall.For(x => x.BaseClass(null)); + var handler1 = HandlerCall.For(x => x.Interface(null!)); + var handler2 = HandlerCall.For(x => x.BaseClass(null!)); handler1.CouldHandleOtherMessageType(typeof(Input1)).ShouldBeTrue(); handler2.CouldHandleOtherMessageType(typeof(Input1)).ShouldBeTrue(); @@ -21,7 +21,7 @@ public void could_handle() [Fact] public void could_handle_is_false_for_its_own_input_type() { - var handler = HandlerCall.For(x => x.OneInOneOut(null)); + var handler = HandlerCall.For(x => x.OneInOneOut(null!)); handler.CouldHandleOtherMessageType(typeof(Input)).ShouldBeFalse(); } diff --git a/src/Testing/CoreTests/Runtime/Handlers/HandlerChainTests.cs b/src/Testing/CoreTests/Runtime/Handlers/HandlerChainTests.cs index 939298a45..38edc01eb 100644 --- a/src/Testing/CoreTests/Runtime/Handlers/HandlerChainTests.cs +++ b/src/Testing/CoreTests/Runtime/Handlers/HandlerChainTests.cs @@ -14,35 +14,35 @@ public class HandlerChainTests [Fact] public void the_default_log_level_is_information() { - var chain = HandlerChain.For(x => x.Go(null), null); + var chain = HandlerChain.For(x => x.Go(null!), null!); chain.SuccessLogLevel.ShouldBe(LogLevel.Information); } [Fact] public void is_transactional_is_false_by_default() { - var chain = HandlerChain.For(x => x.Go(null), null); + var chain = HandlerChain.For(x => x.Go(null!), null!); chain.IsTransactional.ShouldBeFalse(); } [Fact] public void default_idempotency_is_none() { - var chain = HandlerChain.For(x => x.Go(null), null); + var chain = HandlerChain.For(x => x.Go(null!), null!); chain.Idempotency.ShouldBe(IdempotencyStyle.None); } [Fact] public void open_telemetry_enabled_is_true_by_default() { - var chain = HandlerChain.For(x => x.Go(null), null); + var chain = HandlerChain.For(x => x.Go(null!), null!); chain.TelemetryEnabled.ShouldBeTrue(); } [Fact] public void create_by_method() { - var chain = HandlerChain.For(x => x.Go(null), null); + var chain = HandlerChain.For(x => x.Go(null!), null!); chain.MessageType.ShouldBe(typeof(Message1)); var methodCall = chain.Handlers.Single(); @@ -53,7 +53,7 @@ public void create_by_method() [Fact] public void create_by_static_method() { - var chain = HandlerChain.For(nameof(Target.GoStatic), null); + var chain = HandlerChain.For(nameof(Target.GoStatic), null!); chain.MessageType.ShouldBe(typeof(Message2)); @@ -65,14 +65,14 @@ public void create_by_static_method() [Fact] public void default_number_of_max_attempts_is_null() { - var chain = HandlerChain.For(nameof(Target.GoStatic), null); + var chain = HandlerChain.For(nameof(Target.GoStatic), null!); chain.Failures.MaximumAttempts.HasValue.ShouldBeFalse(); } [Fact] public void ignore_message_type_as_service_dependency() { - var chain = HandlerChain.For(nameof(Target.GoStatic), null); + var chain = HandlerChain.For(nameof(Target.GoStatic), null!); chain.ServiceDependencies(ServiceContainer.Empty(), new List()) .ShouldNotContain(typeof(Message2)); } diff --git a/src/Testing/CoreTests/Runtime/Handlers/HandlerChain_TryFindVariable.cs b/src/Testing/CoreTests/Runtime/Handlers/HandlerChain_TryFindVariable.cs index ff3c79662..3efff8c78 100644 --- a/src/Testing/CoreTests/Runtime/Handlers/HandlerChain_TryFindVariable.cs +++ b/src/Testing/CoreTests/Runtime/Handlers/HandlerChain_TryFindVariable.cs @@ -10,7 +10,7 @@ public class HandlerChain_TryFindVariable [Fact] public void for_matching_member_name_on_name_and_type() { - var chain = HandlerChain.For(x => x.Handle(null), new HandlerGraph()); + var chain = HandlerChain.For(x => x.Handle(null!), new HandlerGraph()); chain.TryFindVariable(nameof(CreateThing.Id), ValueSource.InputMember, typeof(Guid), out var variable) .ShouldBeTrue(); @@ -22,7 +22,7 @@ public void for_matching_member_name_on_name_and_type() [Fact] public void miss_on_type() { - var chain = HandlerChain.For(x => x.Handle(null), new HandlerGraph()); + var chain = HandlerChain.For(x => x.Handle(null!), new HandlerGraph()); chain.TryFindVariable(nameof(CreateThing.Id), ValueSource.InputMember, typeof(int), out var variable) .ShouldBeFalse(); @@ -31,7 +31,7 @@ public void miss_on_type() [Fact] public void miss_on_member_name() { - var chain = HandlerChain.For(x => x.Handle(null), new HandlerGraph()); + var chain = HandlerChain.For(x => x.Handle(null!), new HandlerGraph()); chain.TryFindVariable("wrong", ValueSource.InputMember, typeof(Guid), out var variable) .ShouldBeFalse(); @@ -40,7 +40,7 @@ public void miss_on_member_name() [Fact] public void for_matching_member_name_on_name_and_type_and_anything_is_the_source() { - var chain = HandlerChain.For(x => x.Handle(null), new HandlerGraph()); + var chain = HandlerChain.For(x => x.Handle(null!), new HandlerGraph()); chain.TryFindVariable(nameof(CreateThing.Id), ValueSource.Anything, typeof(Guid), out var variable) .ShouldBeTrue(); @@ -52,7 +52,7 @@ public void for_matching_member_name_on_name_and_type_and_anything_is_the_source [Fact] public void miss_on_unsupported_value_sources() { - var chain = HandlerChain.For(x => x.Handle(null), new HandlerGraph()); + var chain = HandlerChain.For(x => x.Handle(null!), new HandlerGraph()); chain.TryFindVariable(nameof(CreateThing.Id), ValueSource.RouteValue, typeof(Guid), out var variable) .ShouldBeFalse(); diff --git a/src/Testing/CoreTests/Runtime/Handlers/HandlerGraphTests.cs b/src/Testing/CoreTests/Runtime/Handlers/HandlerGraphTests.cs index 519d815f7..8f95bda7d 100644 --- a/src/Testing/CoreTests/Runtime/Handlers/HandlerGraphTests.cs +++ b/src/Testing/CoreTests/Runtime/Handlers/HandlerGraphTests.cs @@ -105,7 +105,7 @@ public static void Handle(MarkedMessage message){} public class ConcreteMessage : IMessageAbstraction { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public class ConcreteMessageHandler diff --git a/src/Testing/CoreTests/Runtime/Handlers/MethodInfoExtensionsTester.cs b/src/Testing/CoreTests/Runtime/Handlers/MethodInfoExtensionsTester.cs index 92e598350..ad344a030 100644 --- a/src/Testing/CoreTests/Runtime/Handlers/MethodInfoExtensionsTester.cs +++ b/src/Testing/CoreTests/Runtime/Handlers/MethodInfoExtensionsTester.cs @@ -11,27 +11,27 @@ public class MethodInfoExtensionsTester { private MethodInfo methodFor(Expression> expression) { - return ReflectionHelper.GetMethod(expression); + return ReflectionHelper.GetMethod(expression)!; } [Fact] public void message_type_for_single_parameter_that_is_concrete() { - methodFor(x => x.Go(null)).MessageType() + methodFor(x => x.Go(null!)).MessageType() .ShouldBe(typeof(Message1)); } [Fact] public void message_type_keys_on_name_input() { - methodFor(x => x.Go3(null, null, null)).MessageType() + methodFor(x => x.Go3(null!, null!, null!)).MessageType() .ShouldBe(typeof(Message2)); } [Fact] public void message_type_keys_on_name_message() { - methodFor(x => x.Go2(null, null)).MessageType() + methodFor(x => x.Go2(null!, null!)).MessageType() .ShouldBe(typeof(Message1)); } @@ -44,7 +44,7 @@ public void throw_exception_if_you_have_no_parameters() [Fact] public void use_first_arg_if_it_is_concrete() { - methodFor(x => x.Go7(null, null)).MessageType() + methodFor(x => x.Go7(null!, null!)).MessageType() .ShouldBe(typeof(Message4)); } diff --git a/src/Testing/CoreTests/Runtime/Handlers/finding_service_dependencies_of_a_chain.cs b/src/Testing/CoreTests/Runtime/Handlers/finding_service_dependencies_of_a_chain.cs index b140fbb1d..ee2da8266 100644 --- a/src/Testing/CoreTests/Runtime/Handlers/finding_service_dependencies_of_a_chain.cs +++ b/src/Testing/CoreTests/Runtime/Handlers/finding_service_dependencies_of_a_chain.cs @@ -11,7 +11,7 @@ namespace CoreTests.Runtime.Handlers; public class finding_service_dependencies_of_a_chain { private readonly HandlerChain - theChain = HandlerChain.For(x => x.Handle(null, null, null), null); + theChain = HandlerChain.For(x => x.Handle(null!, null!, null!), null!); private IServiceContainer theContainer; @@ -74,5 +74,9 @@ public interface IService4; public interface IService5; - public class Service5(IService5 five) : IService5; + public class Service5(IService5 _) : IService5 + { + // Reference to suppress CS9113 + public IService5 Inner => _; + } } \ No newline at end of file diff --git a/src/Testing/CoreTests/Runtime/Interop/MassTransitEnvelopeTests.cs b/src/Testing/CoreTests/Runtime/Interop/MassTransitEnvelopeTests.cs index 8ddef468d..aee62c49d 100644 --- a/src/Testing/CoreTests/Runtime/Interop/MassTransitEnvelopeTests.cs +++ b/src/Testing/CoreTests/Runtime/Interop/MassTransitEnvelopeTests.cs @@ -46,7 +46,7 @@ public void create_masstransit_envelope_from_envelope() mtEnvelope.ConversationId.ShouldBe(envelope.ConversationId.ToString()); mtEnvelope.SentTime.ShouldNotBeNull(); - mtEnvelope.ExpirationTime.Value.ShouldBe(envelope.DeliverBy.Value.DateTime); + mtEnvelope.ExpirationTime!.Value.ShouldBe(envelope.DeliverBy!.Value.DateTime); } [Fact] @@ -59,7 +59,7 @@ public void map_headers() [Fact] public void map_the_message_id() { - theEnvelope.Id.ShouldBe(Guid.Parse(theMassTransitEnvelope.MessageId)); + theEnvelope.Id.ShouldBe(Guid.Parse(theMassTransitEnvelope.MessageId!)); } [Fact] @@ -71,7 +71,7 @@ public void map_the_correlation_id() [Fact] public void map_the_conversation_id() { - theEnvelope.ConversationId.ShouldBe(Guid.Parse(theMassTransitEnvelope.ConversationId)); + theEnvelope.ConversationId.ShouldBe(Guid.Parse(theMassTransitEnvelope.ConversationId!)); } [Fact] diff --git a/src/Testing/CoreTests/Runtime/MessageContextTests.cs b/src/Testing/CoreTests/Runtime/MessageContextTests.cs index 23d6268b2..474c37c27 100644 --- a/src/Testing/CoreTests/Runtime/MessageContextTests.cs +++ b/src/Testing/CoreTests/Runtime/MessageContextTests.cs @@ -136,7 +136,7 @@ public void track_envelope_correlation() theEnvelope.TenantId.ShouldBe(theContext.TenantId); theEnvelope.SagaId.ShouldBe("some saga"); - theEnvelope.ConversationId.ShouldBe(theContext.Envelope.ConversationId); + theEnvelope.ConversationId.ShouldBe(theContext.Envelope!.ConversationId); theEnvelope.Source.ShouldBe("MyService"); theEnvelope.CorrelationId.ShouldBe(theContext.CorrelationId); @@ -320,7 +320,7 @@ await theRuntime.Storage.Inbox.Received() [Fact] public void correlation_id_should_be_same_as_original_envelope() { - theContext.CorrelationId.ShouldBe(theContext.Envelope.CorrelationId); + theContext.CorrelationId.ShouldBe(theContext.Envelope!.CorrelationId); } [Fact] diff --git a/src/Testing/CoreTests/Runtime/Routing/NoNamedEndpointRouteTests.cs b/src/Testing/CoreTests/Runtime/Routing/NoNamedEndpointRouteTests.cs index abfc202c4..3912011d6 100644 --- a/src/Testing/CoreTests/Runtime/Routing/NoNamedEndpointRouteTests.cs +++ b/src/Testing/CoreTests/Runtime/Routing/NoNamedEndpointRouteTests.cs @@ -10,7 +10,7 @@ public void throws_descriptive_exception() { var route = new NoNamedEndpointRoute("foo", ["bar", "baz"]); - var ex = Should.Throw(() => route.CreateForSending(null, null, null, null, null)); + var ex = Should.Throw(() => route.CreateForSending(null!, null!, null!, null!, null!)); ex.Message.ShouldBe("Endpoint name 'foo' is invalid. Known endpoints are bar, baz"); } diff --git a/src/Testing/CoreTests/Runtime/Samples/error_handling.cs b/src/Testing/CoreTests/Runtime/Samples/error_handling.cs index ee4cb6308..89a775b25 100644 --- a/src/Testing/CoreTests/Runtime/Samples/error_handling.cs +++ b/src/Testing/CoreTests/Runtime/Samples/error_handling.cs @@ -245,7 +245,7 @@ public void Handle(InvoiceApproved approved) public class InvoiceCreated { public DateTime Time { get; set; } - public string Purchaser { get; set; } + public string Purchaser { get; set; } = null!; public double Amount { get; set; } } @@ -290,11 +290,11 @@ public RaiseAlert(Exception ex) public async ValueTask ExecuteAsync(IEnvelopeLifecycle lifecycle, IWolverineRuntime runtime, - DateTimeOffset now, Activity activity) + DateTimeOffset now, Activity? activity) { await lifecycle.SendAsync(new RescheduledAlert { - Id = lifecycle.Envelope.Id, + Id = lifecycle.Envelope!.Id, ExceptionText = _ex.ToString() }); } @@ -305,5 +305,5 @@ await lifecycle.SendAsync(new RescheduledAlert public class RescheduledAlert { public Guid Id { get; set; } - public string ExceptionText { get; set; } + public string ExceptionText { get; set; } = null!; } \ No newline at end of file diff --git a/src/Testing/CoreTests/Runtime/Stubs/using_stubs_end_to_end.cs b/src/Testing/CoreTests/Runtime/Stubs/using_stubs_end_to_end.cs index d39e55f5e..b7e19759b 100644 --- a/src/Testing/CoreTests/Runtime/Stubs/using_stubs_end_to_end.cs +++ b/src/Testing/CoreTests/Runtime/Stubs/using_stubs_end_to_end.cs @@ -7,8 +7,8 @@ namespace CoreTests.Runtime.Stubs; public class using_stubs_end_to_end : IAsyncLifetime { - private IHost theSender; - private IHost theReceiver; + private IHost theSender = null!; + private IHost theReceiver = null!; public async Task InitializeAsync() { diff --git a/src/Testing/CoreTests/Runtime/SubscriptionTester.cs b/src/Testing/CoreTests/Runtime/SubscriptionTester.cs index 114513fb9..8f083a714 100644 --- a/src/Testing/CoreTests/Runtime/SubscriptionTester.cs +++ b/src/Testing/CoreTests/Runtime/SubscriptionTester.cs @@ -21,7 +21,7 @@ public void description_of_namespace_rule() { var rule = new Subscription { - Match = typeof(RandomClass).Namespace, + Match = typeof(RandomClass).Namespace!, Scope = RoutingScope.Namespace }; rule.ToString().ShouldBe("Message type is within namespace CoreTests.Runtime"); @@ -67,7 +67,7 @@ public void negative_namespace_test() var rule = new Subscription { Scope = RoutingScope.Namespace, - Match = typeof(RedMessage1).Namespace + Match = typeof(RedMessage1).Namespace! }; rule.Matches(typeof(GreenMessage1)).ShouldBeFalse(); @@ -91,7 +91,7 @@ public void positive_namespace_test() var rule = new Subscription { Scope = RoutingScope.Namespace, - Match = typeof(RedMessage1).Namespace + Match = typeof(RedMessage1).Namespace! }; rule.Matches(typeof(RedMessage1)).ShouldBeTrue(); diff --git a/src/Testing/CoreTests/SendingContext.cs b/src/Testing/CoreTests/SendingContext.cs index 0bc11e585..bd5bcccf4 100644 --- a/src/Testing/CoreTests/SendingContext.cs +++ b/src/Testing/CoreTests/SendingContext.cs @@ -10,8 +10,8 @@ namespace CoreTests; public abstract class SendingContext : IAsyncDisposable { private readonly int _senderPort; - private IHost _receiver; - private IHost _sender; + private IHost _receiver = null!; + private IHost _sender = null!; public SendingContext() { diff --git a/src/Testing/CoreTests/Serialization/reading_model_synchronously_by_content_type.cs b/src/Testing/CoreTests/Serialization/reading_model_synchronously_by_content_type.cs index a605f770b..8935232d7 100644 --- a/src/Testing/CoreTests/Serialization/reading_model_synchronously_by_content_type.cs +++ b/src/Testing/CoreTests/Serialization/reading_model_synchronously_by_content_type.cs @@ -2,6 +2,6 @@ public class ConnegMessage { - public string ContentType { get; set; } - public string Name { get; set; } + public string ContentType { get; set; } = null!; + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Testing/CoreTests/Serialization/serialization_and_deserialization.cs b/src/Testing/CoreTests/Serialization/serialization_and_deserialization.cs index 8e31881f5..fdddb9227 100644 --- a/src/Testing/CoreTests/Serialization/serialization_and_deserialization.cs +++ b/src/Testing/CoreTests/Serialization/serialization_and_deserialization.cs @@ -8,7 +8,7 @@ namespace CoreTests.Serialization; public class serialization_and_deserialization_of_single_message { private readonly Envelope outgoing; - private Envelope _incoming; + private Envelope _incoming = null!; public serialization_and_deserialization_of_single_message() { @@ -133,13 +133,13 @@ public void content_type() [Fact] public void data_comes_over() { - incoming.Data.ShouldHaveTheSameElementsAs(outgoing.Data); + incoming.Data!.ShouldHaveTheSameElementsAs(outgoing.Data!); } [Fact] public void deliver_by_with_value() { - incoming.DeliverBy.Value.ShouldBe(outgoing.DeliverBy.Value); + incoming.DeliverBy!.Value.ShouldBe(outgoing.DeliverBy!.Value); } [Fact] @@ -241,6 +241,6 @@ public void partition_key() [Fact] public void keep_until() { - incoming.KeepUntil.Value.ShouldBe(outgoing.KeepUntil.Value); + incoming.KeepUntil!.Value.ShouldBe(outgoing.KeepUntil!.Value); } } \ No newline at end of file diff --git a/src/Testing/CoreTests/Serialization/serialization_configuration.cs b/src/Testing/CoreTests/Serialization/serialization_configuration.cs index 6dc0ee8b5..21082c414 100644 --- a/src/Testing/CoreTests/Serialization/serialization_configuration.cs +++ b/src/Testing/CoreTests/Serialization/serialization_configuration.cs @@ -21,9 +21,9 @@ public async Task by_default_every_endpoint_has_json_serializer_with_default_set var root = host.Services.GetRequiredService(); - root.Endpoints.EndpointFor("stub://one".ToUri()) + root.Endpoints.EndpointFor("stub://one".ToUri())! .DefaultSerializer.ShouldBeOfType(); - root.Endpoints.EndpointFor("stub://two".ToUri()) + root.Endpoints.EndpointFor("stub://two".ToUri())! .DefaultSerializer.ShouldBeOfType(); } @@ -41,10 +41,10 @@ public async Task can_override_the_json_serialization_on_subscriber() }).StartAsync(); var root = host.Services.GetRequiredService(); - root.Endpoints.EndpointFor("stub://one".ToUri()) + root.Endpoints.EndpointFor("stub://one".ToUri())! .DefaultSerializer.ShouldBeOfType(); - root.Endpoints.EndpointFor("stub://two".ToUri()) + root.Endpoints.EndpointFor("stub://two".ToUri())! .DefaultSerializer.ShouldBeOfType() .Settings.ShouldBeSameAs(customSettings); } @@ -64,11 +64,11 @@ public async Task can_find_other_serializer_from_parent() }).StartAsync(); var root = host.Services.GetRequiredService(); - root.Endpoints.EndpointFor("stub://one".ToUri()) + root.Endpoints.EndpointFor("stub://one".ToUri())! .TryFindSerializer("text/foo") .ShouldBeOfType(); - root.Endpoints.EndpointFor("stub://two".ToUri()) + root.Endpoints.EndpointFor("stub://two".ToUri())! .TryFindSerializer("text/foo") .ShouldBeOfType(); } @@ -89,7 +89,7 @@ public async Task can_override_the_default_serializer_on_sender() }).StartAsync(); var root = host.Services.GetRequiredService(); - root.Endpoints.EndpointFor("stub://one".ToUri()) + root.Endpoints.EndpointFor("stub://one".ToUri())! .DefaultSerializer.ShouldBeSameAs(fooSerializer); } @@ -107,10 +107,10 @@ public async Task can_override_the_json_serialization_on_listener() }).StartAsync(); var root = host.Services.GetRequiredService(); - root.Endpoints.EndpointFor("stub://one".ToUri()) + root.Endpoints.EndpointFor("stub://one".ToUri())! .DefaultSerializer.ShouldBeOfType(); - root.Endpoints.EndpointFor("stub://two".ToUri()) + root.Endpoints.EndpointFor("stub://two".ToUri())! .DefaultSerializer.ShouldBeOfType() .Settings.ShouldBeSameAs(customSettings); } @@ -129,10 +129,10 @@ public async Task can_override_the_default_serialization_on_listener() }).StartAsync(); var root = host.Services.GetRequiredService(); - root.Endpoints.EndpointFor("stub://one".ToUri()) + root.Endpoints.EndpointFor("stub://one".ToUri())! .DefaultSerializer.ShouldBeOfType(); - root.Endpoints.EndpointFor("stub://two".ToUri()) + root.Endpoints.EndpointFor("stub://two".ToUri())! .DefaultSerializer.ShouldBeSameAs(fooSerializer); } @@ -150,18 +150,18 @@ public async Task can_override_the_default_app_wide() }).StartAsync(); var root = host.Services.GetRequiredService(); - root.Endpoints.EndpointFor("stub://one".ToUri()) + root.Endpoints.EndpointFor("stub://one".ToUri())! .DefaultSerializer.ShouldBe(fooSerializer); - root.Endpoints.EndpointFor("stub://two".ToUri()) + root.Endpoints.EndpointFor("stub://two".ToUri())! .DefaultSerializer.ShouldBe(fooSerializer); } public class FooSerializer : IMessageSerializer { - public string? ContentType => "text/foo"; + public string ContentType => "text/foo"; - public object? ReadFromData(byte[]? data) + public object ReadFromData(byte[] data) { throw new NotImplementedException(); } diff --git a/src/Testing/CoreTests/Tracking/EnvelopeRecordTests.cs b/src/Testing/CoreTests/Tracking/EnvelopeRecordTests.cs index 3527fe228..4a97edb39 100644 --- a/src/Testing/CoreTests/Tracking/EnvelopeRecordTests.cs +++ b/src/Testing/CoreTests/Tracking/EnvelopeRecordTests.cs @@ -23,13 +23,13 @@ public void creating_a_new_envelope_record_records_otel_activity() .AddConsoleExporter() .Build(); - var root = source.CreateActivity("process", ActivityKind.Internal); + var root = source.CreateActivity("process", ActivityKind.Internal)!; root.Start(); - var parent = source.CreateActivity("process", ActivityKind.Internal); + var parent = source.CreateActivity("process", ActivityKind.Internal)!; parent.Start(); - var child = source.CreateActivity("process", ActivityKind.Internal); + var child = source.CreateActivity("process", ActivityKind.Internal)!; child.Start(); root.ShouldNotBeNull(); @@ -39,8 +39,8 @@ public void creating_a_new_envelope_record_records_otel_activity() var record = new EnvelopeRecord(MessageEventType.Sent, ObjectMother.Envelope(), 1000, null); - root.Id.ShouldContain(record.RootId); - record.ParentId.ShouldContain(parent.Id); + root.Id!.ShouldContain(record.RootId!); + record.ParentId!.ShouldContain(parent.Id!); record.ActivityId.ShouldBe(child.Id); root.Stop(); diff --git a/src/Testing/CoreTests/Tracking/WaitForMessageTester.cs b/src/Testing/CoreTests/Tracking/WaitForMessageTester.cs index a16afcb26..285980a08 100644 --- a/src/Testing/CoreTests/Tracking/WaitForMessageTester.cs +++ b/src/Testing/CoreTests/Tracking/WaitForMessageTester.cs @@ -21,7 +21,7 @@ public void is_completed_with_no_unique_id(MessageEventType eventType, Type mess var message = Activator.CreateInstance(messageType); - waiter.Record(new EnvelopeRecord(eventType, new Envelope(message), 100, null)); + waiter.Record(new EnvelopeRecord(eventType, new Envelope(message!), 100, null)); waiter.IsCompleted().ShouldBe(isCompleted); } @@ -51,7 +51,7 @@ public void is_completed_with_unique_id(MessageEventType eventType, Type message var message = Activator.CreateInstance(messageType); - waiter.Record(new EnvelopeRecord(eventType, new Envelope(message), 100, null) + waiter.Record(new EnvelopeRecord(eventType, new Envelope(message!), 100, null) { UniqueNodeId = guids[nodeId] }); diff --git a/src/Testing/CoreTests/Tracking/when_determining_if_the_session_is_done.cs b/src/Testing/CoreTests/Tracking/when_determining_if_the_session_is_done.cs index 3f9450785..b5c9b9424 100644 --- a/src/Testing/CoreTests/Tracking/when_determining_if_the_session_is_done.cs +++ b/src/Testing/CoreTests/Tracking/when_determining_if_the_session_is_done.cs @@ -69,7 +69,7 @@ public void sending_an_envelope_that_is_local_does_not_finish_a_locally_tracked_ { var history = new EnvelopeHistory(env1.Id); - env1.Destination.Scheme.ShouldBe(TransportConstants.Local); + env1.Destination!.Scheme.ShouldBe(TransportConstants.Local); history.RecordLocally(new EnvelopeRecord(MessageEventType.Sent, env1, 110, null)); history.IsComplete().ShouldBeFalse(); diff --git a/src/Testing/CoreTests/Tracking/when_session_is_tracked_for_published_message_without_handler.cs b/src/Testing/CoreTests/Tracking/when_session_is_tracked_for_published_message_without_handler.cs index f44a177cf..815a995bc 100644 --- a/src/Testing/CoreTests/Tracking/when_session_is_tracked_for_published_message_without_handler.cs +++ b/src/Testing/CoreTests/Tracking/when_session_is_tracked_for_published_message_without_handler.cs @@ -34,9 +34,7 @@ await Task.Delay( public class when_session_is_tracked_for_published_message_without_handler : IAsyncLifetime { private readonly ITestOutputHelper _testOutputHelper; - private IHost _host; - - private IHost _secondHost; + private IHost _host = null!; public when_session_is_tracked_for_published_message_without_handler( ITestOutputHelper testOutputHelper diff --git a/src/Testing/CoreTests/Transports/Local/LocalQueueTests.cs b/src/Testing/CoreTests/Transports/Local/LocalQueueTests.cs index 66710859a..5732d9776 100644 --- a/src/Testing/CoreTests/Transports/Local/LocalQueueTests.cs +++ b/src/Testing/CoreTests/Transports/Local/LocalQueueTests.cs @@ -71,7 +71,7 @@ public void configure_circuit_breaker_options_with_explicit_config() endpoint.Compile(new MockWolverineRuntime()); - endpoint.CircuitBreakerOptions.PauseTime.ShouldBe(23.Minutes()); + endpoint.CircuitBreakerOptions!.PauseTime.ShouldBe(23.Minutes()); endpoint.CircuitBreakerOptions.ShouldNotBeNull(); } diff --git a/src/Testing/CoreTests/Transports/Tcp/Protocol/ProtocolContext.cs b/src/Testing/CoreTests/Transports/Tcp/Protocol/ProtocolContext.cs index aacabf1f3..8e88d3ce3 100644 --- a/src/Testing/CoreTests/Transports/Tcp/Protocol/ProtocolContext.cs +++ b/src/Testing/CoreTests/Transports/Tcp/Protocol/ProtocolContext.cs @@ -84,13 +84,13 @@ public class StubReceiverCallback : IReceiver { public bool ThrowErrorOnReceived; - public Envelope[] MessagesReceived { get; set; } + public Envelope[] MessagesReceived { get; set; } = null!; public bool? WasAcknowledged { get; set; } - public Exception FailureException { get; set; } + public Exception FailureException { get; set; } = null!; - public Uri Address { get; } + public Uri Address { get; } = null!; public ListeningStatus Status { get; set; } public int QueueCount => 0; @@ -100,7 +100,7 @@ public ValueTask DrainAsync() return ValueTask.CompletedTask; } - public IHandlerPipeline Pipeline => null; + public IHandlerPipeline Pipeline => null!; public void Dispose() { diff --git a/src/Testing/CoreTests/Transports/Tcp/TestingListeningAgent.cs b/src/Testing/CoreTests/Transports/Tcp/TestingListeningAgent.cs index 45f4c4beb..28da14f8d 100644 --- a/src/Testing/CoreTests/Transports/Tcp/TestingListeningAgent.cs +++ b/src/Testing/CoreTests/Transports/Tcp/TestingListeningAgent.cs @@ -19,7 +19,7 @@ public class TestingListeningAgent : IDisposable, IListener private readonly TcpListener _listener; private readonly IBlock _socketHandling; private readonly Uri _uri; - private Task _receivingLoop; + private Task _receivingLoop = null!; public TestingListeningAgent(IReceiver callback, IPAddress ipaddr, int port, string protocol, CancellationToken cancellationToken) diff --git a/src/Testing/CoreTests/Transports/Tcp/message_forwarding.cs b/src/Testing/CoreTests/Transports/Tcp/message_forwarding.cs index 92fadaca8..6ad6c47b5 100644 --- a/src/Testing/CoreTests/Transports/Tcp/message_forwarding.cs +++ b/src/Testing/CoreTests/Transports/Tcp/message_forwarding.cs @@ -42,8 +42,8 @@ public async Task send_message_via_forwarding() [MessageIdentity("versioned-message", Version = 1)] public class OriginalMessage : IForwardsTo { - public string FirstName { get; set; } - public string LastName { get; set; } + public string FirstName { get; set; } = null!; + public string LastName { get; set; } = null!; public NewMessage Transform() { @@ -54,7 +54,7 @@ public NewMessage Transform() [MessageIdentity("versioned-message", Version = 2)] public class NewMessage { - public string FullName { get; set; } + public string FullName { get; set; } = null!; } public class NewMessageHandler diff --git a/src/Testing/CoreTests/Util/WolverineMessageNamingTests.cs b/src/Testing/CoreTests/Util/WolverineMessageNamingTests.cs index 2e8cc1e84..e838311b8 100644 --- a/src/Testing/CoreTests/Util/WolverineMessageNamingTests.cs +++ b/src/Testing/CoreTests/Util/WolverineMessageNamingTests.cs @@ -75,7 +75,7 @@ public void web_socket_messages_are_kebab_cased() public class ConcreteMessage : IInterfaceMessage { - public string Name { get; set; } + public string Name { get; set; } = null!; } [MessageIdentity(typeof(AliasedMessage))] diff --git a/src/Testing/CoreTests/WolverineOptionsTests.cs b/src/Testing/CoreTests/WolverineOptionsTests.cs index 4248388d5..b8ca43a2b 100644 --- a/src/Testing/CoreTests/WolverineOptionsTests.cs +++ b/src/Testing/CoreTests/WolverineOptionsTests.cs @@ -117,7 +117,7 @@ public async Task durable_local_queue_is_indeed_durable() .StartAsync(); runtime.Services.GetRequiredService() - .Endpoints.EndpointFor(TransportConstants.DurableLocalUri) + .Endpoints.EndpointFor(TransportConstants.DurableLocalUri)! .Mode.ShouldBe(EndpointMode.Durable); } @@ -133,7 +133,7 @@ public void sets_up_the_container_with_services() }); var services = runtime.Get(); - services.DefaultFor().ImplementationType.ShouldBe(typeof(Foo)); + services.DefaultFor()!.ImplementationType.ShouldBe(typeof(Foo)); } [Fact] @@ -221,13 +221,13 @@ public void publish_mechanism_with_multiple_subscribers() var endpoint3333 = collection.Transports.TryGetEndpoint("stub://3333".ToUri()); var endpoint4444 = collection.Transports.TryGetEndpoint("stub://4444".ToUri()); - endpoint3333.Subscriptions[0] + endpoint3333!.Subscriptions[0] .ShouldBe(new Subscription { Scope = RoutingScope.Namespace, Match = "One" }); endpoint3333.Subscriptions[1] .ShouldBe(new Subscription { Scope = RoutingScope.Namespace, Match = "Two" }); - endpoint4444.Subscriptions[0] + endpoint4444!.Subscriptions[0] .ShouldBe(new Subscription { Scope = RoutingScope.Namespace, Match = "One" }); endpoint4444.Subscriptions[1] @@ -295,7 +295,7 @@ public FakeTransport() : this("fake") public bool TryBuildBrokerUsage(out BrokerDescription usage) { - usage = default; + usage = default!; return false; } @@ -331,7 +331,7 @@ public ValueTask InitializeAsync(IWolverineRuntime runtime) public bool TryBuildStatefulResource(IWolverineRuntime runtime, out IStatefulResource resource) { - resource = null; + resource = null!; return false; } diff --git a/src/Testing/MessageRoutingTests/MessageRoutingContext.cs b/src/Testing/MessageRoutingTests/MessageRoutingContext.cs index d902ca8bb..4aec7fa58 100644 --- a/src/Testing/MessageRoutingTests/MessageRoutingContext.cs +++ b/src/Testing/MessageRoutingTests/MessageRoutingContext.cs @@ -17,7 +17,7 @@ namespace MessageRoutingTests; public class MessageRoutingContext : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -71,7 +71,7 @@ async Task IAsyncLifetime.DisposeAsync() var envelopes = messageRouter.RouteForPublish(new T(), null); var expected = uris.OrderBy(x => x).Select(x => new Uri(x)).ToArray(); - var actual = envelopes.Select(x => x.Destination).OrderBy(x => x.ToString()).ToArray(); + var actual = envelopes.Select(x => x.Destination!).OrderBy(x => x.ToString()).ToArray(); actual.ShouldBe(expected); } diff --git a/src/Testing/MessageRoutingTests/MessageRoutingTests.csproj b/src/Testing/MessageRoutingTests/MessageRoutingTests.csproj index 7e747d47e..997727062 100644 --- a/src/Testing/MessageRoutingTests/MessageRoutingTests.csproj +++ b/src/Testing/MessageRoutingTests/MessageRoutingTests.csproj @@ -1,6 +1,7 @@ + enable false diff --git a/src/Testing/MessageRoutingTests/using_additive_local_routing_and_external_conventions.cs b/src/Testing/MessageRoutingTests/using_additive_local_routing_and_external_conventions.cs index 42cb8f48f..18186a35b 100644 --- a/src/Testing/MessageRoutingTests/using_additive_local_routing_and_external_conventions.cs +++ b/src/Testing/MessageRoutingTests/using_additive_local_routing_and_external_conventions.cs @@ -18,7 +18,7 @@ public static async Task configure_additive_routing() var rabbitConnectionString = builder .Configuration.GetConnectionString("rabbitmq"); - opts.UseRabbitMq(rabbitConnectionString) + opts.UseRabbitMq(rabbitConnectionString!) .AutoProvision() // Using the built in, default Rabbit MQ message routing conventions diff --git a/src/Testing/MessageRoutingTests/using_separate_handlers.cs b/src/Testing/MessageRoutingTests/using_separate_handlers.cs index e51c9cdcb..86feb71f1 100644 --- a/src/Testing/MessageRoutingTests/using_separate_handlers.cs +++ b/src/Testing/MessageRoutingTests/using_separate_handlers.cs @@ -61,7 +61,7 @@ public async Task publish_message_should_go_independently_to_all_three() { var tracked = await theHost.SendMessageAndWaitAsync(new ColorMessage()); - tracked.Executed.Envelopes().Select(x => x.Destination).OrderBy(x => x.ToString()) + tracked.Executed.Envelopes().Select(x => x.Destination!).OrderBy(x => x.ToString()) .ShouldBe([new Uri("local://blue"), new Uri("local://messageroutingtests.greencolormessagehandler"), new Uri("local://red")]); } diff --git a/src/Testing/MetricsTests/MessagePump.cs b/src/Testing/MetricsTests/MessagePump.cs index 9650abb0f..8c1da788d 100644 --- a/src/Testing/MetricsTests/MessagePump.cs +++ b/src/Testing/MetricsTests/MessagePump.cs @@ -9,7 +9,7 @@ namespace MetricsTests; public class MessagePump : IAsyncDisposable { - private IHost _host; + private IHost _host = null!; public async Task StartHostAsync(WolverineMetricsMode mode) { @@ -37,7 +37,7 @@ public async Task PumpMessagesAsync(WolverineMetricsMode mode, TimeSpan duration while (stopwatch.ElapsedMilliseconds < duration.TotalMilliseconds) { - var bus = _host.MessageBus(); + var bus = _host!.MessageBus(); for (int i = 0; i < 100; i++) { for (int j = 0; j < Random.Shared.Next(1, 5); j++) diff --git a/src/Testing/Module1/Module1Extension.cs b/src/Testing/Module1/Module1Extension.cs index cc3d4980b..1d6f0b17f 100644 --- a/src/Testing/Module1/Module1Extension.cs +++ b/src/Testing/Module1/Module1Extension.cs @@ -5,7 +5,7 @@ namespace Module1; public class Module1Extension : IWolverineExtension { - public static WolverineOptions Options { get; set; } + public static WolverineOptions Options { get; set; } = null!; public void Configure(WolverineOptions options) { diff --git a/src/Testing/PolicyTests/endpoint_policy_configuration.cs b/src/Testing/PolicyTests/endpoint_policy_configuration.cs index fb24feb2e..f2d9b9517 100644 --- a/src/Testing/PolicyTests/endpoint_policy_configuration.cs +++ b/src/Testing/PolicyTests/endpoint_policy_configuration.cs @@ -22,7 +22,7 @@ namespace PolicyTests; public class endpoint_policy_configuration : IAsyncDisposable { - private IHost _host; + private IHost _host = null!; public async ValueTask DisposeAsync() { @@ -254,21 +254,21 @@ public async Task discover_local_endpoints_with_default_name_pattern() var runtime = _host.Services.GetRequiredService() .ShouldBeOfType(); - var endpoint1 = runtime.DetermineLocalSendingAgent(typeof(Message1)) + var endpoint1 = runtime.DetermineLocalSendingAgent(typeof(Message1))! .Endpoint.ShouldBeOfType(); endpoint1.EndpointName.ShouldBe(typeof(Message1).ToMessageTypeName().ToLowerInvariant()); endpoint1.Mode.ShouldBe(EndpointMode.Durable); - var endpoint2 = runtime.DetermineLocalSendingAgent(typeof(Message2)) + var endpoint2 = runtime.DetermineLocalSendingAgent(typeof(Message2))! .Endpoint.ShouldBeOfType(); endpoint2.EndpointName.ShouldBe(typeof(Message2).ToMessageTypeName().ToLowerInvariant()); endpoint2.Mode.ShouldBe(EndpointMode.Durable); - runtime.DetermineLocalSendingAgent(typeof(Message3)) + runtime.DetermineLocalSendingAgent(typeof(Message3))! .Endpoint.ShouldBeOfType().EndpointName .ShouldBe(typeof(Message3).ToMessageTypeName().ToLowerInvariant()); - runtime.DetermineLocalSendingAgent(typeof(Message4)) + runtime.DetermineLocalSendingAgent(typeof(Message4))! .Endpoint.ShouldBeOfType().EndpointName .ShouldBe(typeof(Message4).ToMessageTypeName().ToLowerInvariant()); } @@ -286,21 +286,21 @@ public async Task discover_local_endpoints_with_custom_name_pattern() var runtime = _host.Services.GetRequiredService() .ShouldBeOfType(); - var endpoint1 = runtime.DetermineLocalSendingAgent(typeof(Message1)) + var endpoint1 = runtime.DetermineLocalSendingAgent(typeof(Message1))! .Endpoint.ShouldBeOfType(); endpoint1.EndpointName.ShouldBe(typeof(Message1).ToMessageTypeName().ToLowerInvariant() + "_more"); endpoint1.Mode.ShouldBe(EndpointMode.Durable); - var endpoint2 = runtime.DetermineLocalSendingAgent(typeof(Message2)) + var endpoint2 = runtime.DetermineLocalSendingAgent(typeof(Message2))! .Endpoint.ShouldBeOfType(); endpoint2.EndpointName.ShouldBe(typeof(Message2).ToMessageTypeName().ToLowerInvariant() + "_more"); endpoint2.Mode.ShouldBe(EndpointMode.Durable); - runtime.DetermineLocalSendingAgent(typeof(Message3)) + runtime.DetermineLocalSendingAgent(typeof(Message3))! .Endpoint.ShouldBeOfType().EndpointName .ShouldBe(typeof(Message3).ToMessageTypeName().ToLowerInvariant() + "_more"); - runtime.DetermineLocalSendingAgent(typeof(Message4)) + runtime.DetermineLocalSendingAgent(typeof(Message4))! .Endpoint.ShouldBeOfType().EndpointName .ShouldBe(typeof(Message4).ToMessageTypeName().ToLowerInvariant() + "_more"); } diff --git a/src/Testing/CoreTests/Persistence/Sagas/resequencer_saga_in_memory.cs b/src/Testing/SlowTests/Persistence/Sagas/resequencer_saga_in_memory.cs similarity index 98% rename from src/Testing/CoreTests/Persistence/Sagas/resequencer_saga_in_memory.cs rename to src/Testing/SlowTests/Persistence/Sagas/resequencer_saga_in_memory.cs index 9b0f95d15..89105f384 100644 --- a/src/Testing/CoreTests/Persistence/Sagas/resequencer_saga_in_memory.cs +++ b/src/Testing/SlowTests/Persistence/Sagas/resequencer_saga_in_memory.cs @@ -7,7 +7,7 @@ using Wolverine.Transports; using Xunit; -namespace CoreTests.Persistence.Sagas; +namespace SlowTests.Persistence.Sagas; public record StartSequencedSaga(Guid Id); @@ -31,7 +31,7 @@ public void Handle(SequencedCommand cmd) public class resequencer_saga_in_memory : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Testing/SlowTests/RetryBlockTests.cs b/src/Testing/SlowTests/RetryBlockTests.cs index b79c78fae..4ad6fa27a 100644 --- a/src/Testing/SlowTests/RetryBlockTests.cs +++ b/src/Testing/SlowTests/RetryBlockTests.cs @@ -143,7 +143,7 @@ public bool IsEnabled(LogLevel logLevel) return true; } - public IDisposable BeginScope(TState state) + public IDisposable BeginScope(TState state) where TState : notnull { return this; } diff --git a/src/Testing/SlowTests/SharedMemory/buffered_compliance.cs b/src/Testing/SlowTests/SharedMemory/buffered_compliance.cs index 418283df7..683f5ca7f 100644 --- a/src/Testing/SlowTests/SharedMemory/buffered_compliance.cs +++ b/src/Testing/SlowTests/SharedMemory/buffered_compliance.cs @@ -27,7 +27,7 @@ await SenderIs(opts => }); } - public Task DisposeAsync() + public new Task DisposeAsync() { return SharedMemoryQueueManager.ClearAllAsync(); } diff --git a/src/Testing/SlowTests/SharedMemory/inline_compliance.cs b/src/Testing/SlowTests/SharedMemory/inline_compliance.cs index ec2ac0391..97fff859e 100644 --- a/src/Testing/SlowTests/SharedMemory/inline_compliance.cs +++ b/src/Testing/SlowTests/SharedMemory/inline_compliance.cs @@ -27,7 +27,7 @@ await SenderIs(opts => }); } - public Task DisposeAsync() + public new Task DisposeAsync() { return SharedMemoryQueueManager.ClearAllAsync(); } diff --git a/src/Testing/SlowTests/TcpTransport/LightweightTcpTransportCompliance.cs b/src/Testing/SlowTests/TcpTransport/LightweightTcpTransportCompliance.cs index f22c13d7e..ecb50eed3 100644 --- a/src/Testing/SlowTests/TcpTransport/LightweightTcpTransportCompliance.cs +++ b/src/Testing/SlowTests/TcpTransport/LightweightTcpTransportCompliance.cs @@ -20,7 +20,7 @@ public async Task InitializeAsync() await ReceiverIs(opts => { opts.ListenAtPort(OutboundAddress.Port); }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { await DisposeAsync(); } diff --git a/src/Testing/SlowTests/delayed_message_end_to_end.cs b/src/Testing/SlowTests/delayed_message_end_to_end.cs index 3323d015a..8c927574d 100644 --- a/src/Testing/SlowTests/delayed_message_end_to_end.cs +++ b/src/Testing/SlowTests/delayed_message_end_to_end.cs @@ -42,7 +42,7 @@ public record KickOffMessage(int Number); public class TimeoutHandler { - private static TaskCompletionSource _completion; + private static TaskCompletionSource _completion = null!; public static Task WaitForEnforcedTimeout(TimeSpan timeout) { diff --git a/src/Testing/SlowTests/in_memory_scheduled_messages.cs b/src/Testing/SlowTests/in_memory_scheduled_messages.cs index 0212f9024..db7005bc3 100644 --- a/src/Testing/SlowTests/in_memory_scheduled_messages.cs +++ b/src/Testing/SlowTests/in_memory_scheduled_messages.cs @@ -25,10 +25,10 @@ public in_memory_scheduled_messages() _callbacks.Clear(); } - public Uri Uri { get; } - public Uri ReplyUri { get; } + public Uri Uri { get; } = null!; + public Uri ReplyUri { get; } = null!; public Uri Destination { get; } = "local://delayed".ToUri(); - public Uri Alias { get; } + public Uri Alias { get; } = null!; public void Enqueue(Envelope envelope) { @@ -65,7 +65,7 @@ public ValueTask DrainAsync() return ValueTask.CompletedTask; } - public IHandlerPipeline Pipeline => null; + public IHandlerPipeline Pipeline => null!; public int QueueCount => 0; diff --git a/src/Testing/SlowTests/invoke_async_with_delivery_options.cs b/src/Testing/SlowTests/invoke_async_with_delivery_options.cs index c13b51949..64f1071e3 100644 --- a/src/Testing/SlowTests/invoke_async_with_delivery_options.cs +++ b/src/Testing/SlowTests/invoke_async_with_delivery_options.cs @@ -11,8 +11,8 @@ namespace SlowTests; public class invoke_async_with_delivery_options : IAsyncLifetime { - private IHost _publisher; - private IHost _receiver; + private IHost _publisher = null!; + private IHost _receiver = null!; public async Task InitializeAsync() { @@ -81,7 +81,7 @@ public async Task invoke_remotely() [Fact] public async Task invoke_with_expected_outcome_remotely() { - Answer answer = null; + Answer answer = null!; Func action = async c => answer = await c.InvokeAsync(new DoMath(3, 4, "blue", "tom"), new DeliveryOptions { TenantId = "blue" }.WithHeader("user-id", "tom")); var tracked = await _publisher.TrackActivity() @@ -93,7 +93,7 @@ public async Task invoke_with_expected_outcome_remotely() envelope.TenantId.ShouldBe("blue"); envelope.Headers["user-id"].ShouldBe("tom"); - answer.Sum.ShouldBe(7); + answer!.Sum.ShouldBe(7); } } diff --git a/src/Testing/SlowTests/message_timeout_mechanics.cs b/src/Testing/SlowTests/message_timeout_mechanics.cs index 0c80b7ec9..982d67155 100644 --- a/src/Testing/SlowTests/message_timeout_mechanics.cs +++ b/src/Testing/SlowTests/message_timeout_mechanics.cs @@ -30,8 +30,8 @@ public void set_timeout_on_handler_attribute() { using var host = WolverineHost.Basic(); var handlers = host.Services.GetRequiredService(); - var chain = handlers.HandlerFor(typeof(PotentiallySlowMessage)).As().Chain; - chain.ExecutionTimeoutInSeconds.ShouldBe(1); // coming from the attribute + var chain = handlers.HandlerFor(typeof(PotentiallySlowMessage))!.As().Chain; + chain!.ExecutionTimeoutInSeconds.ShouldBe(1); // coming from the attribute } [Fact] diff --git a/src/Testing/Wolverine.ComplianceTests/BaseContext.cs b/src/Testing/Wolverine.ComplianceTests/BaseContext.cs index 1ed7256ce..f1b207dad 100644 --- a/src/Testing/Wolverine.ComplianceTests/BaseContext.cs +++ b/src/Testing/Wolverine.ComplianceTests/BaseContext.cs @@ -8,7 +8,7 @@ public abstract class BaseContext : IDisposable protected readonly IHostBuilder builder = Host.CreateDefaultBuilder(); - private IHost _host; + private IHost _host = null!; protected BaseContext(bool shouldStart) { diff --git a/src/Testing/Wolverine.ComplianceTests/Compliance/MessageConsumer.cs b/src/Testing/Wolverine.ComplianceTests/Compliance/MessageConsumer.cs index 980fe63b5..98f8e33c7 100644 --- a/src/Testing/Wolverine.ComplianceTests/Compliance/MessageConsumer.cs +++ b/src/Testing/Wolverine.ComplianceTests/Compliance/MessageConsumer.cs @@ -36,10 +36,10 @@ public Response Handle(Request request) public class Request { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class Response { - public string Name { get; set; } + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Testing/Wolverine.ComplianceTests/Compliance/Messages.cs b/src/Testing/Wolverine.ComplianceTests/Compliance/Messages.cs index b1fec827a..243c965ec 100644 --- a/src/Testing/Wolverine.ComplianceTests/Compliance/Messages.cs +++ b/src/Testing/Wolverine.ComplianceTests/Compliance/Messages.cs @@ -5,7 +5,7 @@ namespace Wolverine.ComplianceTests.Compliance; public class NewUser { - public string UserId { get; set; } + public string UserId { get; set; } = null!; } public class EditUser; @@ -22,13 +22,13 @@ public class DeleteUser public class PingMessage { public Guid Id { get; set; } = Guid.NewGuid(); - public string Name { get; set; } + public string Name { get; set; } = null!; } public class PongMessage { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } #endregion @@ -36,13 +36,13 @@ public class PongMessage public class ImplicitPing { public Guid Id { get; set; } = Guid.NewGuid(); - public string Name { get; set; } + public string Name { get; set; } = null!; } public class ImplicitPong { public Guid Id { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; } public class PingHandler @@ -83,25 +83,25 @@ public void Handle(ImplicitPong message) public class UserCreated { public Guid Id { get; set; } - public string UserId { get; set; } + public string UserId { get; set; } = null!; } public class UserDeleted { public Guid Id { get; set; } - public string UserId { get; set; } + public string UserId { get; set; } = null!; } public class SentTrack { public Guid Id { get; set; } - public string MessageType { get; set; } + public string MessageType { get; set; } = null!; } public class ReceivedTrack { public Guid Id { get; set; } - public string MessageType { get; set; } + public string MessageType { get; set; } = null!; } public class TimeoutsMessage; @@ -130,13 +130,13 @@ public void Handle(ColorChosen message, ColorHistory history, Envelope envelope) public class ColorHistory { - public string Name { get; set; } - public Envelope Envelope { get; set; } + public string Name { get; set; } = null!; + public Envelope Envelope { get; set; } = null!; } public class ColorChosen { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class TracksMessage @@ -172,11 +172,11 @@ public class SpecialTopic [MessageIdentity("Structural.Typed.Message")] public class BlueMessage { - public string Name { get; set; } + public string Name { get; set; } = null!; } [MessageIdentity("Structural.Typed.Message")] public class GreenMessage { - public string Name { get; set; } + public string Name { get; set; } = null!; } \ No newline at end of file diff --git a/src/Testing/Wolverine.ComplianceTests/Compliance/Target.cs b/src/Testing/Wolverine.ComplianceTests/Compliance/Target.cs index 312da787b..a857f34e6 100644 --- a/src/Testing/Wolverine.ComplianceTests/Compliance/Target.cs +++ b/src/Testing/Wolverine.ComplianceTests/Compliance/Target.cs @@ -25,7 +25,7 @@ public class Target public float Float; - public string StringField; + public string StringField = null!; public Target() { @@ -37,12 +37,12 @@ public Target() public int Number { get; set; } public long Long { get; set; } - public string String { get; set; } - public string AnotherString { get; set; } + public string String { get; set; } = null!; + public string AnotherString { get; set; } = null!; public Guid OtherGuid { get; set; } - public Target Inner { get; set; } + public Target Inner { get; set; } = null!; public Colors Color { get; set; } @@ -53,9 +53,9 @@ public Target() public DateTime Date { get; set; } public DateTimeOffset DateOffset { get; set; } - public int[] NumberArray { get; set; } + public int[] NumberArray { get; set; } = null!; - public Target[] Children { get; set; } + public Target[] Children { get; set; } = null!; public int? NullableNumber { get; set; } public DateTime? NullableDateTime { get; set; } diff --git a/src/Testing/Wolverine.ComplianceTests/Compliance/TransportCompliance.cs b/src/Testing/Wolverine.ComplianceTests/Compliance/TransportCompliance.cs index cd4a658ff..219038058 100644 --- a/src/Testing/Wolverine.ComplianceTests/Compliance/TransportCompliance.cs +++ b/src/Testing/Wolverine.ComplianceTests/Compliance/TransportCompliance.cs @@ -26,8 +26,8 @@ protected TransportComplianceFixture(Uri destination, int defaultTimeInSeconds = DefaultTimeout = defaultTimeInSeconds.Seconds(); } - public IHost Sender { get; private set; } - public IHost Receiver { get; private set; } + public IHost Sender { get; private set; } = null!; + public IHost Receiver { get; private set; } = null!; public Uri OutboundAddress { get; protected set; } public bool AllLocally { get; set; } @@ -171,10 +171,10 @@ public virtual void BeforeEach() public abstract class TransportCompliance : IAsyncLifetime where T : TransportComplianceFixture, new() { protected readonly ErrorCausingMessage theMessage = new(); - private ITrackedSession _session; - protected Uri theOutboundAddress; - protected IHost theReceiver; - protected IHost theSender; + private ITrackedSession _session = null!; + protected Uri theOutboundAddress = null!; + protected IHost theReceiver = null!; + protected IHost theSender = null!; protected TransportCompliance() { @@ -366,7 +366,7 @@ public async Task can_request_reply() .Timeout(30.Seconds()) .InvokeAndWaitAsync(request, 30.Seconds()); - response.Name.ShouldBe(request.Name); + response!.Name.ShouldBe(request.Name); } [Fact] @@ -382,7 +382,7 @@ public async Task tags_the_envelope_with_the_source() record .ShouldNotBeNull(); - record.Envelope.Source.ShouldBe(theSender.Get().ServiceName); + record!.Envelope!.Source.ShouldBe(theSender.Get().ServiceName); } [Fact] @@ -410,7 +410,7 @@ public async Task tracking_correlation_id_on_everything() .ToArray(); - foreach (var envelope in envelopes) envelope.CorrelationId.ShouldBe(id2); + foreach (var envelope in envelopes) envelope!.CorrelationId!.ShouldBe(id2); } [Fact] @@ -427,9 +427,9 @@ public async Task schedule_send() message.Name.ShouldBe("Orange"); } - protected void throwOnAttempt(int attempt) where T : Exception, new() + protected void throwOnAttempt(int attempt) where TException : Exception, new() { - theMessage.Errors.Add(attempt, new T()); + theMessage.Errors.Add(attempt, new TException()); } protected async Task afterProcessingIsComplete() @@ -440,9 +440,9 @@ protected async Task afterProcessingIsComplete() .DoNotAssertOnExceptionsDetected() .SendMessageAndWaitAsync(theMessage); - return _session.AllRecordsInOrder().Where(x => x.Envelope.Message is ErrorCausingMessage).LastOrDefault(x => + return _session.AllRecordsInOrder().Where(x => x.Envelope!.Message is ErrorCausingMessage).LastOrDefault(x => x.MessageEventType == MessageEventType.MessageSucceeded || - x.MessageEventType == MessageEventType.MovedToErrorQueue); + x.MessageEventType == MessageEventType.MovedToErrorQueue)!; } protected async Task shouldSucceedOnAttempt(int attempt) @@ -456,10 +456,10 @@ protected async Task shouldSucceedOnAttempt(int attempt) session.AssertCondition("Expected ending activity was not detected", () => { - var record = session.AllRecordsInOrder().Where(x => x.Envelope.Message is ErrorCausingMessage).LastOrDefault( + var record = session.AllRecordsInOrder().Where(x => x.Envelope!.Message is ErrorCausingMessage).LastOrDefault( x => x.MessageEventType == MessageEventType.MessageSucceeded || - x.MessageEventType == MessageEventType.MovedToErrorQueue); + x.MessageEventType == MessageEventType.MovedToErrorQueue)!; if (record is null) return false; @@ -481,10 +481,10 @@ protected async Task shouldMoveToErrorQueueOnAttempt(int attempt) .Timeout(30.Seconds()) .SendMessageAndWaitAsync(theMessage); - var record = session.AllRecordsInOrder().Where(x => x.Envelope.Message is ErrorCausingMessage).LastOrDefault( + var record = session.AllRecordsInOrder().Where(x => x.Envelope!.Message is ErrorCausingMessage).LastOrDefault( x => x.MessageEventType == MessageEventType.MessageSucceeded || - x.MessageEventType == MessageEventType.MovedToErrorQueue); + x.MessageEventType == MessageEventType.MovedToErrorQueue)!; if (record == null) { @@ -640,10 +640,10 @@ public byte[] Write(Envelope envelope) public object ReadFromData(Type messageType, Envelope envelope) { - return ReadFromData(envelope.Data); + return ReadFromData(envelope.Data!); } - public object? ReadFromData(byte[]? data) + public object ReadFromData(byte[] data) { var name = Encoding.UTF8.GetString(data); return new BlueMessage { Name = name }; @@ -661,14 +661,14 @@ public byte[] WriteMessage(object message) public class GreenTextWriter : IMessageSerializer { - public string? ContentType => "text/plain"; + public string ContentType => "text/plain"; public object ReadFromData(Type messageType, Envelope envelope) { throw new NotImplementedException(); } - public object? ReadFromData(byte[]? data) + public object ReadFromData(byte[] data) { throw new NotImplementedException(); } diff --git a/src/Testing/Wolverine.ComplianceTests/DeadLetterAdminCompliance.cs b/src/Testing/Wolverine.ComplianceTests/DeadLetterAdminCompliance.cs index 7d11b81e4..6231b1635 100644 --- a/src/Testing/Wolverine.ComplianceTests/DeadLetterAdminCompliance.cs +++ b/src/Testing/Wolverine.ComplianceTests/DeadLetterAdminCompliance.cs @@ -23,24 +23,24 @@ public abstract class DeadLetterAdminCompliance : IAsyncLifetime ["Red", "Blue", "Orange", "Yellow", "Purple", "Green", "Black", "White", "Gray", "Pink"]; private readonly ITestOutputHelper _output; - private DeadLetterEnvelopeResults allEnvelopes; + private DeadLetterEnvelopeResults allEnvelopes = null!; private DateTimeOffset EightHoursAgo; private DateTimeOffset FiveHoursAgo; private DateTimeOffset FourHoursAgo; private DateTimeOffset SevenHoursAgo; private DateTimeOffset SixHoursAgo; - protected IDeadLetters theDeadLetters; - protected EnvelopeGenerator theGenerator; - protected IMessageStore thePersistence; - private IReadOnlyList theSummaries; + protected IDeadLetters theDeadLetters = null!; + protected EnvelopeGenerator theGenerator = null!; + protected IMessageStore thePersistence = null!; + private IReadOnlyList theSummaries = null!; protected DeadLetterAdminCompliance(ITestOutputHelper output) { _output = output; } - public IHost theHost { get; private set; } + public IHost theHost { get; private set; } = null!; public async Task InitializeAsync() { @@ -143,7 +143,7 @@ private async Task fetchSummary(TimeRange range) } private DeadLetterQueueCount summaryCount(int expected, Uri? receivedAt = null, - Uri databaseIdentifier = null) + Uri? databaseIdentifier = null) { var uri = receivedAt ?? theGenerator.ReceivedAt; var messageType = typeof(TMessage).ToMessageTypeName(); diff --git a/src/Testing/Wolverine.ComplianceTests/Fakes/GenericFakeTransactionAttribute.cs b/src/Testing/Wolverine.ComplianceTests/Fakes/GenericFakeTransactionAttribute.cs index e7330f1a2..37c869027 100644 --- a/src/Testing/Wolverine.ComplianceTests/Fakes/GenericFakeTransactionAttribute.cs +++ b/src/Testing/Wolverine.ComplianceTests/Fakes/GenericFakeTransactionAttribute.cs @@ -28,7 +28,7 @@ public override void Modify(HandlerChain chain, GenerationRules rules) public class FakeTransaction : Frame { private readonly Variable _session; - private Variable _store; + private Variable _store = null!; public FakeTransaction() : base(false) { diff --git a/src/Testing/Wolverine.ComplianceTests/LeadershipElectionCompliance.cs b/src/Testing/Wolverine.ComplianceTests/LeadershipElectionCompliance.cs index 19a1dd2ac..304afa30f 100644 --- a/src/Testing/Wolverine.ComplianceTests/LeadershipElectionCompliance.cs +++ b/src/Testing/Wolverine.ComplianceTests/LeadershipElectionCompliance.cs @@ -18,7 +18,7 @@ public abstract class LeadershipElectionCompliance : IAsyncLifetime { private readonly List _hosts = new(); private readonly ITestOutputHelper _output; - private IHost _originalHost; + private IHost _originalHost = null!; // TODO -- rename this after combining protected abstract Task beforeBuildingHost(); @@ -63,7 +63,7 @@ public IHost FindHostRunning(Uri agentUri) { if (_originalHost.RunningAgents().Contains(agentUri)) return _originalHost; - return _hosts.FirstOrDefault(x => x.RunningAgents().Contains(agentUri)); + return _hosts.FirstOrDefault(x => x.RunningAgents().Contains(agentUri))!; } public IHost OriginalHost => _originalHost; diff --git a/src/Testing/Wolverine.ComplianceTests/Logger.cs b/src/Testing/Wolverine.ComplianceTests/Logger.cs index 833e00f14..dd741ec33 100644 --- a/src/Testing/Wolverine.ComplianceTests/Logger.cs +++ b/src/Testing/Wolverine.ComplianceTests/Logger.cs @@ -45,13 +45,13 @@ public bool IsEnabled(LogLevel logLevel) return logLevel != LogLevel.Error; } - public IDisposable BeginScope(TState state) + public IDisposable BeginScope(TState state) where TState : notnull { return new Disposable(); } - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, - Func formatter) + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, + Func formatter) { if (exception is DivideByZeroException) { diff --git a/src/Testing/Wolverine.ComplianceTests/MessageStoreCompliance.cs b/src/Testing/Wolverine.ComplianceTests/MessageStoreCompliance.cs index f114f7403..fe95e9a25 100644 --- a/src/Testing/Wolverine.ComplianceTests/MessageStoreCompliance.cs +++ b/src/Testing/Wolverine.ComplianceTests/MessageStoreCompliance.cs @@ -15,8 +15,8 @@ namespace Wolverine.ComplianceTests; public abstract class MessageStoreCompliance : IAsyncLifetime { - public IHost theHost { get; private set; } - protected IMessageStore thePersistence; + public IHost theHost { get; private set; } = null!; + protected IMessageStore thePersistence = null!; public abstract Task BuildCleanHost(); @@ -135,7 +135,7 @@ public async Task store_a_single_incoming_envelope_that_is_handled() var stored = (await thePersistence.Admin.AllIncomingAsync()).Single(); // This is the important part - stored.Data.Length.ShouldBe(0); + stored.Data!.Length.ShouldBe(0); stored.Destination.ShouldBe(envelope.Destination); stored.Id.ShouldBe(envelope.Id); diff --git a/src/Testing/Wolverine.ComplianceTests/NodePersistenceCompliance.cs b/src/Testing/Wolverine.ComplianceTests/NodePersistenceCompliance.cs index bb9016e3a..8a4e68ff9 100644 --- a/src/Testing/Wolverine.ComplianceTests/NodePersistenceCompliance.cs +++ b/src/Testing/Wolverine.ComplianceTests/NodePersistenceCompliance.cs @@ -9,7 +9,7 @@ namespace Wolverine.ComplianceTests; public abstract class NodePersistenceCompliance : IAsyncLifetime { - private IMessageStore _database; + private IMessageStore _database = null!; public async Task InitializeAsync() { @@ -148,7 +148,7 @@ public async Task add_assignments_one_at_a_time() var persisted = await _database.Nodes.LoadNodeAsync(node.NodeId, CancellationToken.None); - persisted.ActiveAgents.OrderBy(x => x.ToString()).ShouldBe([agent3, agent2, agent1]); + persisted!.ActiveAgents.OrderBy(x => x.ToString()).ShouldBe([agent3, agent2, agent1]); } [Fact] diff --git a/src/Testing/Wolverine.ComplianceTests/Sagas/SagaTestHarness.cs b/src/Testing/Wolverine.ComplianceTests/Sagas/SagaTestHarness.cs index 2f33cc90e..d82356607 100644 --- a/src/Testing/Wolverine.ComplianceTests/Sagas/SagaTestHarness.cs +++ b/src/Testing/Wolverine.ComplianceTests/Sagas/SagaTestHarness.cs @@ -10,7 +10,7 @@ namespace Wolverine.ComplianceTests.Sagas; public class SagaTestHarness : IDisposable where T : Saga { - private IHost _host; + private IHost _host = null!; public SagaTestHarness(ISagaHost sagaHost) { @@ -29,32 +29,32 @@ protected void withApplication() _host = SagaHost.BuildHost(); } - protected string codeFor() + protected string codeFor() { - return _host.Get().HandlerFor().As().Chain.SourceCode; + return _host!.Get().HandlerFor()!.As().Chain!.SourceCode!; } - protected async Task invoke(T message) + protected async Task invoke(TMessage message) { if (_host == null) { withApplication(); } - await _host.InvokeMessageAndWaitAsync(message); + await _host!.InvokeMessageAndWaitAsync(message!); } - protected async Task send(T message) + protected async Task send(TMessage message) { if (_host == null) { withApplication(); } - await _host.ExecuteAndWaitValueTaskAsync(x => x.SendAsync(message)); + await _host!.ExecuteAndWaitValueTaskAsync(x => x.SendAsync(message!)); } - protected Task send(T message, object sagaId) + protected Task send(TMessage message, object sagaId) { return _host.SendMessageAndWaitAsync(message, new DeliveryOptions { SagaId = sagaId.ToString() }, 10000); } diff --git a/src/Testing/Wolverine.ComplianceTests/Sagas/StringIdentifiedSagaComplianceSpecs.cs b/src/Testing/Wolverine.ComplianceTests/Sagas/StringIdentifiedSagaComplianceSpecs.cs index 2bbbed024..5b4c00776 100644 --- a/src/Testing/Wolverine.ComplianceTests/Sagas/StringIdentifiedSagaComplianceSpecs.cs +++ b/src/Testing/Wolverine.ComplianceTests/Sagas/StringIdentifiedSagaComplianceSpecs.cs @@ -23,7 +23,7 @@ public void Handles(StringDoThree message) public class StringDoThree { - [SagaIdentity] public string TheSagaId { get; set; } + [SagaIdentity] public string TheSagaId { get; set; } = null!; } public class StringIdentifiedSagaComplianceSpecs : SagaTestHarness where T : ISagaHost, new() diff --git a/src/Testing/Wolverine.ComplianceTests/Sagas/TestMessages.cs b/src/Testing/Wolverine.ComplianceTests/Sagas/TestMessages.cs index 263a28073..a1a57e732 100644 --- a/src/Testing/Wolverine.ComplianceTests/Sagas/TestMessages.cs +++ b/src/Testing/Wolverine.ComplianceTests/Sagas/TestMessages.cs @@ -4,8 +4,8 @@ namespace Wolverine.ComplianceTests.Sagas; public abstract class Start { - public T Id { get; set; } - public string Name { get; set; } + public T Id { get; set; } = default!; + public string Name { get; set; } = null!; } public class GuidStart : Start; @@ -18,7 +18,7 @@ public class StringStart : Start; public abstract class CompleteThree { - public T SagaId { get; set; } + public T SagaId { get; set; } = default!; } public class GuidCompleteThree : CompleteThree; @@ -39,22 +39,22 @@ public class FinishItAll; public class WildcardStart { - public string Id { get; set; } - public string Name { get; set; } + public string Id { get; set; } = null!; + public string Name { get; set; } = null!; } public class BasicWorkflow : Saga where TCompleteThree : CompleteThree where TStart : Start { - public TId Id { get; set; } + public TId Id { get; set; } = default!; public bool OneCompleted { get; set; } public bool TwoCompleted { get; set; } public bool ThreeCompleted { get; set; } public bool FourCompleted { get; set; } - public string Name { get; set; } + public string Name { get; set; } = null!; public void Start(TStart starting) { diff --git a/src/Testing/Wolverine.ComplianceTests/Scheduling/DurabilityComplianceContext.cs b/src/Testing/Wolverine.ComplianceTests/Scheduling/DurabilityComplianceContext.cs index 749c2ddac..34171cdb0 100644 --- a/src/Testing/Wolverine.ComplianceTests/Scheduling/DurabilityComplianceContext.cs +++ b/src/Testing/Wolverine.ComplianceTests/Scheduling/DurabilityComplianceContext.cs @@ -17,8 +17,8 @@ namespace Wolverine.ComplianceTests.Scheduling; public abstract class DurabilityComplianceContext : IAsyncLifetime { - private IHost theReceiver; - private IHost theSender; + private IHost theReceiver = null!; + private IHost theSender = null!; public async Task InitializeAsync() { @@ -159,7 +159,7 @@ public async Task SendWithReceiverDown() // Shutting it down theReceiver.Dispose(); - theReceiver = null; + theReceiver = null!; var item = new ItemCreated @@ -235,7 +235,7 @@ await send(async c => public class ItemCreated { public Guid Id; - public string Name; + public string Name = null!; } public class ScheduledMessage @@ -247,9 +247,9 @@ public class ScheduledMessageHandler { public static readonly IList ReceivedMessages = new List(); - private static TaskCompletionSource _source; + private static TaskCompletionSource _source = null!; - public static Task Received { get; private set; } + public static Task Received { get; private set; } = null!; public void Consume(ScheduledMessage message) { @@ -267,7 +267,7 @@ public static void Reset() public class CascadedMessage { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class CascadeReceiver @@ -279,7 +279,7 @@ public void Handle(CascadedMessage message) public class TriggerMessage { - public string Name { get; set; } + public string Name { get; set; } = null!; } public class QuestionHandler diff --git a/src/Testing/Wolverine.ComplianceTests/Scheduling/ScheduledJobCompliance.cs b/src/Testing/Wolverine.ComplianceTests/Scheduling/ScheduledJobCompliance.cs index 6c9b3aded..6a3e78686 100644 --- a/src/Testing/Wolverine.ComplianceTests/Scheduling/ScheduledJobCompliance.cs +++ b/src/Testing/Wolverine.ComplianceTests/Scheduling/ScheduledJobCompliance.cs @@ -22,7 +22,7 @@ public class ScheduledMessageReceiver public abstract class ScheduledJobCompliance: IAsyncLifetime { private readonly ScheduledMessageReceiver theReceiver = new(); - private IHost theHost; + private IHost theHost = null!; public abstract void ConfigurePersistence(WolverineOptions opts); diff --git a/src/Testing/Wolverine.ComplianceTests/SimpleSingularAgent.cs b/src/Testing/Wolverine.ComplianceTests/SimpleSingularAgent.cs index 1de76f5c5..ef0452ad8 100644 --- a/src/Testing/Wolverine.ComplianceTests/SimpleSingularAgent.cs +++ b/src/Testing/Wolverine.ComplianceTests/SimpleSingularAgent.cs @@ -8,7 +8,7 @@ namespace Wolverine.ComplianceTests; public class SimpleSingularAgent : SingularAgent { private CancellationTokenSource _cancellation = new(); - private Timer _timer; + private Timer _timer = null!; // The scheme argument is meant to be descriptive and // your agent will have the Uri {scheme}:// in all diagnostics diff --git a/src/Testing/Wolverine.ComplianceTests/StorageActionCompliance.cs b/src/Testing/Wolverine.ComplianceTests/StorageActionCompliance.cs index 689498a48..94672dfcb 100644 --- a/src/Testing/Wolverine.ComplianceTests/StorageActionCompliance.cs +++ b/src/Testing/Wolverine.ComplianceTests/StorageActionCompliance.cs @@ -46,7 +46,7 @@ public async Task DisposeAsync() } - public IHost Host { get; set; } + public IHost Host { get; set; } = null!; // These two methods will be changed public abstract Task Load(string id); @@ -63,8 +63,8 @@ public async Task use_insert_as_return_value() tracked.NoRoutes.Envelopes().Any().ShouldBeFalse(); var todo = await Load(command.Id); - - todo.Name.ShouldBe("Write docs"); + + todo!.Name.ShouldBe("Write docs"); } [Fact] @@ -76,9 +76,9 @@ public async Task use_entity_attribute_with_id() await Host.InvokeMessageAndWaitAsync(new RenameTodo(command.Id, "New name")); var todo = await Load(command.Id); - todo.Name.ShouldBe("New name"); + todo!.Name.ShouldBe("New name"); } - + [Fact] public async Task use_entity_attribute_with_entity_id() { @@ -88,9 +88,9 @@ public async Task use_entity_attribute_with_entity_id() await Host.InvokeMessageAndWaitAsync(new RenameTodo2(command.Id, "New name2")); var todo = await Load(command.Id); - todo.Name.ShouldBe("New name2"); + todo!.Name.ShouldBe("New name2"); } - + [Fact] public async Task use_entity_attribute_with_explicit_id() { @@ -98,9 +98,9 @@ public async Task use_entity_attribute_with_explicit_id() await Host.InvokeMessageAndWaitAsync(command); await Host.InvokeMessageAndWaitAsync(new RenameTodo3(command.Id, "New name3")); - + var todo = await Load(command.Id); - todo.Name.ShouldBe("New name3"); + todo!.Name.ShouldBe("New name3"); } @@ -130,7 +130,7 @@ public async Task use_generic_action_as_insert() await Host.InvokeMessageAndWaitAsync(shouldInsert); await Host.InvokeMessageAndWaitAsync(shouldDoNothing); - (await Load(shouldInsert.Id)).Name.ShouldBe("Pick up milk"); + (await Load(shouldInsert.Id))!.Name.ShouldBe("Pick up milk"); (await Load(shouldDoNothing.Id)).ShouldBeNull(); } @@ -153,9 +153,9 @@ public async Task use_generic_action_as_update() await Host.InvokeMessageAndWaitAsync(new AlterTodo(command.Id, "New text", StorageAction.Update)); - (await Load(command.Id)).Name.ShouldBe("New text"); + (await Load(command.Id))!.Name.ShouldBe("New text"); } - + [Fact] public async Task use_generic_action_as_store() { @@ -164,7 +164,7 @@ public async Task use_generic_action_as_store() await Host.InvokeMessageAndWaitAsync(new AlterTodo(command.Id, "New text", StorageAction.Store)); - (await Load(command.Id)).Name.ShouldBe("New text"); + (await Load(command.Id))!.Name.ShouldBe("New text"); } [Fact] @@ -175,7 +175,7 @@ public async Task do_nothing_as_generic_action() await Host.InvokeMessageAndWaitAsync(new AlterTodo(command.Id, "New text", StorageAction.Nothing)); - (await Load(command.Id)).Name.ShouldBe("Write docs"); + (await Load(command.Id))!.Name.ShouldBe("Write docs"); } [Fact] @@ -206,9 +206,9 @@ public async Task do_not_execute_the_handler_if_the_entity_is_not_found() // This should be fine await Host.InvokeMessageAndWaitAsync(new CompleteTodo(todoId)); - (await Load(todoId)).IsComplete.ShouldBeTrue(); + (await Load(todoId))!.IsComplete.ShouldBeTrue(); } - + [Fact] public async Task handler_not_required_entity_attributes() { @@ -217,11 +217,11 @@ public async Task handler_not_required_entity_attributes() var todoId = Guid.NewGuid().ToString(); await Host.InvokeMessageAndWaitAsync(new CreateTodo(todoId, "Write docs")); - + // This should be fine await Host.InvokeMessageAndWaitAsync(new MaybeCompleteTodo(todoId)); - - (await Load(todoId)).IsComplete.ShouldBeTrue(); + + (await Load(todoId))!.IsComplete.ShouldBeTrue(); } [Fact] @@ -229,11 +229,11 @@ public async Task entity_can_be_used_in_before_methods_implied_from_main_handler { var todoId = Guid.NewGuid().ToString(); await Host.InvokeMessageAndWaitAsync(new CreateTodo(todoId, "Write docs")); - + // This should be fine await Host.InvokeMessageAndWaitAsync(new MarkTaskCompleteWithBeforeUsage(todoId)); - - (await Load(todoId)).IsComplete.ShouldBeTrue(); + + (await Load(todoId))!.IsComplete.ShouldBeTrue(); } [Fact] @@ -271,7 +271,7 @@ public async Task use_unit_of_work_as_return_value() public class Todo { - public string Id { get; set; } + public string Id { get; set; } = null!; public string? Name { get; set; } public bool IsComplete { get; set; } } diff --git a/src/Transports/AWS/Wolverine.AmazonSns.Tests/BufferedSendingAndReceivingCompliance.cs b/src/Transports/AWS/Wolverine.AmazonSns.Tests/BufferedSendingAndReceivingCompliance.cs index 3bd180d83..d2bdd0452 100644 --- a/src/Transports/AWS/Wolverine.AmazonSns.Tests/BufferedSendingAndReceivingCompliance.cs +++ b/src/Transports/AWS/Wolverine.AmazonSns.Tests/BufferedSendingAndReceivingCompliance.cs @@ -42,9 +42,9 @@ await SenderIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Transports/AWS/Wolverine.AmazonSns.Tests/InlineSendingAndReceivingCompliance.cs b/src/Transports/AWS/Wolverine.AmazonSns.Tests/InlineSendingAndReceivingCompliance.cs index ba065adf5..0a229f5ff 100644 --- a/src/Transports/AWS/Wolverine.AmazonSns.Tests/InlineSendingAndReceivingCompliance.cs +++ b/src/Transports/AWS/Wolverine.AmazonSns.Tests/InlineSendingAndReceivingCompliance.cs @@ -47,9 +47,9 @@ await SenderIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Transports/AWS/Wolverine.AmazonSns.Tests/bootstrapping.cs b/src/Transports/AWS/Wolverine.AmazonSns.Tests/bootstrapping.cs index 0619669e9..152d38170 100644 --- a/src/Transports/AWS/Wolverine.AmazonSns.Tests/bootstrapping.cs +++ b/src/Transports/AWS/Wolverine.AmazonSns.Tests/bootstrapping.cs @@ -5,7 +5,7 @@ namespace Wolverine.AmazonSns.Tests; -public class bootstrapping +public class Bootstrapping { [Fact] public async Task create_an_open_client() @@ -17,7 +17,7 @@ public async Task create_an_open_client() var transport = options.AmazonSnsTransport(); // Just a smoke test on configuration here - var topicNames = await transport.SnsClient.ListTopicsAsync("0"); + var topicNames = await transport.SnsClient!.ListTopicsAsync("0"); } [Fact] @@ -37,7 +37,7 @@ public async Task create_new_topic_on_startup() var transport = options.AmazonSnsTransport(); // Just a smoke test on configuration here - var topic = await transport.SnsClient.FindTopicAsync(topicName); + var topic = await transport.SnsClient!.FindTopicAsync(topicName); topic.ShouldNotBeNull(); topic.TopicArn.ShouldNotBeNull(); @@ -61,7 +61,7 @@ public async Task auto_purge_topic_on_startup_smoke_test() var options = host.Services.GetRequiredService(); var transport = options.AmazonSnsTransport(); - var topic = await transport.SnsClient.FindTopicAsync(topicName); + var topic = await transport.SnsClient!.FindTopicAsync(topicName); topic.ShouldNotBeNull(); topic.TopicArn.ShouldNotBeNull(); diff --git a/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue.cs b/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue.cs index 8abfa6f3a..4f4078de1 100644 --- a/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue.cs +++ b/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue.cs @@ -10,7 +10,7 @@ namespace Wolverine.AmazonSns.Tests; public class send_to_topic_and_receive_in_queue : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -91,6 +91,6 @@ public static class SqsMessageHandler public static void Handle(SnsMessage message) { // nothing - var x = 2; + // intentionally empty } } \ No newline at end of file diff --git a/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue_in_aws.cs b/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue_in_aws.cs index 57dfc34d3..84d6452ba 100644 --- a/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue_in_aws.cs +++ b/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue_in_aws.cs @@ -8,9 +8,10 @@ namespace Wolverine.AmazonSns.Tests; +[Trait("Category", "Flaky")] public class send_to_topic_and_receive_in_queue_in_aws : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue_with_cloud_events.cs b/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue_with_cloud_events.cs index 84cc5c52d..4ddafd52b 100644 --- a/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue_with_cloud_events.cs +++ b/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue_with_cloud_events.cs @@ -10,7 +10,7 @@ namespace Wolverine.AmazonSns.Tests; public class send_to_topic_and_receive_in_queue_with_cloud_events : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue_with_rawMessageDelivery.cs b/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue_with_rawMessageDelivery.cs index d0aa03d81..4a3ea2641 100644 --- a/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue_with_rawMessageDelivery.cs +++ b/src/Transports/AWS/Wolverine.AmazonSns.Tests/send_to_topic_and_receive_in_queue_with_rawMessageDelivery.cs @@ -10,7 +10,7 @@ namespace Wolverine.AmazonSns.Tests; public class send_to_topic_and_receive_in_queue_with_rawMessageDelivery : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Transports/AWS/Wolverine.AmazonSns.Tests/sending_compliance_with_prefixes.cs b/src/Transports/AWS/Wolverine.AmazonSns.Tests/sending_compliance_with_prefixes.cs index adfdba0c7..29f7c7395 100644 --- a/src/Transports/AWS/Wolverine.AmazonSns.Tests/sending_compliance_with_prefixes.cs +++ b/src/Transports/AWS/Wolverine.AmazonSns.Tests/sending_compliance_with_prefixes.cs @@ -55,9 +55,9 @@ await SenderIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Transports/AWS/Wolverine.AmazonSns/AmazonSnsSubscriberConfiguration.cs b/src/Transports/AWS/Wolverine.AmazonSns/AmazonSnsSubscriberConfiguration.cs index e42ea3645..cc70ce73c 100644 --- a/src/Transports/AWS/Wolverine.AmazonSns/AmazonSnsSubscriberConfiguration.cs +++ b/src/Transports/AWS/Wolverine.AmazonSns/AmazonSnsSubscriberConfiguration.cs @@ -94,9 +94,9 @@ public AmazonSnsSubscriberConfiguration UseNServiceBusInterop(string? replyQueue add(e => { e.DefaultSerializer = new NewtonsoftSerializer(new JsonSerializerSettings()); - e.Mapper = new NServiceBusEnvelopeMapper(replyQueueName, e); + e.Mapper = new NServiceBusEnvelopeMapper(replyQueueName!, e); }); - + return this; } @@ -106,7 +106,7 @@ public AmazonSnsSubscriberConfiguration UseNServiceBusInterop(string? replyQueue /// public AmazonSnsSubscriberConfiguration UseMassTransitInterop() { - add(e => e.Mapper = new MassTransitMapper(Endpoint as IMassTransitInteropEndpoint)); + add(e => e.Mapper = new MassTransitMapper((Endpoint as IMassTransitInteropEndpoint)!)); return this; } diff --git a/src/Transports/AWS/Wolverine.AmazonSns/Internal/AmazonSnsTransport.cs b/src/Transports/AWS/Wolverine.AmazonSns/Internal/AmazonSnsTransport.cs index 0c78b64f6..7a5947b44 100644 --- a/src/Transports/AWS/Wolverine.AmazonSns/Internal/AmazonSnsTransport.cs +++ b/src/Transports/AWS/Wolverine.AmazonSns/Internal/AmazonSnsTransport.cs @@ -39,7 +39,7 @@ internal AmazonSnsTransport(IAmazonSimpleNotificationService snsClient, IAmazonS public int LocalStackPort { get; set; } public bool UseLocalStackInDevelopment { get; set; } - internal AmazonSqsTransport SQS { get; set; } + internal AmazonSqsTransport SQS { get; set; } = null!; // TODO duplicated code in SqsTransport public static string SanitizeSnsName(string identifier) diff --git a/src/Transports/AWS/Wolverine.AmazonSns/Internal/NServiceBusEnvelopeMapper.cs b/src/Transports/AWS/Wolverine.AmazonSns/Internal/NServiceBusEnvelopeMapper.cs index 0e89cd2ae..b2c3e216a 100644 --- a/src/Transports/AWS/Wolverine.AmazonSns/Internal/NServiceBusEnvelopeMapper.cs +++ b/src/Transports/AWS/Wolverine.AmazonSns/Internal/NServiceBusEnvelopeMapper.cs @@ -88,7 +88,7 @@ public void ReadEnvelopeData(Envelope envelope, string messageBody, IDictionary< if (sqs.Headers.TryGetValue("NServiceBus.EnclosedMessageTypes", out var messageTypeName)) { - Type messageType = Type.GetType(messageTypeName); + Type? messageType = Type.GetType(messageTypeName); if (messageType != null) { envelope.MessageType = messageType.ToMessageTypeName(); @@ -105,18 +105,18 @@ internal record SnsEnvelope(string Body, Dictionary Headers); public string BuildMessageBody(Envelope envelope) { - var data = Convert.ToBase64String(_serializer.WriteMessage(envelope.Message)); + var data = Convert.ToBase64String(_serializer.WriteMessage(envelope.Message!)); var sqs = new SnsEnvelope(data, new()) { Headers = { ["NServiceBus.MessageId"] = envelope.Id.ToString(), ["NServiceBus.ConversationId"] = envelope.ConversationId.ToString(), - ["NServiceBus.CorrelationId"] = envelope.CorrelationId, + ["NServiceBus.CorrelationId"] = envelope.CorrelationId!, ["NServiceBus.ReplyToAddress"] = _replyName, ["NServiceBus.ContentType"] = "application/json", ["NServiceBus.TimeSent"] = envelope.SentAt.ToString("yyyy-MM-dd HH:mm:ss:ffffff Z"), - ["NServiceBus.EnclosedMessageTypes"] = envelope.Message.GetType().ToMessageTypeName() + ["NServiceBus.EnclosedMessageTypes"] = envelope.Message!.GetType().ToMessageTypeName() } }; diff --git a/src/Transports/AWS/Wolverine.AmazonSns/Internal/SnsSenderProtocol.cs b/src/Transports/AWS/Wolverine.AmazonSns/Internal/SnsSenderProtocol.cs index 476400437..a0491dd55 100644 --- a/src/Transports/AWS/Wolverine.AmazonSns/Internal/SnsSenderProtocol.cs +++ b/src/Transports/AWS/Wolverine.AmazonSns/Internal/SnsSenderProtocol.cs @@ -57,7 +57,7 @@ public OutgoingSnsBatch(AmazonSnsTopic topic, ILogger logger, IEnumerable }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } @@ -60,7 +60,7 @@ public virtual async Task dlq_mechanics() var transport = runtime.Options.Transports.GetOrCreate(); var queue = transport.Queues[AmazonSqsTransport.DeadLetterQueueName]; await queue.InitializeAsync(NullLogger.Instance); - var messages = await transport.Client.ReceiveMessageAsync(queue.QueueUrl); + var messages = await transport.Client!.ReceiveMessageAsync(queue.QueueUrl); messages.Messages.Count.ShouldBeGreaterThan(0); } } \ No newline at end of file diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/ConventionalRoutingContext.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/ConventionalRoutingContext.cs index ece308640..429d3e033 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/ConventionalRoutingContext.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/ConventionalRoutingContext.cs @@ -9,7 +9,7 @@ namespace Wolverine.AmazonSqs.Tests.ConventionalRouting; public abstract class ConventionalRoutingContext : IDisposable { - private IHost _host; + private IHost _host = null!; internal IWolverineRuntime theRuntime { diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/conventional_listener_discovery.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/conventional_listener_discovery.cs index 3d92dcac5..59e2bcbcb 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/conventional_listener_discovery.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/conventional_listener_discovery.cs @@ -9,6 +9,7 @@ namespace Wolverine.AmazonSqs.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class conventional_listener_discovery : ConventionalRoutingContext { [Fact] @@ -18,7 +19,7 @@ public void disable_sender_with_lambda() { if (t == typeof(PublishedMessage)) { - return null; // should not be routed + return null!; // should not be routed } return t.ToMessageTypeName().Replace('.', '-'); diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/discover_with_naming_prefix.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/discover_with_naming_prefix.cs index 75f221d53..ccde35b8c 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/discover_with_naming_prefix.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/discover_with_naming_prefix.cs @@ -6,6 +6,7 @@ namespace Wolverine.AmazonSqs.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class discover_with_naming_prefix : IDisposable { private readonly IHost _host; diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs index 83dd19ffb..8aa45175b 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs @@ -6,6 +6,7 @@ namespace Wolverine.AmazonSqs.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class end_to_end_with_conventional_routing : IDisposable { private readonly IHost _receiver; @@ -44,7 +45,7 @@ public async Task send_from_one_node_to_another_all_with_conventional_routing() var received = session .AllRecordsInOrder() - .Where(x => x.Envelope.Message?.GetType() == typeof(RoutedMessage)) + .Where(x => x.Envelope!.Message!.GetType() == typeof(RoutedMessage)) .Single(x => x.MessageEventType == MessageEventType.Received); received diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs index 34a65868e..3e61a0274 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs @@ -6,6 +6,7 @@ namespace Wolverine.AmazonSqs.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class end_to_end_with_conventional_routing_with_prefix : IDisposable { private readonly IHost _receiver; @@ -48,13 +49,13 @@ public async Task send_from_one_node_to_another_all_with_conventional_routing() var received = session .AllRecordsInOrder() - .Where(x => x.Envelope.Message?.GetType() == typeof(RoutedMessage)) + .Where(x => x.Envelope!.Message!.GetType() == typeof(RoutedMessage)) .Single(x => x.MessageEventType == MessageEventType.Received); received .ServiceName.ShouldBe("Receiver"); - received.Envelope.Destination + received.Envelope!.Destination! .ShouldBe(new Uri("sqs://shazaam-routed/")); } } \ No newline at end of file diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_all_defaults.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_all_defaults.cs index 9ffa6efd7..194c00ed5 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_all_defaults.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_all_defaults.cs @@ -5,6 +5,7 @@ namespace Wolverine.AmazonSqs.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class when_discovering_a_listening_endpoint_with_all_defaults : ConventionalRoutingContext { private readonly Uri theExpectedUri = "sqs://routed".ToUri(); diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_overridden_queue_naming.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_overridden_queue_naming.cs index b852adf2b..5e123170d 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_overridden_queue_naming.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_overridden_queue_naming.cs @@ -4,6 +4,7 @@ namespace Wolverine.AmazonSqs.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class when_discovering_a_listening_endpoint_with_overridden_queue_naming : ConventionalRoutingContext { private readonly Uri theExpectedUri = "sqs://routedmessage2".ToUri(); diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/when_discovering_a_sender_with_all_defaults.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/when_discovering_a_sender_with_all_defaults.cs index 995f69435..944aaf2cf 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/when_discovering_a_sender_with_all_defaults.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/ConventionalRouting/when_discovering_a_sender_with_all_defaults.cs @@ -6,6 +6,7 @@ namespace Wolverine.AmazonSqs.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class when_discovering_a_sender_with_all_defaults : ConventionalRoutingContext { private readonly MessageRoute theRoute; diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/DurableSendingAndReceivingCompliance.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/DurableSendingAndReceivingCompliance.cs index e819dcb99..0858a6fd7 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/DurableSendingAndReceivingCompliance.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/DurableSendingAndReceivingCompliance.cs @@ -67,9 +67,9 @@ await ReceiverIs(opts => await Receiver.RebuildAllEnvelopeStorageAsync(); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } public class DurableSendingAndReceivingCompliance : TransportCompliance @@ -88,7 +88,7 @@ public virtual async Task dlq_mechanics() var transport = runtime.Options.Transports.GetOrCreate(); var queue = transport.Queues[AmazonSqsTransport.DeadLetterQueueName]; await queue.InitializeAsync(NullLogger.Instance); - var messages = await transport.Client.ReceiveMessageAsync(queue.QueueUrl); + var messages = await transport.Client!.ReceiveMessageAsync(queue.QueueUrl); messages.Messages.Count.ShouldBeGreaterThan(0); } } diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/InlineSendingAndReceivingCompliance.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/InlineSendingAndReceivingCompliance.cs index 12ddc08d4..5510df9f7 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/InlineSendingAndReceivingCompliance.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/InlineSendingAndReceivingCompliance.cs @@ -44,9 +44,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } @@ -66,7 +66,7 @@ public virtual async Task dlq_mechanics() var transport = runtime.Options.Transports.GetOrCreate(); var queue = transport.Queues[AmazonSqsTransport.DeadLetterQueueName]; await queue.InitializeAsync(NullLogger.Instance); - var messages = await transport.Client.ReceiveMessageAsync(queue.QueueUrl); + var messages = await transport.Client!.ReceiveMessageAsync(queue.QueueUrl); messages.Messages.Count.ShouldBeGreaterThan(0); } } \ No newline at end of file diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/RawJson/RawJsonSqsEnvelopeMapperTests.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/RawJson/RawJsonSqsEnvelopeMapperTests.cs index 300298e7f..dc0982429 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/RawJson/RawJsonSqsEnvelopeMapperTests.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/RawJson/RawJsonSqsEnvelopeMapperTests.cs @@ -42,7 +42,7 @@ public class TextDetected public string Status { get; set; } = string.Empty; - public DocumentLocation DocumentLocation { get; set; } + public DocumentLocation DocumentLocation { get; set; } = null!; public long Timestamp { get; set; } = -1; diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/RawJson/receive_raw_json_as_buffered.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/RawJson/receive_raw_json_as_buffered.cs index 4d020d3f1..8b89423f6 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/RawJson/receive_raw_json_as_buffered.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/RawJson/receive_raw_json_as_buffered.cs @@ -10,9 +10,9 @@ namespace Wolverine.AmazonSqs.Tests.RawJson { public class receive_raw_json_as_buffered : IAsyncLifetime { - private IHost _host; - private IHost _sender; - private string theQueueName; + private IHost _host = null!; + private IHost _sender = null!; + private string theQueueName = null!; public async Task InitializeAsync() { diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/RawJson/receive_raw_json_as_inline.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/RawJson/receive_raw_json_as_inline.cs index 5e268b511..29c1be5b0 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/RawJson/receive_raw_json_as_inline.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/RawJson/receive_raw_json_as_inline.cs @@ -10,9 +10,9 @@ namespace Wolverine.AmazonSqs.Tests.RawJson; public class receive_raw_json_as_inline : IAsyncLifetime { - private IHost _host; - private IHost _sender; - private string theQueueName; + private IHost _host = null!; + private IHost _sender = null!; + private string theQueueName = null!; public async Task InitializeAsync() { diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/Samples/Bootstrapping.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/Samples/Bootstrapping.cs index ac22f3682..97cf00f46 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/Samples/Bootstrapping.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/Samples/Bootstrapping.cs @@ -10,6 +10,7 @@ namespace Wolverine.AmazonSqs.Tests.Samples; +[Trait("Category", "Flaky")] public class Bootstrapping { public static async Task use_named_brokers() @@ -388,7 +389,7 @@ public class CustomSqsMapper : ISqsEnvelopeMapper public string BuildMessageBody(Envelope envelope) { // Serialized data from the Wolverine message - return Encoding.Default.GetString(envelope.Data); + return Encoding.Default.GetString(envelope.Data!); } // Specify header values for the SQS message from the Wolverine envelope diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/bootstrapping.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/bootstrapping.cs index 3315e4beb..d850545f1 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/bootstrapping.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/bootstrapping.cs @@ -5,7 +5,7 @@ namespace Wolverine.AmazonSqs.Tests; -public class bootstrapping +public class Bootstrapping { [Fact] public async Task create_an_open_client() @@ -17,7 +17,7 @@ public async Task create_an_open_client() var transport = options.AmazonSqsTransport(); // Just a smoke test on configuration here - var queueNames = await transport.Client.ListQueuesAsync("wolverine"); + var queueNames = await transport.Client!.ListQueuesAsync("wolverine"); } [Fact] @@ -37,11 +37,11 @@ public async Task create_new_queue_on_startup() var transport = options.AmazonSqsTransport(); // Just a smoke test on configuration here - var queueNames = await transport.Client.ListQueuesAsync("wolverine"); + var queueNames = await transport.Client!.ListQueuesAsync("wolverine"); var queueUrl = queueNames.QueueUrls.FirstOrDefault(x => x.Contains(queueName)); queueUrl.ShouldNotBeNull(); - await transport.Client.DeleteQueueAsync(queueUrl); + await transport.Client!.DeleteQueueAsync(queueUrl); } [Fact] @@ -61,11 +61,11 @@ public async Task auto_purge_queue_on_startup_smoke_test() var options = host.Services.GetRequiredService(); var transport = options.AmazonSqsTransport(); - var queueNames = await transport.Client.ListQueuesAsync("wolverine"); + var queueNames = await transport.Client!.ListQueuesAsync("wolverine"); var queueUrl = queueNames.QueueUrls.FirstOrDefault(x => x.Contains(queueName)); queueUrl.ShouldNotBeNull(); - await transport.Client.DeleteQueueAsync(queueUrl); + await transport.Client!.DeleteQueueAsync(queueUrl); } [Fact] diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/concurrency_resilient_sharded_processing.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/concurrency_resilient_sharded_processing.cs index 38fa6b945..6b4aa35d1 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/concurrency_resilient_sharded_processing.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/concurrency_resilient_sharded_processing.cs @@ -13,6 +13,7 @@ namespace Wolverine.AmazonSqs.Tests; +[Trait("Category", "Flaky")] public class concurrency_resilient_sharded_processing { private readonly ITestOutputHelper _output; @@ -98,7 +99,7 @@ public async Task hammer_it_with_lots_of_messages_against_buffered() var counts = envelopes.GroupBy(x => x.Destination); foreach (var count in counts) { - _output.WriteLine(count.Key.ToString() + " had " + count.Count()); + _output.WriteLine(count.Key!.ToString() + " had " + count.Count()); } envelopes.Any(x => x.Destination == new Uri("sqs://letters1")).ShouldBeTrue(); diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/end_to_end_with_named_broker.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/end_to_end_with_named_broker.cs index ff35cac91..8b86f9e28 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/end_to_end_with_named_broker.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/end_to_end_with_named_broker.cs @@ -41,7 +41,7 @@ public async Task send_message_to_and_receive_through_kafka_with_inline_receiver ColorHandler.Received = new(); - Task.Run(async () => + _ = Task.Run(async () => { for (int i = 0; i < 10000; i++) { diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/global_partitioned_sharded_processing.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/global_partitioned_sharded_processing.cs index c0ac95cef..118e35dbe 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/global_partitioned_sharded_processing.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/global_partitioned_sharded_processing.cs @@ -85,7 +85,7 @@ public async Task hammer_it_with_lots_of_messages_global_partitioned() var counts = envelopes.GroupBy(x => x.Destination); foreach (var count in counts) { - _output.WriteLine(count.Key.ToString() + " had " + count.Count()); + _output.WriteLine(count.Key!.ToString() + " had " + count.Count()); } // In single-node mode, global partitioning routes directly to companion local queues diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/send_and_receive.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/send_and_receive.cs index 027e2595d..2453597ea 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/send_and_receive.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/send_and_receive.cs @@ -7,7 +7,7 @@ namespace Wolverine.AmazonSqs.Tests; public class send_and_receive : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/send_and_receive_with_CloudEvents.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/send_and_receive_with_CloudEvents.cs index b3def9e43..73e2c52ae 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/send_and_receive_with_CloudEvents.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/send_and_receive_with_CloudEvents.cs @@ -7,7 +7,7 @@ namespace Wolverine.AmazonSqs.Tests; public class send_and_receive_with_CloudEvents : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/sending_compliance_with_prefixes.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/sending_compliance_with_prefixes.cs index c7c8016a3..78c8b72df 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/sending_compliance_with_prefixes.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/sending_compliance_with_prefixes.cs @@ -40,9 +40,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Transports/AWS/Wolverine.AmazonSqs/AmazonSqsListenerConfiguration.cs b/src/Transports/AWS/Wolverine.AmazonSqs/AmazonSqsListenerConfiguration.cs index 92abe332a..7c7c781c9 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs/AmazonSqsListenerConfiguration.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs/AmazonSqsListenerConfiguration.cs @@ -147,7 +147,7 @@ public AmazonSqsListenerConfiguration UseNServiceBusInterop(string? replyQueueNa add(e => { e.DefaultSerializer = new NewtonsoftSerializer(new JsonSerializerSettings()); - e.Mapper = new NServiceBusEnvelopeMapper(replyQueueName, e); + e.Mapper = new NServiceBusEnvelopeMapper(replyQueueName!, e); }); return this; @@ -155,7 +155,7 @@ public AmazonSqsListenerConfiguration UseNServiceBusInterop(string? replyQueueNa public AmazonSqsListenerConfiguration UseMassTransitInterop(Action? configure = null) { - add(e => e.Mapper = new MassTransitMapper(Endpoint as IMassTransitInteropEndpoint)); + add(e => e.Mapper = new MassTransitMapper((Endpoint as IMassTransitInteropEndpoint)!)); return this; } @@ -261,7 +261,7 @@ public void ReadEnvelopeData(Envelope envelope, string messageBody, IDictionary< if (sqs.Headers.TryGetValue("NServiceBus.EnclosedMessageTypes", out var messageTypeName)) { - Type messageType = Type.GetType(messageTypeName); + Type? messageType = Type.GetType(messageTypeName); if (messageType != null) { envelope.MessageType = messageType.ToMessageTypeName(); @@ -275,18 +275,18 @@ public void ReadEnvelopeData(Envelope envelope, string messageBody, IDictionary< public string BuildMessageBody(Envelope envelope) { - var data = Convert.ToBase64String(_serializer.WriteMessage(envelope.Message)); + var data = Convert.ToBase64String(_serializer.WriteMessage(envelope.Message!)); var sqs = new SqsEnvelope(data, new()) { Headers = { ["NServiceBus.MessageId"] = envelope.Id.ToString(), ["NServiceBus.ConversationId"] = envelope.ConversationId.ToString(), - ["NServiceBus.CorrelationId"] = envelope.CorrelationId, + ["NServiceBus.CorrelationId"] = envelope.CorrelationId!, ["NServiceBus.ReplyToAddress"] = _replyName, ["NServiceBus.ContentType"] = "application/json", ["NServiceBus.TimeSent"] = envelope.SentAt.ToString("yyyy-MM-dd HH:mm:ss:ffffff Z"), - ["NServiceBus.EnclosedMessageTypes"] = envelope.Message.GetType().ToMessageTypeName() + ["NServiceBus.EnclosedMessageTypes"] = envelope.Message!.GetType().ToMessageTypeName() } }; diff --git a/src/Transports/AWS/Wolverine.AmazonSqs/AmazonSqsSubscriberConfiguration.cs b/src/Transports/AWS/Wolverine.AmazonSqs/AmazonSqsSubscriberConfiguration.cs index 0a7dcc165..b36640800 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs/AmazonSqsSubscriberConfiguration.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs/AmazonSqsSubscriberConfiguration.cs @@ -73,9 +73,9 @@ public AmazonSqsSubscriberConfiguration UseNServiceBusInterop(string? replyQueue add(e => { e.DefaultSerializer = new NewtonsoftSerializer(new JsonSerializerSettings()); - e.Mapper = new NServiceBusEnvelopeMapper(replyQueueName, e); + e.Mapper = new NServiceBusEnvelopeMapper(replyQueueName!, e); }); - + return this; } @@ -85,7 +85,7 @@ public AmazonSqsSubscriberConfiguration UseNServiceBusInterop(string? replyQueue /// public AmazonSqsSubscriberConfiguration UseMassTransitInterop() { - add(e => e.Mapper = new MassTransitMapper(Endpoint as IMassTransitInteropEndpoint)); + add(e => e.Mapper = new MassTransitMapper((Endpoint as IMassTransitInteropEndpoint)!)); return this; } diff --git a/src/Transports/AWS/Wolverine.AmazonSqs/Internal/AmazonSqsQueue.cs b/src/Transports/AWS/Wolverine.AmazonSqs/Internal/AmazonSqsQueue.cs index f6922eb80..7142f6bda 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs/Internal/AmazonSqsQueue.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs/Internal/AmazonSqsQueue.cs @@ -174,7 +174,7 @@ public async ValueTask> GetAttributesAsync() Uri? IMassTransitInteropEndpoint.MassTransitReplyUri() { var reply = _parent.ReplyEndpoint(); - return reply.As().MassTransitUri(); + return reply!.As().MassTransitUri(); } Uri? IMassTransitInteropEndpoint.TranslateMassTransitToWolverineUri(Uri uri) diff --git a/src/Transports/AWS/Wolverine.AmazonSqs/Internal/AmazonSqsTransport.cs b/src/Transports/AWS/Wolverine.AmazonSqs/Internal/AmazonSqsTransport.cs index 0c16b11ba..5a48455e1 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs/Internal/AmazonSqsTransport.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs/Internal/AmazonSqsTransport.cs @@ -265,5 +265,5 @@ internal void ConnectToLocalStack(int port = 4566) Config.ServiceURL = $"http://localhost:{port}"; } - public string ServerHost => Config.ServiceURL?.ToUri().Host; + public string ServerHost => Config.ServiceURL?.ToUri().Host!; } \ No newline at end of file diff --git a/src/Transports/AWS/Wolverine.AmazonSqs/Internal/SqsSenderProtocol.cs b/src/Transports/AWS/Wolverine.AmazonSqs/Internal/SqsSenderProtocol.cs index afd47250e..56421bbc4 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs/Internal/SqsSenderProtocol.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs/Internal/SqsSenderProtocol.cs @@ -58,7 +58,7 @@ public OutgoingSqsBatch(AmazonSqsQueue queue, ILogger logger, IEnumerable }); } - public Task DisposeAsync() + public new Task DisposeAsync() { return Task.CompletedTask; } @@ -45,6 +45,7 @@ protected override Task AfterDisposeAsync() } } +[Trait("Category", "Flaky")] public class BufferedSendingAndReceivingCompliance : TransportCompliance { [Fact] diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_1684_separated_handlers_and_conventional_routing.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_1684_separated_handlers_and_conventional_routing.cs index 384c00da0..f6967c32f 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_1684_separated_handlers_and_conventional_routing.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_1684_separated_handlers_and_conventional_routing.cs @@ -10,6 +10,7 @@ namespace Wolverine.AzureServiceBus.Tests.Bugs; +[Trait("Category", "Flaky")] public class Bug_1684_separated_handlers_and_conventional_routing(ITestOutputHelper Output) : IAsyncLifetime { public Task InitializeAsync() => Task.CompletedTask; diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_1933_multi_tenant_conventional_routing.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_1933_multi_tenant_conventional_routing.cs index 736dc21ed..607dc439e 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_1933_multi_tenant_conventional_routing.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_1933_multi_tenant_conventional_routing.cs @@ -17,6 +17,7 @@ public static void Handle(Bug1933Message message) } } +[Trait("Category", "Flaky")] public class Bug_1933_multi_tenant_conventional_routing : IAsyncLifetime { public Task InitializeAsync() => Task.CompletedTask; @@ -37,7 +38,7 @@ public async Task DisposeAsync() private static async Task DeleteTenantEmulatorObjectsAsync() { - var client = new ServiceBusAdministrationClient(Servers.AzureServiceBusTenantManagementConnectionString); + var client = new ServiceBusAdministrationClient(Servers.AzureServiceBusConnectionString); await foreach (var topic in client.GetTopicsAsync()) { @@ -62,13 +63,13 @@ public async Task should_receive_message_when_published_without_tenant_id() opts.UseAzureServiceBusTesting() .AutoPurgeOnStartup() - .AddTenantByConnectionString("test", Servers.AzureServiceBusTenantConnectionString) + .AddTenantByConnectionString("test", Servers.AzureServiceBusConnectionString) .UseConventionalRouting(); // Set the tenant's management connection string for the emulator var transport = opts.Transports.GetOrCreate(); transport.Tenants["test"].Transport.ManagementConnectionString = - Servers.AzureServiceBusTenantManagementConnectionString; + Servers.AzureServiceBusConnectionString; }).StartAsync(); var message = new Bug1933Message("Hello from default namespace"); diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_2283_purge_session_subscription.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_2283_purge_session_subscription.cs index 96d31a99b..3818a3ee1 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_2283_purge_session_subscription.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_2283_purge_session_subscription.cs @@ -6,9 +6,10 @@ namespace Wolverine.AzureServiceBus.Tests.Bugs; +[Trait("Category", "Flaky")] public class Bug_2283_purge_session_subscription : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_2307_batching_with_conventional_routing.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_2307_batching_with_conventional_routing.cs index 6aa6d756d..5c0d1d6a7 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_2307_batching_with_conventional_routing.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Bugs/Bug_2307_batching_with_conventional_routing.cs @@ -10,9 +10,10 @@ namespace Wolverine.AzureServiceBus.Tests.Bugs; +[Trait("Category", "Flaky")] public class Bug_2307_batching_with_conventional_routing : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/Broadcasting/end_to_end_with_conventional_routing.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/Broadcasting/end_to_end_with_conventional_routing.cs index d4226917a..323c6f5a3 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/Broadcasting/end_to_end_with_conventional_routing.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/Broadcasting/end_to_end_with_conventional_routing.cs @@ -7,10 +7,11 @@ namespace Wolverine.AzureServiceBus.Tests.ConventionalRouting.Broadcasting; +[Trait("Category", "Flaky")] public class end_to_end_with_conventional_routing : IAsyncLifetime { - private IHost _receiver; - private IHost _sender; + private IHost _receiver = null!; + private IHost _sender = null!; public Task InitializeAsync() { @@ -76,10 +77,10 @@ public async Task send_from_one_node_to_another_all_with_conventional_routing() var received = session .AllRecordsInOrder() - .Where(x => x.Envelope.Message?.GetType() == typeof(Routed2Message)) + .Where(x => x.Envelope!.Message?.GetType() == typeof(Routed2Message)) .Single(x => x.MessageEventType == MessageEventType.Received); - received + received! .ServiceName.ShouldBe("Receiver"); } } \ No newline at end of file diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/ConventionalRoutingContext.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/ConventionalRoutingContext.cs index d70b34df7..f9f9d50c5 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/ConventionalRoutingContext.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/ConventionalRoutingContext.cs @@ -10,7 +10,7 @@ namespace Wolverine.AzureServiceBus.Tests.ConventionalRouting; public abstract class ConventionalRoutingContext : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; internal IWolverineRuntime theRuntime { diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/conventional_listener_discovery.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/conventional_listener_discovery.cs index b222b4c56..41364c498 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/conventional_listener_discovery.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/conventional_listener_discovery.cs @@ -10,6 +10,7 @@ namespace Wolverine.AzureServiceBus.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class conventional_listener_discovery : ConventionalRoutingContext { [Fact] diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/discover_with_naming_prefix.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/discover_with_naming_prefix.cs index cec8e3988..97f866238 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/discover_with_naming_prefix.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/discover_with_naming_prefix.cs @@ -7,6 +7,7 @@ namespace Wolverine.AzureServiceBus.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class discover_with_naming_prefix : IDisposable { private readonly IHost _host; diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs index 1a4b7cb6f..a9d1c98bc 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs @@ -8,10 +8,11 @@ namespace Wolverine.AzureServiceBus.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class end_to_end_with_conventional_routing : IAsyncLifetime { - private IHost _receiver; - private IHost _sender; + private IHost _receiver = null!; + private IHost _sender = null!; public async Task InitializeAsync() { @@ -55,10 +56,10 @@ public async Task send_from_one_node_to_another_all_with_conventional_routing() var received = session .AllRecordsInOrder() - .Where(x => x.Envelope.Message?.GetType() == typeof(RoutedMessage)) + .Where(x => x.Envelope!.Message?.GetType() == typeof(RoutedMessage)) .Single(x => x.MessageEventType == MessageEventType.Received); - received + received! .ServiceName.ShouldBe("Receiver"); } } \ No newline at end of file diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs index e7bcb5b4e..35b2c7bb1 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs @@ -7,10 +7,11 @@ namespace Wolverine.AzureServiceBus.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class end_to_end_with_conventional_routing_with_prefix : IAsyncLifetime { - private IHost _receiver; - private IHost _sender; + private IHost _receiver = null!; + private IHost _sender = null!; public Task InitializeAsync() { @@ -54,13 +55,13 @@ public async Task send_from_one_node_to_another_all_with_conventional_routing() var received = session .AllRecordsInOrder() - .Where(x => x.Envelope.Message?.GetType() == typeof(RoutedMessage)) + .Where(x => x.Envelope!.Message?.GetType() == typeof(RoutedMessage)) .Single(x => x.MessageEventType == MessageEventType.Received); received .ServiceName.ShouldBe("Receiver"); - received.Envelope.Destination + received.Envelope!.Destination! .ShouldBe(new Uri("asb://queue/shazaam.routed")); } } \ No newline at end of file diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_all_defaults.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_all_defaults.cs index 017d1e490..5c05eb063 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_all_defaults.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_all_defaults.cs @@ -6,6 +6,7 @@ namespace Wolverine.AzureServiceBus.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class when_discovering_a_listening_endpoint_with_all_defaults : ConventionalRoutingContext { private readonly Uri theExpectedUri = "asb://queue/routed2".ToUri(); diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_overridden_queue_naming.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_overridden_queue_naming.cs index 871b92af2..69b29759e 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_overridden_queue_naming.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/when_discovering_a_listening_endpoint_with_overridden_queue_naming.cs @@ -5,6 +5,7 @@ namespace Wolverine.AzureServiceBus.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class when_discovering_a_listening_endpoint_with_overridden_queue_naming : ConventionalRoutingContext { private readonly Uri theExpectedUri = "asb://queue/routedmessage2".ToUri(); diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/when_discovering_a_sender_with_all_defaults.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/when_discovering_a_sender_with_all_defaults.cs index a3c48d04d..d4303b5c0 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/when_discovering_a_sender_with_all_defaults.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/ConventionalRouting/when_discovering_a_sender_with_all_defaults.cs @@ -7,6 +7,7 @@ namespace Wolverine.AzureServiceBus.Tests.ConventionalRouting; +[Trait("Category", "Flaky")] public class when_discovering_a_sender_with_all_defaults : ConventionalRoutingContext { private readonly MessageRoute theRoute; diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/DocumentationSamples.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/DocumentationSamples.cs index 06cc50dfe..57fa1c9aa 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/DocumentationSamples.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/DocumentationSamples.cs @@ -20,7 +20,7 @@ public async Task bootstrapping() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString) @@ -55,7 +55,7 @@ public async Task configuring_queues() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString).AutoProvision() @@ -95,7 +95,7 @@ public async Task configuring_a_listener() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString).AutoProvision(); @@ -131,7 +131,7 @@ public async Task configure_buffered_listener() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString).AutoProvision(); @@ -228,7 +228,7 @@ public async Task configure_durable_listener() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString).AutoProvision(); @@ -261,7 +261,7 @@ public async Task publishing_to_queue() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString).AutoProvision(); @@ -290,7 +290,7 @@ public async Task delivery_expiration_rules_per_subscriber() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString).AutoProvision(); @@ -322,7 +322,7 @@ public async Task conventional_listener_configuration() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString).AutoProvision() @@ -349,7 +349,7 @@ public async Task conventional_subscriber_configuration() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString).AutoProvision() @@ -381,7 +381,7 @@ public async Task conventional_routing_no_local_routing() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString).AutoProvision() @@ -405,7 +405,7 @@ public async Task conventional_routing() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString).AutoProvision() @@ -472,7 +472,7 @@ public static async Task custom_mapping() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString).AutoProvision(); @@ -484,13 +484,13 @@ public static async Task custom_mapping() { // Not sure how useful this would be, but we can start from // the baseline Wolverine mapping and just override a few mappings - mapper.MapPropertyToHeader(x => x.ContentType, "OtherTool.ContentType"); - mapper.MapPropertyToHeader(x => x.CorrelationId, "OtherTool.CorrelationId"); + mapper.MapPropertyToHeader(x => x.ContentType!, "OtherTool.ContentType"); + mapper.MapPropertyToHeader(x => x.CorrelationId!, "OtherTool.CorrelationId"); // and more // or a little uglier where you might be mapping and transforming data between // the transport's model and the Wolverine Envelope - mapper.MapProperty(x => x.ReplyUri, + mapper.MapProperty(x => x.ReplyUri!, (e, msg) => e.ReplyUri = new Uri($"asb://queue/{msg.ReplyTo}"), (e, msg) => msg.ReplyTo = "response"); @@ -515,7 +515,7 @@ public static async Task nservicebus() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString).AutoProvision(); diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/InlineSendingAndReceivingCompliance.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/InlineSendingAndReceivingCompliance.cs index 9b027a868..cb658e920 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/InlineSendingAndReceivingCompliance.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/InlineSendingAndReceivingCompliance.cs @@ -36,7 +36,7 @@ await ReceiverIs(opts => }); } - public Task DisposeAsync() + public new Task DisposeAsync() { return Task.CompletedTask; } diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Playing.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Playing.cs deleted file mode 100644 index 142ab7ea3..000000000 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Playing.cs +++ /dev/null @@ -1,28 +0,0 @@ -using DotNet.Testcontainers.Builders; -using Testcontainers.ServiceBus; -using Xunit; - -namespace Wolverine.AzureServiceBus.Tests; - -public class Playing -{ - private readonly ServiceBusContainer _serviceBusContainer; - public const ushort ServiceBusPort = 5672; - public const ushort ServiceBusHttpPort = 5300; - - [Fact] - public async Task spin_up_container() - { - - var container = new ServiceBusBuilder() - .WithImage("mcr.microsoft.com/azure-messaging/servicebus-emulator:latest") - .WithAcceptLicenseAgreement(true) - .WithPortBinding(ServiceBusPort, true) - .WithPortBinding(ServiceBusHttpPort, true) - .WithEnvironment("SQL_WAIT_INTERVAL", "0") - .WithResourceMapping("Config.json", "/ServiceBus_Emulator/ConfigFiles/") - .WithWaitStrategy(Wait.ForUnixContainer().UntilHttpRequestIsSucceeded(request => - request.ForPort(ServiceBusHttpPort).ForPath("/health"))) - .Build(); - } -} \ No newline at end of file diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Samples.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Samples.cs index 462ce1ca0..b0d715311 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Samples.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Samples.cs @@ -134,7 +134,7 @@ public void show_bootstrapping() // connection string out of configuration var azureServiceBusConnectionString = builder .Configuration - .GetConnectionString("azure-service-bus"); + .GetConnectionString("azure-service-bus")!; // Connect to the broker in the simplest possible way opts.UseAzureServiceBus(azureServiceBusConnectionString) @@ -153,15 +153,15 @@ public void show_bootstrapping() // Add new tenants by registering the tenant id and a separate fully qualified namespace // to a different Azure Service Bus connection - .AddTenantByNamespace("one", builder.Configuration.GetValue("asb_ns_one")) - .AddTenantByNamespace("two", builder.Configuration.GetValue("asb_ns_two")) - .AddTenantByNamespace("three", builder.Configuration.GetValue("asb_ns_three")) + .AddTenantByNamespace("one", builder.Configuration.GetValue("asb_ns_one")!) + .AddTenantByNamespace("two", builder.Configuration.GetValue("asb_ns_two")!) + .AddTenantByNamespace("three", builder.Configuration.GetValue("asb_ns_three")!) // OR, instead, add tenants by registering the tenant id and a separate connection string // to a different Azure Service Bus connection - .AddTenantByConnectionString("four", builder.Configuration.GetConnectionString("asb_four")) - .AddTenantByConnectionString("five", builder.Configuration.GetConnectionString("asb_five")) - .AddTenantByConnectionString("six", builder.Configuration.GetConnectionString("asb_six")); + .AddTenantByConnectionString("four", builder.Configuration.GetConnectionString("asb_four")!) + .AddTenantByConnectionString("five", builder.Configuration.GetConnectionString("asb_five")!) + .AddTenantByConnectionString("six", builder.Configuration.GetConnectionString("asb_six")!); // This Wolverine application would be listening to a queue // named "incoming" on all Azure Service Bus connections, including the default @@ -194,7 +194,7 @@ public class CustomAzureServiceBusMapper : IAzureServiceBusEnvelopeMapper { public void MapEnvelopeToOutgoing(Envelope envelope, ServiceBusMessage outgoing) { - outgoing.Body = new BinaryData(envelope.Data); + outgoing.Body = new BinaryData(envelope.Data!); if (envelope.DeliverWithin != null) { outgoing.TimeToLive = envelope.DeliverWithin.Value; diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/StatefulResourceSmokeTests.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/StatefulResourceSmokeTests.cs index 769b86b7b..4faa17f73 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/StatefulResourceSmokeTests.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/StatefulResourceSmokeTests.cs @@ -6,6 +6,7 @@ namespace Wolverine.AzureServiceBus.Tests; +[Trait("Category", "Flaky")] public class StatefulResourceSmokeTests : IAsyncLifetime { public Task InitializeAsync() => Task.CompletedTask; diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Wolverine.AzureServiceBus.Tests.csproj b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Wolverine.AzureServiceBus.Tests.csproj index 8c0eb4e24..6c9b78049 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Wolverine.AzureServiceBus.Tests.csproj +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/Wolverine.AzureServiceBus.Tests.csproj @@ -6,7 +6,6 @@ - diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/end_to_end.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/end_to_end.cs index 0aea79581..a216092dd 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/end_to_end.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/end_to_end.cs @@ -9,9 +9,10 @@ namespace Wolverine.AzureServiceBus.Tests; +[Trait("Category", "Flaky")] public class end_to_end : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/end_to_end_with_CloudEvents.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/end_to_end_with_CloudEvents.cs index 731f57239..0f56e71d4 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/end_to_end_with_CloudEvents.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/end_to_end_with_CloudEvents.cs @@ -10,7 +10,7 @@ namespace Wolverine.AzureServiceBus.Tests; public class end_to_end_with_CloudEvents : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/end_to_end_with_named_broker.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/end_to_end_with_named_broker.cs index 0ed054e45..9dbc37956 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/end_to_end_with_named_broker.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/end_to_end_with_named_broker.cs @@ -28,10 +28,10 @@ public static async Task bootstrap_with_named_brokers() var builder = Host.CreateApplicationBuilder(); builder.UseWolverine(opts => { - var connectionString1 = builder.Configuration.GetConnectionString("azureservicebus1"); + var connectionString1 = builder.Configuration.GetConnectionString("azureservicebus1")!; opts.AddNamedAzureServiceBusBroker(new BrokerName("one"), connectionString1); - - var connectionString2 = builder.Configuration.GetConnectionString("azureservicebus2"); + + var connectionString2 = builder.Configuration.GetConnectionString("azureservicebus2")!; opts.AddNamedAzureServiceBusBroker(new BrokerName("two"), connectionString2); opts.PublishAllMessages().ToAzureServiceBusQueueOnNamedBroker(new BrokerName("one"), "queue1"); @@ -139,8 +139,8 @@ public async Task correct_scheme_on_reply_uri() var (tracked, response) = await publisher.TrackActivity().AlsoTrack(receiver).InvokeAndWaitAsync(request); - response.Id.ShouldBe(request.Id); - tracked.Received.SingleEnvelope().Destination.Scheme.ShouldBe("other"); + response!.Id.ShouldBe(request.Id); + tracked.Received.SingleEnvelope().Destination!.Scheme.ShouldBe("other"); } } diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/multi_tenancy_through_separate_namespaces.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/multi_tenancy_through_separate_namespaces.cs index 13a5f4e54..85f26082d 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/multi_tenancy_through_separate_namespaces.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/multi_tenancy_through_separate_namespaces.cs @@ -32,13 +32,13 @@ public class MultiTenantedAzureServiceBusFixture : IAsyncLifetime public const string Tenant2ConnectionString = "CHANGE ME TO A REAL THING"; public const string Tenant3ConnectionString = "CHANGE ME TO A REAL THING"; - public IHost Three { get; set; } + public IHost Three { get; set; } = null!; - public IHost Two { get; set; } + public IHost Two { get; set; } = null!; - public IHost One { get; set; } + public IHost One { get; set; } = null!; - public IHost Main { get; private set; } + public IHost Main { get; private set; } = null!; public async Task InitializeAsync() { @@ -141,8 +141,8 @@ public async Task send_message_to_a_specific_tenant() response.ServiceName.ShouldBe("main"); // Label the envelope as tenant id = "two" because it was received at that point - response.Envelope.TenantId.ShouldBe("two"); - response.Envelope.Message.ShouldBeOfType() + response.Envelope!.TenantId.ShouldBe("two"); + response.Envelope!.Message!.ShouldBeOfType() .Id.ShouldBe(message.Id); } diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/send_and_receive_with_topics_and_subscriptions.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/send_and_receive_with_topics_and_subscriptions.cs index 63f637dbe..9f5aed97b 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/send_and_receive_with_topics_and_subscriptions.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/send_and_receive_with_topics_and_subscriptions.cs @@ -26,7 +26,7 @@ await ReceiverIs(opts => }); } - public Task DisposeAsync() + public new Task DisposeAsync() { return Task.CompletedTask; } diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/send_and_receive_with_topics_and_subscriptions_with_custom_rule.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/send_and_receive_with_topics_and_subscriptions_with_custom_rule.cs index e348cbbcf..e75da16f8 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/send_and_receive_with_topics_and_subscriptions_with_custom_rule.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/send_and_receive_with_topics_and_subscriptions_with_custom_rule.cs @@ -32,7 +32,7 @@ await ReceiverIs(opts => }); } - public Task DisposeAsync() + public new Task DisposeAsync() { return Task.CompletedTask; } diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/sending_compliance_with_prefixes.cs b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/sending_compliance_with_prefixes.cs index a1400329b..aa5110353 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/sending_compliance_with_prefixes.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus.Tests/sending_compliance_with_prefixes.cs @@ -37,7 +37,7 @@ await ReceiverIs(opts => }); } - public Task DisposeAsync() + public new Task DisposeAsync() { return Task.CompletedTask; } diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus/AzureServiceBusTopicBroadcastingRoutingConvention.cs b/src/Transports/Azure/Wolverine.AzureServiceBus/AzureServiceBusTopicBroadcastingRoutingConvention.cs index 86d37ed87..dd1d637ba 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus/AzureServiceBusTopicBroadcastingRoutingConvention.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus/AzureServiceBusTopicBroadcastingRoutingConvention.cs @@ -36,7 +36,7 @@ protected override (AzureServiceBusSubscriptionListenerConfiguration, Endpoint) { var topic = transport.Topics[topicName]; - var subscriptionName = _subscriptionNameSource == null ? transport.MaybeCorrectName(handlerType.FullName) : _subscriptionNameSource(handlerType); + var subscriptionName = _subscriptionNameSource == null ? transport.MaybeCorrectName(handlerType.FullName!) : _subscriptionNameSource(handlerType); var subscription = transport.Subscriptions.FirstOrDefault(x => diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus/AzureServiceBusTransport.cs b/src/Transports/Azure/Wolverine.AzureServiceBus/AzureServiceBusTransport.cs index d136425fe..f835cacbe 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus/AzureServiceBusTransport.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus/AzureServiceBusTransport.cs @@ -21,7 +21,7 @@ public partial class AzureServiceBusTransport : BrokerTransport _managementClient; public readonly List Subscriptions = new(); - private string _hostName; + private string _hostName = null!; public const string DeadLetterQueueName = DeadLetterQueueConstants.DefaultQueueName; public AzureServiceBusTransport() : this(ProtocolName) @@ -210,7 +210,7 @@ public string HostName { if (_hostName == null) { - var parts = ConnectionString.Split(';'); + var parts = ConnectionString!.Split(';'); foreach (var part in parts) { var split = part.Split('='); @@ -221,7 +221,7 @@ public string HostName } } - return _hostName; + return _hostName!; } } diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusEnvelopeMapper.cs b/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusEnvelopeMapper.cs index 8c0263754..605b68a4e 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusEnvelopeMapper.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusEnvelopeMapper.cs @@ -34,7 +34,7 @@ public AzureServiceBusEnvelopeMapper(Endpoint endpoint, IWolverineRuntime runtim } }); - MapProperty(x => x.GroupId, (e, m) => e.GroupId = m.SessionId, (e, m) => m.SessionId = e.GroupId); + MapProperty(x => x.GroupId!, (e, m) => e.GroupId = m.SessionId!, (e, m) => m.SessionId = e.GroupId); } diff --git a/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusQueue.cs b/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusQueue.cs index 92814d428..ceb5e3213 100644 --- a/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusQueue.cs +++ b/src/Transports/Azure/Wolverine.AzureServiceBus/Internal/AzureServiceBusQueue.cs @@ -199,7 +199,7 @@ protected override ISender CreateSender(IWolverineRuntime runtime) internal void ConfigureDeadLetterQueue(Action configure) { - var dlq = Parent.Queues[DeadLetterQueueName]; + var dlq = Parent.Queues[DeadLetterQueueName!]; configure(dlq); } @@ -250,23 +250,23 @@ void ReadReplyUri(Envelope e, ServiceBusReceivedMessage serviceBusReceivedMessag m.MapProperty(x => x.ReplyUri!, ReadReplyUri, WriteReplyToAddress); - m.MapProperty(x => x.MessageType, (e, m) => + m.MapProperty(x => x.MessageType!, (e, m) => { - // Incoming + // Incoming if (m.ApplicationProperties.TryGetValue("NServiceBus.EnclosedMessageTypes", out var raw)) { var typeName = (raw is byte[] b ? Encoding.Default.GetString(b) : raw.ToString())!; if (typeName.IsNotEmpty()) { var messageType = Type.GetType(typeName); - e.MessageType = messageType.ToMessageTypeName(); + e.MessageType = messageType!.ToMessageTypeName(); } } - }, + }, (e, m) => { // Outgoing, use the interop strategy here - m.ApplicationProperties["NServiceBus.EnclosedMessageTypes"] = e.Message.GetType().ToMessageTypeName(); + m.ApplicationProperties["NServiceBus.EnclosedMessageTypes"] = e.Message!.GetType().ToMessageTypeName(); }); }); } @@ -278,7 +278,7 @@ void ReadReplyUri(Envelope e, ServiceBusReceivedMessage serviceBusReceivedMessag Uri? IMassTransitInteropEndpoint.MassTransitReplyUri() { - return Parent.ReplyEndpoint().As().MassTransitUri(); + return Parent.ReplyEndpoint()!.As().MassTransitUri(); } Uri? IMassTransitInteropEndpoint.TranslateMassTransitToWolverineUri(Uri uri) diff --git a/src/Transports/GCP/Wolverine.Pubsub.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs b/src/Transports/GCP/Wolverine.Pubsub.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs index 4454f59be..fe875794a 100644 --- a/src/Transports/GCP/Wolverine.Pubsub.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs +++ b/src/Transports/GCP/Wolverine.Pubsub.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs @@ -72,7 +72,7 @@ public async Task send_from_one_node_to_another_all_with_conventional_routing() var received = session .AllRecordsInOrder() - .Where(x => x.Envelope.Message?.GetType() == typeof(RoutedMessage)) + .Where(x => x.Envelope!.Message?.GetType() == typeof(RoutedMessage)) .Single(x => x.MessageEventType == MessageEventType.Received); received.ServiceName.ShouldBe("Receiver"); diff --git a/src/Transports/GCP/Wolverine.Pubsub.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs b/src/Transports/GCP/Wolverine.Pubsub.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs index 1cc35fe59..42eb486e1 100644 --- a/src/Transports/GCP/Wolverine.Pubsub.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs +++ b/src/Transports/GCP/Wolverine.Pubsub.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs @@ -63,10 +63,10 @@ public async Task send_from_one_node_to_another_all_with_conventional_routing() var received = session .AllRecordsInOrder() - .Where(x => x.Envelope.Message?.GetType() == typeof(RoutedMessage)) + .Where(x => x.Envelope!.Message?.GetType() == typeof(RoutedMessage)) .Single(x => x.MessageEventType == MessageEventType.Received); received.ServiceName.ShouldBe("Receiver"); - received.Envelope.Destination.ShouldBe(new Uri($"{PubsubTransport.ProtocolName}://wolverine/shazaam.routed")); + received.Envelope!.Destination.ShouldBe(new Uri($"{PubsubTransport.ProtocolName}://wolverine/shazaam.routed")); } } \ No newline at end of file diff --git a/src/Transports/GCP/Wolverine.Pubsub/Internal/PubsubEnvelopeMapper.cs b/src/Transports/GCP/Wolverine.Pubsub/Internal/PubsubEnvelopeMapper.cs index d23a9bf5a..90380d81b 100644 --- a/src/Transports/GCP/Wolverine.Pubsub/Internal/PubsubEnvelopeMapper.cs +++ b/src/Transports/GCP/Wolverine.Pubsub/Internal/PubsubEnvelopeMapper.cs @@ -32,9 +32,9 @@ public PubsubEnvelopeMapper(PubsubEndpoint endpoint) : base(endpoint) } ); - MapPropertyToHeader(x => x.GroupId, "group-id"); - MapPropertyToHeader(x => x.DeduplicationId, "deduplication-id"); - MapPropertyToHeader(x => x.PartitionKey, "partition-key"); + MapPropertyToHeader(x => x.GroupId!, "group-id"); + MapPropertyToHeader(x => x.DeduplicationId!, "deduplication-id"); + MapPropertyToHeader(x => x.PartitionKey!, "partition-key"); } public void MapOutgoingToMessage(OutgoingMessageBatch outgoing, PubsubMessage message) diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/DeadLetterQueueTests.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/DeadLetterQueueTests.cs index abf5fec9c..a3e573781 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/DeadLetterQueueTests.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/DeadLetterQueueTests.cs @@ -16,7 +16,7 @@ namespace Wolverine.Kafka.Tests; public class DeadLetterQueueTests : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost _host; + private IHost _host = null!; private readonly string _topicName; private readonly string _dlqTopicName; @@ -32,7 +32,7 @@ public async Task InitializeAsync() _host = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092") + opts.UseKafka(KafkaContainerFixture.ConnectionString) .AutoProvision() .ConfigureConsumers(c => c.AutoOffsetReset = AutoOffsetReset.Earliest); @@ -56,7 +56,7 @@ public async Task InitializeAsync() { var config = new ConsumerConfig { - BootstrapServers = "localhost:9092", + BootstrapServers = KafkaContainerFixture.ConnectionString, GroupId = $"dlq-verify-{Guid.NewGuid():N}", AutoOffsetReset = AutoOffsetReset.Earliest, EnableAutoCommit = true diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/DocumentationSamples.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/DocumentationSamples.cs index 0c6cac00e..b629da026 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/DocumentationSamples.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/DocumentationSamples.cs @@ -16,7 +16,7 @@ public static async Task configure() using var host = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092") + opts.UseKafka(KafkaContainerFixture.ConnectionString) // See https://github.com/confluentinc/confluent-kafka-dotnet for the exact options here .ConfigureClient(client => @@ -101,7 +101,7 @@ public static async Task configure() // This will also set the Envelope.GroupId for any // received messages at this topic config.GroupId = "foo"; - config.BootstrapServers = "localhost:9092"; + config.BootstrapServers = KafkaContainerFixture.ConnectionString; // Other configuration }) @@ -134,7 +134,7 @@ public static async Task disable_producing() .UseWolverine(opts => { opts - .UseKafka("localhost:9092") + .UseKafka(KafkaContainerFixture.ConnectionString) // Tell Wolverine that this application will never // produce messages to turn off any diagnostics that might @@ -153,7 +153,7 @@ public static async Task use_named_brokers() using var host = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092"); + opts.UseKafka(KafkaContainerFixture.ConnectionString); opts.AddNamedKafkaBroker(new BrokerName("americas"), "americas-kafka:9092"); opts.AddNamedKafkaBroker(new BrokerName("emea"), "emea-kafka:9092"); diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/KafkaContainerFixture.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/KafkaContainerFixture.cs new file mode 100644 index 000000000..9782b5362 --- /dev/null +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/KafkaContainerFixture.cs @@ -0,0 +1,22 @@ +using System.Runtime.CompilerServices; +using Testcontainers.Kafka; + +namespace Wolverine.Kafka.Tests; + +public static class KafkaContainerFixture +{ + private static KafkaContainer? _container; + + public static string ConnectionString { get; private set; } = "localhost:9092"; + + [ModuleInitializer] + internal static void Initialize() + { + _container = new KafkaBuilder() + .WithImage("confluentinc/cp-kafka:7.6.1") + .Build(); + + _container.StartAsync().GetAwaiter().GetResult(); + ConnectionString = _container.GetBootstrapAddress(); + } +} diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/StatefulResourceSmokeTests.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/StatefulResourceSmokeTests.cs index 4f883b81f..5ae00206d 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/StatefulResourceSmokeTests.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/StatefulResourceSmokeTests.cs @@ -14,11 +14,11 @@ private IHostBuilder ConfigureBuilder(bool autoProvision, int starting = 1) { if (autoProvision) { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); } else { - opts.UseKafka("localhost:9092");; + opts.UseKafka(KafkaContainerFixture.ConnectionString);; } opts.PublishMessage() diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/Wolverine.Kafka.Tests.csproj b/src/Transports/Kafka/Wolverine.Kafka.Tests/Wolverine.Kafka.Tests.csproj index 1a2c1e6ad..1b65e4363 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/Wolverine.Kafka.Tests.csproj +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/Wolverine.Kafka.Tests.csproj @@ -19,6 +19,7 @@ + diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/batch_processing_with_kafka.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/batch_processing_with_kafka.cs index 1e9e32018..150934a1b 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/batch_processing_with_kafka.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/batch_processing_with_kafka.cs @@ -7,6 +7,7 @@ namespace Wolverine.Kafka.Tests; +[Trait("Category", "Flaky")] public class batch_processing_with_kafka { [Fact] diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/broadcast_to_topic_async.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/broadcast_to_topic_async.cs index 89b16061d..7e80c4cc4 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/broadcast_to_topic_async.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/broadcast_to_topic_async.cs @@ -8,11 +8,12 @@ namespace Wolverine.Kafka.Tests; +[Trait("Category", "Flaky")] public class broadcast_to_topic_async : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost _sender; - private IHost _receiver; + private IHost _sender = null!; + private IHost _receiver = null!; public broadcast_to_topic_async(ITestOutputHelper output) { @@ -25,7 +26,7 @@ public async Task InitializeAsync() _sender = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.Policies.DisableConventionalLocalRouting(); opts.Services.AddResourceSetupOnStartup(); @@ -34,7 +35,7 @@ public async Task InitializeAsync() _receiver = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.ListenToKafkaTopic("incoming.one"); // Include test assembly for handler discovery @@ -77,7 +78,7 @@ public ColorMessage(string color) Color = color; } - public string Color { get; set; } + public string Color { get; set; } = null!; } public static class ColorMessageHandler diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/broadcast_to_topic_rules.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/broadcast_to_topic_rules.cs index c7d77154a..0d421c688 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/broadcast_to_topic_rules.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/broadcast_to_topic_rules.cs @@ -16,8 +16,8 @@ namespace Wolverine.Kafka.Tests; public class broadcast_to_topic_rules : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost _sender; - private IHost _receiver; + private IHost _sender = null!; + private IHost _receiver = null!; public broadcast_to_topic_rules(ITestOutputHelper output) { @@ -29,7 +29,7 @@ public async Task InitializeAsync() _receiver = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092") + opts.UseKafka(KafkaContainerFixture.ConnectionString) .AutoProvision() .ConfigureConsumers(c => c.AutoOffsetReset = AutoOffsetReset.Earliest); opts.ListenToKafkaTopic("red").ConfigureConsumer(c => @@ -53,7 +53,7 @@ public async Task InitializeAsync() _sender = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.Policies.DisableConventionalLocalRouting(); opts.PublishAllMessages().ToKafkaTopics().SendInline(); diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/compliance.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/compliance.cs index 1355360af..2530ac478 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/compliance.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/compliance.cs @@ -25,7 +25,7 @@ public async Task InitializeAsync() await ReceiverIs(opts => { - opts.UseKafka("localhost:9092"); + opts.UseKafka(KafkaContainerFixture.ConnectionString); opts.ListenToKafkaTopic(receiverTopic).Named("receiver").BufferedInMemory(); @@ -34,7 +34,7 @@ await ReceiverIs(opts => await SenderIs(opts => { - opts.UseKafka("localhost:9092").ConfigureConsumers(x => x.EnableAutoCommit = false); + opts.UseKafka(KafkaContainerFixture.ConnectionString).ConfigureConsumers(x => x.EnableAutoCommit = false); opts.ListenToKafkaTopic(senderTopic); @@ -69,7 +69,7 @@ public async Task InitializeAsync() await SenderIs(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.ListenToKafkaTopic(senderTopic).UseForReplies().ConfigureConsumer(consumer => { @@ -84,7 +84,7 @@ await SenderIs(opts => await ReceiverIs(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.ListenToKafkaTopic(receiverTopic).Named("receiver").ProcessInline(); diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/configuration_precedence.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/configuration_precedence.cs index 685286cb2..6c5974c15 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/configuration_precedence.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/configuration_precedence.cs @@ -22,7 +22,7 @@ public async Task explicit_configuration_wins() using var host = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092").ConfigureConsumers( x => x.GroupId = "Conventional").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).ConfigureConsumers( x => x.GroupId = "Conventional").AutoProvision(); opts.ListenToKafkaTopic("General").Named("General"); @@ -30,7 +30,7 @@ public async Task explicit_configuration_wins() .ConfigureConsumer(x => { x.GroupId = "Specific"; - x.BootstrapServers = "localhost:9092"; + x.BootstrapServers = KafkaContainerFixture.ConnectionString; }).Named("Specific"); // Not working as expected opts.Services.AddResourceSetupOnStartup(); @@ -49,6 +49,6 @@ public async Task explicit_configuration_wins() general.Parent.ConsumerConfig.GroupId.ShouldBe("Conventional"); var specific = runtime.Endpoints.EndpointFor("kafka://topic/ResponseMessages".ToUri()).ShouldBeOfType(); - specific.ConsumerConfig.GroupId.ShouldBe("Specific"); + specific.ConsumerConfig!.GroupId.ShouldBe("Specific"); } } \ No newline at end of file diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/configure_consumers_and_publishers.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/configure_consumers_and_publishers.cs index f219944e4..70e9f6ec4 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/configure_consumers_and_publishers.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/configure_consumers_and_publishers.cs @@ -20,7 +20,7 @@ public configure_consumers_and_publishers(ITestOutputHelper output) _output = output; } - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -29,7 +29,7 @@ public async Task InitializeAsync() { opts.ServiceName = "Wolverine.Kafka.Tests"; - opts.UseKafka("localhost:9092") + opts.UseKafka(KafkaContainerFixture.ConnectionString) .AutoProvision() .ConfigureConsumers(consumer => { diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/dlq_compliance.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/dlq_compliance.cs index 08ee82336..3edee78eb 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/dlq_compliance.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/dlq_compliance.cs @@ -20,7 +20,7 @@ public async Task InitializeAsync() await ReceiverIs(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.ListenToKafkaTopic(receiverTopic) .Named("receiver") @@ -32,7 +32,7 @@ await ReceiverIs(opts => await SenderIs(opts => { - opts.UseKafka("localhost:9092") + opts.UseKafka(KafkaContainerFixture.ConnectionString) .AutoProvision() .ConfigureConsumers(x => x.EnableAutoCommit = false); diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/end_to_end_with_CloudEvents.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/end_to_end_with_CloudEvents.cs index 70b62e82a..7b5babc30 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/end_to_end_with_CloudEvents.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/end_to_end_with_CloudEvents.cs @@ -18,10 +18,11 @@ internal static class CloudEventsKafkaTestConstants public const string ColorMessageTypeAlias = "wolverine.kafka.tests.color"; } +[Trait("Category", "Flaky")] public class end_to_end_with_CloudEvents : IAsyncLifetime { - private IHost _receiver; - private IHost _sender; + private IHost _receiver = null!; + private IHost _sender = null!; public async Task InitializeAsync() { @@ -29,7 +30,7 @@ public async Task InitializeAsync() .UseWolverine(opts => { //opts.EnableAutomaticFailureAcks = false; - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.RegisterMessageType(typeof(ColorMessage), CloudEventsKafkaTestConstants.ColorMessageTypeAlias); opts.ListenToKafkaTopic("cloudevents").InteropWithCloudEvents(); @@ -48,7 +49,7 @@ public async Task InitializeAsync() _sender = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.Policies.DisableConventionalLocalRouting(); opts.RegisterMessageType(typeof(ColorMessage), CloudEventsKafkaTestConstants.ColorMessageTypeAlias); @@ -80,17 +81,18 @@ public async Task end_to_end() } } +[Trait("Category", "Flaky")] public class inline_end_to_end_with_CloudEvents : IAsyncLifetime { - private IHost _receiver; - private IHost _sender; + private IHost _receiver = null!; + private IHost _sender = null!; public async Task InitializeAsync() { _receiver = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.RegisterMessageType(typeof(ColorMessage), CloudEventsKafkaTestConstants.ColorMessageTypeAlias); opts.ListenToKafkaTopic("cloudevents-inline") .InteropWithCloudEvents() @@ -103,7 +105,7 @@ public async Task InitializeAsync() _sender = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.Policies.DisableConventionalLocalRouting(); opts.RegisterMessageType(typeof(ColorMessage), CloudEventsKafkaTestConstants.ColorMessageTypeAlias); @@ -146,7 +148,7 @@ public CloudEventsOnlyMapper(CloudEventsMapper cloudEvents) public void MapEnvelopeToOutgoing(Envelope envelope, Message outgoing) { - outgoing.Key = envelope.GroupId; + outgoing.Key = envelope.GroupId!; outgoing.Value = _cloudEvents.WriteToBytes(envelope); } diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/end_to_end_with_named_broker.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/end_to_end_with_named_broker.cs index 742455cb2..4ea85ec08 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/end_to_end_with_named_broker.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/end_to_end_with_named_broker.cs @@ -26,7 +26,7 @@ public async Task send_message_to_and_receive_through_kafka_with_inline_receiver var topicName = Guid.NewGuid().ToString(); using var publisher = WolverineHost.For(opts => { - opts.AddNamedKafkaBroker(theName, "localhost:9092").AutoProvision().AutoPurgeOnStartup(); + opts.AddNamedKafkaBroker(theName, KafkaContainerFixture.ConnectionString).AutoProvision().AutoPurgeOnStartup(); opts.PublishAllMessages() .ToKafkaTopicOnNamedBroker(theName, topicName) @@ -36,7 +36,7 @@ public async Task send_message_to_and_receive_through_kafka_with_inline_receiver using var receiver = WolverineHost.For(opts => { - opts.AddNamedKafkaBroker(theName, "localhost:9092").AutoProvision(); + opts.AddNamedKafkaBroker(theName, KafkaContainerFixture.ConnectionString).AutoProvision(); opts.ListenToKafkaTopicOnNamedBroker(theName, topicName).ProcessInline().Named(topicName); opts.Services.AddSingleton(); @@ -47,7 +47,7 @@ public async Task send_message_to_and_receive_through_kafka_with_inline_receiver ColorHandler.Received = new(); - Task.Run(async () => + _ = Task.Run(async () => { for (int i = 0; i < 10000; i++) { diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/global_partitioned_sharded_processing.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/global_partitioned_sharded_processing.cs index b7b48737a..0502000c9 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/global_partitioned_sharded_processing.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/global_partitioned_sharded_processing.cs @@ -56,7 +56,7 @@ public async Task hammer_it_with_lots_of_messages_global_partitioned() .UseWolverine(opts => { opts.Durability.Mode = DurabilityMode.Solo; - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.Discovery.DisableConventionalDiscovery().IncludeType(typeof(GLetterMessageHandler)); @@ -87,7 +87,7 @@ public async Task hammer_it_with_lots_of_messages_global_partitioned() var counts = envelopes.GroupBy(x => x.Destination); foreach (var count in counts) { - _output.WriteLine(count.Key.ToString() + " had " + count.Count()); + _output.WriteLine(count.Key!.ToString() + " had " + count.Count()); } // In single-node mode, global partitioning routes directly to companion local queues diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/moving_unknown_cloudevents_type_to_dlq.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/moving_unknown_cloudevents_type_to_dlq.cs index 2564d1c9e..93890d329 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/moving_unknown_cloudevents_type_to_dlq.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/moving_unknown_cloudevents_type_to_dlq.cs @@ -15,7 +15,7 @@ namespace Wolverine.Kafka.Tests; public class moving_unknown_cloudevents_type_to_dlq : IAsyncLifetime { - private IHost _receiver; + private IHost _receiver = null!; private readonly string _topicName = $"cloudevents-dlq-{Guid.NewGuid():N}"; @@ -24,7 +24,7 @@ public async Task InitializeAsync() _receiver = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092") + opts.UseKafka(KafkaContainerFixture.ConnectionString) .AutoProvision() .ConfigureConsumers(c => c.AutoOffsetReset = AutoOffsetReset.Earliest); diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/multi_topic_listening.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/multi_topic_listening.cs index 08128223c..45f090616 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/multi_topic_listening.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/multi_topic_listening.cs @@ -17,8 +17,8 @@ namespace Wolverine.Kafka.Tests; public class multi_topic_listening : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost _sender; - private IHost _receiver; + private IHost _sender = null!; + private IHost _receiver = null!; public multi_topic_listening(ITestOutputHelper output) { @@ -30,7 +30,7 @@ public async Task InitializeAsync() _receiver = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092") + opts.UseKafka(KafkaContainerFixture.ConnectionString) .AutoProvision() .ConfigureConsumers(c => { @@ -53,7 +53,7 @@ public async Task InitializeAsync() _sender = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.Policies.DisableConventionalLocalRouting(); opts.PublishAllMessages().ToKafkaTopics().SendInline(); diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/propagate_group_id_to_partition_key.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/propagate_group_id_to_partition_key.cs index ec4f41578..566d00ef8 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/propagate_group_id_to_partition_key.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/propagate_group_id_to_partition_key.cs @@ -10,7 +10,7 @@ namespace Wolverine.Kafka.Tests; public class propagate_group_id_to_partition_key : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { @@ -19,7 +19,7 @@ public async Task InitializeAsync() { opts.ServiceName = "PropagateGroupIdTests"; - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); // Enable the feature under test opts.Policies.PropagateGroupIdToPartitionKey(); diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/publish_and_receive_raw_json.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/publish_and_receive_raw_json.cs index d689bded1..01307ed32 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/publish_and_receive_raw_json.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/publish_and_receive_raw_json.cs @@ -13,8 +13,8 @@ namespace Wolverine.Kafka.Tests; public class publish_and_receive_raw_json : IAsyncLifetime { - private IHost _sender; - private IHost _receiver; + private IHost _sender = null!; + private IHost _receiver = null!; public async Task InitializeAsync() { @@ -24,7 +24,7 @@ public async Task InitializeAsync() .UseWolverine(opts => { //opts.EnableAutomaticFailureAcks = false; - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.ListenToKafkaTopic("json") // You do have to tell Wolverine what the message type @@ -47,7 +47,7 @@ public async Task InitializeAsync() _sender = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.Policies.DisableConventionalLocalRouting(); opts.Services.AddResourceSetupOnStartup(); diff --git a/src/Transports/Kafka/Wolverine.Kafka.Tests/when_publishing_and_receiving_by_partition_key.cs b/src/Transports/Kafka/Wolverine.Kafka.Tests/when_publishing_and_receiving_by_partition_key.cs index 7e8d49c15..3632fa509 100644 --- a/src/Transports/Kafka/Wolverine.Kafka.Tests/when_publishing_and_receiving_by_partition_key.cs +++ b/src/Transports/Kafka/Wolverine.Kafka.Tests/when_publishing_and_receiving_by_partition_key.cs @@ -8,6 +8,7 @@ namespace Wolverine.Kafka.Tests; +[Trait("Category", "Flaky")] public class when_publishing_and_receiving_by_partition_key : IAsyncLifetime { #region sample_publish_to_kafka_by_partition_key @@ -19,14 +20,14 @@ public static ValueTask publish_by_partition_key(IMessageBus bus) #endregion - private IHost _sender; - private IHost _receiver; + private IHost _sender = null!; + private IHost _receiver = null!; public async Task InitializeAsync() { _sender = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.Policies.DisableConventionalLocalRouting(); opts.Services.AddResourceSetupOnStartup(); @@ -40,7 +41,7 @@ public async Task InitializeAsync() _receiver = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseKafka("localhost:9092").AutoProvision(); + opts.UseKafka(KafkaContainerFixture.ConnectionString).AutoProvision(); opts.ListenToKafkaTopic("colorswithkey") .ProcessInline(); diff --git a/src/Transports/Kafka/Wolverine.Kafka/IKafkaEnvelopeMapper.cs b/src/Transports/Kafka/Wolverine.Kafka/IKafkaEnvelopeMapper.cs index 1770ce6f4..c6224e840 100644 --- a/src/Transports/Kafka/Wolverine.Kafka/IKafkaEnvelopeMapper.cs +++ b/src/Transports/Kafka/Wolverine.Kafka/IKafkaEnvelopeMapper.cs @@ -25,7 +25,7 @@ public JsonOnlyMapper(KafkaTopic topic, JsonSerializerOptions options) public void MapEnvelopeToOutgoing(Envelope envelope, Message outgoing) { - outgoing.Key = envelope.GroupId; + outgoing.Key = envelope.GroupId!; if (envelope.Data != null && envelope.Data.Any()) { diff --git a/src/Transports/Kafka/Wolverine.Kafka/Internals/KafkaListener.cs b/src/Transports/Kafka/Wolverine.Kafka/Internals/KafkaListener.cs index 9f02d9ded..c5f9a055b 100644 --- a/src/Transports/Kafka/Wolverine.Kafka/Internals/KafkaListener.cs +++ b/src/Transports/Kafka/Wolverine.Kafka/Internals/KafkaListener.cs @@ -44,7 +44,7 @@ public KafkaListener(KafkaTopic topic, ConsumerConfig config, var result = _consumer.Consume(_cancellation.Token); var message = result.Message; - var envelope = mapper.CreateEnvelope(result.Topic, message); + var envelope = mapper!.CreateEnvelope(result.Topic, message); envelope.Offset = result.Offset.Value; envelope.MessageType ??= _messageTypeName; envelope.GroupId = config.GroupId; diff --git a/src/Transports/Kafka/Wolverine.Kafka/KafkaTransportExtensions.cs b/src/Transports/Kafka/Wolverine.Kafka/KafkaTransportExtensions.cs index 3039bcb17..533c56bea 100644 --- a/src/Transports/Kafka/Wolverine.Kafka/KafkaTransportExtensions.cs +++ b/src/Transports/Kafka/Wolverine.Kafka/KafkaTransportExtensions.cs @@ -232,7 +232,7 @@ internal static async ValueTask> CreateMessage(this IKaf var message = new Message { Key = !string.IsNullOrEmpty(envelope.PartitionKey) ? envelope.PartitionKey : envelope.Id.ToString(), - Value = data, + Value = data!, Headers = new Headers() }; diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/MosquittoContainerFixture.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/MosquittoContainerFixture.cs new file mode 100644 index 000000000..4798623f8 --- /dev/null +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/MosquittoContainerFixture.cs @@ -0,0 +1,28 @@ +using System.Runtime.CompilerServices; +using DotNet.Testcontainers.Builders; +using DotNet.Testcontainers.Containers; + +namespace Wolverine.MQTT.Tests; + +public static class MosquittoContainerFixture +{ + private static IContainer? _container; + + public static string Host { get; private set; } = "localhost"; + public static int Port { get; private set; } = 1883; + + [ModuleInitializer] + internal static void Initialize() + { + _container = new ContainerBuilder() + .WithImage("eclipse-mosquitto:2") + .WithPortBinding(1883, true) + .WithCommand("mosquitto", "-c", "/mosquitto-no-auth.conf") + .WithWaitStrategy(Wait.ForUnixContainer().UntilMessageIsLogged("mosquitto version")) + .Build(); + + _container.StartAsync().GetAwaiter().GetResult(); + Host = _container.Hostname; + Port = _container.GetMappedPublicPort(1883); + } +} diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/Samples.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/Samples.cs index 37217d228..f120a3ba5 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/Samples.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/Samples.cs @@ -212,7 +212,7 @@ public class MyMqttEnvelopeMapper : IMqttEnvelopeMapper public void MapEnvelopeToOutgoing(Envelope envelope, MqttApplicationMessage outgoing) { // This is the only absolutely mandatory item - outgoing.PayloadSegment = envelope.Data; + outgoing.PayloadSegment = envelope.Data!; // Maybe enrich this more? outgoing.ContentType = envelope.ContentType; diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/Wolverine.MQTT.Tests.csproj b/src/Transports/MQTT/Wolverine.MQTT.Tests/Wolverine.MQTT.Tests.csproj index db91cb8f2..32648148c 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/Wolverine.MQTT.Tests.csproj +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/Wolverine.MQTT.Tests.csproj @@ -19,6 +19,7 @@ all + diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/XUnitLogger.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/XUnitLogger.cs index ddb7a11a1..8ad157480 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/XUnitLogger.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/XUnitLogger.cs @@ -26,13 +26,13 @@ public bool IsEnabled(LogLevel logLevel) return logLevel != LogLevel.None; } - public IDisposable BeginScope(TState state) + public IDisposable BeginScope(TState state) where TState : notnull { return new Disposable(); } - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, - Func formatter) + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, + Func formatter) { if (exception is DivideByZeroException) { diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/ack_smoke_tests.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/ack_smoke_tests.cs index eecc74009..fb06a1765 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/ack_smoke_tests.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/ack_smoke_tests.cs @@ -11,9 +11,9 @@ namespace Wolverine.MQTT.Tests; public class ack_smoke_tests : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost _sender; - private IHost _receiver; - private LocalMqttBroker Broker; + private IHost _sender = null!; + private IHost _receiver = null!; + private LocalMqttBroker Broker = null!; public ack_smoke_tests(ITestOutputHelper output) { diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/broadcast_to_topic_async.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/broadcast_to_topic_async.cs index f5b639b7a..40cf201e9 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/broadcast_to_topic_async.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/broadcast_to_topic_async.cs @@ -13,8 +13,8 @@ namespace Wolverine.MQTT.Tests; public class broadcast_to_topic_async : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost _sender; - private IHost _receiver; + private IHost _sender = null!; + private IHost _receiver = null!; public broadcast_to_topic_async(ITestOutputHelper output) { @@ -60,7 +60,7 @@ public async Task broadcast() received.Color.ShouldBe("blue"); } - public LocalMqttBroker Broker { get; set; } + public LocalMqttBroker Broker { get; set; } = null!; public async Task DisposeAsync() { @@ -84,7 +84,7 @@ public ColorMessage(string color) Color = color; } - public string Color { get; set; } + public string Color { get; set; } = null!; } public class SpecialColorMessage : ColorMessage; diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/broadcast_to_topic_by_user_logic.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/broadcast_to_topic_by_user_logic.cs index 34480bc96..1683177e6 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/broadcast_to_topic_by_user_logic.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/broadcast_to_topic_by_user_logic.cs @@ -11,8 +11,8 @@ namespace Wolverine.MQTT.Tests; public class broadcast_to_topic_by_user_logic: IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost _sender; - private IHost _receiver; + private IHost _sender = null!; + private IHost _receiver = null!; public broadcast_to_topic_by_user_logic(ITestOutputHelper output) { @@ -82,7 +82,7 @@ public async Task route_by_derived_topics_2() .Destination.ShouldBe(new Uri("mqtt://topic/green")); } - public LocalMqttBroker Broker { get; set; } + public LocalMqttBroker Broker { get; set; } = null!; public async Task DisposeAsync() { diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/broadcast_to_topic_rules.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/broadcast_to_topic_rules.cs index fb6fcaf3b..17c7760e1 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/broadcast_to_topic_rules.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/broadcast_to_topic_rules.cs @@ -13,8 +13,8 @@ namespace Wolverine.MQTT.Tests; public class broadcast_to_topic_rules : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost _sender; - private IHost _receiver; + private IHost _sender = null!; + private IHost _receiver = null!; public broadcast_to_topic_rules(ITestOutputHelper output) { @@ -84,7 +84,7 @@ public async Task route_by_derived_topics_2() .Destination.ShouldBe(new Uri("mqtt://topic/green")); } - public LocalMqttBroker Broker { get; set; } + public LocalMqttBroker Broker { get; set; } = null!; public async Task DisposeAsync() { diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/buffered_compliance.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/buffered_compliance.cs index 412b1ebc1..7c4fd5bee 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/buffered_compliance.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/buffered_compliance.cs @@ -50,7 +50,7 @@ await ReceiverIs(opts => }); } - public LocalMqttBroker Broker { get; private set; } + public LocalMqttBroker Broker { get; private set; } = null!; public new async Task DisposeAsync() { diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/connectivity.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/connectivity.cs index 15e0ebd15..b494420da 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/connectivity.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/connectivity.cs @@ -11,11 +11,11 @@ namespace Wolverine.MQTT.Tests; [Collection("acceptance")] -public class connectivity +public class Connectivity { private readonly ITestOutputHelper _output; - public connectivity(ITestOutputHelper output) + public Connectivity(ITestOutputHelper output) { _output = output; } diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/inline_compliance.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/inline_compliance.cs index ff7059190..447f41222 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/inline_compliance.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/inline_compliance.cs @@ -50,7 +50,7 @@ await ReceiverIs(opts => }); } - public LocalMqttBroker Broker { get; private set; } + public LocalMqttBroker Broker { get; private set; } = null!; public new async Task DisposeAsync() { diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/listen_with_emqx_shared_group_topic.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/listen_with_emqx_shared_group_topic.cs index fc17b7207..39f95f187 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/listen_with_emqx_shared_group_topic.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/listen_with_emqx_shared_group_topic.cs @@ -12,8 +12,8 @@ namespace Wolverine.MQTT.Tests; public class listen_with_emqx_shared_group_topic : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost _sender; - private IHost _receiver; + private IHost _sender = null!; + private IHost _receiver = null!; public listen_with_emqx_shared_group_topic(ITestOutputHelper output) { @@ -51,7 +51,7 @@ public async Task InitializeAsync() #endregion } - [Fact] + [Fact(Skip = "Shared subscriptions ($share/) require a real MQTT broker like EMQX or Mosquitto; LocalMqttBroker does not support them")] public async Task send_to_shared_topic_and_receive() { var tracked = await _sender.TrackActivity() @@ -65,7 +65,7 @@ public async Task send_to_shared_topic_and_receive() received.Color.ShouldBe("green"); } - public LocalMqttBroker Broker { get; set; } + public LocalMqttBroker Broker { get; set; } = null!; public async Task DisposeAsync() { diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/listen_with_topic_wildcards.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/listen_with_topic_wildcards.cs index de44547e9..d435e4fea 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/listen_with_topic_wildcards.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/listen_with_topic_wildcards.cs @@ -12,8 +12,8 @@ namespace Wolverine.MQTT.Tests; public class listen_with_topic_wildcards : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost _sender; - private IHost _receiver; + private IHost _sender = null!; + private IHost _receiver = null!; public listen_with_topic_wildcards(ITestOutputHelper output) { @@ -63,7 +63,7 @@ public async Task broadcast() received.Color.ShouldBe("blue"); } - public LocalMqttBroker Broker { get; set; } + public LocalMqttBroker Broker { get; set; } = null!; public async Task DisposeAsync() { diff --git a/src/Transports/MQTT/Wolverine.MQTT.Tests/mosquitto_compliance.cs b/src/Transports/MQTT/Wolverine.MQTT.Tests/mosquitto_compliance.cs index edfd35a64..c020bd7ab 100644 --- a/src/Transports/MQTT/Wolverine.MQTT.Tests/mosquitto_compliance.cs +++ b/src/Transports/MQTT/Wolverine.MQTT.Tests/mosquitto_compliance.cs @@ -29,7 +29,7 @@ await SenderIs(opts => { opts.UseMqtt(mqtt => { - mqtt.WithClientOptions(client => client.WithTcpServer("localhost", 1883)); + mqtt.WithClientOptions(client => client.WithTcpServer(MosquittoContainerFixture.Host, MosquittoContainerFixture.Port)); }); opts.ListenToMqttTopic(senderTopic).RetainMessages(); @@ -40,7 +40,7 @@ await ReceiverIs(opts => { opts.UseMqtt(mqtt => { - mqtt.WithClientOptions(client => client.WithTcpServer("localhost", 1883)); + mqtt.WithClientOptions(client => client.WithTcpServer(MosquittoContainerFixture.Host, MosquittoContainerFixture.Port)); }); opts.ListenToMqttTopic(receiverTopic).Named("receiver").RetainMessages().BufferedInMemory(); @@ -64,8 +64,8 @@ public class MosquittoBufferedCompliance : TransportCompliance { - mqtt.WithClientOptions(client => client.WithTcpServer("localhost", 1883)); + mqtt.WithClientOptions(client => client.WithTcpServer(MosquittoContainerFixture.Host, MosquittoContainerFixture.Port)); }); opts.Policies.DisableConventionalLocalRouting(); }).StartAsync(); @@ -89,7 +89,7 @@ public async Task InitializeAsync() { opts.UseMqtt(mqtt => { - mqtt.WithClientOptions(client => client.WithTcpServer("localhost", 1883)); + mqtt.WithClientOptions(client => client.WithTcpServer(MosquittoContainerFixture.Host, MosquittoContainerFixture.Port)); }); opts.ListenToMqttTopic("incoming/one", "group1").RetainMessages(); }).StartAsync(); @@ -124,8 +124,8 @@ public async Task DisposeAsync() public class mosquitto_shared_subscription_with_wildcard : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost _sender; - private IHost _receiver; + private IHost _sender = null!; + private IHost _receiver = null!; public mosquitto_shared_subscription_with_wildcard(ITestOutputHelper output) { @@ -139,7 +139,7 @@ public async Task InitializeAsync() { opts.UseMqtt(mqtt => { - mqtt.WithClientOptions(client => client.WithTcpServer("localhost", 1883)); + mqtt.WithClientOptions(client => client.WithTcpServer(MosquittoContainerFixture.Host, MosquittoContainerFixture.Port)); }); opts.Policies.DisableConventionalLocalRouting(); }).StartAsync(); @@ -149,7 +149,7 @@ public async Task InitializeAsync() { opts.UseMqtt(mqtt => { - mqtt.WithClientOptions(client => client.WithTcpServer("localhost", 1883)); + mqtt.WithClientOptions(client => client.WithTcpServer(MosquittoContainerFixture.Host, MosquittoContainerFixture.Port)); }); // GH-2213: shared subscription with wildcard opts.ListenToMqttTopic("incoming/+", "workers").RetainMessages(); diff --git a/src/Transports/MQTT/Wolverine.MQTT/AckMqttTopic.cs b/src/Transports/MQTT/Wolverine.MQTT/AckMqttTopic.cs index 5cdd2ada5..abbdb78bb 100644 --- a/src/Transports/MQTT/Wolverine.MQTT/AckMqttTopic.cs +++ b/src/Transports/MQTT/Wolverine.MQTT/AckMqttTopic.cs @@ -13,7 +13,7 @@ public record AckMqttTopic() : ISendMyself, ISerializable { public async ValueTask ApplyAsync(IMessageContext context) { - var topicName = context.Envelope?.TopicName ?? MqttTransport.TopicForUri(context.Envelope?.Destination); + var topicName = context.Envelope?.TopicName ?? MqttTransport.TopicForUri(context.Envelope?.Destination!); if (topicName.IsEmpty()) { throw new ArgumentOutOfRangeException(nameof(context), "Envelope.Topic cannot be empty or null"); diff --git a/src/Transports/MQTT/Wolverine.MQTT/Internals/MqttEnvelopeMapper.cs b/src/Transports/MQTT/Wolverine.MQTT/Internals/MqttEnvelopeMapper.cs index 42af23bfb..f59b60315 100644 --- a/src/Transports/MQTT/Wolverine.MQTT/Internals/MqttEnvelopeMapper.cs +++ b/src/Transports/MQTT/Wolverine.MQTT/Internals/MqttEnvelopeMapper.cs @@ -20,7 +20,7 @@ public void MapEnvelopeToOutgoing(Envelope envelope, MqttApplicationMessage mess message.ResponseTopic = _topic.Parent.ResponseTopic; message.Retain = _topic.Retain; message.QualityOfServiceLevel = _topic.QualityOfServiceLevel; - message.PayloadSegment = envelope.Data; + message.PayloadSegment = envelope.Data!; message.Topic = envelope.TopicName ?? _topic.TopicName; // Don't override so that user supplied topics can work! message.UserProperties = @@ -64,7 +64,7 @@ public void MapEnvelopeToOutgoing(Envelope envelope, MqttApplicationMessage mess if (envelope.AcceptedContentTypes != null) { - var accepted = new MqttUserProperty(EnvelopeConstants.AcceptedContentTypesKey, envelope.AcceptedContentTypes.Join(",")); + var accepted = new MqttUserProperty(EnvelopeConstants.AcceptedContentTypesKey, envelope.AcceptedContentTypes!.Join(",")!); message.UserProperties.Add(accepted); } diff --git a/src/Transports/MQTT/Wolverine.MQTT/Internals/MqttTransport.cs b/src/Transports/MQTT/Wolverine.MQTT/Internals/MqttTransport.cs index d9bd84459..984db0c85 100644 --- a/src/Transports/MQTT/Wolverine.MQTT/Internals/MqttTransport.cs +++ b/src/Transports/MQTT/Wolverine.MQTT/Internals/MqttTransport.cs @@ -19,7 +19,7 @@ public class MqttTransport : TransportBase, IAsyncDisposable private List _listeners = new(); private ImHashMap _topicListeners = ImHashMap.Empty; private bool _subscribed; - private ILogger _logger; + private ILogger _logger = null!; private Timer? _jwtTokenRefreshTimer; public static string TopicForUri(Uri uri) @@ -147,16 +147,16 @@ internal bool tryFindListener(string topicName, out MqttListener listener) return listener is not null; } - listener = _listeners.FirstOrDefault(x => x.TopicName == topicName) ?? _listeners.FirstOrDefault(x => - MqttTopicFilterComparer.Compare(topicName, x.TopicName) == MqttTopicFilterCompareResult.IsMatch); + listener = (_listeners.FirstOrDefault(x => x.TopicName == topicName) ?? _listeners.FirstOrDefault(x => + MqttTopicFilterComparer.Compare(topicName, x.TopicName) == MqttTopicFilterCompareResult.IsMatch))!; - _topicListeners = _topicListeners.AddOrUpdate(topicName, listener); + _topicListeners = _topicListeners.AddOrUpdate(topicName, listener!); return listener is not null; } - internal IManagedMqttClient Client { get; private set; } + internal IManagedMqttClient Client { get; private set; } = null!; internal MqttJwtAuthenticationOptions? JwtAuthenticationOptions { get; set; } public ManagedMqttClientOptions Options { get; set; } = new ManagedMqttClientOptions diff --git a/src/Transports/MQTT/Wolverine.MQTT/LocalMqttBroker.cs b/src/Transports/MQTT/Wolverine.MQTT/LocalMqttBroker.cs index 615a20e0f..6120dcb00 100644 --- a/src/Transports/MQTT/Wolverine.MQTT/LocalMqttBroker.cs +++ b/src/Transports/MQTT/Wolverine.MQTT/LocalMqttBroker.cs @@ -8,7 +8,7 @@ namespace Wolverine.MQTT; public class LocalMqttBroker : IAsyncDisposable, IMqttNetLogger { - private MqttServer _mqttServer; + private MqttServer _mqttServer = null!; private readonly MqttServerOptions _mqttServerOptions; public LocalMqttBroker() diff --git a/src/Transports/NATS/Wolverine.Nats.Tests/Helpers/TestCollections.cs b/src/Transports/NATS/Wolverine.Nats.Tests/Helpers/TestCollections.cs index 462a3e1b9..843f9f7a3 100644 --- a/src/Transports/NATS/Wolverine.Nats.Tests/Helpers/TestCollections.cs +++ b/src/Transports/NATS/Wolverine.Nats.Tests/Helpers/TestCollections.cs @@ -3,16 +3,16 @@ namespace Wolverine.Nats.Tests.Helpers; [CollectionDefinition("NATS Integration Tests")] -public class NatsIntegrationTestCollection : ICollectionFixture +public class NatsIntegrationTestCollection : ICollectionFixture { } [CollectionDefinition("NATS MultiTenancy Tests")] -public class NatsMultiTenancyTestCollection : ICollectionFixture +public class NatsMultiTenancyTestCollection : ICollectionFixture { } [CollectionDefinition("NATS Compliance", DisableParallelization = true)] -public class NatsComplianceTestCollection : ICollectionFixture +public class NatsComplianceTestCollection : ICollectionFixture { -} \ No newline at end of file +} diff --git a/src/Transports/NATS/Wolverine.Nats.Tests/NatsContainerFixture.cs b/src/Transports/NATS/Wolverine.Nats.Tests/NatsContainerFixture.cs new file mode 100644 index 000000000..07fb56742 --- /dev/null +++ b/src/Transports/NATS/Wolverine.Nats.Tests/NatsContainerFixture.cs @@ -0,0 +1,55 @@ +using Testcontainers.Nats; +using Xunit; + +namespace Wolverine.Nats.Tests; + +public class NatsContainerFixture : IAsyncLifetime +{ + private static NatsContainer? _container; + private static string? _connectionString; + private static int _referenceCount; + private static readonly SemaphoreSlim Lock = new(1, 1); + + public string ConnectionString => _connectionString!; + + public async Task InitializeAsync() + { + await Lock.WaitAsync(); + try + { + _referenceCount++; + if (_container != null) return; + + _container = new NatsBuilder() + .WithImage("nats:latest") + .Build(); + + await _container.StartAsync(); + _connectionString = _container.GetConnectionString(); + Environment.SetEnvironmentVariable("NATS_URL", _connectionString); + } + finally + { + Lock.Release(); + } + } + + public async Task DisposeAsync() + { + await Lock.WaitAsync(); + try + { + _referenceCount--; + if (_referenceCount > 0 || _container == null) return; + + Environment.SetEnvironmentVariable("NATS_URL", null); + await _container.DisposeAsync(); + _container = null; + _connectionString = null; + } + finally + { + Lock.Release(); + } + } +} diff --git a/src/Transports/NATS/Wolverine.Nats.Tests/NatsIntegrationTestCollection.cs b/src/Transports/NATS/Wolverine.Nats.Tests/NatsIntegrationTestCollection.cs index eb06efc0d..bdabae7e2 100644 --- a/src/Transports/NATS/Wolverine.Nats.Tests/NatsIntegrationTestCollection.cs +++ b/src/Transports/NATS/Wolverine.Nats.Tests/NatsIntegrationTestCollection.cs @@ -3,4 +3,4 @@ namespace Wolverine.Nats.Tests; [CollectionDefinition("NATS Integration", DisableParallelization = true)] -public class NatsIntegrationTestCollection; +public class NatsIntegrationTestCollection : ICollectionFixture; diff --git a/src/Transports/NATS/Wolverine.Nats.Tests/Wolverine.Nats.Tests.csproj b/src/Transports/NATS/Wolverine.Nats.Tests/Wolverine.Nats.Tests.csproj index 3f8a317e7..4b4347fe0 100644 --- a/src/Transports/NATS/Wolverine.Nats.Tests/Wolverine.Nats.Tests.csproj +++ b/src/Transports/NATS/Wolverine.Nats.Tests/Wolverine.Nats.Tests.csproj @@ -21,6 +21,7 @@ + diff --git a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/DefaultPulsarProtocolTests.cs b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/DefaultPulsarProtocolTests.cs index 49aa621cc..fc49ef15d 100644 --- a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/DefaultPulsarProtocolTests.cs +++ b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/DefaultPulsarProtocolTests.cs @@ -16,9 +16,9 @@ namespace Wolverine.Pulsar.Tests; internal class StubMessage : IMessage> { - public MessageId MessageId { get; } + public MessageId MessageId { get; } = null!; public ReadOnlySequence Data { get; } - public string ProducerName { get; } + public string ProducerName { get; } = null!; public byte[]? SchemaVersion { get; } public ulong SequenceId { get; } public uint RedeliveryCount { get; } @@ -35,7 +35,7 @@ internal class StubMessage : IMessage> public ulong PublishTime { get; } public DateTime PublishTimeAsDateTime { get; } public DateTimeOffset PublishTimeAsDateTimeOffset { get; } - public IReadOnlyDictionary Properties { get; set; } + public IReadOnlyDictionary Properties { get; set; } = null!; public ReadOnlySequence Value() { @@ -67,12 +67,12 @@ public DefaultPulsarProtocolTests() var prop1 = typeof(MessageMetadata).GetProperty("Metadata", BindingFlags.Instance | BindingFlags.NonPublic); - var internalMetadata = prop1.GetValue(metadata); - var prop2 = internalMetadata.GetType().GetProperty("Properties"); - var values = (RepeatedField)prop2.GetValue(internalMetadata); + var internalMetadata = prop1!.GetValue(metadata); + var prop2 = internalMetadata!.GetType().GetProperty("Properties"); + var values = (RepeatedField)prop2!.GetValue(internalMetadata)!; var properties = new Dictionary(); - foreach (var pair in values) properties[pair.Key] = pair.Value; + foreach (var pair in values!) properties[pair.Key] = pair.Value; var message = new StubMessage { Properties = properties }; diff --git a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/DocumentationSamples.cs b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/DocumentationSamples.cs index b1a84dc80..c9f6b1cce 100644 --- a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/DocumentationSamples.cs +++ b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/DocumentationSamples.cs @@ -17,7 +17,7 @@ public static async Task configure() opts.UsePulsar(c => { var pulsarUri = builder.Configuration.GetValue("pulsar"); - c.ServiceUrl(pulsarUri); + c.ServiceUrl(pulsarUri!); // Any other configuration you want to apply to your // Pulsar client @@ -60,7 +60,7 @@ public static async Task disable_requeues() opts.UsePulsar(c => { var pulsarUri = builder.Configuration.GetValue("pulsar"); - c.ServiceUrl(pulsarUri); + c.ServiceUrl(pulsarUri!); }); // Listen for incoming messages from a Pulsar topic @@ -91,7 +91,7 @@ public static async Task policy_configuration() opts.UsePulsar(c => { var pulsarUri = builder.Configuration.GetValue("pulsar"); - c.ServiceUrl(pulsarUri); + c.ServiceUrl(pulsarUri!); }); // Disable unsubscribe on close for all Pulsar endpoints diff --git a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/InlinePulsarTransportComplianceTests.cs b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/InlinePulsarTransportComplianceTests.cs index 766b4051c..87dd55954 100644 --- a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/InlinePulsarTransportComplianceTests.cs +++ b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/InlinePulsarTransportComplianceTests.cs @@ -6,7 +6,7 @@ namespace Wolverine.Pulsar.Tests; public class InlinePulsarTransportFixture : TransportComplianceFixture, IAsyncLifetime { - public InlinePulsarTransportFixture() : base(null) + public InlinePulsarTransportFixture() : base(null!) { } @@ -18,22 +18,22 @@ public async Task InitializeAsync() await ReceiverIs(opts => { - opts.UsePulsar(); + opts.UsePulsar(b => b.ServiceUrl(PulsarContainerFixture.ServiceUrl)); opts.ListenToPulsarTopic(topicPath).ProcessInline(); }); await SenderIs(opts => { var replyPath = $"persistent://public/default/replies-{topic}"; - opts.UsePulsar(); + opts.UsePulsar(b => b.ServiceUrl(PulsarContainerFixture.ServiceUrl)); opts.ListenToPulsarTopic(replyPath).UseForReplies().ProcessInline(); opts.PublishAllMessages().ToPulsarTopic(topicPath).SendInline(); }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } public override void BeforeEach() diff --git a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarContainerFixture.cs b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarContainerFixture.cs new file mode 100644 index 000000000..491e60bf5 --- /dev/null +++ b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarContainerFixture.cs @@ -0,0 +1,29 @@ +using System.Runtime.CompilerServices; +using DotNet.Testcontainers.Containers; +using Testcontainers.Pulsar; + +namespace Wolverine.Pulsar.Tests; + +public static class PulsarContainerFixture +{ + private static PulsarContainer? _container; + + public static Uri ServiceUrl { get; private set; } = new("pulsar://localhost:6650"); + + public static string HttpServiceUrl { get; private set; } = "http://localhost:8080"; + + [ModuleInitializer] + internal static void Initialize() + { + _container = new PulsarBuilder() + .WithImage("apachepulsar/pulsar:latest") + .Build(); + + _container.StartAsync().GetAwaiter().GetResult(); + ServiceUrl = new Uri(_container.GetBrokerAddress()); + + var host = _container.Hostname; + var httpPort = _container.GetMappedPublicPort(8080); + HttpServiceUrl = $"http://{host}:{httpPort}"; + } +} diff --git a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarEndpointTests.cs b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarEndpointTests.cs index cc9a3de48..77371531f 100644 --- a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarEndpointTests.cs +++ b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarEndpointTests.cs @@ -9,7 +9,7 @@ public class PulsarEndpointTests [Fact] public void reject_uri_that_is_not_pulsar() { - Should.Throw(() => { new PulsarEndpoint("tcp://server:5000".ToUri(), null); }); + Should.Throw(() => { new PulsarEndpoint("tcp://server:5000".ToUri(), null!); }); } [Fact] @@ -17,12 +17,12 @@ public void reject_uri_with_wrong_number_of_segments() { Should.Throw(() => { - new PulsarEndpoint("pulsar://persistent/public/default".ToUri(), null); + new PulsarEndpoint("pulsar://persistent/public/default".ToUri(), null!); }); Should.Throw(() => { - new PulsarEndpoint("pulsar://persistent/public/default/topica/more".ToUri(), null); + new PulsarEndpoint("pulsar://persistent/public/default/topica/more".ToUri(), null!); }); } @@ -31,14 +31,14 @@ public void reject_uri_with_invalid_persistent_flag() { Should.Throw(() => { - new PulsarEndpoint("pulsar://wrong/public/default/aaa".ToUri(), null); + new PulsarEndpoint("pulsar://wrong/public/default/aaa".ToUri(), null!); }); } [Fact] public void parse_acceptable_persistent_uri() { - var endpoint = new PulsarEndpoint("pulsar://persistent/public/default/aaa".ToUri(), null); + var endpoint = new PulsarEndpoint("pulsar://persistent/public/default/aaa".ToUri(), null!); endpoint.Persistence.ShouldBe(PulsarEndpoint.Persistent); endpoint.Tenant.ShouldBe("public"); endpoint.Namespace.ShouldBe("default"); @@ -48,7 +48,7 @@ public void parse_acceptable_persistent_uri() [Fact] public void parse_acceptable_nonpersistent_uri() { - var endpoint = new PulsarEndpoint("pulsar://non-persistent/public/default/aaa".ToUri(), null); + var endpoint = new PulsarEndpoint("pulsar://non-persistent/public/default/aaa".ToUri(), null!); endpoint.Persistence.ShouldBe(PulsarEndpoint.NonPersistent); endpoint.Tenant.ShouldBe("public"); endpoint.Namespace.ShouldBe("default"); @@ -74,7 +74,7 @@ public void uri_for_topic_string() { var topicPath = "persistent://t1/ns1/aaa"; var uri = PulsarEndpoint.UriFor(topicPath); - var endpoint = new PulsarEndpoint(uri, null); + var endpoint = new PulsarEndpoint(uri, null!); endpoint.Persistence.ShouldBe(PulsarEndpoint.Persistent); endpoint.Namespace.ShouldBe("ns1"); diff --git a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarListenerTests.cs b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarListenerTests.cs index b08c7f0c4..ca49799b4 100644 --- a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarListenerTests.cs +++ b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarListenerTests.cs @@ -14,7 +14,7 @@ public async Task UnsubscribeOnClose() { var host = await Host.CreateDefaultBuilder().UseWolverine(opts => { - opts.UsePulsar(); + opts.UsePulsar(b => b.ServiceUrl(PulsarContainerFixture.ServiceUrl)); opts.UnsubscribePulsarOnClose(PulsarUnsubscribeOnClose.Enabled); var topic = "persistent://public/default/test"; @@ -37,7 +37,7 @@ public async Task KeepSubscriptionOnClose() { var host = await Host.CreateDefaultBuilder().UseWolverine(opts => { - opts.UsePulsar(); + opts.UsePulsar(b => b.ServiceUrl(PulsarContainerFixture.ServiceUrl)); opts.UnsubscribePulsarOnClose(PulsarUnsubscribeOnClose.Disabled); var topic = "persistent://public/default/test"; @@ -59,7 +59,7 @@ private async Task SubscriptionExists() { using var httpClient = new HttpClient(); var response = - await httpClient.GetAsync("http://localhost:8080/admin/v2/persistent/public/default/test/subscriptions"); + await httpClient.GetAsync($"{PulsarContainerFixture.HttpServiceUrl}/admin/v2/persistent/public/default/test/subscriptions"); var subscriptions = await response.Content.ReadFromJsonAsync(); return subscriptions != null && subscriptions.Length != 0; } diff --git a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarNativeReliabilityTests.cs b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarNativeReliabilityTests.cs index f69fef5da..0f36c059b 100644 --- a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarNativeReliabilityTests.cs +++ b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarNativeReliabilityTests.cs @@ -13,7 +13,7 @@ namespace Wolverine.Pulsar.Tests; [Collection("pulsar")] public class PulsarNativeReliabilityTests : /*TransportComplianceFixture,*/ IAsyncLifetime { - public IHost WolverineHost; + public IHost WolverineHost = null!; public PulsarNativeReliabilityTests() { @@ -30,7 +30,7 @@ private IHostBuilder ConfigureBuilder() opts.UsePulsar(b => { - b.ServiceUrl(new Uri("pulsar://127.0.0.1:6650")); + b.ServiceUrl(PulsarContainerFixture.ServiceUrl); }); opts.IncludeType(); @@ -276,7 +276,7 @@ public WaitForDeadLetteredMessage() public void Record(EnvelopeRecord record) { - if (record.Envelope.Message is T && record.MessageEventType == MessageEventType.MovedToErrorQueue ) + if (record.Envelope?.Message is T && record.MessageEventType == MessageEventType.MovedToErrorQueue) { _found = true; } diff --git a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarTransportComplianceTests.cs b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarTransportComplianceTests.cs index 2eeb5659f..9115d958a 100644 --- a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarTransportComplianceTests.cs +++ b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/PulsarTransportComplianceTests.cs @@ -6,7 +6,7 @@ namespace Wolverine.Pulsar.Tests; public class PulsarTransportFixture : TransportComplianceFixture, IAsyncLifetime { - public PulsarTransportFixture() : base(null) + public PulsarTransportFixture() : base(null!) { } @@ -19,13 +19,13 @@ public async Task InitializeAsync() await SenderIs(opts => { var listener = $"persistent://public/default/replies{topic}"; - opts.UsePulsar(e => { }); + opts.UsePulsar(b => b.ServiceUrl(PulsarContainerFixture.ServiceUrl)); opts.ListenToPulsarTopic(listener).UseForReplies(); }); await ReceiverIs(opts => { - opts.UsePulsar(); + opts.UsePulsar(b => b.ServiceUrl(PulsarContainerFixture.ServiceUrl)); opts.ListenToPulsarTopic(topicPath); }); } diff --git a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/WithCloudEvents.cs b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/WithCloudEvents.cs index 0364a5eda..26aa73faa 100644 --- a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/WithCloudEvents.cs +++ b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/WithCloudEvents.cs @@ -6,7 +6,7 @@ namespace Wolverine.Pulsar.Tests; public class PulsarWithCloudEventsFixture : TransportComplianceFixture, IAsyncLifetime { - public PulsarWithCloudEventsFixture() : base(null) + public PulsarWithCloudEventsFixture() : base(null!) { } @@ -19,7 +19,7 @@ public async Task InitializeAsync() await SenderIs(opts => { var listener = $"persistent://public/default/replies{topic}"; - opts.UsePulsar(e => { }); + opts.UsePulsar(b => b.ServiceUrl(PulsarContainerFixture.ServiceUrl)); opts.Policies.UsePulsarWithCloudEvents(); opts.ListenToPulsarTopic(listener).UseForReplies(); opts.PublishMessage().ToPulsarTopic(topicPath); @@ -27,7 +27,7 @@ await SenderIs(opts => await ReceiverIs(opts => { - opts.UsePulsar(); + opts.UsePulsar(b => b.ServiceUrl(PulsarContainerFixture.ServiceUrl)); opts.Policies.UsePulsarWithCloudEvents(); opts.ListenToPulsarTopic(topicPath); }); diff --git a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/Wolverine.Pulsar.Tests.csproj b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/Wolverine.Pulsar.Tests.csproj index d4deed9cc..70a7f68b2 100644 --- a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/Wolverine.Pulsar.Tests.csproj +++ b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/Wolverine.Pulsar.Tests.csproj @@ -10,6 +10,7 @@ + diff --git a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/endpoint_configuration.cs b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/endpoint_configuration.cs index 096a5886a..9146d3aee 100644 --- a/src/Transports/Pulsar/Wolverine.Pulsar.Tests/endpoint_configuration.cs +++ b/src/Transports/Pulsar/Wolverine.Pulsar.Tests/endpoint_configuration.cs @@ -15,7 +15,7 @@ public endpoint_configuration() { _host = Host.CreateDefaultBuilder().UseWolverine(opts => { - opts.UsePulsar(); + opts.UsePulsar(b => b.ServiceUrl(PulsarContainerFixture.ServiceUrl)); opts.DisablePulsarRequeue(); opts.UnsubscribePulsarOnClose(PulsarUnsubscribeOnClose.Disabled); @@ -42,7 +42,7 @@ public void requeue_disabled() var uri = PulsarEndpoint.UriFor("persistent://public/default/one"); var endpoint = theRuntime.Endpoints.EndpointFor(uri)?.As(); - endpoint.EnableRequeue.ShouldBeFalse(); + endpoint!.EnableRequeue.ShouldBeFalse(); } [Fact] @@ -51,6 +51,6 @@ public void unsubscribe_on_close_disabled() var uri = PulsarEndpoint.UriFor("persistent://public/default/one"); var endpoint = theRuntime.Endpoints.EndpointFor(uri)?.As(); - endpoint.UnsubscribeOnClose.ShouldBeFalse(); + endpoint!.UnsubscribeOnClose.ShouldBeFalse(); } } diff --git a/src/Transports/Pulsar/Wolverine.Pulsar/PulsarTransportExtensions.cs b/src/Transports/Pulsar/Wolverine.Pulsar/PulsarTransportExtensions.cs index d98103f23..a82d1abe9 100644 --- a/src/Transports/Pulsar/Wolverine.Pulsar/PulsarTransportExtensions.cs +++ b/src/Transports/Pulsar/Wolverine.Pulsar/PulsarTransportExtensions.cs @@ -242,7 +242,7 @@ public PulsarNativeResiliencyDeadLetterConfiguration WithSharedSubscriptionType( { add(e => { e.SubscriptionType = DotPulsar.SubscriptionType.Shared; }); - return new PulsarNativeResiliencyDeadLetterConfiguration(new PulsarListenerConfiguration(_endpoint)); + return new PulsarNativeResiliencyDeadLetterConfiguration(new PulsarListenerConfiguration(_endpoint!)); } @@ -255,7 +255,7 @@ public PulsarNativeResiliencyDeadLetterConfiguration WithKeySharedSubscriptionTy { add(e => { e.SubscriptionType = DotPulsar.SubscriptionType.KeyShared; }); - return new PulsarNativeResiliencyDeadLetterConfiguration(new PulsarListenerConfiguration(_endpoint)); + return new PulsarNativeResiliencyDeadLetterConfiguration(new PulsarListenerConfiguration(_endpoint!)); } /// @@ -299,7 +299,7 @@ public PulsarListenerConfiguration DeadLetterQueueing(DeadLetterTopic dlq) add(e => { e.DeadLetterTopic = dlq; - e.Runtime.Options.Policies.OnAnyException().MoveToErrorQueue(); + e.Runtime!.Options.Policies.OnAnyException().MoveToErrorQueue(); }); return this; diff --git a/src/Transports/RabbitMQ/ChaosTesting/ChaosDriver.cs b/src/Transports/RabbitMQ/ChaosTesting/ChaosDriver.cs index 1feb96d5f..64c460e20 100644 --- a/src/Transports/RabbitMQ/ChaosTesting/ChaosDriver.cs +++ b/src/Transports/RabbitMQ/ChaosTesting/ChaosDriver.cs @@ -29,8 +29,8 @@ public TransportConfiguration(string description) public string Description { get; } - public Action ConfigureReceiver { get; init; } - public Action ConfigureSender { get; init; } + public Action ConfigureReceiver { get; init; } = null!; + public Action ConfigureSender { get; init; } = null!; public override string ToString() { @@ -186,7 +186,7 @@ public async Task WaitForAllMessagingToComplete(TimeSpan time) var receiver = _receivers.Values.FirstOrDefault(); - var count = await _storage.FindOutstandingMessageCount(receiver.Services, CancellationToken.None); + var count = await _storage.FindOutstandingMessageCount(receiver!.Services, CancellationToken.None); var attempts = 0; while (attempts < 20) @@ -246,7 +246,7 @@ public async Task WaitForAllSendingToComplete(TimeSpan timeout) { var runtime = sender.Services.GetRequiredService(); var sendingQueue = runtime.Endpoints.LocalQueueForMessageType(typeof(SendMessages)); - while (!cancellation.Token.IsCancellationRequested && sendingQueue.MessageCount > 0) + while (!cancellation.Token.IsCancellationRequested && sendingQueue!.MessageCount > 0) { await Task.Delay(100.Milliseconds(), cancellation.Token); } diff --git a/src/Transports/RabbitMQ/ChaosTesting/MartenStorage.cs b/src/Transports/RabbitMQ/ChaosTesting/MartenStorage.cs index 56b1ce543..67287f013 100644 --- a/src/Transports/RabbitMQ/ChaosTesting/MartenStorage.cs +++ b/src/Transports/RabbitMQ/ChaosTesting/MartenStorage.cs @@ -80,9 +80,9 @@ public async Task FindOutstandingMessageCount(IServiceProvider container, public class MultiDatabaseMartenStorageStrategy : IMessageStorageStrategy { - private string tenant1ConnectionString; - private string tenant2ConnectionString; - private string tenant3ConnectionString; + private string tenant1ConnectionString = null!; + private string tenant2ConnectionString = null!; + private string tenant3ConnectionString = null!; public async Task InitializeAsync() { diff --git a/src/Transports/RabbitMQ/ChaosTesting/MessageRecord.cs b/src/Transports/RabbitMQ/ChaosTesting/MessageRecord.cs index 1c543379b..15ade7798 100644 --- a/src/Transports/RabbitMQ/ChaosTesting/MessageRecord.cs +++ b/src/Transports/RabbitMQ/ChaosTesting/MessageRecord.cs @@ -12,5 +12,5 @@ public static MessageRecord For(ITrackedMessage message) } public Guid Id { get; set; } - public string TypeName { get; set; } + public string TypeName { get; set; } = null!; } \ No newline at end of file diff --git a/src/Transports/RabbitMQ/ChaosTesting/MultiTenantedChaosSpecifications.cs b/src/Transports/RabbitMQ/ChaosTesting/MultiTenantedChaosSpecifications.cs index 4deb6a4bc..37d24715b 100644 --- a/src/Transports/RabbitMQ/ChaosTesting/MultiTenantedChaosSpecifications.cs +++ b/src/Transports/RabbitMQ/ChaosTesting/MultiTenantedChaosSpecifications.cs @@ -53,8 +53,6 @@ public MultiTenantedChaosSpecifications(ITestOutputHelper output) _output = output; } - private MultiTenantedMessageStore _store; - protected async Task execute(TransportConfiguration configuration) where TScript : ChaosScript, new() { diff --git a/src/Transports/RabbitMQ/CircuitBreakingTests/CircuitBreakerIntegrationContext.cs b/src/Transports/RabbitMQ/CircuitBreakingTests/CircuitBreakerIntegrationContext.cs index 07d55e80f..702f22214 100644 --- a/src/Transports/RabbitMQ/CircuitBreakingTests/CircuitBreakerIntegrationContext.cs +++ b/src/Transports/RabbitMQ/CircuitBreakingTests/CircuitBreakerIntegrationContext.cs @@ -230,7 +230,7 @@ public bool IsEnabled(LogLevel logLevel) //return typeof(T).Name == "DurabilityAgent"; } - public IDisposable BeginScope(TState state) + public IDisposable BeginScope(TState state) where TState : notnull { return this; } diff --git a/src/Transports/RabbitMQ/CircuitBreakingTests/Recorder.cs b/src/Transports/RabbitMQ/CircuitBreakingTests/Recorder.cs index 879f17623..a1c3ee01b 100644 --- a/src/Transports/RabbitMQ/CircuitBreakingTests/Recorder.cs +++ b/src/Transports/RabbitMQ/CircuitBreakingTests/Recorder.cs @@ -5,9 +5,9 @@ namespace CircuitBreakingTests; public static class Recorder { public static int Received; - private static TaskCompletionSource _completion; + private static TaskCompletionSource _completion = null!; private static int _expected; - private static ITestOutputHelper _output; + private static ITestOutputHelper _output = null!; public static bool NeverFail { get; set; } public static Task WaitForMessagesToBeProcessed(ITestOutputHelper output, int number, TimeSpan timeout) diff --git a/src/Transports/RabbitMQ/CircuitBreakingTests/stopping_and_starting_listeners.cs b/src/Transports/RabbitMQ/CircuitBreakingTests/stopping_and_starting_listeners.cs index ffa04cbc2..88166f09e 100644 --- a/src/Transports/RabbitMQ/CircuitBreakingTests/stopping_and_starting_listeners.cs +++ b/src/Transports/RabbitMQ/CircuitBreakingTests/stopping_and_starting_listeners.cs @@ -77,7 +77,7 @@ public async Task pause_a_local_durable_queue() public void find_listener_by_name() { var runtime = theListener.GetRuntime(); - runtime.Endpoints.FindListeningAgent("one") + runtime.Endpoints.FindListeningAgent("one")! .Uri.ShouldBe($"tcp://localhost:{_port1}".ToUri()); runtime.Endpoints.FindListeningAgent("wrong") @@ -93,9 +93,9 @@ public void all_listeners_are_initially_listening() var runtime = theListener.GetRuntime(); - runtime.Endpoints.FindListeningAgent(uri1).Status.ShouldBe(ListeningStatus.Accepting); - runtime.Endpoints.FindListeningAgent(uri2).Status.ShouldBe(ListeningStatus.Accepting); - runtime.Endpoints.FindListeningAgent(uri3).Status.ShouldBe(ListeningStatus.Accepting); + runtime.Endpoints.FindListeningAgent(uri1)!.Status.ShouldBe(ListeningStatus.Accepting); + runtime.Endpoints.FindListeningAgent(uri2)!.Status.ShouldBe(ListeningStatus.Accepting); + runtime.Endpoints.FindListeningAgent(uri3)!.Status.ShouldBe(ListeningStatus.Accepting); } [Fact] @@ -108,7 +108,7 @@ public void unknown_listener_is_unknown() [Fact] public async Task stop_with_no_restart() { - var agent = theListener.GetRuntime().Endpoints.FindListeningAgent("one"); + var agent = theListener.GetRuntime().Endpoints.FindListeningAgent("one")!; await agent.StopAndDrainAsync(); agent.Status.ShouldBe(ListeningStatus.Stopped); @@ -121,7 +121,7 @@ public async Task stop_with_no_restart() [Fact] public async Task pause() { - var agent = theListener.GetRuntime().Endpoints.FindListeningAgent("one"); + var agent = theListener.GetRuntime().Endpoints.FindListeningAgent("one")!; await agent.PauseAsync(3.Seconds()); agent.Status.ShouldBe(ListeningStatus.Stopped); @@ -144,7 +144,7 @@ public async Task pause() [Fact] public async Task pause_repeatedly() { - var agent = theListener.GetRuntime().Endpoints.FindListeningAgent("one"); + var agent = theListener.GetRuntime().Endpoints.FindListeningAgent("one")!; await agent.PauseAsync(1.Seconds()); await agent.PauseAsync(1.Seconds()); await agent.PauseAsync(3.Seconds()); @@ -188,7 +188,7 @@ await sender await stopWaiter; - var agent = runtime.Endpoints.FindListeningAgent("one"); + var agent = runtime.Endpoints.FindListeningAgent("one")!; agent.Status.ShouldBe(ListeningStatus.Stopped); // should restart diff --git a/src/Transports/RabbitMQ/RabbitMqBootstrapping/Program.cs b/src/Transports/RabbitMQ/RabbitMqBootstrapping/Program.cs index ee28ee1a0..4a29d9012 100644 --- a/src/Transports/RabbitMQ/RabbitMqBootstrapping/Program.cs +++ b/src/Transports/RabbitMQ/RabbitMqBootstrapping/Program.cs @@ -11,7 +11,7 @@ builder.Host.UseWolverine(opts => { // Using the Rabbit MQ URI specification: https://www.rabbitmq.com/uri-spec.html - opts.UseRabbitMq(new Uri(builder.Configuration["rabbitmq"])); + opts.UseRabbitMq(new Uri(builder.Configuration["rabbitmq"]!)); // Or connect locally as you might for development purposes opts.UseRabbitMq(); @@ -19,9 +19,9 @@ // Or do it more programmatically: opts.UseRabbitMq(rabbit => { - rabbit.HostName = builder.Configuration["rabbitmq_host"]; - rabbit.VirtualHost = builder.Configuration["rabbitmq_virtual_host"]; - rabbit.UserName = builder.Configuration["rabbitmq_username"]; + rabbit.HostName = builder.Configuration["rabbitmq_host"]!; + rabbit.VirtualHost = builder.Configuration["rabbitmq_virtual_host"]!; + rabbit.UserName = builder.Configuration["rabbitmq_username"]!; // and you get the point, you get full control over the Rabbit MQ // connection here for the times you need that diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_189_fails_if_there_are_many_messages_in_queue_on_startup.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_189_fails_if_there_are_many_messages_in_queue_on_startup.cs index 7ff01b02d..8dbe7fb5b 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_189_fails_if_there_are_many_messages_in_queue_on_startup.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_189_fails_if_there_are_many_messages_in_queue_on_startup.cs @@ -6,6 +6,7 @@ namespace Wolverine.RabbitMQ.Tests.Bugs; +[Trait("Category", "Flaky")] public class Bug_189_fails_if_there_are_many_messages_in_queue_on_startup { [Fact] diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_2078_pause_then_requeue.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_2078_pause_then_requeue.cs index 42f4d93e4..ac22889ac 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_2078_pause_then_requeue.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_2078_pause_then_requeue.cs @@ -11,10 +11,11 @@ namespace Wolverine.RabbitMQ.Tests.Bugs; +[Trait("Category", "Flaky")] public class Bug_2078_pause_then_requeue : IAsyncLifetime { private readonly ITestOutputHelper _output; - private IHost _host; + private IHost _host = null!; private readonly string _queueName; public Bug_2078_pause_then_requeue(ITestOutputHelper output) @@ -46,7 +47,7 @@ public async Task DisposeAsync() { if (_host != null) { - _host.TeardownResources(); + await _host.TeardownResources(); await _host.StopAsync(); _host.Dispose(); } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_2155_ancillary_store_inbox_persistence.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_2155_ancillary_store_inbox_persistence.cs index 83092bd98..7af966159 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_2155_ancillary_store_inbox_persistence.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_2155_ancillary_store_inbox_persistence.cs @@ -37,8 +37,8 @@ public class AncillaryDoc2155 public class Bug_2155_ancillary_store_inbox_persistence : IAsyncLifetime { - private IHost _host; - private string _queueName; + private IHost _host = null!; + private string _queueName = null!; public async Task InitializeAsync() { diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_710_rabbit_exchange_errorneously_used_for_system_queues.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_710_rabbit_exchange_errorneously_used_for_system_queues.cs index c2249d885..d7142fc58 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_710_rabbit_exchange_errorneously_used_for_system_queues.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_710_rabbit_exchange_errorneously_used_for_system_queues.cs @@ -33,6 +33,6 @@ public async Task start_system_with_declared_exchange() var options = host.Services.GetRequiredService().Options; - options.Transports.NodeControlEndpoint.Uri.Scheme.ShouldBe("dbcontrol"); + options.Transports.NodeControlEndpoint!.Uri.Scheme.ShouldBe("dbcontrol"); } } \ No newline at end of file diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_DLQ_NotSavedToDatabase.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_DLQ_NotSavedToDatabase.cs index 6f789fef3..962baee6d 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_DLQ_NotSavedToDatabase.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_DLQ_NotSavedToDatabase.cs @@ -41,7 +41,7 @@ namespace Wolverine.RabbitMQ.Tests.Bugs; public class Bug_DLQ_NotSavedToDatabase : IDisposable { private readonly ITestOutputHelper _output; - private IHost _host; + private IHost _host = null!; public Bug_DLQ_NotSavedToDatabase(ITestOutputHelper output) { diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/ConventionalRoutingContext.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/ConventionalRoutingContext.cs index d31f272a8..ed1e97ec4 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/ConventionalRoutingContext.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/ConventionalRoutingContext.cs @@ -16,7 +16,7 @@ public static class ConventionalRoutingTestDefaults public abstract class ConventionalRoutingContext : IDisposable { - private IHost _host; + private IHost _host = null!; internal bool DisableListenerDiscovery { get; set; } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs index f15b3c95e..3be8c1b05 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/end_to_end_with_conventional_routing.cs @@ -43,7 +43,7 @@ public async Task send_from_one_node_to_another_all_with_conventional_routing() var received = session .AllRecordsInOrder() - .Where(x => x.Envelope.Message?.GetType() == typeof(ConventionallyRoutedMessage)) + .Where(x => x.Envelope?.Message?.GetType() == typeof(ConventionallyRoutedMessage)) .Single(x => x.MessageEventType == MessageEventType.Received); received diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/end_to_end_with_conventional_routing_custom_exchange.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/end_to_end_with_conventional_routing_custom_exchange.cs index 4c630ac0b..4d07690d9 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/end_to_end_with_conventional_routing_custom_exchange.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/end_to_end_with_conventional_routing_custom_exchange.cs @@ -75,7 +75,7 @@ public async Task send_from_one_node_to_another_all_with_conventional_routing() var received = session .AllRecordsInOrder() - .Where(x => x.Envelope.Message?.GetType() == typeof(HeadersMessage)) + .Where(x => x.Envelope?.Message?.GetType() == typeof(HeadersMessage)) .Single(x => x.MessageEventType == MessageEventType.Received); received diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs index 1c26d2ab7..954507180 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/end_to_end_with_conventional_routing_with_prefix.cs @@ -55,13 +55,13 @@ public async Task send_from_one_node_to_another_all_with_conventional_routing() var received = session .AllRecordsInOrder() - .Where(x => x.Envelope.Message?.GetType() == typeof(ConventionallyRoutedMessage)) + .Where(x => x.Envelope?.Message?.GetType() == typeof(ConventionallyRoutedMessage)) .Single(x => x.MessageEventType == MessageEventType.Received); received .ServiceName.ShouldBe("Receiver"); - received.Envelope.Destination + received.Envelope!.Destination .ShouldBe(new Uri("rabbitmq://queue/shazaam-routed")); } } \ No newline at end of file diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/when_discovering_a_sender_with_all_defaults.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/when_discovering_a_sender_with_all_defaults.cs index 9a62f3e4e..d5b79dbac 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/when_discovering_a_sender_with_all_defaults.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/ConventionalRouting/when_discovering_a_sender_with_all_defaults.cs @@ -11,12 +11,12 @@ namespace Wolverine.RabbitMQ.Tests.ConventionalRouting; public class when_discovering_a_sender_with_all_defaults : ConventionalRoutingContext { - private readonly MessageRoute theRoute; + private readonly MessageRoute theRoute = null!; public when_discovering_a_sender_with_all_defaults() { DisableListenerDiscovery = true; ConfigureConventions(x=> x.IncludeTypes(ConventionalRoutingTestDefaults.RoutingMessageOnly)); - theRoute = PublishingRoutesFor().Single() as MessageRoute; + theRoute = (PublishingRoutesFor().Single() as MessageRoute)!; } [Fact] diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/InlineRabbitMqTransportComplianceTests.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/InlineRabbitMqTransportComplianceTests.cs index 477a60ba2..b92955c21 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/InlineRabbitMqTransportComplianceTests.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/InlineRabbitMqTransportComplianceTests.cs @@ -34,9 +34,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/RabbitMqEndpointTests.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/RabbitMqEndpointTests.cs index 2d0dd68e2..5ac8e9be4 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/RabbitMqEndpointTests.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/RabbitMqEndpointTests.cs @@ -79,7 +79,7 @@ public void map_to_rabbit_mq_uri_with_queue() // With virtual host - transport.ConnectionFactory.VirtualHost = "v1"; + transport.ConnectionFactory!.VirtualHost = "v1"; endpoint.MassTransitUri().ShouldBe("rabbitmq://rabbitserver/v1/foo".ToUri()); } @@ -98,7 +98,7 @@ public void map_to_rabbit_mq_uri_with_exchange() // With virtual host - transport.ConnectionFactory.VirtualHost = "v1"; + transport.ConnectionFactory!.VirtualHost = "v1"; endpoint.MassTransitUri().ShouldBe("rabbitmq://rabbitserver/v1/bar".ToUri()); } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/RabbitMqExchangeTests.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/RabbitMqExchangeTests.cs index c981e5108..c8463cb27 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/RabbitMqExchangeTests.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/RabbitMqExchangeTests.cs @@ -51,12 +51,12 @@ public async Task exchange_declare() await exchange.DeclareAsync(channel, NullLogger.Instance); - await channel.Received().ExchangeDeclareAsync("foo", "fanout", false, true, exchange.Arguments); + await channel.Received().ExchangeDeclareAsync("foo", "fanout", false, true, (IDictionary)exchange.Arguments); exchange.HasDeclared.ShouldBeTrue(); } - - + + [Fact] public async Task exchange_declare_headers() { @@ -70,7 +70,7 @@ public async Task exchange_declare_headers() await exchange.DeclareAsync(channel, NullLogger.Instance); - await channel.Received().ExchangeDeclareAsync("foo", "headers", false, true, exchange.Arguments); + await channel.Received().ExchangeDeclareAsync("foo", "headers", false, true, (IDictionary)exchange.Arguments); exchange.HasDeclared.ShouldBeTrue(); } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/RabbitMqQueueTests.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/RabbitMqQueueTests.cs index 707aab935..ffa919005 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/RabbitMqQueueTests.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/RabbitMqQueueTests.cs @@ -72,7 +72,7 @@ public async Task declare(bool autoDelete, bool isExclusive, bool isDurable) await queue.DeclareAsync(channel, NullLogger.Instance); await channel.Received() - .QueueDeclareAsync("foo", queue.IsDurable, queue.IsExclusive, queue.AutoDelete, queue.Arguments); + .QueueDeclareAsync("foo", queue.IsDurable, queue.IsExclusive, queue.AutoDelete, (IDictionary)queue.Arguments); queue.HasDeclared.ShouldBeTrue(); } @@ -135,7 +135,7 @@ public async Task initialize_with_auto_provision_and_global_auto_purge() await endpoint.InitializeAsync(theChannel, NullLogger.Instance); - await theChannel.Received().QueueDeclareAsync("foo", true, false, false, endpoint.Arguments); + await theChannel.Received().QueueDeclareAsync("foo", true, false, false, (IDictionary)endpoint.Arguments); await theChannel.Received().QueuePurgeAsync("foo"); } @@ -150,7 +150,7 @@ public async Task initialize_with_auto_provision_and_local_auto_purge() await endpoint.InitializeAsync(theChannel, NullLogger.Instance); - await theChannel.Received().QueueDeclareAsync("foo", true, false, false, endpoint.Arguments); + await theChannel.Received().QueueDeclareAsync("foo", true, false, false, (IDictionary)endpoint.Arguments); await theChannel.Received().QueuePurgeAsync("foo"); } } \ No newline at end of file diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/multi_tenancy_internals.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/multi_tenancy_internals.cs index c9a4dcc1e..0932b155a 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/multi_tenancy_internals.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/multi_tenancy_internals.cs @@ -20,8 +20,8 @@ public void create_tenanted_transport_from_virtual_host() var tenant = new RabbitMqTenant("one", "one"); var tenantTransport = tenant.Compile(parent); - tenantTransport.ConnectionFactory.VirtualHost.ShouldBe("one"); - tenantTransport.ConnectionFactory.Port.ShouldBe(5673); + tenantTransport.ConnectionFactory!.VirtualHost.ShouldBe("one"); + tenantTransport.ConnectionFactory!.Port.ShouldBe(5673); } [Fact] @@ -58,7 +58,7 @@ public void add_tenant_by_uri() var expression = new RabbitMqTransportExpression(transport, new WolverineOptions()); expression.AddTenant("one", new Uri("amqp://server1")); - transport.Tenants["one"].Transport.ConnectionFactory.HostName.ShouldBe("server1"); + transport.Tenants["one"].Transport!.ConnectionFactory!.HostName.ShouldBe("server1"); } [Fact] @@ -68,7 +68,7 @@ public void add_tenant_by_explicit_configuration() var expression = new RabbitMqTransportExpression(transport, new WolverineOptions()); expression.AddTenant("one", c => c.HostName = "server2"); - transport.Tenants["one"].Transport.ConnectionFactory.HostName.ShouldBe("server2"); + transport.Tenants["one"].Transport!.ConnectionFactory!.HostName.ShouldBe("server2"); } [Fact] diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/RabbitMqExchangeBindingTests.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/RabbitMqExchangeBindingTests.cs index 091ed7f26..d304404b3 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/RabbitMqExchangeBindingTests.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/RabbitMqExchangeBindingTests.cs @@ -17,7 +17,7 @@ public async Task declare_calls_exchange_bind() await binding.DeclareAsync(channel, NullLogger.Instance); - await channel.Received().ExchangeBindAsync("destination", "source", "routing.key", binding.Arguments); + await channel.Received().ExchangeBindAsync("destination", "source", "routing.key", (IDictionary)binding.Arguments); binding.HasDeclared.ShouldBeTrue(); } @@ -29,7 +29,7 @@ public async Task teardown_calls_exchange_unbind() await binding.TeardownAsync(channel); - await channel.Received().ExchangeUnbindAsync("destination", "source", "routing.key", binding.Arguments); + await channel.Received().ExchangeUnbindAsync("destination", "source", "routing.key", (IDictionary)binding.Arguments); } public class when_adding_exchange_to_exchange_bindings @@ -174,7 +174,7 @@ public async Task declare_async_also_declares_exchange_bindings() await exchange.DeclareAsync(channel, NullLogger.Instance); - await channel.Received().ExchangeDeclareAsync("dest", "topic", true, false, exchange.Arguments); + await channel.Received().ExchangeDeclareAsync("dest", "topic", true, false, (IDictionary)exchange.Arguments); await channel.Received().ExchangeBindAsync("dest", "source", "routing.key", Arg.Any>()); } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/RabbitMqTransportTests.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/RabbitMqTransportTests.cs index 3172dd03b..d7022964d 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/RabbitMqTransportTests.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/RabbitMqTransportTests.cs @@ -14,7 +14,7 @@ public class RabbitMqTransportTests public void automatic_recovery_is_try_by_default() { theTransport.ConfigureFactory(f => {}); - theTransport.ConnectionFactory.AutomaticRecoveryEnabled.ShouldBeTrue(); + theTransport.ConnectionFactory!.AutomaticRecoveryEnabled.ShouldBeTrue(); } [Fact] diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/RouteKeyConvention.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/RouteKeyConvention.cs index f03a37a46..4301edb7d 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/RouteKeyConvention.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/RouteKeyConvention.cs @@ -57,14 +57,14 @@ public static async Task use_it() builder.UseWolverine(opts => { - opts.UseRabbitMq(rabbitConnectionString) + opts.UseRabbitMq(rabbitConnectionString!) .AutoProvision(); var exchangeName = builder .Configuration .GetValue("exchange-name"); - opts.RouteWith(new RouteKeyConvention(exchangeName)); + opts.RouteWith(new RouteKeyConvention(exchangeName!)); }); // actually start the app... diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Samples.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Samples.cs index 2b5968ef3..8696dfde5 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Samples.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Samples.cs @@ -384,7 +384,7 @@ public static async Task configure_conventions() x.ExchangeNameForSending(type => type.Name + "Exchange"); // Customize the naming convention for incoming queues - x.QueueNameForListener(type => type.FullName.Replace('.', '-')); + x.QueueNameForListener(type => type.FullName!.Replace('.', '-')); // Or maybe you want to conditionally configure listening endpoints x.ConfigureListeners((listener, context) => @@ -494,7 +494,7 @@ public static async Task configuring_to_receive_json_from_external_systems() { var rabbitMqConnectionString = builder.Configuration.GetConnectionString("rabbit"); - opts.UseRabbitMq(rabbitMqConnectionString); + opts.UseRabbitMq(rabbitMqConnectionString!); opts.ListenToRabbitQueue("emails") // Tell Wolverine to assume that all messages @@ -519,7 +519,7 @@ public static async Task configuring_custom_interop() { var rabbitMqConnectionString = builder.Configuration.GetConnectionString("rabbit"); - opts.UseRabbitMq(rabbitMqConnectionString); + opts.UseRabbitMq(rabbitMqConnectionString!); opts.ListenToRabbitQueue("emails") // Apply your custom interoperability strategy here @@ -570,7 +570,7 @@ public static async Task configure_quorum_queues() builder.UseWolverine(opts => { opts - .UseRabbitMq(builder.Configuration.GetConnectionString("rabbit")) + .UseRabbitMq(builder.Configuration.GetConnectionString("rabbit")!) // You can configure the queue type for declaration with this // usage as well @@ -677,7 +677,7 @@ public static async Task configure() builder.UseWolverine(opts => { // Connect to the "main" Rabbit MQ broker for this application - opts.UseRabbitMq(builder.Configuration.GetConnectionString("internal-rabbit-mq")); + opts.UseRabbitMq(builder.Configuration.GetConnectionString("internal-rabbit-mq")!); // Listen for incoming messages on the main broker at the queue named "incoming" opts.ListenToRabbitQueue("incoming"); @@ -689,7 +689,7 @@ public static async Task configure() // BUT! Let's also use a second broker opts.AddNamedRabbitMqBroker(external, factory => { - factory.Uri = new Uri(builder.Configuration.GetConnectionString("external-rabbit-mq")); + factory.Uri = new Uri(builder.Configuration.GetConnectionString("external-rabbit-mq")!); }); // Listen to a queue on the named, secondary broker diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/SpecialMapper.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/SpecialMapper.cs index e73561b58..e8eac147f 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/SpecialMapper.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/SpecialMapper.cs @@ -25,7 +25,7 @@ public void MapEnvelopeToOutgoing(Envelope envelope, IBasicProperties outgoing) if (envelope.TenantId.IsNotEmpty()) { - outgoing.Headers ??= new Dictionary(); + outgoing.Headers ??= new Dictionary(); outgoing.Headers["tenant-id"] = envelope.TenantId; } } @@ -47,7 +47,7 @@ public void MapIncomingToEnvelope(Envelope envelope, IReadOnlyBasicProperties in { // Watch this in real life, some systems will send header values as // byte arrays - envelope.TenantId = (string)tenantId; + envelope.TenantId = (string)tenantId!; } } } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/channel_configuration.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/channel_configuration.cs index 072b64634..7dc68331a 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/channel_configuration.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/channel_configuration.cs @@ -16,7 +16,7 @@ public static async Task configure_sample() builder.UseWolverine(opts => { opts - .UseRabbitMq(builder.Configuration.GetConnectionString("rabbitmq")) + .UseRabbitMq(builder.Configuration.GetConnectionString("rabbitmq")!) // Fine tune how the underlying Rabbit MQ channels from // this application will behave diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/concurrency_resilient_sharded_processing.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/concurrency_resilient_sharded_processing.cs index f88ae77d4..8d117ad56 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/concurrency_resilient_sharded_processing.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/concurrency_resilient_sharded_processing.cs @@ -102,7 +102,7 @@ public async Task hammer_it_with_lots_of_messages_against_buffered() var counts = envelopes.GroupBy(x => x.Destination); foreach (var count in counts) { - _output.WriteLine(count.Key.ToString() + " had " + count.Count()); + _output.WriteLine(count.Key?.ToString() + " had " + count.Count()); } envelopes.Any(x => x.Destination == new Uri("rabbitmq://queue/letters1")).ShouldBeTrue(); @@ -178,7 +178,7 @@ public async Task hammer_it_with_lots_of_messages_against_buffered_when_resent() var counts = envelopes.GroupBy(x => x.Destination); foreach (var count in counts) { - _output.WriteLine(count.Key.ToString() + " had " + count.Count()); + _output.WriteLine(count.Key?.ToString() + " had " + count.Count()); } envelopes.Any(x => x.Destination == new Uri("rabbitmq://queue/letters1")).ShouldBeTrue(); diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/durable_compliance.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/durable_compliance.cs index 30b1b16ae..633244c78 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/durable_compliance.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/durable_compliance.cs @@ -61,9 +61,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/dynamic_object_creation_smoke_tests.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/dynamic_object_creation_smoke_tests.cs index 7206c1911..40880509d 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/dynamic_object_creation_smoke_tests.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/dynamic_object_creation_smoke_tests.cs @@ -7,7 +7,7 @@ namespace Wolverine.RabbitMQ.Tests; public class dynamic_object_creation_smoke_tests : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; public async Task InitializeAsync() { diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/end_to_end.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/end_to_end.cs index 526db5eee..7b1c61be6 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/end_to_end.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/end_to_end.cs @@ -38,6 +38,7 @@ public static string NextExchangeName() } } +[Trait("Category", "Flaky")] public class end_to_end { private readonly ITestOutputHelper _output; @@ -891,13 +892,13 @@ public void Handle(ColorChosen message, ColorHistory history, Envelope envelope) public class ColorHistory { - public string Name { get; set; } - public Envelope Envelope { get; set; } + public string Name { get; set; } = null!; + public Envelope Envelope { get; set; } = null!; } public class ColorChosen { - public string Name { get; set; } + public string Name { get; set; } = null!; } [MessageIdentity("A")] diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/end_to_end_with_named_broker.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/end_to_end_with_named_broker.cs index 902cdc3ed..e4c425985 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/end_to_end_with_named_broker.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/end_to_end_with_named_broker.cs @@ -102,8 +102,8 @@ public async Task correct_scheme_on_reply_uri() var (tracked, response) = await publisher.TrackActivity().AlsoTrack(receiver).InvokeAndWaitAsync(request); - response.Id.ShouldBe(request.Id); - tracked.Received.SingleEnvelope().Destination.Scheme.ShouldBe("other"); + response!.Id.ShouldBe(request.Id); + tracked.Received.SingleEnvelope().Destination!.Scheme.ShouldBe("other"); } } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/exchange_queue_binding_model_setup_and_teardown_smoke_tests.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/exchange_queue_binding_model_setup_and_teardown_smoke_tests.cs index dca0df7ae..47b814db8 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/exchange_queue_binding_model_setup_and_teardown_smoke_tests.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/exchange_queue_binding_model_setup_and_teardown_smoke_tests.cs @@ -11,7 +11,7 @@ namespace Wolverine.RabbitMQ.Tests; public class exchange_queue_binding_model_setup_and_teardown_smoke_tests { - private readonly IStatefulResource theResource; + private readonly IStatefulResource theResource = null!; private readonly RabbitMqTransport theTransport = new(); public exchange_queue_binding_model_setup_and_teardown_smoke_tests() @@ -47,7 +47,7 @@ public exchange_queue_binding_model_setup_and_teardown_smoke_tests() var wolverineRuntime = new MockWolverineRuntime(); theTransport.TryBuildStatefulResource(wolverineRuntime, out var resource); - theResource = resource; + theResource = resource!; } [Fact] diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/exclusive_listeners.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/exclusive_listeners.cs index a11c1659a..d43dde5ab 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/exclusive_listeners.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/exclusive_listeners.cs @@ -22,7 +22,7 @@ public class exclusive_listeners : IAsyncLifetime { private readonly List _hosts = []; private readonly ITestOutputHelper _output; - private IHost _originalHost; + private IHost _originalHost = null!; public exclusive_listeners(ITestOutputHelper output) { diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/global_partitioned_sharded_processing.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/global_partitioned_sharded_processing.cs index 42063ecf7..900335d9a 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/global_partitioned_sharded_processing.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/global_partitioned_sharded_processing.cs @@ -85,7 +85,7 @@ public async Task hammer_it_with_lots_of_messages_global_partitioned() var counts = envelopes.GroupBy(x => x.Destination); foreach (var count in counts) { - _output.WriteLine(count.Key.ToString() + " had " + count.Count()); + _output.WriteLine(count.Key?.ToString() + " had " + count.Count()); } // In single-node mode, global partitioning routes directly to companion local queues diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/interop_friendly_dead_letter_queue_mechanics.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/interop_friendly_dead_letter_queue_mechanics.cs index 27d8cfb4e..9826f9c8f 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/interop_friendly_dead_letter_queue_mechanics.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/interop_friendly_dead_letter_queue_mechanics.cs @@ -10,11 +10,12 @@ namespace Wolverine.RabbitMQ.Tests; +[Trait("Category", "Flaky")] public class interop_friendly_dead_letter_queue_mechanics: IDisposable { private readonly string QueueName = Guid.NewGuid().ToString(); - private IHost _host; - private RabbitMqTransport theTransport; + private IHost _host = null!; + private RabbitMqTransport theTransport = null!; private readonly string deadLetterQueueName; public interop_friendly_dead_letter_queue_mechanics() diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/interoperability_specs.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/interoperability_specs.cs index f88e14211..c77b1cdc1 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/interoperability_specs.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/interoperability_specs.cs @@ -10,8 +10,8 @@ namespace Wolverine.RabbitMQ.Tests; public class interoperability_specs : IAsyncLifetime { - private string theQueueName; - private IHost _host; + private string theQueueName = null!; + private IHost _host = null!; public async Task InitializeAsync() { @@ -37,7 +37,6 @@ public async Task DisposeAsync() public async Task send_raw_json_to_receiver() { var runtime = _host.GetRuntime(); - var json = "{\"Number\": \"55\"}"; var envelope = new Envelope(new NumberMessage(55)); var data = new SystemTextJsonSerializer(new JsonSerializerOptions()).Write(envelope); diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/leader_pinned_listener.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/leader_pinned_listener.cs index 8a7607c4e..f3dd747c0 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/leader_pinned_listener.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/leader_pinned_listener.cs @@ -19,7 +19,7 @@ namespace Wolverine.RabbitMQ.Tests; public class leader_pinned_listener : IAsyncDisposable { private readonly ITestOutputHelper _output; - private const string? LeaderPinnedListeners = "leader_pinned_listeners"; + private const string LeaderPinnedListeners = "leader_pinned_listeners"; private List _hosts = new List(); public leader_pinned_listener(ITestOutputHelper output) @@ -142,13 +142,13 @@ public bool IsEnabled(LogLevel logLevel) return logLevel != LogLevel.None; } - public IDisposable BeginScope(TState state) + public IDisposable BeginScope(TState state) where TState : notnull { return new Disposable(); } - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, - Func formatter) + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, + Func formatter) { if (exception is DivideByZeroException) { diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/moving_unknown_message_type_to_dlq.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/moving_unknown_message_type_to_dlq.cs index 65387ab82..e085057f1 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/moving_unknown_message_type_to_dlq.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/moving_unknown_message_type_to_dlq.cs @@ -15,8 +15,8 @@ namespace Wolverine.RabbitMQ.Tests; public class moving_unknown_message_type_to_dlq : IAsyncLifetime { - private IHost _sender; - private IHost _receiver; + private IHost _sender = null!; + private IHost _receiver = null!; public static async Task TestSample() { @@ -26,7 +26,7 @@ public static async Task TestSample() builder.UseWolverine(opts => { var connectionString = builder.Configuration.GetConnectionString("rabbit"); - opts.UseRabbitMq(connectionString).UseConventionalRouting(); + opts.UseRabbitMq(connectionString!).UseConventionalRouting(); // All unknown message types received should be placed into // the proper dead letter queue mechanism diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/multi_tenancy_through_virtual_hosts.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/multi_tenancy_through_virtual_hosts.cs index a4c428f4e..5834f0f4f 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/multi_tenancy_through_virtual_hosts.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/multi_tenancy_through_virtual_hosts.cs @@ -109,13 +109,13 @@ public async Task InitializeAsync() }).StartAsync(); } - public IHost Three { get; set; } + public IHost Three { get; set; } = null!; - public IHost Two { get; set; } + public IHost Two { get; set; } = null!; - public IHost One { get; set; } + public IHost One { get; set; } = null!; - public IHost Main { get; private set; } + public IHost Main { get; private set; } = null!; public async Task DisposeAsync() { @@ -171,8 +171,8 @@ public async Task send_message_to_a_specific_tenant() response.ServiceName.ShouldBe("main"); // Label the envelope as tenant id = "two" because it was received at that point - response.Envelope.TenantId.ShouldBe("two"); - response.Envelope.Message.ShouldBeOfType() + response.Envelope!.TenantId.ShouldBe("two"); + response.Envelope!.Message.ShouldBeOfType() .Id.ShouldBe(message.Id); } @@ -273,7 +273,7 @@ public static async Task Configure() { // At this point, you still have to have a *default* broker connection to be used for // messaging. - opts.UseRabbitMq(new Uri(builder.Configuration.GetConnectionString("main"))) + opts.UseRabbitMq(new Uri(builder.Configuration.GetConnectionString("main")!)) // This will be respected across *all* the tenant specific // virtual hosts and separate broker connections @@ -299,7 +299,7 @@ public static async Task Configure() // Or, you can add a broker connection to something completel // different for a tenant - .AddTenant("four", new Uri(builder.Configuration.GetConnectionString("rabbit_four"))); + .AddTenant("four", new Uri(builder.Configuration.GetConnectionString("rabbit_four")!)); // This Wolverine application would be listening to a queue // named "incoming" on all virtual hosts and/or tenant specific message diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/native_dead_letter_queue_mechanics.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/native_dead_letter_queue_mechanics.cs index e33115542..3386f8c8e 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/native_dead_letter_queue_mechanics.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/native_dead_letter_queue_mechanics.cs @@ -13,11 +13,12 @@ namespace Wolverine.RabbitMQ.Tests; +[Trait("Category", "Flaky")] public class native_dead_letter_queue_mechanics : IDisposable { private readonly string QueueName = Guid.NewGuid().ToString(); - private IHost _host; - private RabbitMqTransport theTransport; + private IHost _host = null!; + private RabbitMqTransport theTransport = null!; public async Task afterBootstrapping() { @@ -177,7 +178,7 @@ public async Task uses_overridden_dead_letter_exchange_per_queue_when_transport_ var channel = Substitute.For(); channel.QueueDeclareAsync(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any>()) + Arg.Any>()) .Returns(Task.FromResult(new QueueDeclareOk(queue.QueueName, 0, 0))); await queue.DeclareAsync(channel, NullLogger.Instance); @@ -253,7 +254,7 @@ public async Task default_and_override_queues_keep_their_own_dlx_exchange_on_dec var channel = Substitute.For(); channel.QueueDeclareAsync(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), - Arg.Any>()) + Arg.Any>()) .Returns(Task.FromResult(new QueueDeclareOk(defaultQueue, 0, 0))); await defaultEndpoint.DeclareAsync(channel, NullLogger.Instance); diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/process_inline_compliance.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/process_inline_compliance.cs index 3232daa53..511ec3810 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/process_inline_compliance.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/process_inline_compliance.cs @@ -52,9 +52,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/quorum_queue_compliance.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/quorum_queue_compliance.cs index 86d57d8b2..76cf974fc 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/quorum_queue_compliance.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/quorum_queue_compliance.cs @@ -49,9 +49,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/rate_limiting_end_to_end.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/rate_limiting_end_to_end.cs index 59f62a4e4..8a417afad 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/rate_limiting_end_to_end.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/rate_limiting_end_to_end.cs @@ -13,6 +13,7 @@ namespace Wolverine.RabbitMQ.Tests; +[Trait("Category", "Flaky")] public class rate_limiting_end_to_end { private readonly ITestOutputHelper _output; diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/response_queue_disabling.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/response_queue_disabling.cs index 4836aeba5..08742880e 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/response_queue_disabling.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/response_queue_disabling.cs @@ -6,7 +6,7 @@ namespace Wolverine.RabbitMQ.Tests; public class response_queue_disabling : IAsyncLifetime { - private IHost _host; + private IHost _host = null!; [Fact] public void reply_queue_should_not_be_declared() diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/response_queue_mechanics.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/response_queue_mechanics.cs index 2b18d4700..bdf41027a 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/response_queue_mechanics.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/response_queue_mechanics.cs @@ -10,9 +10,9 @@ namespace Wolverine.RabbitMQ.Tests; public class response_queue_mechanics : IAsyncLifetime { - private IHost _host; - private RabbitMqQueue theEndpoint; - private string theExpectedResponseQueueName; + private IHost _host = null!; + private RabbitMqQueue theEndpoint = null!; + private string theExpectedResponseQueueName = null!; public async Task InitializeAsync() { diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/send_by_topics.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/send_by_topics.cs index 3349e4fb7..0208e4582 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/send_by_topics.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/send_by_topics.cs @@ -15,6 +15,7 @@ namespace Wolverine.RabbitMQ.Tests; +[Trait("Category", "Flaky")] public class send_by_topics : IDisposable { private readonly IHost theGreenReceiver; @@ -232,7 +233,7 @@ public async Task publish_by_user_message_topic_logic() var record = session.Received.RecordsInOrder().Single(x => x.ServiceName == "Blue"); - record.Envelope.Message.ShouldBeOfType() + record.Envelope!.Message.ShouldBeOfType() .Id.ShouldBe(routed.Id); } @@ -250,11 +251,12 @@ public async Task publish_by_user_message_topic_logic_and_delay() .SendMessageAndWaitAsync(routed, new DeliveryOptions{ScheduleDelay = 3.Seconds()}); var record = session.Received.RecordsInOrder().Single(x => x.ServiceName == "Blue"); - record.Envelope.Message.ShouldBeOfType() + record.Envelope!.Message.ShouldBeOfType() .Id.ShouldBe(routed.Id); } } +[Trait("Category", "Flaky")] public class send_by_topics_durable : IDisposable { private readonly IHost theGreenReceiver; @@ -415,7 +417,7 @@ public async Task publish_by_user_message_topic_logic() var record = session.Received.RecordsInOrder().Single(x => x.ServiceName == "Blue"); - record.Envelope.Message.ShouldBeOfType() + record.Envelope!.Message.ShouldBeOfType() .Id.ShouldBe(routed.Id); } @@ -434,7 +436,7 @@ public async Task publish_by_user_message_topic_logic_and_delay() var record = session.Received.RecordsInOrder().Single(x => x.ServiceName == "Blue"); - record.Envelope.Message.ShouldBeOfType() + record.Envelope!.Message.ShouldBeOfType() .Id.ShouldBe(routed.Id); } } @@ -458,7 +460,7 @@ public class ThirdMessage : FirstMessage; public class RoutedMessage { - public string TopicName { get; set; } + public string TopicName { get; set; } = null!; public Guid Id { get; set; } = Guid.NewGuid(); } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/sending_compliance_with_prefixes.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/sending_compliance_with_prefixes.cs index 0d4a0e597..6233a84b3 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/sending_compliance_with_prefixes.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/sending_compliance_with_prefixes.cs @@ -36,9 +36,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/sending_raw_messages.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/sending_raw_messages.cs index efa17a4f7..9c38db510 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/sending_raw_messages.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/sending_raw_messages.cs @@ -10,6 +10,7 @@ namespace Wolverine.RabbitMQ.Tests; +[Trait("Category", "Flaky")] public class sending_raw_messages { [Fact] @@ -139,7 +140,7 @@ public static async Task send_messages_with_raw_data() builder.UseWolverine(opts => { - opts.UseRabbitMq(connectionString).AutoProvision(); + opts.UseRabbitMq(connectionString!).AutoProvision(); opts.ListenToRabbitQueue("batches") diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/stream_queue_compliance.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/stream_queue_compliance.cs index 8c7e8bacc..3678361a7 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/stream_queue_compliance.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/stream_queue_compliance.cs @@ -44,9 +44,9 @@ await ReceiverIs(opts => }); } - public async Task DisposeAsync() + public new async Task DisposeAsync() { - await DisposeAsync(); + await base.DisposeAsync(); } } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/wolverine_storage_dead_letter_queue_mechanics.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/wolverine_storage_dead_letter_queue_mechanics.cs index af59bd33c..8df5b9a26 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/wolverine_storage_dead_letter_queue_mechanics.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/wolverine_storage_dead_letter_queue_mechanics.cs @@ -14,11 +14,12 @@ namespace Wolverine.RabbitMQ.Tests; +[Trait("Category", "Flaky")] public class wolverine_storage_dead_letter_queue_mechanics : IDisposable { private readonly string QueueName = Guid.NewGuid().ToString(); - private IHost _host; - private RabbitMqTransport theTransport; + private IHost _host = null!; + private RabbitMqTransport theTransport = null!; private readonly string connectionString; public wolverine_storage_dead_letter_queue_mechanics() diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/IRabbitMqExchange.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/IRabbitMqExchange.cs index 8ac68aa30..3ac848619 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/IRabbitMqExchange.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/IRabbitMqExchange.cs @@ -21,5 +21,5 @@ public interface IRabbitMqExchange /// bool AutoDelete { get; set; } - IDictionary Arguments { get; } + IDictionary Arguments { get; } } \ No newline at end of file diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/IRabbitMqQueue.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/IRabbitMqQueue.cs index 54ccb4618..1d84bde61 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/IRabbitMqQueue.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/IRabbitMqQueue.cs @@ -26,7 +26,7 @@ public interface IRabbitMqQueue /// Arguments for Rabbit MQ queue declarations. See the Rabbit MQ .NET client documentation at /// https://www.rabbitmq.com/dotnet.html /// - IDictionary Arguments { get; } + IDictionary Arguments { get; } /// /// Arguments for Rabbit MQ channel consume operations diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEndpoint.MassTransit.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEndpoint.MassTransit.cs index 0e230b592..3695f6484 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEndpoint.MassTransit.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEndpoint.MassTransit.cs @@ -8,7 +8,7 @@ public abstract partial class RabbitMqEndpoint : IMassTransitInteropEndpoint public Uri? MassTransitUri() { var segments = new List(); - var virtualHost = _parent.ConnectionFactory.VirtualHost; + var virtualHost = _parent.ConnectionFactory!.VirtualHost; if (virtualHost.IsNotEmpty() && virtualHost != "/") { segments.Add(virtualHost); diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEndpoint.NServiceBus.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEndpoint.NServiceBus.cs index 30c3ba437..61ac84422 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEndpoint.NServiceBus.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEndpoint.NServiceBus.cs @@ -29,14 +29,14 @@ public void UseNServiceBusInterop() void WriteReplyToAddress(Envelope e, IBasicProperties props) { - props.Headers["NServiceBus.ReplyToAddress"] = replyAddress.Value; + props.Headers!["NServiceBus.ReplyToAddress"] = replyAddress.Value; } void ReadReplyUri(Envelope e, IReadOnlyBasicProperties props) { - if (props.Headers.TryGetValue("NServiceBus.ReplyToAddress", out var raw)) + if (props.Headers!.TryGetValue("NServiceBus.ReplyToAddress", out var raw)) { - var queueName = (raw is byte[] b ? Encoding.Default.GetString(b) : raw.ToString())!; + var queueName = (raw is byte[] b ? Encoding.Default.GetString(b) : raw!.ToString())!; e.ReplyUri = new Uri($"{_parent.Protocol}://queue/{queueName}"); } } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEnvelopeMapper.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEnvelopeMapper.cs index 920638528..db04762aa 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEnvelopeMapper.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqEnvelopeMapper.cs @@ -54,7 +54,7 @@ public RabbitMqEnvelopeMapper(Endpoint endpoint, IWolverineRuntime runtime) : ba protected override void writeOutgoingHeader(IBasicProperties outgoing, string key, string value) { - outgoing.Headers[key] = value; + outgoing.Headers![key] = value; } // TODO -- this needs to be open for customizations. See the NServiceBus interop @@ -68,7 +68,7 @@ protected override bool tryReadIncomingHeader(IReadOnlyBasicProperties incoming, if (incoming.Headers.TryGetValue(key, out var raw)) { - value = (raw is byte[] b ? Encoding.Default.GetString(b) : raw.ToString())!; + value = (raw is byte[] b ? Encoding.Default.GetString(b) : raw!.ToString())!; return true; } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqExchange.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqExchange.cs index 740c2baff..86ecf2fe9 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqExchange.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqExchange.cs @@ -57,7 +57,7 @@ public override bool AutoStartSendingAgent() public ExchangeType ExchangeType { get; set; } = ExchangeType.Fanout; public bool AutoDelete { get; set; } = false; - public IDictionary Arguments { get; } = new Dictionary(); + public IDictionary Arguments { get; } = new Dictionary(); internal bool HasExchangeBindings => _exchangeBindings.Count > 0; @@ -87,7 +87,7 @@ public RabbitMqExchangeBinding BindExchange(string sourceExchangeName, string? b { foreach (var argument in arguments) { - binding.Arguments.Add(argument); + binding.Arguments.Add(argument.Key, argument.Value); } } _exchangeBindings.Add(binding); diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqListener.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqListener.cs index 092b9d7e7..051c5743b 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqListener.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqListener.cs @@ -239,7 +239,7 @@ public async ValueTask RequeueAsync(RabbitMqEnvelope envelope) { if (!envelope.Acknowledged) { - await Channel.BasicNackAsync(envelope.DeliveryTag, false, false, _cancellation); + await Channel!.BasicNackAsync(envelope.DeliveryTag, false, false, _cancellation); } await _sender.Value.SendAsync(envelope); diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqQueue.Bindings.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqQueue.Bindings.cs index b464d4c1d..1b3121351 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqQueue.Bindings.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqQueue.Bindings.cs @@ -25,7 +25,7 @@ public RabbitMqBinding BindExchange(string exchangeName, string? bindingKey = nu { foreach (var argument in arguments) { - binding.Arguments.Add(argument); + binding.Arguments.Add(argument.Key, argument.Value); } } _bindings.Add(binding); diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqQueue.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqQueue.cs index 643241606..eb54434d4 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqQueue.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqQueue.cs @@ -201,7 +201,7 @@ await _parent.WithAdminChannelAsync(async channel => /// Arguments for Rabbit MQ queue declarations. See the Rabbit MQ .NET client documentation at /// https://www.rabbitmq.com/dotnet.html /// - public IDictionary Arguments { get; } = new Dictionary(); + public IDictionary Arguments { get; } = new Dictionary(); /// /// Arguments for Rabbit MQ channel consume operations diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqSender.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqSender.cs index a3866f829..7dd93c0bb 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqSender.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqSender.cs @@ -15,7 +15,7 @@ internal class RabbitMqSender : RabbitMqChannelAgent, ISender private readonly IWolverineRuntime _runtime; private readonly CachedString _exchangeName; private readonly bool _isDurable; - private readonly CachedString _routingKey; + private readonly CachedString _routingKey = null!; private readonly IRabbitMqEnvelopeMapper _mapper; public RabbitMqSender(RabbitMqEndpoint endpoint, RabbitMqTransport transport, diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqTransportExpression.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqTransportExpression.cs index 055b165bc..623921ebb 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqTransportExpression.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqTransportExpression.cs @@ -89,7 +89,7 @@ public RabbitMqTransportExpression ConfigureConnection(Action throw new ArgumentNullException(nameof(configure)); } - configure(Transport.ConnectionFactory); + configure(Transport.ConnectionFactory!); return this; } diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqBinding.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqBinding.cs index d8be877dc..4855823fe 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqBinding.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqBinding.cs @@ -19,7 +19,7 @@ public RabbitMqBinding(string exchangeName, RabbitMqQueue queue, string? binding public IRabbitMqQueue Queue => _queue; public string ExchangeName { get; } - public IDictionary Arguments { get; } = new Dictionary(); + public IDictionary Arguments { get; } = new Dictionary(); public bool HasDeclared { get; private set; } internal async Task DeclareAsync(IChannel channel, ILogger logger) diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqExchangeBinding.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqExchangeBinding.cs index d2314ab48..f399fde45 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqExchangeBinding.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqExchangeBinding.cs @@ -16,7 +16,7 @@ public RabbitMqExchangeBinding(string sourceExchangeName, string destinationExch public string SourceExchangeName { get; } public string DestinationExchangeName { get; } - public IDictionary Arguments { get; } = new Dictionary(); + public IDictionary Arguments { get; } = new Dictionary(); public bool HasDeclared { get; private set; } internal async Task DeclareAsync(IChannel channel, ILogger logger) diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqExchangeConfigurationExpression.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqExchangeConfigurationExpression.cs index e4a7fb960..81f9e18de 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqExchangeConfigurationExpression.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqExchangeConfigurationExpression.cs @@ -28,7 +28,7 @@ public bool AutoDelete get => _exchange.AutoDelete; set => _exchange.AutoDelete = value; } - public IDictionary Arguments => _exchange.Arguments; + public IDictionary Arguments => _exchange.Arguments; public TopicBindingExchange BindTopic(string topicPattern) { var queue = _transport.Queues[Name]; diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqListenerConfiguration.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqListenerConfiguration.cs index 7db59efbc..c19ed715f 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqListenerConfiguration.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/RabbitMqListenerConfiguration.cs @@ -118,7 +118,7 @@ public RabbitMqListenerConfiguration PreFetchCount(ushort count) /// /// /// - public RabbitMqListenerConfiguration UseInterop(IRabbitMqEnvelopeMapper mapper) + public new RabbitMqListenerConfiguration UseInterop(IRabbitMqEnvelopeMapper mapper) { add(e => e.EnvelopeMapper = mapper); return this; diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/BasicPubSubTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/BasicPubSubTests.cs index ff3d0518d..93a8a30eb 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/BasicPubSubTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/BasicPubSubTests.cs @@ -36,7 +36,7 @@ public async Task publish_and_listen_end_to_end() }) .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); var endpoint = opts.ListenToRedisStream(streamKey, "g1") .DefaultIncomingMessage() .BlockTimeout(100.Milliseconds()) diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/BufferedComplianceTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/BufferedComplianceTests.cs index 32955caa4..73395589f 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/BufferedComplianceTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/BufferedComplianceTests.cs @@ -20,13 +20,13 @@ public async Task InitializeAsync() await ReceiverIs(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.ListenToRedisStream(receiverStream, "g1").BufferedInMemory().StartFromBeginning(); }); await SenderIs(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishAllMessages().ToRedisStream(receiverStream).BufferedInMemory(); }); } diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/Bugs/Bug_1970_issue_with_scheduling.cs b/src/Transports/Redis/Wolverine.Redis.Tests/Bugs/Bug_1970_issue_with_scheduling.cs index 7eacc1759..e347c8251 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/Bugs/Bug_1970_issue_with_scheduling.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/Bugs/Bug_1970_issue_with_scheduling.cs @@ -13,7 +13,7 @@ public async Task send_scheduled_message() using var host = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision() + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision() .ConfigureDefaultConsumerName((runtime, endpoint) => $"{runtime.Options.ServiceName}-test-{runtime.DurabilitySettings.AssignedNodeNumber}"); opts.PublishAllMessages().ToRedisStream("wolverine-messages"); diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/DatabaseBackedEndpointTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/DatabaseBackedEndpointTests.cs index 27b771e3e..c33d34033 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/DatabaseBackedEndpointTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/DatabaseBackedEndpointTests.cs @@ -31,7 +31,7 @@ public async Task redis_endpoint_implements_idatabase_backed_endpoint() .UseWolverine(opts => { opts.ServiceName = "DatabaseBackedEndpointTest"; - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishMessage().ToRedisStream(streamKey).SendInline(); opts.ListenToRedisStream(streamKey, "dbe-test-group").StartFromBeginning(); }).StartAsync(); @@ -54,7 +54,7 @@ public async Task schedule_retry_should_add_message_to_scheduled_set() .UseWolverine(opts => { opts.ServiceName = "DatabaseBackedEndpointTest"; - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishMessage().ToRedisStream(streamKey).SendInline(); opts.ListenToRedisStream(streamKey, "dbe-test-group").StartFromBeginning(); }).StartAsync(); @@ -118,7 +118,7 @@ public async Task schedule_retry_without_scheduled_time_uses_default_delay() .UseWolverine(opts => { opts.ServiceName = "DatabaseBackedEndpointTest"; - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishMessage().ToRedisStream(streamKey).SendInline(); opts.ListenToRedisStream(streamKey, "dbe-test-group").StartFromBeginning(); }).StartAsync(); @@ -178,7 +178,7 @@ public async Task scheduled_retry_should_be_picked_up_by_polling() opts.Durability.ScheduledJobFirstExecution = 50.Milliseconds(); opts.Durability.ScheduledJobPollingTime = 100.Milliseconds(); - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishMessage().ToRedisStream(streamKey).SendInline(); opts.ListenToRedisStream(streamKey, "dbe-test-group").StartFromBeginning(); }).StartAsync(); diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/DeadLetterQueueTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/DeadLetterQueueTests.cs index c6627c25e..53848cfa8 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/DeadLetterQueueTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/DeadLetterQueueTests.cs @@ -33,7 +33,7 @@ public DeadLetterQueueTests(ITestOutputHelper output) // Disable automatic local queue processing opts.Durability.Mode = DurabilityMode.Solo; - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); // Configure routing to our test stream opts.PublishMessage().ToRedisStream(streamKey).SendInline(); diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/DocumentationSamples.cs b/src/Transports/Redis/Wolverine.Redis.Tests/DocumentationSamples.cs index 325b0cf41..0ea8a5929 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/DocumentationSamples.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/DocumentationSamples.cs @@ -21,7 +21,7 @@ public static async Task configure() using var host = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379") + opts.UseRedisTransport(RedisContainerFixture.ConnectionString) // Auto-create streams and consumer groups .AutoProvision() @@ -87,7 +87,7 @@ public static async Task configure_with_database_ids() using var host = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379"); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString); // Configure streams on different databases opts.PublishMessage() @@ -122,7 +122,7 @@ public static async Task configure_with_uri_helpers() using var host = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379"); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString); // Configure endpoints to listen and publish opts.ListenToRedisStream("orders", "order-processors", databaseId: 1); @@ -143,7 +143,7 @@ public static async Task working_with_multiple_databases() using var host = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); // Different message types on different databases for isolation diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/EndToEndRetryTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/EndToEndRetryTests.cs index f69340c0d..896aa004d 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/EndToEndRetryTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/EndToEndRetryTests.cs @@ -37,7 +37,7 @@ public async Task InitializeAsync() opts.Durability.ScheduledJobFirstExecution = 100.Milliseconds(); opts.Durability.ScheduledJobPollingTime = 200.Milliseconds(); - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); // Configure routing to our test stream (without SendInline to ensure durable processing) opts.PublishMessage().ToRedisStream(_streamKey); diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/InlineComplianceTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/InlineComplianceTests.cs index dcda81d50..339789b66 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/InlineComplianceTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/InlineComplianceTests.cs @@ -21,13 +21,13 @@ public async Task InitializeAsync() await ReceiverIs(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.ListenToRedisStream(receiverStream, "g1").ProcessInline().StartFromBeginning(); }); await SenderIs(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishAllMessages().ToRedisStream(receiverStream).SendInline(); }); diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/NativeSchedulingRetryTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/NativeSchedulingRetryTests.cs index 9e8844b07..2338892d8 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/NativeSchedulingRetryTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/NativeSchedulingRetryTests.cs @@ -62,7 +62,7 @@ public async Task endpoint_schedule_retry_async_should_save_to_redis() .UseWolverine(opts => { opts.ServiceName = "RetryTestService"; - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); }).StartAsync(); var runtime = host.Services.GetRequiredService(); diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/RedisAutoClaimIntegrationTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/RedisAutoClaimIntegrationTests.cs index babc1ee90..52acd6986 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/RedisAutoClaimIntegrationTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/RedisAutoClaimIntegrationTests.cs @@ -19,7 +19,7 @@ public class RedisAutoClaimIntegrationTests { public record AutoClaimTestMessage(string Id); - private static async Task ConnectAsync() => (await ConnectionMultiplexer.ConnectAsync("localhost:6379")).GetDatabase(); + private static async Task ConnectAsync() => (await ConnectionMultiplexer.ConnectAsync(RedisContainerFixture.ConnectionString)).GetDatabase(); [Fact] public async Task autoclaim_integration_processes_pending_messages() @@ -59,7 +59,7 @@ await db.StreamAddAsync(streamKey, new[] }) .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts .ListenToRedisStream(streamKey, group) .EnableAutoClaim(500.Milliseconds(), 100.Milliseconds()) @@ -96,7 +96,7 @@ public async Task autoclaim_disabled_by_default() }) .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); var expression = opts.ListenToRedisStream(streamKey, group).DefaultIncomingMessage(); var endpoint = expression.Endpoint.As(); @@ -113,7 +113,7 @@ public async Task autoclaim_disabled_by_default() [Fact] public void fluent_api_enables_autoclaim_with_custom_settings() { - var transport = new RedisTransport("localhost:6379"); + var transport = new RedisTransport(RedisContainerFixture.ConnectionString); var endpoint = transport.StreamEndpoint("test"); endpoint.AutoClaimEnabled.ShouldBeFalse(); // Default @@ -130,7 +130,7 @@ public void fluent_api_enables_autoclaim_with_custom_settings() [Fact] public void fluent_api_disables_autoclaim() { - var transport = new RedisTransport("localhost:6379"); + var transport = new RedisTransport(RedisContainerFixture.ConnectionString); var endpoint = transport.StreamEndpoint("test"); new RedisListenerConfiguration(endpoint).EnableAutoClaim().DisableAutoClaim(); diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/RedisClaimingTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/RedisClaimingTests.cs index 966d265a5..f1aebdf4d 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/RedisClaimingTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/RedisClaimingTests.cs @@ -14,7 +14,7 @@ public class RedisClaimingTests { public record TestMessage(string Id); - private static async Task ConnectAsync() => (await ConnectionMultiplexer.ConnectAsync("localhost:6379")).GetDatabase(); + private static async Task ConnectAsync() => (await ConnectionMultiplexer.ConnectAsync(RedisContainerFixture.ConnectionString)).GetDatabase(); [Fact] public async Task claim_and_process_pending_messages() @@ -54,7 +54,7 @@ await db.StreamAddAsync(streamKey, new[] }) .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts .ListenToRedisStream(streamKey, group) .EnableAutoClaim(TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(1)) diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/RedisContainerFixture.cs b/src/Transports/Redis/Wolverine.Redis.Tests/RedisContainerFixture.cs new file mode 100644 index 000000000..a8bd979af --- /dev/null +++ b/src/Transports/Redis/Wolverine.Redis.Tests/RedisContainerFixture.cs @@ -0,0 +1,22 @@ +using System.Runtime.CompilerServices; +using Testcontainers.Redis; + +namespace Wolverine.Redis.Tests; + +public static class RedisContainerFixture +{ + private static RedisContainer? _container; + + public static string ConnectionString { get; private set; } = "localhost:6379"; + + [ModuleInitializer] + internal static void Initialize() + { + _container = new RedisBuilder() + .WithImage("redis:7-alpine") + .Build(); + + _container.StartAsync().GetAwaiter().GetResult(); + ConnectionString = _container.GetConnectionString(); + } +} diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/RedisDiagnosticsTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/RedisDiagnosticsTests.cs index f1a125dc5..919cb725b 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/RedisDiagnosticsTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/RedisDiagnosticsTests.cs @@ -9,13 +9,13 @@ namespace Wolverine.Redis.Tests; public class RedisDiagnosticsTests { - private static async Task ConnectAsync() => (await ConnectionMultiplexer.ConnectAsync("localhost:6379")).GetDatabase(); + private static async Task ConnectAsync() => (await ConnectionMultiplexer.ConnectAsync(RedisContainerFixture.ConnectionString)).GetDatabase(); [Fact] public async Task get_attributes_and_purge() { var streamKey = $"wolverine-tests-diag-{Guid.NewGuid():N}"; - var transport = new RedisTransport("localhost:6379"); + var transport = new RedisTransport(RedisContainerFixture.ConnectionString); var endpoint = transport.StreamEndpoint(streamKey); var db = await ConnectAsync(); diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/RedisSenderProtocolTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/RedisSenderProtocolTests.cs index 24a38ad90..5b3569a79 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/RedisSenderProtocolTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/RedisSenderProtocolTests.cs @@ -45,7 +45,7 @@ public async Task InitializeAsync() .UseWolverine(opts => { opts.ServiceName = "SenderProtocolTestService"; - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); }).StartAsync(); _runtime = _host.Services.GetRequiredService(); diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/RedisTransportFixture.cs b/src/Transports/Redis/Wolverine.Redis.Tests/RedisTransportFixture.cs index 3cc6a3bce..8e0816ed0 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/RedisTransportFixture.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/RedisTransportFixture.cs @@ -5,7 +5,7 @@ namespace Wolverine.Redis.Tests; public class RedisTransportFixture : TransportComplianceFixture { - public RedisTransportFixture() : base(new Uri($"redis://localhost:6379?streamKey=wolverine-tests-{Guid.NewGuid():N}")) + public RedisTransportFixture() : base(new Uri($"redis://{RedisContainerFixture.ConnectionString}?streamKey=wolverine-tests-{Guid.NewGuid():N}")) { } @@ -13,13 +13,13 @@ public async Task InitializeAsync() { await SenderIs(opts => { - opts.UseRedisTransport("localhost:6379") + opts.UseRedisTransport(RedisContainerFixture.ConnectionString) .AutoProvision(); }); await ReceiverIs(opts => { - opts.UseRedisTransport("localhost:6379") + opts.UseRedisTransport(RedisContainerFixture.ConnectionString) .AutoProvision(); opts.ListenToRedisStream("wolverine-tests", "test-consumer-group"); diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/ResponseStreamMechanicsTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/ResponseStreamMechanicsTests.cs index cb5948511..33cff0f2a 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/ResponseStreamMechanicsTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/ResponseStreamMechanicsTests.cs @@ -24,7 +24,7 @@ public async Task InitializeAsync() .UseWolverine(opts => { opts.ServiceName = "MyApp"; - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); }).StartAsync(); var runtime = _host.GetRuntime(); @@ -89,7 +89,7 @@ public async Task InitializeAsync() .UseWolverine(opts => { var t = opts - .UseRedisTransport("localhost:6379") + .UseRedisTransport(RedisContainerFixture.ConnectionString) .AutoProvision() .SystemQueuesEnabled(false); }).StartAsync(); diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/RetryLimitTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/RetryLimitTests.cs index 8e8f159ba..b8ef9d50b 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/RetryLimitTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/RetryLimitTests.cs @@ -35,7 +35,7 @@ public async Task retries_should_stop_after_configured_limit() opts.Durability.ScheduledJobFirstExecution = 100.Milliseconds(); opts.Durability.ScheduledJobPollingTime = 200.Milliseconds(); - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); // Configure routing to our test stream opts.PublishMessage().ToRedisStream(streamKey); diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/Samples/RedisTransportWithScheduling.cs b/src/Transports/Redis/Wolverine.Redis.Tests/Samples/RedisTransportWithScheduling.cs index 939b65b69..908d17586 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/Samples/RedisTransportWithScheduling.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/Samples/RedisTransportWithScheduling.cs @@ -3,6 +3,7 @@ using Wolverine; using Wolverine.ErrorHandling; using Wolverine.Redis; +using Wolverine.Redis.Tests; #region sample_using_dead_letter_queue_for_redis @@ -10,7 +11,7 @@ using var host = await builder.UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision() + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision() .SystemQueuesEnabled(false) // Disable reply queues .DeleteStreamEntryOnAck(true); // Clean up stream entries on ack @@ -54,7 +55,7 @@ public TestCommand1 Handle(TestCommand command) public record TestCommand1(string message); -public class TestCommand1Handler(IMessageContext messageBus) +public class TestCommand1Handler { public void Handle(TestCommand1 command) { diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/ScheduledMessageIntegrationTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/ScheduledMessageIntegrationTests.cs index 86873d643..72ad9c378 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/ScheduledMessageIntegrationTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/ScheduledMessageIntegrationTests.cs @@ -34,7 +34,7 @@ public async Task verify_scheduled_messages_use_sorted_set() opts.Durability.ScheduledJobFirstExecution = 50.Milliseconds(); opts.Durability.ScheduledJobPollingTime = 100.Milliseconds(); - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishAllMessages().ToRedisStream(streamKey).SendInline(); opts.ListenToRedisStream(streamKey, "integration-test-group") @@ -71,7 +71,7 @@ public async Task verify_scheduled_messages_key_format() using var host = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishAllMessages().ToRedisStream(streamKey).SendInline(); }).StartAsync(); @@ -96,7 +96,7 @@ public async Task verify_message_moves_from_scheduled_to_stream() opts.Durability.ScheduledJobFirstExecution = 50.Milliseconds(); opts.Durability.ScheduledJobPollingTime = 100.Milliseconds(); - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishAllMessages().ToRedisStream(streamKey).SendInline(); opts.ListenToRedisStream(streamKey, "integration-test-group") @@ -146,7 +146,7 @@ public async Task verify_score_represents_execution_time() opts.Durability.ScheduledJobFirstExecution = 50.Milliseconds(); opts.Durability.ScheduledJobPollingTime = 100.Milliseconds(); - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishAllMessages().ToRedisStream(streamKey).SendInline(); opts.ListenToRedisStream(streamKey, "integration-test-group") diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/ScheduledMessageTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/ScheduledMessageTests.cs index 0d934eee3..2678e4497 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/ScheduledMessageTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/ScheduledMessageTests.cs @@ -24,7 +24,7 @@ private async Task CreateHostAsync() opts.Durability.ScheduledJobFirstExecution = 50.Milliseconds(); opts.Durability.ScheduledJobPollingTime = 100.Milliseconds(); - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishAllMessages().ToRedisStream(streamKey); opts.ListenToRedisStream(streamKey, "scheduled-test-group") @@ -116,7 +116,7 @@ public async Task scheduled_messages_are_stored_in_redis_sorted_set() opts.Durability.ScheduledJobFirstExecution = 50.Milliseconds(); opts.Durability.ScheduledJobPollingTime = 100.Milliseconds(); - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishAllMessages().ToRedisStream(streamKey); opts.ListenToRedisStream(streamKey, "scheduled-test-group") diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/StartFromBehaviorTests.cs b/src/Transports/Redis/Wolverine.Redis.Tests/StartFromBehaviorTests.cs index 160a1468b..266f5aa7f 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/StartFromBehaviorTests.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/StartFromBehaviorTests.cs @@ -71,7 +71,7 @@ public async Task StartFromNewMessages_should_only_process_messages_after_group_ using var publisherHost = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); }) .StartAsync(); @@ -94,7 +94,7 @@ public async Task StartFromNewMessages_should_only_process_messages_after_group_ }) .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.ListenToRedisStream(streamKey, "test-group") .StartFromNewMessages() // Explicit, but this is the default .BlockTimeout(TimeSpan.FromMilliseconds(100)) @@ -144,7 +144,7 @@ public async Task StartFromBeginning_should_process_existing_messages() using var publisherHost = await Host.CreateDefaultBuilder() .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishMessage().To(new Uri($"redis://stream/0/{streamKey}")) .SendInline(); @@ -172,7 +172,7 @@ public async Task StartFromBeginning_should_process_existing_messages() }) .UseWolverine(opts => { - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.ListenToRedisStream(streamKey, "test-group-beginning") .StartFromBeginning() // Should process existing messages .BlockTimeout(TimeSpan.FromMilliseconds(100)) diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/Wolverine.Redis.Tests.csproj b/src/Transports/Redis/Wolverine.Redis.Tests/Wolverine.Redis.Tests.csproj index bd16991a5..ea70b56de 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/Wolverine.Redis.Tests.csproj +++ b/src/Transports/Redis/Wolverine.Redis.Tests/Wolverine.Redis.Tests.csproj @@ -19,6 +19,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + diff --git a/src/Transports/Redis/Wolverine.Redis.Tests/rate_limiting_end_to_end.cs b/src/Transports/Redis/Wolverine.Redis.Tests/rate_limiting_end_to_end.cs index 8de253a27..69e73bfdf 100644 --- a/src/Transports/Redis/Wolverine.Redis.Tests/rate_limiting_end_to_end.cs +++ b/src/Transports/Redis/Wolverine.Redis.Tests/rate_limiting_end_to_end.cs @@ -30,7 +30,7 @@ public async Task InitializeAsync() opts.ApplicationAssembly = typeof(rate_limiting_end_to_end).Assembly; opts.Services.AddSingleton(_tracker); - opts.UseRedisTransport("localhost:6379").AutoProvision(); + opts.UseRedisTransport(RedisContainerFixture.ConnectionString).AutoProvision(); opts.PublishAllMessages().ToRedisStream(streamKey); opts.ListenToRedisStream(streamKey, groupName) .UseDurableInbox() diff --git a/src/Transports/Redis/Wolverine.Redis/Internal/RedisStreamListener.cs b/src/Transports/Redis/Wolverine.Redis/Internal/RedisStreamListener.cs index fd4dafdb9..6c8b1a101 100644 --- a/src/Transports/Redis/Wolverine.Redis/Internal/RedisStreamListener.cs +++ b/src/Transports/Redis/Wolverine.Redis/Internal/RedisStreamListener.cs @@ -526,7 +526,7 @@ public async Task MoveScheduledToReadyStreamAsync(CancellationToken cancel if (!removed) continue; // Deserialize the envelope - var envelope = EnvelopeSerializer.Deserialize(serializedEnvelope); + var envelope = EnvelopeSerializer.Deserialize(serializedEnvelope!); // Add it to the stream _endpoint.EnvelopeMapper ??= _endpoint.BuildMapper(_runtime); @@ -589,8 +589,8 @@ public async Task DeleteExpiredAsync(CancellationToken cancellationToken) { try { - var envelope = EnvelopeSerializer.Deserialize(serializedEnvelope); - + var envelope = EnvelopeSerializer.Deserialize(serializedEnvelope!); + // Check if the message has expired if (envelope.DeliverBy.HasValue && envelope.DeliverBy.Value <= now) { diff --git a/src/Transports/Redis/Wolverine.Redis/Internal/RedisTransportExpression.cs b/src/Transports/Redis/Wolverine.Redis/Internal/RedisTransportExpression.cs index c468e1918..77512cdf4 100644 --- a/src/Transports/Redis/Wolverine.Redis/Internal/RedisTransportExpression.cs +++ b/src/Transports/Redis/Wolverine.Redis/Internal/RedisTransportExpression.cs @@ -78,48 +78,48 @@ internal RedisListenerConfiguration(Func source) : base(sou /// public RedisListenerConfiguration BatchSize(int batchSize) { - _endpoint.BatchSize = batchSize; + _endpoint!.BatchSize = batchSize; return this; } - + /// /// Configure the consumer name for this endpoint /// public RedisListenerConfiguration ConsumerName(string consumerName) { - _endpoint.ConsumerName = consumerName; + _endpoint!.ConsumerName = consumerName; return this; } - + /// /// Configure the block timeout when reading from Redis streams /// public RedisListenerConfiguration BlockTimeout(TimeSpan timeout) { - _endpoint.BlockTimeoutMilliseconds = (int)timeout.TotalMilliseconds; + _endpoint!.BlockTimeoutMilliseconds = (int)timeout.TotalMilliseconds; return this; } - + /// /// Configure the consumer group to start consuming from the beginning of the stream, /// including any existing messages (equivalent to Redis "0-0" position) /// public RedisListenerConfiguration StartFromBeginning() { - _endpoint.StartFrom = StartFrom.Beginning; + _endpoint!.StartFrom = StartFrom.Beginning; return this; } - + /// /// Configure the consumer group to start consuming only new messages added after /// group creation (equivalent to Redis "$" position). This is the default behavior. /// public RedisListenerConfiguration StartFromNewMessages() { - _endpoint.StartFrom = StartFrom.NewMessages; + _endpoint!.StartFrom = StartFrom.NewMessages; return this; } - + /// /// Enable auto-claiming of pending entries within the consumer loop every specified period /// @@ -129,7 +129,7 @@ public RedisListenerConfiguration StartFromNewMessages() /// This endpoint for method chaining public RedisListenerConfiguration EnableAutoClaim(TimeSpan? period = null, TimeSpan? minIdle = null) { - _endpoint.AutoClaimEnabled = true; + _endpoint!.AutoClaimEnabled = true; if (period.HasValue) _endpoint.AutoClaimPeriod = period.Value; if (minIdle.HasValue) _endpoint.AutoClaimMinIdle = minIdle.Value; return this; @@ -141,10 +141,10 @@ public RedisListenerConfiguration EnableAutoClaim(TimeSpan? period = null, TimeS /// This endpoint for method chaining public RedisListenerConfiguration DisableAutoClaim() { - _endpoint.AutoClaimEnabled = false; + _endpoint!.AutoClaimEnabled = false; return this; } - + /// /// Enable native dead letter queue support for this endpoint. /// Failed messages will be moved to a dead letter stream: {StreamKey}:dead-letter @@ -152,10 +152,10 @@ public RedisListenerConfiguration DisableAutoClaim() /// This endpoint for method chaining public RedisListenerConfiguration EnableNativeDeadLetterQueue() { - _endpoint.NativeDeadLetterQueueEnabled = true; + _endpoint!.NativeDeadLetterQueueEnabled = true; return this; } - + /// /// Disable native dead letter queue support for this endpoint. /// Failed messages will use Wolverine's default dead letter handling (database persistence). @@ -163,7 +163,7 @@ public RedisListenerConfiguration EnableNativeDeadLetterQueue() /// This endpoint for method chaining public RedisListenerConfiguration DisableNativeDeadLetterQueue() { - _endpoint.NativeDeadLetterQueueEnabled = false; + _endpoint!.NativeDeadLetterQueueEnabled = false; return this; } } @@ -173,31 +173,31 @@ public class RedisSubscriberConfiguration : SubscriberConfiguration /// Configure the batch size for reading messages from Redis streams /// public RedisSubscriberConfiguration BatchSize(int batchSize) { - _endpoint.BatchSize = batchSize; + _endpoint!.BatchSize = batchSize; return this; } - + /// /// Configure the consumer name for this endpoint /// public RedisSubscriberConfiguration ConsumerName(string consumerName) { - _endpoint.ConsumerName = consumerName; + _endpoint!.ConsumerName = consumerName; return this; } - + /// /// Configure the block timeout when reading from Redis streams /// public RedisSubscriberConfiguration BlockTimeout(TimeSpan timeout) { - _endpoint.BlockTimeoutMilliseconds = (int)timeout.TotalMilliseconds; + _endpoint!.BlockTimeoutMilliseconds = (int)timeout.TotalMilliseconds; return this; } } \ No newline at end of file diff --git a/src/Transports/SignalR/Wolverine.SignalR.Tests/SampleCode.cs b/src/Transports/SignalR/Wolverine.SignalR.Tests/SampleCode.cs index 29db46a50..066187cff 100644 --- a/src/Transports/SignalR/Wolverine.SignalR.Tests/SampleCode.cs +++ b/src/Transports/SignalR/Wolverine.SignalR.Tests/SampleCode.cs @@ -37,7 +37,7 @@ public static async Task configure_signalr_client() // hosted on your application and include the exact route where // the WolverineHub is listening var url = builder.Configuration.GetValue("signalr.url"); - opts.UseClientToSignalR(url); + opts.UseClientToSignalR(url!); // Setting this up to publish any messages implementing // the WebSocketMessage marker interface with the SignalR @@ -45,7 +45,7 @@ public static async Task configure_signalr_client() opts.Publish(x => { x.MessagesImplementing(); - x.ToSignalRWithClient(url); + x.ToSignalRWithClient(url!); }); }); diff --git a/src/Transports/SignalR/Wolverine.SignalR.Tests/WebSocketTestContext.cs b/src/Transports/SignalR/Wolverine.SignalR.Tests/WebSocketTestContext.cs index 6454a67d5..84f0c4c7d 100644 --- a/src/Transports/SignalR/Wolverine.SignalR.Tests/WebSocketTestContext.cs +++ b/src/Transports/SignalR/Wolverine.SignalR.Tests/WebSocketTestContext.cs @@ -17,7 +17,7 @@ namespace Wolverine.SignalR.Tests; public abstract class WebSocketTestContext : IAsyncLifetime { - protected WebApplication theWebApp; + protected WebApplication theWebApp = null!; protected readonly int Port = PortFinder.GetAvailablePort(); protected readonly Uri clientUri; @@ -117,7 +117,7 @@ public async Task DisposeAsync() public abstract class WebSocketTestContextWithCustomHub : IAsyncLifetime where THub : WolverineHub { - protected WebApplication theWebApp; + protected WebApplication theWebApp = null!; protected readonly int Port = PortFinder.GetAvailablePort(); protected readonly Uri clientUri; diff --git a/src/Transports/SignalR/Wolverine.SignalR.Tests/group_mechanics.cs b/src/Transports/SignalR/Wolverine.SignalR.Tests/group_mechanics.cs index 29a29e1a4..43eee83b4 100644 --- a/src/Transports/SignalR/Wolverine.SignalR.Tests/group_mechanics.cs +++ b/src/Transports/SignalR/Wolverine.SignalR.Tests/group_mechanics.cs @@ -48,7 +48,7 @@ public async Task take_advantage_of_the_enlist_in_current_connection_saga() var record = tracked.Executed.SingleRecord(); record.ServiceName.ShouldBe("green"); - record.Envelope.Message.ShouldBeOfType().Sum.ShouldBe(11); + record.Envelope!.Message.ShouldBeOfType().Sum.ShouldBe(11); } } diff --git a/src/Transports/SignalR/Wolverine.SignalR.Tests/simple_end_to_end.cs b/src/Transports/SignalR/Wolverine.SignalR.Tests/simple_end_to_end.cs index f35d1ff4e..24092fb3b 100644 --- a/src/Transports/SignalR/Wolverine.SignalR.Tests/simple_end_to_end.cs +++ b/src/Transports/SignalR/Wolverine.SignalR.Tests/simple_end_to_end.cs @@ -20,7 +20,7 @@ public async Task send_message_from_hub_to_client() var record = tracked.Received.SingleRecord(); record.ServiceName.ShouldBe("Client"); - record.Envelope.Message.ShouldBeOfType() + record.Envelope!.Message.ShouldBeOfType() .Name.ShouldBe("Xavier Worthy"); } @@ -43,7 +43,7 @@ public async Task receive_message_from_a_client() var record = tracked.Received.SingleRecord(); record.ServiceName.ShouldBe("Server"); - record.Envelope.Destination.ShouldBe(new Uri("signalr://wolverine")); + record.Envelope!.Destination.ShouldBe(new Uri("signalr://wolverine")); record.Message.ShouldBeOfType() .Name.ShouldBe("Hollywood Brown"); diff --git a/src/Transports/SignalR/Wolverine.SignalR/Client/SignalRClientEndpoint.cs b/src/Transports/SignalR/Wolverine.SignalR/Client/SignalRClientEndpoint.cs index 902ee4bf7..5df9b9d7e 100644 --- a/src/Transports/SignalR/Wolverine.SignalR/Client/SignalRClientEndpoint.cs +++ b/src/Transports/SignalR/Wolverine.SignalR/Client/SignalRClientEndpoint.cs @@ -39,7 +39,7 @@ public SignalRClientEndpoint(Uri uri, SignalRClientTransport parent) : base(Tran public JsonSerializerOptions JsonOptions { get; set; } - public Func>> AccessTokenProvider { get; set; } + public Func>> AccessTokenProvider { get; set; } = null!; public Uri SignalRUri { get; } diff --git a/src/Transports/SignalR/Wolverine.SignalR/Client/SignalRClientTransport.cs b/src/Transports/SignalR/Wolverine.SignalR/Client/SignalRClientTransport.cs index da4173a60..c6148a3ae 100644 --- a/src/Transports/SignalR/Wolverine.SignalR/Client/SignalRClientTransport.cs +++ b/src/Transports/SignalR/Wolverine.SignalR/Client/SignalRClientTransport.cs @@ -21,7 +21,7 @@ protected override IEnumerable endpoints() protected override SignalRClientEndpoint findEndpointByUri(Uri uri) { - return Clients.FirstOrDefault(x => x.Uri == uri); + return Clients.FirstOrDefault(x => x.Uri == uri)!; } public SignalRClientEndpoint ForClientUrl(string clientUrl) diff --git a/src/Transports/SignalR/Wolverine.SignalR/Internals/SignalREnvelope.cs b/src/Transports/SignalR/Wolverine.SignalR/Internals/SignalREnvelope.cs index be4b7566a..e63a13751 100644 --- a/src/Transports/SignalR/Wolverine.SignalR/Internals/SignalREnvelope.cs +++ b/src/Transports/SignalR/Wolverine.SignalR/Internals/SignalREnvelope.cs @@ -13,7 +13,7 @@ public SignalREnvelope(HubCallerContext context, IHubContext hubContext) UserName = context.UserIdentifier; } - public string? UserName { get; set; } + public new string? UserName { get; set; } public string ConnectionId { get; set; } } \ No newline at end of file diff --git a/src/Transports/SignalR/Wolverine.SignalR/ResponseToCallingWebSocket.cs b/src/Transports/SignalR/Wolverine.SignalR/ResponseToCallingWebSocket.cs index dd669291f..59491ce74 100644 --- a/src/Transports/SignalR/Wolverine.SignalR/ResponseToCallingWebSocket.cs +++ b/src/Transports/SignalR/Wolverine.SignalR/ResponseToCallingWebSocket.cs @@ -16,7 +16,7 @@ ValueTask ISendMyself.ApplyAsync(IMessageContext context) { // This gets us back to the same SignalR Hub return context - .EndpointFor(se.Destination) + .EndpointFor(se.Destination!) .SendAsync(Message, new DeliveryOptions { RoutingInformation = new WebSocketRouting.Connection(se.ConnectionId) }); } diff --git a/src/Wolverine/Attributes/AlwaysPublishResponseAttribute.cs b/src/Wolverine/Attributes/AlwaysPublishResponseAttribute.cs index edd13ddc3..1ea3ab785 100644 --- a/src/Wolverine/Attributes/AlwaysPublishResponseAttribute.cs +++ b/src/Wolverine/Attributes/AlwaysPublishResponseAttribute.cs @@ -20,7 +20,7 @@ public override void Modify(HandlerChain chain, GenerationRules rules) internal class AlwaysPublishResponseFrame : SyncFrame { - private Variable _envelope; + private Variable _envelope = null!; public override void GenerateCode(GeneratedMethod method, ISourceWriter writer) { diff --git a/src/Wolverine/Attributes/WolverineParameterAttribute.cs b/src/Wolverine/Attributes/WolverineParameterAttribute.cs index 1154b17f0..dabdb24e0 100644 --- a/src/Wolverine/Attributes/WolverineParameterAttribute.cs +++ b/src/Wolverine/Attributes/WolverineParameterAttribute.cs @@ -27,7 +27,7 @@ protected WolverineParameterAttribute(string argumentName) ArgumentName = argumentName; } - public string ArgumentName { get; set; } + public string ArgumentName { get; set; } = null!; /// /// Where should the identity value for resolving this parameter come from? @@ -79,7 +79,7 @@ protected bool tryFindIdentityVariable(IChain chain, ParameterInfo parameter, Ty return true; } - variable = default; + variable = default!; return false; } } \ No newline at end of file diff --git a/src/Wolverine/Configuration/Capabilities/BrokerDescription.cs b/src/Wolverine/Configuration/Capabilities/BrokerDescription.cs index e25f89a8d..d029d932f 100644 --- a/src/Wolverine/Configuration/Capabilities/BrokerDescription.cs +++ b/src/Wolverine/Configuration/Capabilities/BrokerDescription.cs @@ -17,7 +17,7 @@ public BrokerDescription(ITransport subject) : base(subject) ReplyUri = subject.ReplyEndpoint()?.Uri; } - public string ProtocolName { get; set; } - public string Name { get; set; } + public string ProtocolName { get; set; } = null!; + public string Name { get; set; } = null!; public Uri? ReplyUri { get; set; } } \ No newline at end of file diff --git a/src/Wolverine/Configuration/Capabilities/EndpointDescriptor.cs b/src/Wolverine/Configuration/Capabilities/EndpointDescriptor.cs index 3752a06f5..b380f1051 100644 --- a/src/Wolverine/Configuration/Capabilities/EndpointDescriptor.cs +++ b/src/Wolverine/Configuration/Capabilities/EndpointDescriptor.cs @@ -13,7 +13,7 @@ public EndpointDescriptor(Endpoint endpoint) : base(endpoint) Uri = endpoint.Uri; } - public Uri Uri { get; set; } + public Uri Uri { get; set; } = null!; protected bool Equals(EndpointDescriptor other) { diff --git a/src/Wolverine/Configuration/Capabilities/MessageHandlerDescriptor.cs b/src/Wolverine/Configuration/Capabilities/MessageHandlerDescriptor.cs index 07b857dc3..083c47788 100644 --- a/src/Wolverine/Configuration/Capabilities/MessageHandlerDescriptor.cs +++ b/src/Wolverine/Configuration/Capabilities/MessageHandlerDescriptor.cs @@ -23,7 +23,7 @@ public MessageHandlerDescriptor(HandlerChain chain, HandlerGraph handlers) : bas } // TODO -- use this later to retrieve a preview of the source code - public string CodeFileName { get; set; } + public string CodeFileName { get; set; } = null!; public Uri[] StickyEndpoints { get; set; } = []; public List Handlers { get; set; } = new(); diff --git a/src/Wolverine/Configuration/Capabilities/MessageStore.cs b/src/Wolverine/Configuration/Capabilities/MessageStore.cs index d478713b5..c17b24a3b 100644 --- a/src/Wolverine/Configuration/Capabilities/MessageStore.cs +++ b/src/Wolverine/Configuration/Capabilities/MessageStore.cs @@ -11,7 +11,7 @@ public record MessageStore( /// /// The agent URI that the DurabilityAgent would use for this message store /// - public string AgentUri { get; init; } = Uri?.ToString(); + public string AgentUri { get; init; } = Uri?.ToString()!; public static MessageStore For(IMessageStore store) { diff --git a/src/Wolverine/Configuration/Capabilities/ServiceCapabilities.cs b/src/Wolverine/Configuration/Capabilities/ServiceCapabilities.cs index 4152b8364..f99f3da51 100644 --- a/src/Wolverine/Configuration/Capabilities/ServiceCapabilities.cs +++ b/src/Wolverine/Configuration/Capabilities/ServiceCapabilities.cs @@ -19,14 +19,14 @@ public ServiceCapabilities() public ServiceCapabilities(WolverineOptions options) : base(options) { - Version = (options.ApplicationAssembly ?? Assembly.GetEntryAssembly()).GetName().Version?.ToString(); + Version = (options.ApplicationAssembly ?? Assembly.GetEntryAssembly())!.GetName().Version?.ToString()!; WolverineVersion = options.GetType().Assembly.GetName().Version?.ToString(); DurabilitySettings = new DurabilitySettingsDescription(options.Durability); } public DateTimeOffset Evaluated { get; set; } = DateTimeOffset.UtcNow; - public string Version { get; set; } + public string Version { get; set; } = null!; public string? WolverineVersion { get; set; } diff --git a/src/Wolverine/Configuration/Capabilities/ServiceRegistration.cs b/src/Wolverine/Configuration/Capabilities/ServiceRegistration.cs index 661ae431a..85649333a 100644 --- a/src/Wolverine/Configuration/Capabilities/ServiceRegistration.cs +++ b/src/Wolverine/Configuration/Capabilities/ServiceRegistration.cs @@ -7,7 +7,7 @@ public class ServiceRegistration public Guid Id { get; set; } public string Name { get; set; } = "Critter Service"; - public string Description { get; set; } + public string Description { get; set; } = null!; // This could be local? public Uri CritterWatchUri { get; set; } = new Uri("local://"); diff --git a/src/Wolverine/Configuration/Chain.cs b/src/Wolverine/Configuration/Chain.cs index 6a0c45530..6cab70e4f 100644 --- a/src/Wolverine/Configuration/Chain.cs +++ b/src/Wolverine/Configuration/Chain.cs @@ -224,7 +224,7 @@ private static bool isMaybeServiceDependency(Type type) if (type.IsArray) { - return isMaybeServiceDependency(type.GetElementType()); + return isMaybeServiceDependency(type.GetElementType()!); } if (ServiceContainer.IsEnumerable(type)) @@ -384,7 +384,7 @@ public void AssertServiceLocationsAreAllowed(ServiceLocationReport[] reports, IS if (!reports.Any()) return; var logger = services.GetLoggerOrDefault(); - var options = services.GetService() ?? new WolverineOptions(); + var options = services!.GetService() ?? new WolverineOptions(); switch (options.ServiceLocationPolicy) { diff --git a/src/Wolverine/Configuration/IDelayedEndpointConfiguration.cs b/src/Wolverine/Configuration/IDelayedEndpointConfiguration.cs index 17769ffc4..a87a258ba 100644 --- a/src/Wolverine/Configuration/IDelayedEndpointConfiguration.cs +++ b/src/Wolverine/Configuration/IDelayedEndpointConfiguration.cs @@ -32,7 +32,7 @@ protected DelayedEndpointConfiguration(Func source) _source = source; } - public Endpoint Endpoint => _endpoint; + public Endpoint Endpoint => _endpoint!; void IDelayedEndpointConfiguration.Apply() { diff --git a/src/Wolverine/Configuration/ListenerConfiguration.cs b/src/Wolverine/Configuration/ListenerConfiguration.cs index fe251608b..5620f7d5c 100644 --- a/src/Wolverine/Configuration/ListenerConfiguration.cs +++ b/src/Wolverine/Configuration/ListenerConfiguration.cs @@ -294,7 +294,7 @@ public TSelf Sequential() public TSelf AddStickyHandler(Type handlerType) { // This needs to be done eagerly - _endpoint.StickyHandlers.Add(handlerType); + _endpoint!.StickyHandlers.Add(handlerType); return this.As(); } diff --git a/src/Wolverine/Envelope.cs b/src/Wolverine/Envelope.cs index 3e8c0cea5..05bd56d4d 100644 --- a/src/Wolverine/Envelope.cs +++ b/src/Wolverine/Envelope.cs @@ -147,7 +147,7 @@ public TimeSpan? ScheduleDelay catch (Exception e) { throw new WolverineSerializationException( - $"Error trying to serialize message of type {Message.GetType().FullNameInCode()} with serializer {Serializer}", e); + $"Error trying to serialize message of type {Message!.GetType().FullNameInCode()} with serializer {Serializer}", e); } } @@ -176,7 +176,7 @@ public byte[]? Data return _data; } - throw new WolverineSerializationException($"No data or writer is known for this envelope of message type {_message.GetType().FullNameInCode()}"); + throw new WolverineSerializationException($"No data or writer is known for this envelope of message type {_message!.GetType().FullNameInCode()}"); } try @@ -186,7 +186,7 @@ public byte[]? Data catch (Exception e) { throw new WolverineSerializationException( - $"Error trying to serialize message of type {Message.GetType().FullNameInCode()} with serializer {Serializer}", e); + $"Error trying to serialize message of type {Message!.GetType().FullNameInCode()} with serializer {Serializer}", e); } return _data; diff --git a/src/Wolverine/ErrorHandling/MoveToErrorQueue.cs b/src/Wolverine/ErrorHandling/MoveToErrorQueue.cs index c41aed4e1..d46b9048d 100644 --- a/src/Wolverine/ErrorHandling/MoveToErrorQueue.cs +++ b/src/Wolverine/ErrorHandling/MoveToErrorQueue.cs @@ -30,7 +30,7 @@ public async ValueTask ExecuteAsync(IEnvelopeLifecycle lifecycle, DateTimeOffset now, Activity? activity) { // TODO -- at some point, we need a more systematic way of doing this - var scheme = lifecycle.Envelope.Destination.Scheme; + var scheme = lifecycle.Envelope!.Destination!.Scheme; if (runtime.Options.EnableAutomaticFailureAcks && scheme != TransportConstants.Local && scheme != "external-table") { await lifecycle.SendFailureAcknowledgementAsync( diff --git a/src/Wolverine/IResponse.cs b/src/Wolverine/IResponse.cs index 0017c450d..30f17a2a6 100644 --- a/src/Wolverine/IResponse.cs +++ b/src/Wolverine/IResponse.cs @@ -47,7 +47,7 @@ public void Apply(IReadOnlyList chains, GenerationRules rules, ISe CommentText = $"Placed by Wolverine's {nameof(IResponse)} policy" }; - buildResponse.ReturnVariable.OverrideName("response_of_" + buildResponse.ReturnVariable.Usage); + buildResponse.ReturnVariable!.OverrideName("response_of_" + buildResponse.ReturnVariable.Usage); var captureAsCascading = new CaptureCascadingMessages(buildResponse.ReturnVariable); @@ -66,7 +66,7 @@ private MethodInfo findMethod(Type responseType) BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.Instance) ?? responseType.GetMethod(AsyncMethod, BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.Instance) - ?? responseType.GetInterfaces().FirstValue(findMethod); + ?? responseType.GetInterfaces().FirstValue(findMethod)!; } } diff --git a/src/Wolverine/ISendMyself.cs b/src/Wolverine/ISendMyself.cs index 4ac13ec32..39c593375 100644 --- a/src/Wolverine/ISendMyself.cs +++ b/src/Wolverine/ISendMyself.cs @@ -300,6 +300,6 @@ ValueTask ISendMyself.ApplyAsync(IMessageContext context) { return EndpointName.IsNotEmpty() ? context.EndpointFor(EndpointName).SendAsync(Message, DeliveryOptions) - : context.EndpointFor(Destination).SendAsync(Message, DeliveryOptions); + : context.EndpointFor(Destination!).SendAsync(Message, DeliveryOptions); } } \ No newline at end of file diff --git a/src/Wolverine/Persistence/Durability/DeadLetterEnvelope.cs b/src/Wolverine/Persistence/Durability/DeadLetterEnvelope.cs index cd819eb24..d0d0d6ff0 100644 --- a/src/Wolverine/Persistence/Durability/DeadLetterEnvelope.cs +++ b/src/Wolverine/Persistence/Durability/DeadLetterEnvelope.cs @@ -54,9 +54,9 @@ internal void TryReadData(IWolverineRuntime runtime) { if (runtime.Options.HandlerGraph.TryFindMessageType(MessageType, out var messageType)) { - var endpoint = runtime.Endpoints.EndpointFor(Envelope.Destination); + var endpoint = runtime.Endpoints.EndpointFor(Envelope.Destination!); var serializer = endpoint?.TryFindSerializer(Envelope.ContentType) ?? - runtime.Options.TryFindSerializer(Envelope.ContentType); + runtime.Options.TryFindSerializer(Envelope.ContentType!); if (serializer != null) { diff --git a/src/Wolverine/Persistence/Durability/IMessageStore.cs b/src/Wolverine/Persistence/Durability/IMessageStore.cs index 38187375d..403b5c803 100644 --- a/src/Wolverine/Persistence/Durability/IMessageStore.cs +++ b/src/Wolverine/Persistence/Durability/IMessageStore.cs @@ -142,7 +142,7 @@ public AncillaryMessageStoreApplication(IWolverineRuntime runtime) public void Apply(MessageContext context) { - context.Storage = _store; + context.Storage = _store!; } } diff --git a/src/Wolverine/Persistence/Durability/MultiTenantedMessageStore.cs b/src/Wolverine/Persistence/Durability/MultiTenantedMessageStore.cs index cfaaaebfd..1937fea94 100644 --- a/src/Wolverine/Persistence/Durability/MultiTenantedMessageStore.cs +++ b/src/Wolverine/Persistence/Durability/MultiTenantedMessageStore.cs @@ -294,12 +294,12 @@ async Task IMessageOutbox.DiscardAndReassignOutgoingAsync(Envelope[] discards, E public async Task ReassignIncomingAsync(int ownerId, IReadOnlyList incoming) { - string tenantId = null; + string tenantId = null!; try { - tenantId = incoming.Select(x => x.TenantId).Distinct().Single(); + tenantId = incoming.Select(x => x.TenantId).Distinct().Single()!; } - catch (Exception e) + catch (Exception) { throw new ArgumentOutOfRangeException(nameof(incoming), "Invalid in this case to use a mixed bag of tenanted envelopes"); @@ -309,7 +309,7 @@ public async Task ReassignIncomingAsync(int ownerId, IReadOnlyList inc await database.ReassignIncomingAsync(ownerId, incoming); } - public string Name { get; } + public string Name { get; } = null!; public void PromoteToMain(IWolverineRuntime runtime) { // Nothing here. @@ -590,7 +590,7 @@ public async ValueTask> EnrollAndFetchSagaStorage(context); @@ -626,30 +626,30 @@ public async ValueTask GetDatabaseAsync(string? tenantId) return Main; } - if (tenantId.EqualsIgnoreCase(TransportConstants.Default)) + if (tenantId!.EqualsIgnoreCase(TransportConstants.Default)) { return Main; } - if (tenantId.EqualsIgnoreCase(StorageConstants.Main)) + if (tenantId!.EqualsIgnoreCase(StorageConstants.Main)) { return Main; } - if (_byTenant.TryFind(tenantId, out var store)) + if (_byTenant.TryFind(tenantId!, out var store)) { return store; } - store = await Source.FindAsync(tenantId); + store = await Source.FindAsync(tenantId!); if (store != null && _runtime.Options.AutoBuildMessageStorageOnStartup != AutoCreate.None) { await store.Admin.MigrateAsync(); } - _byTenant = _byTenant.AddOrUpdate(tenantId, store); + _byTenant = _byTenant.AddOrUpdate(tenantId!, store!); - return store; + return store!; } private IEnumerable databases() diff --git a/src/Wolverine/Persistence/EntityAttribute.cs b/src/Wolverine/Persistence/EntityAttribute.cs index c9f07ccdb..cf5670786 100644 --- a/src/Wolverine/Persistence/EntityAttribute.cs +++ b/src/Wolverine/Persistence/EntityAttribute.cs @@ -20,7 +20,7 @@ public class LoadEntityFrameBlock : Frame { private readonly Frame[] _guardFrames; - public LoadEntityFrameBlock(Variable entity, params Frame[] guardFrames) : base(entity.Creator.IsAsync || guardFrames.Any(x => x.IsAsync)) + public LoadEntityFrameBlock(Variable entity, params Frame[] guardFrames) : base(entity.Creator!.IsAsync || guardFrames.Any(x => x.IsAsync)) { _guardFrames = guardFrames; Mirror = new Variable(entity.VariableType, entity.Usage, this); @@ -106,7 +106,7 @@ public EntityAttribute(string argumentName) : base(argumentName) /// public bool Required { get; set; } = true; - public string MissingMessage { get; set; } + public string MissingMessage { get; set; } = null!; public OnMissing OnMissing { @@ -161,7 +161,7 @@ public override Variable Modify(IChain chain, ParameterInfo parameter, IServiceC var frame = provider.DetermineLoadFrame(container, parameter.ParameterType, identity); var entity = frame.Creates.First(x => x.VariableType == parameter.ParameterType); - entity.OverrideName(parameter.Name); + entity.OverrideName(parameter.Name!); if (MaybeSoftDeleted is false) { @@ -186,7 +186,7 @@ public override Variable Modify(IChain chain, ParameterInfo parameter, IServiceC } // Store deferred assignment for middleware methods added later (Before/After) - StoreDeferredMiddlewareVariable(chain, parameter.Name, returnVariable); + StoreDeferredMiddlewareVariable(chain, parameter.Name!, returnVariable); return returnVariable; } diff --git a/src/Wolverine/Persistence/EnvelopeGenerator.cs b/src/Wolverine/Persistence/EnvelopeGenerator.cs index 86dc46391..dc31d5cf2 100644 --- a/src/Wolverine/Persistence/EnvelopeGenerator.cs +++ b/src/Wolverine/Persistence/EnvelopeGenerator.cs @@ -44,7 +44,7 @@ public Envelope BuildEnvelope() Source = SourceServiceName }; - envelope.Data = envelope.Serializer.WriteMessage(envelope.Message); + envelope.Data = envelope.Serializer.WriteMessage(envelope.Message!); if (Random.Shared.Next(0, 10) < 2) { diff --git a/src/Wolverine/Persistence/MessageStoreCollection.cs b/src/Wolverine/Persistence/MessageStoreCollection.cs index 88b404465..9a2ae0877 100644 --- a/src/Wolverine/Persistence/MessageStoreCollection.cs +++ b/src/Wolverine/Persistence/MessageStoreCollection.cs @@ -313,7 +313,7 @@ internal async Task StartScheduledJobProcessing(IWolverineRuntime runtim public bool TryFindMultiTenantedForMainStore(IMessageStore store, out MultiTenantedMessageStore multiTenanted) { - multiTenanted = _multiTenanted.FirstOrDefault(x => x.Main.Uri == store.Uri); + multiTenanted = _multiTenanted.FirstOrDefault(x => x.Main.Uri == store.Uri)!; return multiTenanted != null; } diff --git a/src/Wolverine/Persistence/MultiTenancy/CodeGeneration.cs b/src/Wolverine/Persistence/MultiTenancy/CodeGeneration.cs index db3966151..8b63ebb32 100644 --- a/src/Wolverine/Persistence/MultiTenancy/CodeGeneration.cs +++ b/src/Wolverine/Persistence/MultiTenancy/CodeGeneration.cs @@ -22,7 +22,7 @@ public Variable Create(Type type) internal class TenantIdResolutionFrame : SyncFrame { private bool _useRawTenantId = false; - private Variable _context; + private Variable _context = null!; public TenantIdResolutionFrame() { diff --git a/src/Wolverine/Persistence/PersistenceMetrics.cs b/src/Wolverine/Persistence/PersistenceMetrics.cs index f6b793f13..93f36ca63 100644 --- a/src/Wolverine/Persistence/PersistenceMetrics.cs +++ b/src/Wolverine/Persistence/PersistenceMetrics.cs @@ -15,7 +15,7 @@ public class PersistenceMetrics : IDisposable private readonly ObservableGauge _outgoing; private readonly ObservableGauge _scheduled; private CancellationTokenSource _cancellation; - private Task _task; + private Task _task = null!; private readonly IWolverineObserver _observer; public PersistenceMetrics(IWolverineRuntime runtime, DurabilitySettings settings, string? databaseName) diff --git a/src/Wolverine/Persistence/Sagas/EnrollAndFetchSagaStorageFrame.cs b/src/Wolverine/Persistence/Sagas/EnrollAndFetchSagaStorageFrame.cs index d0349dc66..b5a4eeb13 100644 --- a/src/Wolverine/Persistence/Sagas/EnrollAndFetchSagaStorageFrame.cs +++ b/src/Wolverine/Persistence/Sagas/EnrollAndFetchSagaStorageFrame.cs @@ -8,8 +8,8 @@ namespace Wolverine.Persistence.Sagas; public class EnrollAndFetchSagaStorageFrame : AsyncFrame, ISagaStorageFrame where TSaga : Saga { - private Variable _context; - private Variable _cancellation; + private Variable _context = null!; + private Variable _cancellation = null!; public EnrollAndFetchSagaStorageFrame() { diff --git a/src/Wolverine/Persistence/Sagas/GenerationRulesExtensions.cs b/src/Wolverine/Persistence/Sagas/GenerationRulesExtensions.cs index ee3539154..991d88f56 100644 --- a/src/Wolverine/Persistence/Sagas/GenerationRulesExtensions.cs +++ b/src/Wolverine/Persistence/Sagas/GenerationRulesExtensions.cs @@ -61,7 +61,7 @@ public static class GenerationRulesExtensions public static bool TryFindPersistenceFrameProvider(this GenerationRules rules, IServiceContainer container, Type entityType, out IPersistenceFrameProvider provider) { - provider = default; + provider = default!; var providers = rules.PersistenceProviders(); if (providers.Any()) { diff --git a/src/Wolverine/Persistence/Sagas/InMemoryPersistenceFrameProvider.cs b/src/Wolverine/Persistence/Sagas/InMemoryPersistenceFrameProvider.cs index 9879f0ff9..fcd74af0c 100644 --- a/src/Wolverine/Persistence/Sagas/InMemoryPersistenceFrameProvider.cs +++ b/src/Wolverine/Persistence/Sagas/InMemoryPersistenceFrameProvider.cs @@ -103,7 +103,7 @@ public Frame DetermineStoreFrame(Variable saga, IServiceContainer container) public Frame DetermineDeleteFrame(Variable variable, IServiceContainer container) { - return DetermineDeleteFrame(null, variable, container); + return DetermineDeleteFrame(null!, variable, container); } public Frame DetermineStorageActionFrame(Type entityType, Variable action, IServiceContainer container) @@ -118,7 +118,7 @@ public Frame DetermineStorageActionFrame(Type entityType, Variable action, IServ internal class InMemorySagaPersistorStore : MethodCall { - public InMemorySagaPersistorStore() : base(typeof(InMemorySagaPersistor), ReflectionHelper.GetMethod(x => x.StoreAction(Storage.Nothing()))) + public InMemorySagaPersistorStore() : base(typeof(InMemorySagaPersistor), ReflectionHelper.GetMethod(x => x.StoreAction(Storage.Nothing()))!) { } } \ No newline at end of file diff --git a/src/Wolverine/Persistence/Sagas/InMemorySagaPersistor.cs b/src/Wolverine/Persistence/Sagas/InMemorySagaPersistor.cs index f775672cf..e3e66626e 100644 --- a/src/Wolverine/Persistence/Sagas/InMemorySagaPersistor.cs +++ b/src/Wolverine/Persistence/Sagas/InMemorySagaPersistor.cs @@ -54,8 +54,8 @@ public void StoreAction(IStorageAction action) { case StorageAction.Delete: var idProp = typeof(T).GetProperty("Id"); - var id = idProp.GetValue(action.Entity); - Delete(id); + var id = idProp!.GetValue(action.Entity); + Delete(id!); break; case StorageAction.Insert: diff --git a/src/Wolverine/Persistence/Sagas/LightweightSagaPersistenceFrameProvider.cs b/src/Wolverine/Persistence/Sagas/LightweightSagaPersistenceFrameProvider.cs index cc679874f..995ea93bf 100644 --- a/src/Wolverine/Persistence/Sagas/LightweightSagaPersistenceFrameProvider.cs +++ b/src/Wolverine/Persistence/Sagas/LightweightSagaPersistenceFrameProvider.cs @@ -26,7 +26,7 @@ public void ApplyTransactionSupport(IChain chain, IServiceContainer container) var idType = member.GetRawMemberType(); var enrollFrame = - typeof(EnrollAndFetchSagaStorageFrame<,>).CloseAndBuildAs(idType, sagaChain.SagaType); + typeof(EnrollAndFetchSagaStorageFrame<,>).CloseAndBuildAs(idType!, sagaChain.SagaType); sagaChain.Middleware.Add(enrollFrame); } @@ -49,7 +49,7 @@ public bool CanPersist(Type entityType, IServiceContainer container, out Type pe var idType = SagaChain.DetermineSagaIdMember(entityType, entityType)?.GetRawMemberType(); if (idType == null) { - persistenceService = default; + persistenceService = default!; return false; } diff --git a/src/Wolverine/Persistence/Sagas/LoadSagaOperation.cs b/src/Wolverine/Persistence/Sagas/LoadSagaOperation.cs index 6e0a5c863..f1bd43d48 100644 --- a/src/Wolverine/Persistence/Sagas/LoadSagaOperation.cs +++ b/src/Wolverine/Persistence/Sagas/LoadSagaOperation.cs @@ -8,8 +8,8 @@ public class LoadSagaOperation : AsyncFrame { private readonly Type _sagaType; private readonly Variable _sagaId; - private Variable _storage; - private Variable _cancellation; + private Variable _storage = null!; + private Variable _cancellation = null!; public LoadSagaOperation(Type sagaType, Variable sagaId) { diff --git a/src/Wolverine/Persistence/Sagas/SagaOperation.cs b/src/Wolverine/Persistence/Sagas/SagaOperation.cs index a612f2955..58af4a8fb 100644 --- a/src/Wolverine/Persistence/Sagas/SagaOperation.cs +++ b/src/Wolverine/Persistence/Sagas/SagaOperation.cs @@ -6,8 +6,8 @@ namespace Wolverine.Persistence.Sagas; public class SagaOperation : AsyncFrame, ISagaOperation { - private Variable _storage; - private Variable _cancellation; + private Variable _storage = null!; + private Variable _cancellation = null!; public SagaOperation(Variable saga, SagaOperationType operation) { diff --git a/src/Wolverine/Persistence/Sagas/SagaStorageVariableSource.cs b/src/Wolverine/Persistence/Sagas/SagaStorageVariableSource.cs index 589b98287..ad109c5be 100644 --- a/src/Wolverine/Persistence/Sagas/SagaStorageVariableSource.cs +++ b/src/Wolverine/Persistence/Sagas/SagaStorageVariableSource.cs @@ -15,6 +15,6 @@ public Variable Create(Type type) var sagaType = type.GetGenericArguments().Last(); var idType = SagaChain.DetermineSagaIdMember(sagaType, sagaType)?.GetRawMemberType(); - return typeof(EnrollAndFetchSagaStorageFrame<,>).CloseAndBuildAs(idType, sagaType).SimpleVariable; + return typeof(EnrollAndFetchSagaStorageFrame<,>).CloseAndBuildAs(idType!, sagaType).SimpleVariable; } } \ No newline at end of file diff --git a/src/Wolverine/Persistence/Sagas/SetSagaIdFromSagaFrame.cs b/src/Wolverine/Persistence/Sagas/SetSagaIdFromSagaFrame.cs index 99ee6909f..db76c48f1 100644 --- a/src/Wolverine/Persistence/Sagas/SetSagaIdFromSagaFrame.cs +++ b/src/Wolverine/Persistence/Sagas/SetSagaIdFromSagaFrame.cs @@ -16,7 +16,7 @@ internal class SetSagaIdFromSagaFrame : SyncFrame private readonly Type _messageType; private readonly MemberInfo _sagaIdMember; private Variable? _context; - private Variable _message; + private Variable _message = null!; public SetSagaIdFromSagaFrame(Type messageType, MemberInfo sagaIdMember) { diff --git a/src/Wolverine/RateLimiting/RateLimitSettingsRegistry.cs b/src/Wolverine/RateLimiting/RateLimitSettingsRegistry.cs index 65ba8204b..5abe3c8e2 100644 --- a/src/Wolverine/RateLimiting/RateLimitSettingsRegistry.cs +++ b/src/Wolverine/RateLimiting/RateLimitSettingsRegistry.cs @@ -21,7 +21,7 @@ public void RegisterEndpoint(Uri endpoint, RateLimitSettings settings) public bool TryFindForMessageType(Type messageType, out RateLimitSettings settings) { - if (_messageTypeLimits.TryGetValue(messageType, out settings)) + if (_messageTypeLimits.TryGetValue(messageType, out settings!)) { return true; } @@ -41,6 +41,6 @@ public bool TryFindForMessageType(Type messageType, out RateLimitSettings settin public bool TryFindForEndpoint(Uri endpoint, out RateLimitSettings settings) { - return _endpointLimits.TryGetValue(endpoint.ToString(), out settings); + return _endpointLimits.TryGetValue(endpoint.ToString(), out settings!); } } diff --git a/src/Wolverine/Runtime/Agents/AgentRestrictions.cs b/src/Wolverine/Runtime/Agents/AgentRestrictions.cs index f626e9089..70094167b 100644 --- a/src/Wolverine/Runtime/Agents/AgentRestrictions.cs +++ b/src/Wolverine/Runtime/Agents/AgentRestrictions.cs @@ -22,7 +22,7 @@ public bool Matches(AgentRestriction other) public class AgentRestrictions { - private readonly AgentRestriction[] _originals; + private readonly AgentRestriction[] _originals = null!; private readonly List _current = new(); public AgentRestrictions() diff --git a/src/Wolverine/Runtime/Agents/AssignAgent.cs b/src/Wolverine/Runtime/Agents/AssignAgent.cs index 03d10735b..10cf06536 100644 --- a/src/Wolverine/Runtime/Agents/AssignAgent.cs +++ b/src/Wolverine/Runtime/Agents/AssignAgent.cs @@ -44,4 +44,9 @@ public virtual bool Equals(AssignAgent? other) return AgentUri.Equals(other.AgentUri) && Destination.NodeId.Equals(other.Destination.NodeId); } + + public override int GetHashCode() + { + return HashCode.Combine(AgentUri, Destination.NodeId); + } } \ No newline at end of file diff --git a/src/Wolverine/Runtime/Agents/ExclusiveListenerFamily.cs b/src/Wolverine/Runtime/Agents/ExclusiveListenerFamily.cs index 657e03f1c..af0f897e1 100644 --- a/src/Wolverine/Runtime/Agents/ExclusiveListenerFamily.cs +++ b/src/Wolverine/Runtime/Agents/ExclusiveListenerFamily.cs @@ -38,7 +38,9 @@ internal class ExclusiveListenerFamily : IStaticAgentFamily private readonly IWolverineRuntime _runtime; internal const string SchemeName = "wolverine-listener"; - private readonly WolverineOptions _options; + #pragma warning disable CS0414 + private readonly WolverineOptions _options = null!; + #pragma warning restore CS0414 private readonly Dictionary _agents; public ExclusiveListenerFamily(IWolverineRuntime runtime) diff --git a/src/Wolverine/Runtime/Agents/IAgentCommand.cs b/src/Wolverine/Runtime/Agents/IAgentCommand.cs index 0aac97815..78c9df731 100644 --- a/src/Wolverine/Runtime/Agents/IAgentCommand.cs +++ b/src/Wolverine/Runtime/Agents/IAgentCommand.cs @@ -41,7 +41,7 @@ public bool TryFindHandledType(Type concreteType, out Type handlerType) return true; } - handlerType = default; + handlerType = default!; return false; } } \ No newline at end of file diff --git a/src/Wolverine/Runtime/Agents/IWolverineObserver.cs b/src/Wolverine/Runtime/Agents/IWolverineObserver.cs index 071d20645..6bd94ec97 100644 --- a/src/Wolverine/Runtime/Agents/IWolverineObserver.cs +++ b/src/Wolverine/Runtime/Agents/IWolverineObserver.cs @@ -135,7 +135,7 @@ public async Task AssignmentsChanged(AssignmentGrid grid, AgentCommands commands { NodeNumber = _runtime.Options.Durability.AssignedNodeNumber, RecordType = NodeRecordType.AssignmentChanged, - Description = x.ToString() + Description = x.ToString()! }).ToArray(); await _runtime.Storage.Nodes.LogRecordsAsync(records); diff --git a/src/Wolverine/Runtime/Agents/LeaderPinnedAgentFamily.cs b/src/Wolverine/Runtime/Agents/LeaderPinnedAgentFamily.cs index 4980f87d2..57c5625f1 100644 --- a/src/Wolverine/Runtime/Agents/LeaderPinnedAgentFamily.cs +++ b/src/Wolverine/Runtime/Agents/LeaderPinnedAgentFamily.cs @@ -38,7 +38,9 @@ public class LeaderPinnedListenerFamily : IStaticAgentFamily private readonly IWolverineRuntime _runtime; internal const string SchemeName = "wolverine-leader-listener"; - private readonly WolverineOptions _options; + #pragma warning disable CS0414 + private readonly WolverineOptions _options = null!; + #pragma warning restore CS0414 private readonly Dictionary _agents; public LeaderPinnedListenerFamily(IWolverineRuntime runtime) diff --git a/src/Wolverine/Runtime/Agents/NodeAgentController.HeartBeat.cs b/src/Wolverine/Runtime/Agents/NodeAgentController.HeartBeat.cs index 2af116c47..125171f16 100644 --- a/src/Wolverine/Runtime/Agents/NodeAgentController.HeartBeat.cs +++ b/src/Wolverine/Runtime/Agents/NodeAgentController.HeartBeat.cs @@ -94,7 +94,7 @@ await _persistence.AddAssignmentAsync(_runtime.Options.UniqueNodeId, LeaderUri, // This is important, some of the assignment logic depends on knowing what the leader is var self = nodes.FirstOrDefault(x => x.NodeId == _runtime.Options.UniqueNodeId); - self.AssignAgents([LeaderUri]); + self!.AssignAgents([LeaderUri]); return await EvaluateAssignmentsAsync(nodes, restrictions); } diff --git a/src/Wolverine/Runtime/Agents/NodeAgentController.StartLocally.cs b/src/Wolverine/Runtime/Agents/NodeAgentController.StartLocally.cs index c7d95ff4f..e502cc9ac 100644 --- a/src/Wolverine/Runtime/Agents/NodeAgentController.StartLocally.cs +++ b/src/Wolverine/Runtime/Agents/NodeAgentController.StartLocally.cs @@ -4,7 +4,7 @@ namespace Wolverine.Runtime.Agents; public partial class NodeAgentController { - private Task _soloCheckingTask; + private Task _soloCheckingTask = null!; public async Task StartSoloModeAsync() { diff --git a/src/Wolverine/Runtime/Agents/NodeAgentController.cs b/src/Wolverine/Runtime/Agents/NodeAgentController.cs index 6481d6310..ed2b9fc18 100644 --- a/src/Wolverine/Runtime/Agents/NodeAgentController.cs +++ b/src/Wolverine/Runtime/Agents/NodeAgentController.cs @@ -22,7 +22,9 @@ private readonly Dictionary private readonly IWolverineRuntime _runtime; // May be valuable later + #pragma warning disable CS0169 private DateTimeOffset? _lastAssignmentCheck; + #pragma warning restore CS0169 private readonly IWolverineObserver _observer; private DateTimeOffset? _lastNodeAssignmentHealthCheckTrace; diff --git a/src/Wolverine/Runtime/Agents/NodeRecordType.cs b/src/Wolverine/Runtime/Agents/NodeRecordType.cs index fe0310cad..62415ddb9 100644 --- a/src/Wolverine/Runtime/Agents/NodeRecordType.cs +++ b/src/Wolverine/Runtime/Agents/NodeRecordType.cs @@ -57,6 +57,6 @@ public byte[] Write() public static object Read(byte[] bytes) { - return JsonSerializer.Deserialize(bytes); + return JsonSerializer.Deserialize(bytes)!; } } \ No newline at end of file diff --git a/src/Wolverine/Runtime/Agents/StartAgents.cs b/src/Wolverine/Runtime/Agents/StartAgents.cs index c430abd61..343a5c280 100644 --- a/src/Wolverine/Runtime/Agents/StartAgents.cs +++ b/src/Wolverine/Runtime/Agents/StartAgents.cs @@ -90,7 +90,7 @@ public virtual bool Equals(StartAgents? other) return true; } - return AgentUris.SequenceEqual(other.AgentUris); + return AgentUris.SequenceEqual(other!.AgentUris); } public override int GetHashCode() diff --git a/src/Wolverine/Runtime/Agents/WolverineNode.cs b/src/Wolverine/Runtime/Agents/WolverineNode.cs index 5bfa813a4..9e90b0601 100644 --- a/src/Wolverine/Runtime/Agents/WolverineNode.cs +++ b/src/Wolverine/Runtime/Agents/WolverineNode.cs @@ -35,7 +35,7 @@ public static WolverineNode For(WolverineOptions options) return new WolverineNode { - Version = options.Version, + Version = options.Version!, NodeId = options.UniqueNodeId, ControlUri = options.Transports.NodeControlEndpoint?.Uri, LastHealthCheck = DateTimeOffset.UtcNow diff --git a/src/Wolverine/Runtime/Batching/BatchingOptions.cs b/src/Wolverine/Runtime/Batching/BatchingOptions.cs index 8f838bc10..2edaa93b9 100644 --- a/src/Wolverine/Runtime/Batching/BatchingOptions.cs +++ b/src/Wolverine/Runtime/Batching/BatchingOptions.cs @@ -7,7 +7,7 @@ namespace Wolverine.Runtime.Batching; public class BatchingOptions(Type elementType) : IAsyncDisposable { - private IMessageHandler _handler; + private IMessageHandler _handler = null!; /// /// The message type to be batched up @@ -61,7 +61,7 @@ public IMessageHandler Build(WolverineRuntime runtime, IMessageBatcher batcher, $"This Wolverine application has a configuration for batching messages of type {typeof(T).FullNameInCode()}, but there is no known handler for {typeof(T).FullNameInCode()}[]"); } - var localQueue = (ILocalQueue)runtime.Endpoints.AgentForLocalQueue(options.LocalExecutionQueueName); + var localQueue = (ILocalQueue)runtime.Endpoints.AgentForLocalQueue(options.LocalExecutionQueueName!); return new BatchingProcessor(parentChain, batcher, options, localQueue, runtime.DurabilitySettings); diff --git a/src/Wolverine/Runtime/HandlerPipeline.cs b/src/Wolverine/Runtime/HandlerPipeline.cs index 27339ee84..a9548ea4e 100644 --- a/src/Wolverine/Runtime/HandlerPipeline.cs +++ b/src/Wolverine/Runtime/HandlerPipeline.cs @@ -19,7 +19,7 @@ public class HandlerPipeline : IHandlerPipeline private readonly HandlerGraph _graph; private readonly WolverineRuntime _runtime; - private readonly Endpoint _endpoint; + private readonly Endpoint _endpoint = null!; internal HandlerPipeline(WolverineRuntime runtime, IExecutorFactory executorFactory) { diff --git a/src/Wolverine/Runtime/Handlers/Executor.cs b/src/Wolverine/Runtime/Handlers/Executor.cs index 64d61293d..11f7fb698 100644 --- a/src/Wolverine/Runtime/Handlers/Executor.cs +++ b/src/Wolverine/Runtime/Handlers/Executor.cs @@ -179,7 +179,7 @@ public async Task ExecuteAsync(MessageContext context, Cancellati try { await Handler.HandleAsync(context, combined.Token); - if (context.Envelope.ReplyRequested.IsNotEmpty()) + if (context.Envelope!.ReplyRequested.IsNotEmpty()) { await context.AssertAnyRequiredResponseWasGenerated(); } @@ -208,7 +208,7 @@ public async Task ExecuteAsync(MessageContext context, Cancellati finally { - _executionFinished(_logger, envelope.CorrelationId, _messageTypeName, envelope.Id, null); + _executionFinished(_logger, envelope.CorrelationId!, _messageTypeName, envelope.Id, null); } } diff --git a/src/Wolverine/Runtime/Handlers/HandlerChain.cs b/src/Wolverine/Runtime/Handlers/HandlerChain.cs index e30d16e8f..e02d94652 100644 --- a/src/Wolverine/Runtime/Handlers/HandlerChain.cs +++ b/src/Wolverine/Runtime/Handlers/HandlerChain.cs @@ -125,9 +125,11 @@ protected virtual void maybeAssignStickyHandlers(WolverineOptions options, IGrou internal void ApplyIdempotencyCheck() { + #pragma warning disable CS4014 Middleware.Insert(0, MethodCall.For(x => x.AssertEagerIdempotencyAsync(CancellationToken.None))); - + Postprocessors.Add(MethodCall.For(x => x.PersistHandledAsync())); + #pragma warning restore CS4014 } protected virtual void validateAgainstInvalidSagaMethods(IGrouping grouping) @@ -282,7 +284,7 @@ bool ICodeFile.AttachTypesSynchronously(GenerationRules rules, Assembly assembly return false; } - var container = services.GetRequiredService(); + var container = services!.GetRequiredService(); applyCustomizations(rules, container); Handler = (MessageHandler)container.QuickBuild(_handlerType); @@ -369,7 +371,7 @@ public override Type InputType() public override void UseForResponse(MethodCall methodCall) { - var response = methodCall.ReturnVariable; + var response = methodCall.ReturnVariable!; response.OverrideName("response_of_" + response.Usage); Postprocessors.Add(methodCall); @@ -382,9 +384,9 @@ public override bool TryFindVariable(string valueName, ValueSource source, Type { if (source == ValueSource.InputMember || source == ValueSource.Anything) { - var member = MessageType.GetProperties() + var member = (MemberInfo?)MessageType.GetProperties() .FirstOrDefault(x => x.Name.EqualsIgnoreCase(valueName) && x.PropertyType == valueType) - ?? (MemberInfo)MessageType.GetFields() + ?? MessageType.GetFields() .FirstOrDefault(x => x.Name.EqualsIgnoreCase(valueName) && x.FieldType == valueType); if (member != null) @@ -394,7 +396,7 @@ public override bool TryFindVariable(string valueName, ValueSource source, Type } } - variable = default; + variable = default!; return false; } @@ -419,7 +421,7 @@ public override Frame[] AddStopConditionIfNull(Variable data, Variable? identity default: var message = requirement.MissingMessage ?? $"Unknown {data.VariableType.NameInCode()} with identity {{Id}}"; - return [new ThrowRequiredDataMissingExceptionFrame(data, identity, message)]; + return [new ThrowRequiredDataMissingExceptionFrame(data, identity!, message)]; } } @@ -517,7 +519,7 @@ internal virtual List DetermineFrames(GenerationRules rules, IServiceCont { if (AuditedMembers.All(x => x.Member != identity)) { - Audit(identity); + Audit(identity!); } } diff --git a/src/Wolverine/Runtime/Handlers/HandlerGraph.cs b/src/Wolverine/Runtime/Handlers/HandlerGraph.cs index 79c8cf649..b36e79fe4 100644 --- a/src/Wolverine/Runtime/Handlers/HandlerGraph.cs +++ b/src/Wolverine/Runtime/Handlers/HandlerGraph.cs @@ -66,7 +66,7 @@ public HandlerGraph() public Dictionary MappedGenericMessageTypes { get; } = new(); - internal IServiceContainer Container { get; set; } + internal IServiceContainer Container { get; set; } = null!; public HandlerChain[] Chains => _chains.Enumerate().Select(x => x.Value).ToArray(); @@ -270,7 +270,7 @@ public void AddRange(IEnumerable calls) if (chain.Handler == null) { - chain.InitializeSynchronously(Rules, this, Container.Services); + chain.InitializeSynchronously(Rules, this, Container!.Services); handler = chain.CreateHandler(Container!); } else @@ -320,7 +320,7 @@ internal void Compile(WolverineOptions options, IServiceContainer container) _hasCompiled = true; - var logger = (ILogger)container.Services.GetService>() ?? NullLogger.Instance; + var logger = (ILogger?)container.Services.GetService>() ?? NullLogger.Instance; Rules = options.CodeGeneration; diff --git a/src/Wolverine/Runtime/Handlers/MessageHandler.cs b/src/Wolverine/Runtime/Handlers/MessageHandler.cs index 0a7fc1bda..7462392ae 100644 --- a/src/Wolverine/Runtime/Handlers/MessageHandler.cs +++ b/src/Wolverine/Runtime/Handlers/MessageHandler.cs @@ -41,13 +41,13 @@ public abstract class MessageHandler : MessageHandler { public sealed override Task HandleAsync(MessageContext context, CancellationToken cancellation) { - if (context.Envelope.Message is T message) + if (context.Envelope!.Message is T message) { return HandleAsync(message, context, cancellation); } throw new ArgumentOutOfRangeException(nameof(context), - $"Wrong message type {context.Envelope.Message.GetType().FullNameInCode()}, expected {typeof(T).FullNameInCode()}"); + $"Wrong message type {context.Envelope!.Message!.GetType().FullNameInCode()}, expected {typeof(T).FullNameInCode()}"); } /// diff --git a/src/Wolverine/Runtime/Interop/CloudEventsMapper.cs b/src/Wolverine/Runtime/Interop/CloudEventsMapper.cs index ca76a7348..a3868a65d 100644 --- a/src/Wolverine/Runtime/Interop/CloudEventsMapper.cs +++ b/src/Wolverine/Runtime/Interop/CloudEventsMapper.cs @@ -26,39 +26,39 @@ public CloudEventsEnvelope(Envelope envelope) { if (envelope.Message is null) throw new ArgumentNullException(nameof(envelope), "Message is null"); - TenantId = envelope.TenantId; + TenantId = envelope.TenantId!; Data = envelope.Message; - + // Doesn't always apply in Wolverine, so ¯\_(ツ)_/¯ - Topic = envelope.TopicName ?? envelope.GroupId; + Topic = (envelope.TopicName ?? envelope.GroupId)!; Id = envelope.Id; - TraceId = envelope.CorrelationId; - Source = envelope.Source; - + TraceId = envelope.CorrelationId!; + Source = envelope.Source!; + // This is the Wolverine string that aliases the message type - Type = envelope.MessageType; + Type = envelope.MessageType!; Time = envelope.SentAt.ToString("O"); - TraceParent = envelope.ParentId; + TraceParent = envelope.ParentId!; } [JsonPropertyName("topic")] - public string Topic { get; set; } - + public string Topic { get; set; } = null!; + [JsonPropertyName("tenantid")] - public string TenantId { get; set; } - + public string TenantId { get; set; } = null!; + [JsonPropertyName("traceid")] - public string TraceId { get; set; } - + public string TraceId { get; set; } = null!; + [JsonPropertyName("tracestate")] - public string TraceState { get; set; } + public string TraceState { get; set; } = null!; [JsonPropertyName("data")] - public object Data { get; set; } - + public object Data { get; set; } = null!; + [JsonPropertyName("id")] public Guid Id { get; set; } @@ -67,18 +67,18 @@ public CloudEventsEnvelope(Envelope envelope) [JsonPropertyName("datacontenttype")] public string DataContentType { get; set; } = "application/json; charset=utf-8"; - + [JsonPropertyName("source")] - public string Source { get; set; } - + public string Source { get; set; } = null!; + [JsonPropertyName("type")] - public string Type { get; set; } - + public string Type { get; set; } = null!; + [JsonPropertyName("time")] - public string Time { get; set; } - + public string Time { get; set; } = null!; + [JsonPropertyName("traceparent")] - public string TraceParent { get; set; } + public string TraceParent { get; set; } = null!; } public class CloudEventsMapper : IUnwrapsMetadataMessageSerializer @@ -116,7 +116,7 @@ public void MapIncoming(Envelope envelope, JsonNode? node) if (node["Message"] != null) { var message = node["Message"]; - if (message.GetValueKind() == JsonValueKind.String) + if (message!.GetValueKind() == JsonValueKind.String) { node = JsonNode.Parse(message.GetValue()); } @@ -127,27 +127,27 @@ public void MapIncoming(Envelope envelope, JsonNode? node) } } - if (node.TryGetValue("tenantid", out var tenantid)) + if (node!.TryGetValue("tenantid", out var tenantid)) { envelope.TenantId = tenantid; } - if (node.TryGetValue("traceid", out var traceId)) + if (node!.TryGetValue("traceid", out var traceId)) { envelope.CorrelationId = traceId; } - if (node.TryGetValue("source", out var source)) + if (node!.TryGetValue("source", out var source)) { envelope.Source = source; } - if (node.TryGetValue("time", out var time)) + if (node!.TryGetValue("time", out var time)) { envelope.SentAt = time; } - if (node.TryGetValue("id", out var raw)) + if (node!.TryGetValue("id", out var raw)) { if (Guid.TryParse(raw, out var id)) { @@ -159,7 +159,7 @@ public void MapIncoming(Envelope envelope, JsonNode? node) } } - if (node.TryGetValue("type", out var cloudEventType)) + if (node!.TryGetValue("type", out var cloudEventType)) { // Preserve the raw CloudEvent type on the envelope before resolution. // If resolution fails, the raw type survives for dead-letter persistence. @@ -167,7 +167,7 @@ public void MapIncoming(Envelope envelope, JsonNode? node) if (_handlers.TryFindMessageType(cloudEventType, out var messageType)) { - var data = node["data"]; + var data = node!["data"]; if (data != null) { envelope.Message = data.Deserialize(messageType, _options); @@ -182,7 +182,7 @@ public void MapIncoming(Envelope envelope, JsonNode? node) } } - if (node.TryGetValue("datacontenttype", out var contentType)) + if (node!.TryGetValue("datacontenttype", out var contentType)) { if (contentType.StartsWith("application/json")) { @@ -207,7 +207,7 @@ public object ReadFromData(Type messageType, Envelope envelope) var node = JsonNode.Parse(envelope.Data); MapIncoming(envelope, node); - return envelope.Message; + return envelope.Message!; } public void Unwrap(Envelope envelope) @@ -234,7 +234,7 @@ public static bool TryGetValue(this JsonNode node, string nodeName, out T val var child = node[nodeName]; if (child == null) { - value = default; + value = default!; return false; } diff --git a/src/Wolverine/Runtime/MessageBus.cs b/src/Wolverine/Runtime/MessageBus.cs index 6ce41951e..13db506f5 100644 --- a/src/Wolverine/Runtime/MessageBus.cs +++ b/src/Wolverine/Runtime/MessageBus.cs @@ -65,7 +65,7 @@ public virtual Task ReScheduleCurrentAsync(DateTimeOffset rescheduledAt) public string? TenantId { get => _tenantId; - set => _tenantId = Runtime.Options.Durability.TenantIdStyle.MaybeCorrectTenantId(value); + set => _tenantId = Runtime.Options.Durability.TenantIdStyle.MaybeCorrectTenantId(value!); } public IDestinationEndpoint EndpointFor(string endpointName) diff --git a/src/Wolverine/Runtime/MessageContext.cs b/src/Wolverine/Runtime/MessageContext.cs index 0b570db1e..2bf20ad0a 100644 --- a/src/Wolverine/Runtime/MessageContext.cs +++ b/src/Wolverine/Runtime/MessageContext.cs @@ -116,7 +116,7 @@ public async Task AssertEagerIdempotencyAsync(CancellationToken cancellation) public async Task PersistHandledAsync() { - var handled = Envelope.ForPersistedHandled(Envelope, DateTimeOffset.UtcNow, Runtime.Options.Durability); + var handled = Envelope.ForPersistedHandled(Envelope!, DateTimeOffset.UtcNow, Runtime.Options.Durability); try { await Runtime.Storage.Inbox.StoreIncomingAsync(handled); @@ -235,7 +235,7 @@ public async Task AssertAnyRequiredResponseWasGenerated() { if (isMissingRequestedReply()) { - var failureDescription = $"No response was created for expected response '{Envelope.ReplyRequested}' back to reply-uri {Envelope.ReplyUri}. "; + var failureDescription = $"No response was created for expected response '{Envelope!.ReplyRequested}' back to reply-uri {Envelope.ReplyUri}. "; if (_outstanding.Count > 0) { var types = new List(_outstanding.Count + (_sent?.Count ?? 0)); @@ -256,8 +256,8 @@ public async Task AssertAnyRequiredResponseWasGenerated() } else { - Activity.Current?.SetTag("reply-uri", Envelope.ReplyUri.ToString()); - Runtime.Logger.LogInformation("Sending requested reply of type {MessageType} to reply-uri {ReplyUri}", Envelope.ReplyRequested, Envelope.ReplyUri); + Activity.Current?.SetTag("reply-uri", Envelope!.ReplyUri!.ToString()); + Runtime.Logger.LogInformation("Sending requested reply of type {MessageType} to reply-uri {ReplyUri}", Envelope!.ReplyRequested, Envelope.ReplyUri); } } } diff --git a/src/Wolverine/Runtime/Metrics/MetricsAccumulator.cs b/src/Wolverine/Runtime/Metrics/MetricsAccumulator.cs index 978fd8b0d..85e39a52a 100644 --- a/src/Wolverine/Runtime/Metrics/MetricsAccumulator.cs +++ b/src/Wolverine/Runtime/Metrics/MetricsAccumulator.cs @@ -20,7 +20,7 @@ public class MetricsAccumulator : IAsyncDisposable private readonly object _syncLock = new(); private ImmutableArray _accumulators = ImmutableArray.Empty; - private Task _runner; + private Task _runner = null!; /// /// Creates a new metrics accumulator bound to the given runtime. @@ -124,7 +124,7 @@ public void Start() } } } - catch (OperationCanceledException e) + catch (OperationCanceledException) { // Nothing } diff --git a/src/Wolverine/Runtime/Partitioning/MessagePartitioningRules.cs b/src/Wolverine/Runtime/Partitioning/MessagePartitioningRules.cs index ef440c3be..d604612cc 100644 --- a/src/Wolverine/Runtime/Partitioning/MessagePartitioningRules.cs +++ b/src/Wolverine/Runtime/Partitioning/MessagePartitioningRules.cs @@ -185,7 +185,7 @@ internal void MaybeInferGrouping(HandlerGraph handlerGraph) { if (chain.TryInferMessageIdentity(out var property)) { - ByMessage(chain.MessageType, property); + ByMessage(chain.MessageType, property!); } // For messages implementing SequencedMessage, use Order as the group id @@ -210,13 +210,13 @@ internal class ExplicitGrouping : IGroupingRule public bool TryFindIdentity(Envelope envelope, out string groupId) { - if (_groupers.TryFind(envelope.Message.GetType(), out var grouper)) + if (_groupers.TryFind(envelope.Message!.GetType(), out var grouper)) { groupId = grouper.ToGroupId(envelope.Message); return true; } - groupId = default; + groupId = default!; return false; } diff --git a/src/Wolverine/Runtime/Partitioning/PartitionedMessageReRouter.cs b/src/Wolverine/Runtime/Partitioning/PartitionedMessageReRouter.cs index 6cd563e6d..36b35a37c 100644 --- a/src/Wolverine/Runtime/Partitioning/PartitionedMessageReRouter.cs +++ b/src/Wolverine/Runtime/Partitioning/PartitionedMessageReRouter.cs @@ -19,7 +19,7 @@ public Task HandleAsync(MessageContext context, CancellationToken cancellation) { // Knock it out of being scheduled just in case // From https://github.com/JasperFx/wolverine/issues/2026 - context.Envelope.ClearAnyScheduling(); + context.Envelope!.ClearAnyScheduling(); var endpoint = _topology.SelectSlot(context.Envelope); diff --git a/src/Wolverine/Runtime/Partitioning/ShardedExecutionBlock.cs b/src/Wolverine/Runtime/Partitioning/ShardedExecutionBlock.cs index e59c7096b..8c92d601b 100644 --- a/src/Wolverine/Runtime/Partitioning/ShardedExecutionBlock.cs +++ b/src/Wolverine/Runtime/Partitioning/ShardedExecutionBlock.cs @@ -36,7 +36,7 @@ public IBlock DeserializeFirst(IHandlerPipeline pipeline, IWolverineRu envelopeLifecycle.ReadEnvelope(e, channel); await continuation.ExecuteAsync(envelopeLifecycle, runtime, DateTimeOffset.UtcNow, Activity.Current); - return default; + return default!; }); } diff --git a/src/Wolverine/Runtime/RemoteInvocation/FailureAcknowledgementHandler.cs b/src/Wolverine/Runtime/RemoteInvocation/FailureAcknowledgementHandler.cs index 1c2ee5020..13f6d3fb8 100644 --- a/src/Wolverine/Runtime/RemoteInvocation/FailureAcknowledgementHandler.cs +++ b/src/Wolverine/Runtime/RemoteInvocation/FailureAcknowledgementHandler.cs @@ -16,7 +16,7 @@ public FailureAcknowledgementHandler(IReplyTracker replies, ILogger logger) public Task HandleAsync(MessageContext context, CancellationToken cancellation) { - var ack = context.Envelope.Message as FailureAcknowledgement; + var ack = context.Envelope!.Message as FailureAcknowledgement; _logger.LogError("Received failure acknowledgement on reply for message {Id} from service {Service} with message '{Message}'", context.Envelope.ConversationId, context.Envelope.Source ?? "Unknown", ack?.Message); _replies.Complete(context.Envelope!); return Task.CompletedTask; diff --git a/src/Wolverine/Runtime/Routing/MessageRoute.cs b/src/Wolverine/Runtime/Routing/MessageRoute.cs index eeb123ac5..e2e82881e 100644 --- a/src/Wolverine/Runtime/Routing/MessageRoute.cs +++ b/src/Wolverine/Runtime/Routing/MessageRoute.cs @@ -33,7 +33,7 @@ public MessageRoute(Type messageType, Endpoint endpoint, IWolverineRuntime runti if (WolverineSystemPart.WithinDescription) { - Sender = endpoint.Agent; + Sender = endpoint.Agent!; } else { @@ -49,7 +49,7 @@ public MessageRoute(Type messageType, Endpoint endpoint, IWolverineRuntime runti } else if (WolverineSystemPart.WithinDescription) { - Serializer = endpoint.DefaultSerializer; + Serializer = endpoint.DefaultSerializer!; } else { @@ -70,8 +70,8 @@ public MessageRoute(Type messageType, Endpoint endpoint, IWolverineRuntime runti public bool IsLocal { get; } - public IMessageSerializer Serializer { get; } - public ISendingAgent Sender { get; } + public IMessageSerializer Serializer { get; } = null!; + public ISendingAgent Sender { get; } = null!; public IList Rules { get; } = new List(); @@ -96,7 +96,7 @@ public Envelope CreateForSending(object message, DeliveryOptions? options, ISend envelope.Status = EnvelopeStatus.Incoming; } - if (options != null && options.ContentType.IsNotEmpty() && options.ContentType != Serializer.ContentType) + if (options != null && options.ContentType!.IsNotEmpty() && options.ContentType! != Serializer!.ContentType) { envelope.Serializer = runtime.Options.FindSerializer(options.ContentType); envelope.ContentType = envelope.Serializer.ContentType; diff --git a/src/Wolverine/Runtime/Routing/TopicRouting.cs b/src/Wolverine/Runtime/Routing/TopicRouting.cs index 9b1f7f082..b9a7e45b3 100644 --- a/src/Wolverine/Runtime/Routing/TopicRouting.cs +++ b/src/Wolverine/Runtime/Routing/TopicRouting.cs @@ -120,7 +120,7 @@ public static string DetermineTopicName(Envelope envelope) throw new ArgumentNullException(nameof(envelope), $"{nameof(envelope.Message)} is null, making this operation invalid"); - return envelope.TopicName ?? DetermineTopicName(envelope.Message?.GetType()); + return envelope.TopicName ?? DetermineTopicName(envelope.Message?.GetType()!); } } diff --git a/src/Wolverine/Runtime/Serialization/IntrinsicSerializer.cs b/src/Wolverine/Runtime/Serialization/IntrinsicSerializer.cs index c00143f28..de06d49b3 100644 --- a/src/Wolverine/Runtime/Serialization/IntrinsicSerializer.cs +++ b/src/Wolverine/Runtime/Serialization/IntrinsicSerializer.cs @@ -17,7 +17,7 @@ private IntrinsicSerializer(){} public string ContentType => MimeType; public byte[] Write(Envelope envelope) { - var messageType = envelope.Message.GetType(); + var messageType = envelope.Message!.GetType(); if (_inner.TryFind(messageType, out var serializer)) { return serializer.Write(envelope); @@ -32,12 +32,12 @@ public object ReadFromData(Type messageType, Envelope envelope) { if (_inner.TryFind(messageType, out var serializer)) { - return serializer.ReadFromData(envelope.Data); + return serializer.ReadFromData(envelope.Data!); } serializer = typeof(IntrinsicSerializer<>).CloseAndBuildAs(messageType); _inner = _inner.AddOrUpdate(messageType, serializer); - return serializer.ReadFromData(envelope.Data); + return serializer.ReadFromData(envelope.Data!); } public object ReadFromData(byte[] data) @@ -56,12 +56,12 @@ internal class IntrinsicSerializer : IMessageSerializer where T : ISerializab public string ContentType => IntrinsicSerializer.MimeType; public byte[] Write(Envelope envelope) { - return WriteMessage(envelope.Message); + return WriteMessage(envelope.Message!); } public object ReadFromData(Type messageType, Envelope envelope) { - return T.Read(envelope.Data); + return T.Read(envelope.Data!); } public object ReadFromData(byte[] data) diff --git a/src/Wolverine/Runtime/Serialization/SystemTextJsonSerializer.cs b/src/Wolverine/Runtime/Serialization/SystemTextJsonSerializer.cs index 141f666ba..23dee8461 100644 --- a/src/Wolverine/Runtime/Serialization/SystemTextJsonSerializer.cs +++ b/src/Wolverine/Runtime/Serialization/SystemTextJsonSerializer.cs @@ -76,7 +76,7 @@ public override void Write( JsonSerializerOptions options ) { - string assemblyQualifiedName = value.AssemblyQualifiedName; + string assemblyQualifiedName = value.AssemblyQualifiedName!; // Use this with caution, since you are disclosing type information. writer.WriteStringValue(assemblyQualifiedName); } diff --git a/src/Wolverine/Runtime/Stubs/StubMessageHandler.cs b/src/Wolverine/Runtime/Stubs/StubMessageHandler.cs index d76cfe575..05c8d9e83 100644 --- a/src/Wolverine/Runtime/Stubs/StubMessageHandler.cs +++ b/src/Wolverine/Runtime/Stubs/StubMessageHandler.cs @@ -28,7 +28,7 @@ public Task HandleAsync(T message, IMessageContext context, IServiceProvider ser public bool TelemetryEnabled => false; public Task HandleAsync(MessageContext context, CancellationToken cancellation) { - var message = (T)context.Envelope.Message; - return Func(message, context, _services, cancellation); + var message = (T)context.Envelope!.Message!; + return Func(message!, context, _services, cancellation); } } \ No newline at end of file diff --git a/src/Wolverine/Runtime/Wolverine.ExecutorFactory.cs b/src/Wolverine/Runtime/Wolverine.ExecutorFactory.cs index f73e7dc4b..cc76a3eb4 100644 --- a/src/Wolverine/Runtime/Wolverine.ExecutorFactory.cs +++ b/src/Wolverine/Runtime/Wolverine.ExecutorFactory.cs @@ -19,16 +19,16 @@ IExecutor IExecutorFactory.BuildFor(Type messageType) IExecutor IExecutorFactory.BuildFor(Type messageType, Endpoint endpoint) { - IMessageHandler handler = null; + IMessageHandler? handler = null; if (Options.MessagePartitioning.TryFindTopology(messageType, out var topology)) { - if (!topology.Slots.Contains(endpoint)) + if (!topology!.Slots.Contains(endpoint)) { handler = new PartitionedMessageReRouter(topology, messageType); } } - handler ??= Handlers.HandlerFor(messageType, endpoint); + handler ??= (IMessageHandler?)Handlers.HandlerFor(messageType, endpoint); if (handler == null ) { var batching = Options.BatchDefinitions.FirstOrDefault(x => x.ElementType == messageType); diff --git a/src/Wolverine/Runtime/WolverineRuntime.Agents.cs b/src/Wolverine/Runtime/WolverineRuntime.Agents.cs index 593943ce9..1031e6817 100644 --- a/src/Wolverine/Runtime/WolverineRuntime.Agents.cs +++ b/src/Wolverine/Runtime/WolverineRuntime.Agents.cs @@ -126,9 +126,9 @@ public async Task ApplyRestrictionsAsync(AgentRestrictions restrictions, Cancell public bool TryFindActiveAgent(Uri agentUri, out T agent) where T : class { agent = default!; - if (NodeController.Agents.TryGetValue(agentUri, out var raw)) + if (NodeController!.Agents.TryGetValue(agentUri, out var raw)) { - agent = raw as T; + agent = (raw as T)!; return agent != null; } diff --git a/src/Wolverine/Runtime/WolverineRuntime.DirectMetrics.cs b/src/Wolverine/Runtime/WolverineRuntime.DirectMetrics.cs index 323b128d8..2733fdaed 100644 --- a/src/Wolverine/Runtime/WolverineRuntime.DirectMetrics.cs +++ b/src/Wolverine/Runtime/WolverineRuntime.DirectMetrics.cs @@ -42,8 +42,8 @@ public void Sent(Envelope envelope) { if (envelope.MessageType.IsNotEmpty() && !IsSystemEndpoint(envelope.Destination)) { - _runtime._accumulator.Value.FindAccumulator(envelope.GetMessageTypeName(), envelope.Destination) - .EntryPoint.Post(new RecordSent(envelope.TenantId, _serviceName)); + _runtime._accumulator.Value.FindAccumulator(envelope.GetMessageTypeName(), envelope.Destination!) + .EntryPoint.Post(new RecordSent(envelope.TenantId!, _serviceName)); } _runtime.ActiveSession?.MaybeRecord(MessageEventType.Sent, envelope, _serviceName, _uniqueNodeId); @@ -60,8 +60,8 @@ public void Received(Envelope envelope) if (isExternal && envelope.MessageType.IsNotEmpty() && !IsSystemEndpoint(envelope.Destination)) { - _runtime._accumulator.Value.FindAccumulator(envelope.GetMessageTypeName(), envelope.Destination) - .EntryPoint.Post(new RecordReceived(envelope.TenantId, _serviceName)); + _runtime._accumulator.Value.FindAccumulator(envelope.GetMessageTypeName(), envelope.Destination!) + .EntryPoint.Post(new RecordReceived(envelope.TenantId!, _serviceName)); } _runtime.ActiveSession?.Record(MessageEventType.Received, envelope, _serviceName, _uniqueNodeId); @@ -80,7 +80,7 @@ public void ExecutionFinished(Envelope envelope) var executionTime = envelope.StopTiming(); if (executionTime > 0) { - _sink.Post(new RecordExecutionTime(executionTime, envelope.TenantId)); + _sink.Post(new RecordExecutionTime(executionTime, envelope.TenantId!)); } _runtime.ActiveSession?.Record(MessageEventType.ExecutionFinished, envelope, _serviceName, _uniqueNodeId); @@ -89,22 +89,22 @@ public void ExecutionFinished(Envelope envelope) public void ExecutionFinished(Envelope envelope, Exception exception) { ExecutionFinished(envelope); - _sink.Post(new RecordFailure(exception.GetType().FullNameInCode(), envelope.TenantId)); + _sink.Post(new RecordFailure(exception.GetType().FullNameInCode(), envelope.TenantId!)); } public void MessageSucceeded(Envelope envelope) { var time = DateTimeOffset.UtcNow.Subtract(envelope.SentAt.ToUniversalTime()).TotalMilliseconds; - _sink.Post(new RecordEffectiveTime(time, envelope.TenantId)); - + _sink.Post(new RecordEffectiveTime(time, envelope.TenantId!)); + _runtime.ActiveSession?.Record(MessageEventType.MessageSucceeded, envelope, _serviceName, _uniqueNodeId); } public void MessageFailed(Envelope envelope, Exception ex) { var time = DateTimeOffset.UtcNow.Subtract(envelope.SentAt.ToUniversalTime()).TotalMilliseconds; - _sink.Post(new RecordEffectiveTime(time, envelope.TenantId)); - _sink.Post(new RecordDeadLetter(ex.GetType().FullNameInCode(), envelope.TenantId)); + _sink.Post(new RecordEffectiveTime(time, envelope.TenantId!)); + _sink.Post(new RecordDeadLetter(ex.GetType().FullNameInCode(), envelope.TenantId!)); _runtime.ActiveSession?.Record(MessageEventType.Sent, envelope, _serviceName, _uniqueNodeId, ex); } @@ -123,7 +123,7 @@ public void MovedToErrorQueue(Envelope envelope, Exception ex) { _runtime.ActiveSession?.Record(MessageEventType.MovedToErrorQueue, envelope, _serviceName, _uniqueNodeId); _movedToErrorQueue(Logger, envelope, ex); - _sink.Post(new RecordDeadLetter(ex.GetType().FullNameInCode(), envelope.TenantId)); + _sink.Post(new RecordDeadLetter(ex.GetType().FullNameInCode(), envelope.TenantId!)); } public void DiscardedEnvelope(Envelope envelope) diff --git a/src/Wolverine/Runtime/WolverineRuntime.HybridMetricsPublishingMessageTracker.cs b/src/Wolverine/Runtime/WolverineRuntime.HybridMetricsPublishingMessageTracker.cs index 215637846..2ad24c749 100644 --- a/src/Wolverine/Runtime/WolverineRuntime.HybridMetricsPublishingMessageTracker.cs +++ b/src/Wolverine/Runtime/WolverineRuntime.HybridMetricsPublishingMessageTracker.cs @@ -48,7 +48,7 @@ public void ExecutionFinished(Envelope envelope) var executionTime = envelope.StopTiming(); if (executionTime > 0) { - _sink.Post(new RecordExecutionTime(executionTime, envelope.TenantId)); + _sink.Post(new RecordExecutionTime(executionTime, envelope.TenantId!)); } _runtime.ExecutionFinished(envelope); @@ -57,13 +57,13 @@ public void ExecutionFinished(Envelope envelope) public void ExecutionFinished(Envelope envelope, Exception exception) { _runtime.ExecutionFinished(envelope, exception); - _sink.Post(new RecordFailure(exception.GetType().FullNameInCode(), envelope.TenantId)); + _sink.Post(new RecordFailure(exception.GetType().FullNameInCode(), envelope.TenantId!)); } public void MessageSucceeded(Envelope envelope) { var time = DateTimeOffset.UtcNow.Subtract(envelope.SentAt.ToUniversalTime()).TotalMilliseconds; - _sink.Post(new RecordEffectiveTime(time, envelope.TenantId)); + _sink.Post(new RecordEffectiveTime(time, envelope.TenantId!)); _runtime.MessageSucceeded(envelope); } @@ -71,9 +71,9 @@ public void MessageSucceeded(Envelope envelope) public void MessageFailed(Envelope envelope, Exception ex) { var time = DateTimeOffset.UtcNow.Subtract(envelope.SentAt.ToUniversalTime()).TotalMilliseconds; - _sink.Post(new RecordEffectiveTime(time, envelope.TenantId)); - _sink.Post(new RecordDeadLetter(ex.GetType().FullNameInCode(), envelope.TenantId)); - + _sink.Post(new RecordEffectiveTime(time, envelope.TenantId!)); + _sink.Post(new RecordDeadLetter(ex.GetType().FullNameInCode(), envelope.TenantId!)); + _runtime.MessageFailed(envelope, ex); } @@ -90,7 +90,7 @@ public void NoRoutesFor(Envelope envelope) public void MovedToErrorQueue(Envelope envelope, Exception ex) { _runtime.MovedToErrorQueue(envelope, ex); - _sink.Post(new RecordDeadLetter(ex.GetType().FullNameInCode(), envelope.TenantId)); + _sink.Post(new RecordDeadLetter(ex.GetType().FullNameInCode(), envelope.TenantId!)); } public void DiscardedEnvelope(Envelope envelope) diff --git a/src/Wolverine/Runtime/WolverineRuntime.Routing.cs b/src/Wolverine/Runtime/WolverineRuntime.Routing.cs index a3e9ee6a0..5cb57097e 100644 --- a/src/Wolverine/Runtime/WolverineRuntime.Routing.cs +++ b/src/Wolverine/Runtime/WolverineRuntime.Routing.cs @@ -100,7 +100,7 @@ public IEnumerable FindRoutes(Type messageType, IWolverineRuntime } var endpoint = options.Transports.GetOrCreate() - .QueueFor(batching.LocalExecutionQueueName); + .QueueFor(batching.LocalExecutionQueueName!); return [new MessageRoute(messageType, endpoint, runtime)]; diff --git a/src/Wolverine/Runtime/WolverineRuntime.Tracking.cs b/src/Wolverine/Runtime/WolverineRuntime.Tracking.cs index 74e062ebb..3a9923c58 100644 --- a/src/Wolverine/Runtime/WolverineRuntime.Tracking.cs +++ b/src/Wolverine/Runtime/WolverineRuntime.Tracking.cs @@ -69,8 +69,8 @@ public void Sent(Envelope envelope) && envelope.MessageType.IsNotEmpty() && !IsSystemEndpoint(envelope.Destination)) { - var accumulator = _accumulator.Value.FindAccumulator(envelope.MessageType, envelope.Destination); - accumulator.EntryPoint.Post(new RecordSent(envelope.TenantId, _serviceName)); + var accumulator = _accumulator.Value.FindAccumulator(envelope.MessageType!, envelope.Destination!); + accumulator.EntryPoint.Post(new RecordSent(envelope.TenantId!, _serviceName)); } ActiveSession?.MaybeRecord(MessageEventType.Sent, envelope, _serviceName, _uniqueNodeId); @@ -96,8 +96,8 @@ public void Received(Envelope envelope) && envelope.MessageType.IsNotEmpty() && !IsSystemEndpoint(envelope.Destination)) { - var accumulator = _accumulator.Value.FindAccumulator(envelope.MessageType, envelope.Destination); - accumulator.EntryPoint.Post(new RecordReceived(envelope.TenantId, _serviceName)); + var accumulator = _accumulator.Value.FindAccumulator(envelope.MessageType!, envelope.Destination!); + accumulator.EntryPoint.Post(new RecordReceived(envelope.TenantId!, _serviceName)); } ActiveSession?.Record(MessageEventType.Received, envelope, _serviceName, _uniqueNodeId); @@ -176,8 +176,8 @@ public void MovedToErrorQueue(Envelope envelope, Exception ex) && envelope.MessageType.IsNotEmpty() && !IsSystemEndpoint(envelope.Destination)) { - var accumulator = _accumulator.Value.FindAccumulator(envelope.MessageType, envelope.Destination); - accumulator.EntryPoint.Post(new RecordDeadLetter(ex.GetType().FullNameInCode(), envelope.TenantId)); + var accumulator = _accumulator.Value.FindAccumulator(envelope.MessageType!, envelope.Destination!); + accumulator.EntryPoint.Post(new RecordDeadLetter(ex.GetType().FullNameInCode(), envelope.TenantId!)); } } diff --git a/src/Wolverine/Runtime/WorkerQueues/BufferedReceiver.cs b/src/Wolverine/Runtime/WorkerQueues/BufferedReceiver.cs index d62143bad..584260ad2 100644 --- a/src/Wolverine/Runtime/WorkerQueues/BufferedReceiver.cs +++ b/src/Wolverine/Runtime/WorkerQueues/BufferedReceiver.cs @@ -71,7 +71,7 @@ internal async Task executeAsync(Envelope envelope, CancellationToken _) envelope.ContentType = EnvelopeConstants.JsonContentType; } - await Pipeline.InvokeAsync(envelope, this); + await Pipeline!.InvokeAsync(envelope, this); } catch (Exception? e) { @@ -108,7 +108,7 @@ async ValueTask IChannelCallback.DeferAsync(Envelope envelope) } } - public IHandlerPipeline? Pipeline { get; } + public IHandlerPipeline Pipeline { get; } = null!; public Uri Uri { get; } diff --git a/src/Wolverine/Runtime/WorkerQueues/DurableReceiver.cs b/src/Wolverine/Runtime/WorkerQueues/DurableReceiver.cs index e4dde43eb..3e29482ad 100644 --- a/src/Wolverine/Runtime/WorkerQueues/DurableReceiver.cs +++ b/src/Wolverine/Runtime/WorkerQueues/DurableReceiver.cs @@ -209,7 +209,7 @@ public async ValueTask DeferAsync(Envelope envelope) await EnqueueAsync(envelope); } - public IHandlerPipeline? Pipeline { get; } + public IHandlerPipeline Pipeline { get; } = null!; public Uri Uri { get; set; } diff --git a/src/Wolverine/Saga.cs b/src/Wolverine/Saga.cs index 30befe932..ee7d968f6 100644 --- a/src/Wolverine/Saga.cs +++ b/src/Wolverine/Saga.cs @@ -95,7 +95,7 @@ public async ValueTask ShouldProceed(T message, IMessageBus bus) } Pending.Remove(next); - LastSequence = next.Order.Value; + LastSequence = next.Order!.Value; // This doesn't actually go out until the original message completes await bus.PublishAsync(next); diff --git a/src/Wolverine/TestMessageContext.cs b/src/Wolverine/TestMessageContext.cs index 15fb52798..29d45ee61 100644 --- a/src/Wolverine/TestMessageContext.cs +++ b/src/Wolverine/TestMessageContext.cs @@ -89,7 +89,7 @@ public ExpectationExpression(TestMessageContext parent, Func match, Uri /// public void RespondWith(TResponse response) { - var expectation = new ExpectedResponse(_match, response, _destination, _endpointName); + var expectation = new ExpectedResponse(_match, response!, _destination, _endpointName); _parent.Expectations.Add(expectation); } } diff --git a/src/Wolverine/TestingExtensions.cs b/src/Wolverine/TestingExtensions.cs index 5910267bc..0627ce6cb 100644 --- a/src/Wolverine/TestingExtensions.cs +++ b/src/Wolverine/TestingExtensions.cs @@ -266,7 +266,7 @@ public class AssignmentWaiter private readonly Dictionary _runtimes = new(); private readonly WolverineRuntime _leaderRuntime; - public string AgentScheme { get; set; } + public string AgentScheme { get; set; } = null!; public AssignmentWaiter(IHost leader) { diff --git a/src/Wolverine/Tracking/EnvelopeHistory.cs b/src/Wolverine/Tracking/EnvelopeHistory.cs index 56a933d35..01b36956b 100644 --- a/src/Wolverine/Tracking/EnvelopeHistory.cs +++ b/src/Wolverine/Tracking/EnvelopeHistory.cs @@ -19,7 +19,7 @@ public object? Message get { return _records - .FirstOrDefault(x => x.Envelope.Message != null)?.Envelope.Message; + .FirstOrDefault(x => x.Envelope!.Message != null)?.Envelope!.Message; } } @@ -56,7 +56,7 @@ public void RecordLocally(EnvelopeRecord record) case MessageEventType.Sent: // Not tracking anything outgoing // when it's testing locally - if (record.Envelope.Destination?.Scheme != TransportConstants.Local || + if (record.Envelope!.Destination?.Scheme != TransportConstants.Local || record.Envelope.MessageType == TransportConstants.ScheduledEnvelope) { record.IsComplete = true; @@ -72,7 +72,7 @@ public void RecordLocally(EnvelopeRecord record) break; case MessageEventType.Received: - if (record.Envelope.Destination?.Scheme == TransportConstants.Local) + if (record.Envelope!.Destination?.Scheme == TransportConstants.Local) { markLastCompleted(MessageEventType.Sent); } @@ -118,11 +118,11 @@ public void RecordCrossApplication(EnvelopeRecord record) switch (record.MessageEventType) { case MessageEventType.Sent: - if (record.Envelope.Status == EnvelopeStatus.Scheduled) + if (record.Envelope!.Status == EnvelopeStatus.Scheduled) { record.WasScheduled = true; record.IsComplete = true; - + record.TryUseInnerFromScheduledEnvelope(); } @@ -210,7 +210,7 @@ public bool Has(MessageEventType eventType) public object? MessageFor(MessageEventType eventType) { return _records.Where(x => x.MessageEventType == eventType) - .LastOrDefault(x => x.Envelope.Message != null)?.Envelope.Message; + .LastOrDefault(x => x.Envelope!.Message != null)?.Envelope!.Message; } public override string ToString() diff --git a/src/Wolverine/Tracking/EnvelopeRecord.cs b/src/Wolverine/Tracking/EnvelopeRecord.cs index 40bb3f516..8ade82ba3 100644 --- a/src/Wolverine/Tracking/EnvelopeRecord.cs +++ b/src/Wolverine/Tracking/EnvelopeRecord.cs @@ -56,7 +56,7 @@ public EnvelopeRecord(MessageEventType eventType, Envelope? envelope, long sessi public override string ToString() { var prefix = $"{ServiceName} ({UniqueNodeId}) @{SessionTime}ms: "; - var message = $"{Message?.GetType().FullNameInCode()} ({Envelope.Id})"; + var message = $"{Message?.GetType().FullNameInCode()} ({Envelope!.Id})"; switch (MessageEventType) { @@ -99,10 +99,10 @@ public override string ToString() internal void TryUseInnerFromScheduledEnvelope() { - if (Envelope.MessageType == TransportConstants.ScheduledEnvelope) + if (Envelope!.MessageType == TransportConstants.ScheduledEnvelope) { MessageEventType = MessageEventType.Scheduled; - Envelope = (Envelope)Envelope.Message; + Envelope = (Envelope)Envelope.Message!; } } } \ No newline at end of file diff --git a/src/Wolverine/Tracking/RecordCollection.cs b/src/Wolverine/Tracking/RecordCollection.cs index 9fedc7544..e0d00c9ee 100644 --- a/src/Wolverine/Tracking/RecordCollection.cs +++ b/src/Wolverine/Tracking/RecordCollection.cs @@ -67,7 +67,7 @@ public Envelope SingleEnvelope() _parent.BuildActivityMessage($"No messages of type {typeof(T).FullNameInCode()} were received")); case 1: - return records.Single().Envelope; + return records.Single().Envelope!; default: throw new Exception(_parent.BuildActivityMessage( @@ -92,7 +92,7 @@ public virtual IEnumerable RecordsInOrder() public IEnumerable Envelopes() { - return RecordsInOrder().Select(x => x.Envelope); + return RecordsInOrder().Select(x => x.Envelope!); } } diff --git a/src/Wolverine/Tracking/TrackedSession.cs b/src/Wolverine/Tracking/TrackedSession.cs index 63406c6bb..3c47c1711 100644 --- a/src/Wolverine/Tracking/TrackedSession.cs +++ b/src/Wolverine/Tracking/TrackedSession.cs @@ -83,7 +83,7 @@ private set public T FindSingleTrackedMessageOfType() { var messages = AllRecordsInOrder() - .Select(x => x.Envelope.Message).Where(x => x != null) + .Select(x => x.Envelope!.Message).Where(x => x != null) .OfType() .Distinct().ToArray(); @@ -107,7 +107,7 @@ public T FindSingleTrackedMessageOfType(MessageEventType eventType) { var messages = AllRecordsInOrder() .Where(x => x.MessageEventType == eventType) - .Select(x => x.Envelope.Message) + .Select(x => x.Envelope!.Message) .Where(x => x != null) .OfType() .Distinct().ToArray(); @@ -129,7 +129,7 @@ public EnvelopeRecord[] FindEnvelopesWithMessageType(MessageEventType eventTy return _envelopes .SelectMany(x => x.Records) .Where(x => x.MessageEventType == eventType) - .Where(x => x.Envelope.Message is T) + .Where(x => x.Envelope!.Message is T) .ToArray(); } @@ -137,7 +137,7 @@ public EnvelopeRecord[] FindEnvelopesWithMessageType() { return _envelopes .SelectMany(x => x.Records) - .Where(x => x.Envelope.Message is T) + .Where(x => x.Envelope!.Message is T) .ToArray(); } @@ -174,7 +174,7 @@ public void AssertCondition(string message, Func condition) public Task PlayScheduledMessagesAsync(TimeSpan timeout) { var serviceName = _primaryHost.GetRuntime().Options.ServiceName; - var recordsInOrder = _envelopes.SelectMany(x => x.Records).Where(x => x.MessageEventType == MessageEventType.Scheduled || x.Envelope.Status == EnvelopeStatus.Scheduled || x.WasScheduled).ToArray(); + var recordsInOrder = _envelopes.SelectMany(x => x.Records).Where(x => x.MessageEventType == MessageEventType.Scheduled || x.Envelope!.Status == EnvelopeStatus.Scheduled || x.WasScheduled).ToArray(); var records = recordsInOrder.Where(x => x.ServiceName == serviceName).ToArray(); if (!records.Any()) { @@ -194,13 +194,13 @@ public Task PlayScheduledMessagesAsync(TimeSpan timeout) internal async Task ReplayAll(IMessageContext context, EnvelopeRecord[] records) { - var envelopes = records.Select(x => x.Envelope).Distinct().ToArray(); - + var envelopes = records.Select(x => x.Envelope!).Distinct().ToArray(); + foreach (var envelope in envelopes) { - if (envelope.Destination.Scheme == TransportConstants.Local) + if (envelope!.Destination!.Scheme == TransportConstants.Local) { - await context.InvokeAsync(envelope.Message); + await context.InvokeAsync(envelope.Message!); } else { @@ -342,7 +342,7 @@ public void AssertNoFailureAcksWereSent() writer.WriteLine($"Configure the tracked activity with {nameof(TrackedSessionConfiguration.IgnoreFailureAcks)}() to ignore these failure acks in the test."); foreach (EnvelopeRecord record in records) { - writer.WriteLine(record.Message.As().Message); + writer.WriteLine(record.Message!.As().Message); } throw new Exception(writer.ToString()); @@ -387,7 +387,7 @@ public void MaybeRecord(MessageEventType messageEventType, Envelope envelope, st // Ignore these var messageType = envelope.Message?.GetType(); - if (_ignoreMessageRules.Any(x => x(messageType))) + if (_ignoreMessageRules.Any(x => x(messageType!))) { return; } diff --git a/src/Wolverine/Tracking/WaitForMessage.cs b/src/Wolverine/Tracking/WaitForMessage.cs index c2b957e99..98df7df26 100644 --- a/src/Wolverine/Tracking/WaitForMessage.cs +++ b/src/Wolverine/Tracking/WaitForMessage.cs @@ -16,7 +16,7 @@ public void Record(EnvelopeRecord record) return; } - if (record.Envelope.Message is T) + if (record.Envelope!.Message is T) { if (UniqueNodeId != Guid.Empty && UniqueNodeId != record.UniqueNodeId) { diff --git a/src/Wolverine/TransportCollection.cs b/src/Wolverine/TransportCollection.cs index 150fcea7b..8ac655a75 100644 --- a/src/Wolverine/TransportCollection.cs +++ b/src/Wolverine/TransportCollection.cs @@ -88,13 +88,13 @@ public void Add(ITransport transport) var transport = _transports.Values.OfType().FirstOrDefault(x => x.Protocol == name.Name); if (transport == null) { - transport = (T)Activator.CreateInstance(typeof(T), name.Name); - _transports[name.Name] = transport; + transport = (T)Activator.CreateInstance(typeof(T), name.Name)!; + _transports[name.Name] = transport!; } - return transport; + return transport!; } - + } internal ITransport Find(Uri uri) diff --git a/src/Wolverine/Transports/BrokerTransport.cs b/src/Wolverine/Transports/BrokerTransport.cs index f87fb2532..e429c1d1f 100644 --- a/src/Wolverine/Transports/BrokerTransport.cs +++ b/src/Wolverine/Transports/BrokerTransport.cs @@ -91,7 +91,9 @@ public sealed override async ValueTask InitializeAsync(IWolverineRuntime runtime tryBuildSystemEndpoints(runtime); + #pragma warning disable CS0219 var attempts = 1; + #pragma warning restore CS0219 for (int i = 0; i < 20; i++) { diff --git a/src/Wolverine/Transports/EnvelopeMapper.cs b/src/Wolverine/Transports/EnvelopeMapper.cs index 9e2f4a14d..4120cc891 100644 --- a/src/Wolverine/Transports/EnvelopeMapper.cs +++ b/src/Wolverine/Transports/EnvelopeMapper.cs @@ -120,7 +120,7 @@ public void InteropWithMassTransit(Action? configure = null var serializer = new MassTransitJsonSerializer(e); configure?.Invoke(serializer); - MapPropertyToHeader(x => x.MessageType, MassTransitHeaders.MessageType); + MapPropertyToHeader(x => x.MessageType!, MassTransitHeaders.MessageType); _endpoint.DefaultSerializer = serializer; diff --git a/src/Wolverine/Transports/ListeningAgent.cs b/src/Wolverine/Transports/ListeningAgent.cs index af5a97716..296a17e0a 100644 --- a/src/Wolverine/Transports/ListeningAgent.cs +++ b/src/Wolverine/Transports/ListeningAgent.cs @@ -110,7 +110,7 @@ public async Task EnqueueDirectlyAsync(IEnumerable envelopes) if (_receiver is BufferedReceiver) { // Agent is latched if listener is null - await _receiver.ReceivedAsync(new RetryOnInlineChannelCallback(Listener, _runtime), envelopes.ToArray()); + await _receiver.ReceivedAsync(new RetryOnInlineChannelCallback(Listener!, _runtime), envelopes.ToArray()); } else if (_receiver is ILocalQueue queue) { @@ -124,7 +124,7 @@ public async Task EnqueueDirectlyAsync(IEnumerable envelopes) else if (_receiver is InlineReceiver inline) { // Agent is latched if listener is null - await inline.ReceivedAsync(new RetryOnInlineChannelCallback(Listener, _runtime), envelopes.ToArray()); + await inline.ReceivedAsync(new RetryOnInlineChannelCallback(Listener!, _runtime), envelopes.ToArray()); } else { diff --git a/src/Wolverine/Transports/Local/DurableLocalQueue.cs b/src/Wolverine/Transports/Local/DurableLocalQueue.cs index 295a01204..3031053a2 100644 --- a/src/Wolverine/Transports/Local/DurableLocalQueue.cs +++ b/src/Wolverine/Transports/Local/DurableLocalQueue.cs @@ -150,7 +150,7 @@ ValueTask IReceiver.ReceivedAsync(IListener listener, Envelope envelope) async ValueTask IReceiver.DrainAsync() { - _receiver.Latch(); + _receiver!.Latch(); await _storeAndEnqueue.DrainAsync(); await _receiver!.DrainAsync(); } diff --git a/src/Wolverine/Transports/Local/LocalTransport.cs b/src/Wolverine/Transports/Local/LocalTransport.cs index 3410e38a5..ac079f6da 100644 --- a/src/Wolverine/Transports/Local/LocalTransport.cs +++ b/src/Wolverine/Transports/Local/LocalTransport.cs @@ -46,7 +46,7 @@ public LocalTransport() : base(TransportConstants.Local, "Local (In Memory)", [" public override bool TryBuildBrokerUsage(out BrokerDescription description) { - description = default; + description = default!; return false; } diff --git a/src/Wolverine/Transports/Sending/TenantedSender.cs b/src/Wolverine/Transports/Sending/TenantedSender.cs index 1d29a17f3..c7c770401 100644 --- a/src/Wolverine/Transports/Sending/TenantedSender.cs +++ b/src/Wolverine/Transports/Sending/TenantedSender.cs @@ -49,14 +49,14 @@ public ValueTask SendAsync(Envelope envelope) public class TenantedSender : ISender, ISenderRequiresCallback, IAsyncDisposable { public TenantedIdBehavior TenantedIdBehavior { get; } - private readonly ISender _defaultSender; + private readonly ISender _defaultSender = null!; private ImHashMap _senders = ImHashMap.Empty; public TenantedSender(Uri destination, TenantedIdBehavior tenantedIdBehavior, ISender? defaultSender) { Destination = destination; TenantedIdBehavior = tenantedIdBehavior; - _defaultSender = defaultSender; + _defaultSender = defaultSender!; if (tenantedIdBehavior == TenantedIdBehavior.FallbackToDefault && _defaultSender == null) { @@ -102,7 +102,7 @@ public async Task PingAsync() public ValueTask SendAsync(Envelope envelope) { - return senderForTenantId(envelope.TenantId).SendAsync(envelope); + return senderForTenantId(envelope.TenantId!).SendAsync(envelope); } private ISender senderForTenantId(string tenantId) diff --git a/src/Wolverine/Transports/SharedMemory/SharedMemoryEndpoint.cs b/src/Wolverine/Transports/SharedMemory/SharedMemoryEndpoint.cs index e5e0e27b5..38e231f7e 100644 --- a/src/Wolverine/Transports/SharedMemory/SharedMemoryEndpoint.cs +++ b/src/Wolverine/Transports/SharedMemory/SharedMemoryEndpoint.cs @@ -8,5 +8,5 @@ protected SharedMemoryEndpoint(Uri uri, EndpointRole role) : base(uri, role) { } - public Uri ReplyUri { get; set; } + public Uri ReplyUri { get; set; } = null!; } \ No newline at end of file diff --git a/src/Wolverine/Transports/SharedMemory/SharedMemorySubscription.cs b/src/Wolverine/Transports/SharedMemory/SharedMemorySubscription.cs index e578b04e7..d4d68b881 100644 --- a/src/Wolverine/Transports/SharedMemory/SharedMemorySubscription.cs +++ b/src/Wolverine/Transports/SharedMemory/SharedMemorySubscription.cs @@ -7,8 +7,8 @@ namespace Wolverine.Transports.SharedMemory; public class SharedMemorySubscription : SharedMemoryEndpoint, IListener, ISender { - private Subscription _subscription; - private Block _receiver; + private Subscription _subscription = null!; + private Block _receiver = null!; public SharedMemoryTopic Parent { get; } public string Name { get; } diff --git a/src/Wolverine/Transports/SharedMemory/SharedMemoryTopic.cs b/src/Wolverine/Transports/SharedMemory/SharedMemoryTopic.cs index 4da0e4755..b8ba0e9f5 100644 --- a/src/Wolverine/Transports/SharedMemory/SharedMemoryTopic.cs +++ b/src/Wolverine/Transports/SharedMemory/SharedMemoryTopic.cs @@ -7,7 +7,7 @@ namespace Wolverine.Transports.SharedMemory; public class SharedMemoryTopic : SharedMemoryEndpoint, ISender { - private Topic _topic; + private Topic _topic = null!; public string TopicName { get; } public Cache TopicSubscriptions { get; } diff --git a/src/Wolverine/Transports/SharedMemory/SharedMemoryTransport.cs b/src/Wolverine/Transports/SharedMemory/SharedMemoryTransport.cs index 5a0f6445a..e0c346970 100644 --- a/src/Wolverine/Transports/SharedMemory/SharedMemoryTransport.cs +++ b/src/Wolverine/Transports/SharedMemory/SharedMemoryTransport.cs @@ -26,7 +26,7 @@ public SharedMemoryTransport() : base(ProtocolName, "Shared Memory Queues", []) public override bool TryBuildBrokerUsage(out BrokerDescription description) { - description = default; + description = default!; return false; } diff --git a/src/Wolverine/Transports/Stub/StubTransport.cs b/src/Wolverine/Transports/Stub/StubTransport.cs index 00fa3093a..cb988702e 100644 --- a/src/Wolverine/Transports/Stub/StubTransport.cs +++ b/src/Wolverine/Transports/Stub/StubTransport.cs @@ -13,7 +13,7 @@ namespace Wolverine.Transports.Stub; internal class StubTransport : TransportBase, IStubHandlers, IMessageRouteSource, IExecutorFactory { - private WolverineRuntime _runtime; + private WolverineRuntime _runtime = null!; private readonly Dictionary _stubs = new(); diff --git a/src/Wolverine/Transports/Tcp/TcpTransport.cs b/src/Wolverine/Transports/Tcp/TcpTransport.cs index 6d2fe3f3d..a787fe605 100644 --- a/src/Wolverine/Transports/Tcp/TcpTransport.cs +++ b/src/Wolverine/Transports/Tcp/TcpTransport.cs @@ -16,7 +16,7 @@ public TcpTransport() : public override bool TryBuildBrokerUsage(out BrokerDescription description) { - description = default; + description = default!; return false; } diff --git a/src/Wolverine/Util/PortFinder.cs b/src/Wolverine/Util/PortFinder.cs index d162b54b1..e8ffdd307 100644 --- a/src/Wolverine/Util/PortFinder.cs +++ b/src/Wolverine/Util/PortFinder.cs @@ -11,7 +11,7 @@ public static int GetAvailablePort() { using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(DefaultLoopbackEndpoint); - var port = ((IPEndPoint)socket.LocalEndPoint).Port; + var port = ((IPEndPoint)socket.LocalEndPoint!).Port; return port; } } \ No newline at end of file diff --git a/src/Wolverine/WolverineOptions.Description.cs b/src/Wolverine/WolverineOptions.Description.cs index 36c3ed439..63fea4baf 100644 --- a/src/Wolverine/WolverineOptions.Description.cs +++ b/src/Wolverine/WolverineOptions.Description.cs @@ -92,7 +92,7 @@ internal Dictionary ToSerializerDictionary() public OptionsDescription ToDescription() { var description = new OptionsDescription(this); - description.AddValue("Version", GetType().Assembly.GetName().Version?.ToString()); + description.AddValue("Version", GetType().Assembly.GetName().Version?.ToString()!); description.AddChildSet("Transports", Transports); description.AddChildSet("Endpoints", Transports.SelectMany(x => x.Endpoints())); diff --git a/src/Wolverine/WolverineOptions.cs b/src/Wolverine/WolverineOptions.cs index b68dd59b4..3eec0bf95 100644 --- a/src/Wolverine/WolverineOptions.cs +++ b/src/Wolverine/WolverineOptions.cs @@ -238,7 +238,7 @@ public void AddMessageHandler(Type messageType, IMessageHandler handler) public void AddMessageHandler(MessageHandler handler) { AddMessageHandler(typeof(T), handler); - handler.ConfigureChain(handler.Chain); // Yeah, this is 100% a tell, don't ask violation + handler.ConfigureChain(handler.Chain!); // Yeah, this is 100% a tell, don't ask violation } [IgnoreDescription] @@ -324,7 +324,7 @@ public AutoCreate AutoBuildMessageStorageOnStartup /// /// Descriptive name of the running service. Used in Wolverine diagnostics and testing support /// - public string ServiceName { get; set; } + public string ServiceName { get; set; } = null!; /// /// This should probably *only* be used in development or testing diff --git a/wolverine.sln b/wolverine.sln index 21ff5c8a2..e9e9bd729 100644 --- a/wolverine.sln +++ b/wolverine.sln @@ -1578,17 +1578,11 @@ Global {0522EE2C-9C5D-452C-A67F-91DBBCDAE502}.Release|x86.ActiveCfg = Release|Any CPU {0522EE2C-9C5D-452C-A67F-91DBBCDAE502}.Release|x86.Build.0 = Release|Any CPU {28E17AA0-8B75-4BAE-9E89-716A45107C58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {28E17AA0-8B75-4BAE-9E89-716A45107C58}.Debug|Any CPU.Build.0 = Debug|Any CPU {28E17AA0-8B75-4BAE-9E89-716A45107C58}.Debug|x64.ActiveCfg = Debug|Any CPU - {28E17AA0-8B75-4BAE-9E89-716A45107C58}.Debug|x64.Build.0 = Debug|Any CPU {28E17AA0-8B75-4BAE-9E89-716A45107C58}.Debug|x86.ActiveCfg = Debug|Any CPU - {28E17AA0-8B75-4BAE-9E89-716A45107C58}.Debug|x86.Build.0 = Debug|Any CPU {28E17AA0-8B75-4BAE-9E89-716A45107C58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {28E17AA0-8B75-4BAE-9E89-716A45107C58}.Release|Any CPU.Build.0 = Release|Any CPU {28E17AA0-8B75-4BAE-9E89-716A45107C58}.Release|x64.ActiveCfg = Release|Any CPU - {28E17AA0-8B75-4BAE-9E89-716A45107C58}.Release|x64.Build.0 = Release|Any CPU {28E17AA0-8B75-4BAE-9E89-716A45107C58}.Release|x86.ActiveCfg = Release|Any CPU - {28E17AA0-8B75-4BAE-9E89-716A45107C58}.Release|x86.Build.0 = Release|Any CPU {3E83F8CE-A04A-477E-A103-1AC7CFDEBF0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3E83F8CE-A04A-477E-A103-1AC7CFDEBF0D}.Debug|Any CPU.Build.0 = Debug|Any CPU {3E83F8CE-A04A-477E-A103-1AC7CFDEBF0D}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -2022,29 +2016,17 @@ Global {ACB9EEA0-A545-4D02-A040-B1AE3CEF83ED}.Release|x86.ActiveCfg = Release|Any CPU {ACB9EEA0-A545-4D02-A040-B1AE3CEF83ED}.Release|x86.Build.0 = Release|Any CPU {D2C9BE8C-B850-47B8-9AEA-E2BFA771559D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2C9BE8C-B850-47B8-9AEA-E2BFA771559D}.Debug|Any CPU.Build.0 = Debug|Any CPU {D2C9BE8C-B850-47B8-9AEA-E2BFA771559D}.Debug|x64.ActiveCfg = Debug|Any CPU - {D2C9BE8C-B850-47B8-9AEA-E2BFA771559D}.Debug|x64.Build.0 = Debug|Any CPU {D2C9BE8C-B850-47B8-9AEA-E2BFA771559D}.Debug|x86.ActiveCfg = Debug|Any CPU - {D2C9BE8C-B850-47B8-9AEA-E2BFA771559D}.Debug|x86.Build.0 = Debug|Any CPU {D2C9BE8C-B850-47B8-9AEA-E2BFA771559D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D2C9BE8C-B850-47B8-9AEA-E2BFA771559D}.Release|Any CPU.Build.0 = Release|Any CPU {D2C9BE8C-B850-47B8-9AEA-E2BFA771559D}.Release|x64.ActiveCfg = Release|Any CPU - {D2C9BE8C-B850-47B8-9AEA-E2BFA771559D}.Release|x64.Build.0 = Release|Any CPU {D2C9BE8C-B850-47B8-9AEA-E2BFA771559D}.Release|x86.ActiveCfg = Release|Any CPU - {D2C9BE8C-B850-47B8-9AEA-E2BFA771559D}.Release|x86.Build.0 = Release|Any CPU {7C6060FA-9C34-472F-B538-0F3547B4926C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7C6060FA-9C34-472F-B538-0F3547B4926C}.Debug|Any CPU.Build.0 = Debug|Any CPU {7C6060FA-9C34-472F-B538-0F3547B4926C}.Debug|x64.ActiveCfg = Debug|Any CPU - {7C6060FA-9C34-472F-B538-0F3547B4926C}.Debug|x64.Build.0 = Debug|Any CPU {7C6060FA-9C34-472F-B538-0F3547B4926C}.Debug|x86.ActiveCfg = Debug|Any CPU - {7C6060FA-9C34-472F-B538-0F3547B4926C}.Debug|x86.Build.0 = Debug|Any CPU {7C6060FA-9C34-472F-B538-0F3547B4926C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7C6060FA-9C34-472F-B538-0F3547B4926C}.Release|Any CPU.Build.0 = Release|Any CPU {7C6060FA-9C34-472F-B538-0F3547B4926C}.Release|x64.ActiveCfg = Release|Any CPU - {7C6060FA-9C34-472F-B538-0F3547B4926C}.Release|x64.Build.0 = Release|Any CPU {7C6060FA-9C34-472F-B538-0F3547B4926C}.Release|x86.ActiveCfg = Release|Any CPU - {7C6060FA-9C34-472F-B538-0F3547B4926C}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE