diff --git a/.github/workflows/base.yml b/.github/workflows/base.yml
index 20cfe91d7..40a0c3c5e 100644
--- a/.github/workflows/base.yml
+++ b/.github/workflows/base.yml
@@ -63,4 +63,11 @@ jobs:
dotnet test --configuration ${{ matrix.configuration }} --blame \
--logger:"GitHubActions;report-warnings=false" --logger:"console;verbosity=normal" \
--framework ${{ matrix.framework }} \
- test/EventStore.Client.${{ inputs.test }}.Tests
+ test/EventStore.Client.Tests
+
+# run: |
+# sudo ./gencert.sh
+# dotnet test --configuration ${{ matrix.configuration }} --blame \
+# --logger:"GitHubActions;report-warnings=false" --logger:"console;verbosity=normal" \
+# --framework ${{ matrix.framework }} \
+# test/EventStore.Client.${{ inputs.test }}.Tests
diff --git a/.github/workflows/dispatch-ce.yml b/.github/workflows/dispatch-ce.yml
index 722baaea7..31e2d8966 100644
--- a/.github/workflows/dispatch-ce.yml
+++ b/.github/workflows/dispatch-ce.yml
@@ -15,10 +15,10 @@ on:
jobs:
test:
uses: ./.github/workflows/base.yml
- strategy:
- fail-fast: false
- matrix:
- test: [ Streams, PersistentSubscriptions, Operations, UserManagement, ProjectionManagement ]
+# strategy:
+# fail-fast: false
+# matrix:
+# test: [ Streams, PersistentSubscriptions, Operations, UserManagement, ProjectionManagement ]
name: Test CE (${{ inputs.docker-tag }})
with:
docker-tag: ${{ inputs.docker-tag }}
diff --git a/.github/workflows/dispatch-ee.yml b/.github/workflows/dispatch-ee.yml
index 13f0b3398..75bde07de 100644
--- a/.github/workflows/dispatch-ee.yml
+++ b/.github/workflows/dispatch-ee.yml
@@ -1,29 +1,29 @@
-name: Dispatch EE
-
-on:
- workflow_dispatch:
- inputs:
- docker-tag:
- description: "Docker tag"
- required: true
- type: string
- docker-image:
- description: "Docker image"
- required: true
- type: string
-
-jobs:
- test:
- uses: ./.github/workflows/base.yml
- strategy:
- fail-fast: false
- matrix:
- test: [ Plugins ]
- name: Test EE (${{ inputs.docker-tag }})
- with:
- docker-tag: ${{ inputs.docker-tag }}
- docker-image: ${{ inputs.docker-image }}
- test: ${{ matrix.test }}
- secrets:
- CLOUDSMITH_CICD_USER: ${{ secrets.CLOUDSMITH_CICD_USER }}
- CLOUDSMITH_CICD_TOKEN: ${{ secrets.CLOUDSMITH_CICD_TOKEN }}
+#name: Dispatch EE
+#
+#on:
+# workflow_dispatch:
+# inputs:
+# docker-tag:
+# description: "Docker tag"
+# required: true
+# type: string
+# docker-image:
+# description: "Docker image"
+# required: true
+# type: string
+#
+#jobs:
+# test:
+# uses: ./.github/workflows/base.yml
+## strategy:
+## fail-fast: false
+## matrix:
+## test: [ Plugins ]
+# name: Test EE (${{ inputs.docker-tag }})
+# with:
+# docker-tag: ${{ inputs.docker-tag }}
+# docker-image: ${{ inputs.docker-image }}
+# test: ${{ matrix.test }}
+# secrets:
+# CLOUDSMITH_CICD_USER: ${{ secrets.CLOUDSMITH_CICD_USER }}
+# CLOUDSMITH_CICD_TOKEN: ${{ secrets.CLOUDSMITH_CICD_TOKEN }}
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 42535a11d..ebe348e3e 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -1,193 +1,193 @@
-name: Publish
-
-on:
- pull_request:
- push:
- branches:
- - master
- tags:
- - v*
-
-jobs:
- vulnerability-scan:
- timeout-minutes: 10
- strategy:
- fail-fast: false
- matrix:
- framework: [ net8.0 ]
- os: [ ubuntu-latest, windows-latest ]
- runs-on: ${{ matrix.os }}
- name: scan-vulnerabilities/${{ matrix.os }}/${{ matrix.framework }}
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Install dotnet SDKs
- uses: actions/setup-dotnet@v3
- with:
- dotnet-version: |
- 8.0.x
- - name: Scan for Vulnerabilities
- shell: bash
- run: |
- dotnet nuget list source
- dotnet restore
- dotnet list package --vulnerable --include-transitive --framework ${{ matrix.framework }} | tee vulnerabilities.txt
- ! cat vulnerabilities.txt | grep -q "has the following vulnerable packages"
-
- build-samples:
- timeout-minutes: 5
- name: build-samples/${{ matrix.framework }}
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- framework: [ net8.0 ]
- services:
- esdb:
- image: docker.eventstore.com/eventstore-ce/eventstoredb-ce:lts
- env:
- EVENTSTORE_INSECURE: true
- EVENTSTORE_MEM_DB: false
- EVENTSTORE_RUN_PROJECTIONS: all
- EVENTSTORE_START_STANDARD_PROJECTIONS: true
- ports:
- - 2113:2113
- options: --health-cmd "exit 0"
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Install dotnet SDKs
- uses: actions/setup-dotnet@v3
- with:
- dotnet-version: |
- 8.0.x
- - name: Compile
- shell: bash
- run: |
- dotnet build samples
- - name: Run
- shell: bash
- run: |
- find samples/ -type f -iname "*.csproj" -print0 | xargs -0L1 dotnet run --framework ${{ matrix.framework }} --project
-
- generate-certificates:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
- - name: Generate certificates
- run: |
- mkdir -p certs
- docker run --rm --user root --volume "$PWD/certs:/tmp" docker.eventstore.com/eventstore-utils/es-gencert-cli:latest create-ca -out /tmp/ca
- docker run --rm --user root --volume "$PWD/certs:/tmp" docker.eventstore.com/eventstore-utils/es-gencert-cli:latest create-node -ca-certificate /tmp/ca/ca.crt -ca-key /tmp/ca/ca.key -out /tmp/node -ip-addresses 127.0.0.1 -dns-names localhost
- docker run --rm --user root --volume "$PWD/certs:/tmp" docker.eventstore.com/eventstore-utils/es-gencert-cli:latest create-user -username admin -ca-certificate /tmp/ca/ca.crt -ca-key /tmp/ca/ca.key -out /tmp/user-admin
- docker run --rm --user root --volume "$PWD/certs:/tmp" docker.eventstore.com/eventstore-utils/es-gencert-cli:latest create-user -username invalid -ca-certificate /tmp/ca/ca.crt -ca-key /tmp/ca/ca.key -out /tmp/user-invalid
- - name: Set permissions on certificates
- run: |
- sudo chown -R $USER:$USER certs
- sudo chmod -R 755 certs
- - name: Upload certificates
- uses: actions/upload-artifact@v4
- with:
- name: certs
- path: certs
-
- test:
- needs: generate-certificates
- timeout-minutes: 20
- strategy:
- fail-fast: false
- matrix:
- framework: [ net8.0 ]
- os: [ ubuntu-latest, windows-latest ]
- configuration: [ release ]
- runs-on: ${{ matrix.os }}
- name: test/EventStore.Client/${{ matrix.os }}/${{ matrix.framework }}
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - shell: bash
- run: |
- git fetch --prune --unshallow
- - name: Install dotnet SDKs
- uses: actions/setup-dotnet@v3
- with:
- dotnet-version: |
- 8.0.x
- - name: Compile
- shell: bash
- run: |
- dotnet build --configuration ${{ matrix.configuration }} --framework ${{ matrix.framework }} src/EventStore.Client
- - name: Download certificates
- uses: actions/download-artifact@v4
- with:
- name: certs
- path: certs
- - name: Run Tests (Linux)
- if: runner.os == 'Linux'
- shell: bash
- run: |
- dotnet test --configuration ${{ matrix.configuration }} --blame \
- --logger:"GitHubActions;report-warnings=false" --logger:"console;verbosity=normal" \
- --framework ${{ matrix.framework }} \
- test/EventStore.Client.Tests
- - name: Run Tests (Windows)
- if: runner.os == 'Windows'
- shell: pwsh
- run: |
- dotnet test --configuration ${{ matrix.configuration }} --blame `
- --logger:"GitHubActions;report-warnings=false" --logger:"console;verbosity=normal" `
- --framework ${{ matrix.framework }} `
- test/EventStore.Client.Tests
-
- publish:
- timeout-minutes: 5
- needs: [ vulnerability-scan, test, build-samples ]
- runs-on: ubuntu-latest
- name: publish
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Get Version
- id: get_version
- run: |
- echo "branch=${GITHUB_REF:10}" >> $GITHUB_OUTPUT
- dotnet nuget list source
- dotnet tool restore
- version=$(dotnet tool run minver -- --tag-prefix=v)
- echo "version=${version}" >> $GITHUB_OUTPUT
- - shell: bash
- run: |
- git fetch --prune --unshallow
- - name: Install dotnet SDKs
- uses: actions/setup-dotnet@v3
- with:
- dotnet-version: |
- 8.0.x
- - name: Dotnet Pack
- shell: bash
- run: |
- mkdir -p packages
- dotnet pack /p:Version=${{ steps.get_version.outputs.version }} --configuration=Release \
- /p:PublishDir=./packages \
- /p:NoWarn=NU5105 \
- /p:RepositoryUrl=https://github.com/EventStore/EventStore-Client-Dotnet \
- /p:RepositoryType=git
- - name: Publish Artifacts
- uses: actions/upload-artifact@v4
- with:
- path: packages
- name: nuget-packages
- - name: Dotnet Push to Github Packages
- shell: bash
- if: github.event_name == 'push'
- run: |
- dotnet tool restore
- find . -name "*.nupkg" | xargs -n1 dotnet nuget push --api-key=${{ secrets.github_token }} --source https://nuget.pkg.github.com/EventStore/index.json --skip-duplicate
- - name: Dotnet Push to Nuget.org
- shell: bash
- if: contains(steps.get_version.outputs.branch, 'v')
- run: |
- dotnet nuget list source
- dotnet tool restore
- find . -name "*.nupkg" | xargs -n1 dotnet nuget push --api-key=${{ secrets.nuget_key }} --source https://api.nuget.org/v3/index.json --skip-duplicate
+#name: Publish
+#
+#on:
+# pull_request:
+# push:
+# branches:
+# - master
+# tags:
+# - v*
+#
+#jobs:
+# vulnerability-scan:
+# timeout-minutes: 10
+# strategy:
+# fail-fast: false
+# matrix:
+# framework: [ net8.0 ]
+# os: [ ubuntu-latest, windows-latest ]
+# runs-on: ${{ matrix.os }}
+# name: scan-vulnerabilities/${{ matrix.os }}/${{ matrix.framework }}
+# steps:
+# - name: Checkout
+# uses: actions/checkout@v3
+# - name: Install dotnet SDKs
+# uses: actions/setup-dotnet@v3
+# with:
+# dotnet-version: |
+# 8.0.x
+# - name: Scan for Vulnerabilities
+# shell: bash
+# run: |
+# dotnet nuget list source
+# dotnet restore
+# dotnet list package --vulnerable --include-transitive --framework ${{ matrix.framework }} | tee vulnerabilities.txt
+# ! cat vulnerabilities.txt | grep -q "has the following vulnerable packages"
+#
+# build-samples:
+# timeout-minutes: 5
+# name: build-samples/${{ matrix.framework }}
+# runs-on: ubuntu-latest
+# strategy:
+# fail-fast: false
+# matrix:
+# framework: [ net8.0 ]
+# services:
+# esdb:
+# image: docker.eventstore.com/eventstore-ce/eventstoredb-ce:lts
+# env:
+# EVENTSTORE_INSECURE: true
+# EVENTSTORE_MEM_DB: false
+# EVENTSTORE_RUN_PROJECTIONS: all
+# EVENTSTORE_START_STANDARD_PROJECTIONS: true
+# ports:
+# - 2113:2113
+# options: --health-cmd "exit 0"
+# steps:
+# - name: Checkout
+# uses: actions/checkout@v3
+# - name: Install dotnet SDKs
+# uses: actions/setup-dotnet@v3
+# with:
+# dotnet-version: |
+# 8.0.x
+# - name: Compile
+# shell: bash
+# run: |
+# dotnet build samples
+# - name: Run
+# shell: bash
+# run: |
+# find samples/ -type f -iname "*.csproj" -print0 | xargs -0L1 dotnet run --framework ${{ matrix.framework }} --project
+#
+# generate-certificates:
+# runs-on: ubuntu-latest
+# steps:
+# - name: Checkout code
+# uses: actions/checkout@v4
+# - name: Generate certificates
+# run: |
+# mkdir -p certs
+# docker run --rm --user root --volume "$PWD/certs:/tmp" docker.eventstore.com/eventstore-utils/es-gencert-cli:latest create-ca -out /tmp/ca
+# docker run --rm --user root --volume "$PWD/certs:/tmp" docker.eventstore.com/eventstore-utils/es-gencert-cli:latest create-node -ca-certificate /tmp/ca/ca.crt -ca-key /tmp/ca/ca.key -out /tmp/node -ip-addresses 127.0.0.1 -dns-names localhost
+# docker run --rm --user root --volume "$PWD/certs:/tmp" docker.eventstore.com/eventstore-utils/es-gencert-cli:latest create-user -username admin -ca-certificate /tmp/ca/ca.crt -ca-key /tmp/ca/ca.key -out /tmp/user-admin
+# docker run --rm --user root --volume "$PWD/certs:/tmp" docker.eventstore.com/eventstore-utils/es-gencert-cli:latest create-user -username invalid -ca-certificate /tmp/ca/ca.crt -ca-key /tmp/ca/ca.key -out /tmp/user-invalid
+# - name: Set permissions on certificates
+# run: |
+# sudo chown -R $USER:$USER certs
+# sudo chmod -R 755 certs
+# - name: Upload certificates
+# uses: actions/upload-artifact@v4
+# with:
+# name: certs
+# path: certs
+#
+# test:
+# needs: generate-certificates
+# timeout-minutes: 20
+# strategy:
+# fail-fast: false
+# matrix:
+# framework: [ net8.0 ]
+# os: [ ubuntu-latest, windows-latest ]
+# configuration: [ release ]
+# runs-on: ${{ matrix.os }}
+# name: test/EventStore.Client/${{ matrix.os }}/${{ matrix.framework }}
+# steps:
+# - name: Checkout
+# uses: actions/checkout@v3
+# - shell: bash
+# run: |
+# git fetch --prune --unshallow
+# - name: Install dotnet SDKs
+# uses: actions/setup-dotnet@v3
+# with:
+# dotnet-version: |
+# 8.0.x
+# - name: Compile
+# shell: bash
+# run: |
+# dotnet build --configuration ${{ matrix.configuration }} --framework ${{ matrix.framework }} src/EventStore.Client
+# - name: Download certificates
+# uses: actions/download-artifact@v4
+# with:
+# name: certs
+# path: certs
+# - name: Run Tests (Linux)
+# if: runner.os == 'Linux'
+# shell: bash
+# run: |
+# dotnet test --configuration ${{ matrix.configuration }} --blame \
+# --logger:"GitHubActions;report-warnings=false" --logger:"console;verbosity=normal" \
+# --framework ${{ matrix.framework }} \
+# test/EventStore.Client.Tests
+# - name: Run Tests (Windows)
+# if: runner.os == 'Windows'
+# shell: pwsh
+# run: |
+# dotnet test --configuration ${{ matrix.configuration }} --blame `
+# --logger:"GitHubActions;report-warnings=false" --logger:"console;verbosity=normal" `
+# --framework ${{ matrix.framework }} `
+# test/EventStore.Client.Tests
+#
+# publish:
+# timeout-minutes: 5
+# needs: [ vulnerability-scan, test, build-samples ]
+# runs-on: ubuntu-latest
+# name: publish
+# steps:
+# - name: Checkout
+# uses: actions/checkout@v3
+# - name: Get Version
+# id: get_version
+# run: |
+# echo "branch=${GITHUB_REF:10}" >> $GITHUB_OUTPUT
+# dotnet nuget list source
+# dotnet tool restore
+# version=$(dotnet tool run minver -- --tag-prefix=v)
+# echo "version=${version}" >> $GITHUB_OUTPUT
+# - shell: bash
+# run: |
+# git fetch --prune --unshallow
+# - name: Install dotnet SDKs
+# uses: actions/setup-dotnet@v3
+# with:
+# dotnet-version: |
+# 8.0.x
+# - name: Dotnet Pack
+# shell: bash
+# run: |
+# mkdir -p packages
+# dotnet pack /p:Version=${{ steps.get_version.outputs.version }} --configuration=Release \
+# /p:PublishDir=./packages \
+# /p:NoWarn=NU5105 \
+# /p:RepositoryUrl=https://github.com/EventStore/EventStore-Client-Dotnet \
+# /p:RepositoryType=git
+# - name: Publish Artifacts
+# uses: actions/upload-artifact@v4
+# with:
+# path: packages
+# name: nuget-packages
+# - name: Dotnet Push to Github Packages
+# shell: bash
+# if: github.event_name == 'push'
+# run: |
+# dotnet tool restore
+# find . -name "*.nupkg" | xargs -n1 dotnet nuget push --api-key=${{ secrets.github_token }} --source https://nuget.pkg.github.com/EventStore/index.json --skip-duplicate
+# - name: Dotnet Push to Nuget.org
+# shell: bash
+# if: contains(steps.get_version.outputs.branch, 'v')
+# run: |
+# dotnet nuget list source
+# dotnet tool restore
+# find . -name "*.nupkg" | xargs -n1 dotnet nuget push --api-key=${{ secrets.nuget_key }} --source https://api.nuget.org/v3/index.json --skip-duplicate
diff --git a/.github/workflows/pull-request-check.yml b/.github/workflows/pull-request-check.yml
index 17d1a4561..9b327e375 100644
--- a/.github/workflows/pull-request-check.yml
+++ b/.github/workflows/pull-request-check.yml
@@ -1,23 +1,23 @@
-name: Pull Request check
-on:
- pull_request:
- paths-ignore:
- - "test/**"
- - "generators/**"
- - "samples/**"
- - "**.md"
- - "gencert.sh"
- - ".github/**"
- - ".gitignore"
- - ".gitattributes"
- - ".editorconfig"
- types: [ opened, edited ]
-jobs:
- checkPullRequest:
- name: Pull Request check
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- - name: Check pull requests
- uses: EventStore/Automations/pr-check@master
+#name: Pull Request check
+#on:
+# pull_request:
+# paths-ignore:
+# - "test/**"
+# - "generators/**"
+# - "samples/**"
+# - "**.md"
+# - "gencert.sh"
+# - ".github/**"
+# - ".gitignore"
+# - ".gitattributes"
+# - ".editorconfig"
+# types: [ opened, edited ]
+#jobs:
+# checkPullRequest:
+# name: Pull Request check
+# runs-on: ubuntu-latest
+# steps:
+# - name: Checkout
+# uses: actions/checkout@v3
+# - name: Check pull requests
+# uses: EventStore/Automations/pr-check@master
diff --git a/Directory.Build.props b/Directory.Build.props
index 52c0d73a5..a22d9632a 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,6 +1,6 @@
- net48;net8.0
+ net48;net8.0;net9.0
true
enable
enable
@@ -18,4 +18,4 @@
-
\ No newline at end of file
+
diff --git a/EventStore.Client.sln b/EventStore.Client.sln
index 373aa58a2..4b4791ec9 100644
--- a/EventStore.Client.sln
+++ b/EventStore.Client.sln
@@ -9,23 +9,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventStore.Client", "src\Ev
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{C51F2C69-45A9-4D0D-A708-4FC319D5D340}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventStore.Client.ProjectionManagement.Tests", "test\EventStore.Client.ProjectionManagement.Tests\EventStore.Client.ProjectionManagement.Tests.csproj", "{8F8548D6-694C-4BAE-9EF3-A020140E04C7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventStore.Client.Operations.Tests", "test\EventStore.Client.Operations.Tests\EventStore.Client.Operations.Tests.csproj", "{4BA2E05E-6B45-47C3-9001-8B039244ECA9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventStore.Client.Streams.Tests", "test\EventStore.Client.Streams.Tests\EventStore.Client.Streams.Tests.csproj", "{082C77F5-4FF5-41D4-A1F1-710F05956E1C}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventStore.Client.Tests", "test\EventStore.Client.Tests\EventStore.Client.Tests.csproj", "{FC829F1B-43AD-4C96-9002-23D04BBA3AF3}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventStore.Client.PersistentSubscriptions.Tests", "test\EventStore.Client.PersistentSubscriptions.Tests\EventStore.Client.PersistentSubscriptions.Tests.csproj", "{6CEB731F-72E1-461F-A6B3-54DBF3FD786C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventStore.Client.UserManagement.Tests", "test\EventStore.Client.UserManagement.Tests\EventStore.Client.UserManagement.Tests.csproj", "{22634CEE-4F7B-4679-A48D-38A2A8580ECA}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventStore.Client.Tests.Common", "test\EventStore.Client.Tests.Common\EventStore.Client.Tests.Common.csproj", "{E326832D-DE52-4DE4-9E54-C800908B75F3}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventStore.Client.Extensions.OpenTelemetry", "src\EventStore.Client.Extensions.OpenTelemetry\EventStore.Client.Extensions.OpenTelemetry.csproj", "{3723933C-585A-49BE-98E8-52D3FAD904CE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventStore.Client.Plugins.Tests", "test\EventStore.Client.Plugins.Tests\EventStore.Client.Plugins.Tests.csproj", "{7D929D45-F1D9-462B-BE49-84BEC11D5039}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventStore.Client.Extensions.OpenTelemetry", "src\EventStore.Client.Extensions.OpenTelemetry\EventStore.Client.Extensions.OpenTelemetry.csproj", "{F6A7B391-36F1-4838-AD08-E0EE0F2FE57E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -40,53 +28,23 @@ Global
{8853D875-4A8E-450B-A1BE-9CEF8BEDABC3}.Debug|x64.Build.0 = Debug|Any CPU
{8853D875-4A8E-450B-A1BE-9CEF8BEDABC3}.Release|x64.ActiveCfg = Release|Any CPU
{8853D875-4A8E-450B-A1BE-9CEF8BEDABC3}.Release|x64.Build.0 = Release|Any CPU
- {8F8548D6-694C-4BAE-9EF3-A020140E04C7}.Debug|x64.ActiveCfg = Debug|Any CPU
- {8F8548D6-694C-4BAE-9EF3-A020140E04C7}.Debug|x64.Build.0 = Debug|Any CPU
- {8F8548D6-694C-4BAE-9EF3-A020140E04C7}.Release|x64.ActiveCfg = Release|Any CPU
- {8F8548D6-694C-4BAE-9EF3-A020140E04C7}.Release|x64.Build.0 = Release|Any CPU
- {4BA2E05E-6B45-47C3-9001-8B039244ECA9}.Debug|x64.ActiveCfg = Debug|Any CPU
- {4BA2E05E-6B45-47C3-9001-8B039244ECA9}.Debug|x64.Build.0 = Debug|Any CPU
- {4BA2E05E-6B45-47C3-9001-8B039244ECA9}.Release|x64.ActiveCfg = Release|Any CPU
- {4BA2E05E-6B45-47C3-9001-8B039244ECA9}.Release|x64.Build.0 = Release|Any CPU
- {082C77F5-4FF5-41D4-A1F1-710F05956E1C}.Debug|x64.ActiveCfg = Debug|Any CPU
- {082C77F5-4FF5-41D4-A1F1-710F05956E1C}.Debug|x64.Build.0 = Debug|Any CPU
- {082C77F5-4FF5-41D4-A1F1-710F05956E1C}.Release|x64.ActiveCfg = Release|Any CPU
- {082C77F5-4FF5-41D4-A1F1-710F05956E1C}.Release|x64.Build.0 = Release|Any CPU
{FC829F1B-43AD-4C96-9002-23D04BBA3AF3}.Debug|x64.ActiveCfg = Debug|Any CPU
{FC829F1B-43AD-4C96-9002-23D04BBA3AF3}.Debug|x64.Build.0 = Debug|Any CPU
{FC829F1B-43AD-4C96-9002-23D04BBA3AF3}.Release|x64.ActiveCfg = Release|Any CPU
{FC829F1B-43AD-4C96-9002-23D04BBA3AF3}.Release|x64.Build.0 = Release|Any CPU
- {6CEB731F-72E1-461F-A6B3-54DBF3FD786C}.Debug|x64.ActiveCfg = Debug|Any CPU
- {6CEB731F-72E1-461F-A6B3-54DBF3FD786C}.Debug|x64.Build.0 = Debug|Any CPU
- {6CEB731F-72E1-461F-A6B3-54DBF3FD786C}.Release|x64.ActiveCfg = Release|Any CPU
- {6CEB731F-72E1-461F-A6B3-54DBF3FD786C}.Release|x64.Build.0 = Release|Any CPU
- {22634CEE-4F7B-4679-A48D-38A2A8580ECA}.Debug|x64.ActiveCfg = Debug|Any CPU
- {22634CEE-4F7B-4679-A48D-38A2A8580ECA}.Debug|x64.Build.0 = Debug|Any CPU
- {22634CEE-4F7B-4679-A48D-38A2A8580ECA}.Release|x64.ActiveCfg = Release|Any CPU
- {22634CEE-4F7B-4679-A48D-38A2A8580ECA}.Release|x64.Build.0 = Release|Any CPU
{E326832D-DE52-4DE4-9E54-C800908B75F3}.Debug|x64.ActiveCfg = Debug|Any CPU
{E326832D-DE52-4DE4-9E54-C800908B75F3}.Debug|x64.Build.0 = Debug|Any CPU
{E326832D-DE52-4DE4-9E54-C800908B75F3}.Release|x64.ActiveCfg = Release|Any CPU
{E326832D-DE52-4DE4-9E54-C800908B75F3}.Release|x64.Build.0 = Release|Any CPU
- {3723933C-585A-49BE-98E8-52D3FAD904CE}.Debug|x64.ActiveCfg = Debug|Any CPU
- {3723933C-585A-49BE-98E8-52D3FAD904CE}.Debug|x64.Build.0 = Debug|Any CPU
- {3723933C-585A-49BE-98E8-52D3FAD904CE}.Release|x64.ActiveCfg = Release|Any CPU
- {3723933C-585A-49BE-98E8-52D3FAD904CE}.Release|x64.Build.0 = Release|Any CPU
- {7D929D45-F1D9-462B-BE49-84BEC11D5039}.Debug|x64.ActiveCfg = Debug|Any CPU
- {7D929D45-F1D9-462B-BE49-84BEC11D5039}.Debug|x64.Build.0 = Debug|Any CPU
- {7D929D45-F1D9-462B-BE49-84BEC11D5039}.Release|x64.ActiveCfg = Release|Any CPU
- {7D929D45-F1D9-462B-BE49-84BEC11D5039}.Release|x64.Build.0 = Release|Any CPU
+ {F6A7B391-36F1-4838-AD08-E0EE0F2FE57E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F6A7B391-36F1-4838-AD08-E0EE0F2FE57E}.Debug|x64.Build.0 = Debug|Any CPU
+ {F6A7B391-36F1-4838-AD08-E0EE0F2FE57E}.Release|x64.ActiveCfg = Release|Any CPU
+ {F6A7B391-36F1-4838-AD08-E0EE0F2FE57E}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{8853D875-4A8E-450B-A1BE-9CEF8BEDABC3} = {EA59C1CB-16DA-4F68-AF8A-642A969B4CF8}
- {8F8548D6-694C-4BAE-9EF3-A020140E04C7} = {C51F2C69-45A9-4D0D-A708-4FC319D5D340}
- {4BA2E05E-6B45-47C3-9001-8B039244ECA9} = {C51F2C69-45A9-4D0D-A708-4FC319D5D340}
- {082C77F5-4FF5-41D4-A1F1-710F05956E1C} = {C51F2C69-45A9-4D0D-A708-4FC319D5D340}
{FC829F1B-43AD-4C96-9002-23D04BBA3AF3} = {C51F2C69-45A9-4D0D-A708-4FC319D5D340}
- {6CEB731F-72E1-461F-A6B3-54DBF3FD786C} = {C51F2C69-45A9-4D0D-A708-4FC319D5D340}
- {22634CEE-4F7B-4679-A48D-38A2A8580ECA} = {C51F2C69-45A9-4D0D-A708-4FC319D5D340}
{E326832D-DE52-4DE4-9E54-C800908B75F3} = {C51F2C69-45A9-4D0D-A708-4FC319D5D340}
- {3723933C-585A-49BE-98E8-52D3FAD904CE} = {EA59C1CB-16DA-4F68-AF8A-642A969B4CF8}
- {7D929D45-F1D9-462B-BE49-84BEC11D5039} = {C51F2C69-45A9-4D0D-A708-4FC319D5D340}
+ {F6A7B391-36F1-4838-AD08-E0EE0F2FE57E} = {EA59C1CB-16DA-4F68-AF8A-642A969B4CF8}
EndGlobalSection
EndGlobal
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 15441ca5d..9f5159807 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -4,7 +4,7 @@
true
EventStore.Client
- Kurrent.Client
+ EventStore.Client
@@ -50,4 +50,4 @@
-
\ No newline at end of file
+
diff --git a/src/EventStore.Client/Core/Certificates/X509Certificates.cs b/src/EventStore.Client/Core/Certificates/X509Certificates.cs
index 78efda04e..3fe1006f5 100644
--- a/src/EventStore.Client/Core/Certificates/X509Certificates.cs
+++ b/src/EventStore.Client/Core/Certificates/X509Certificates.cs
@@ -13,29 +13,36 @@
namespace EventStore.Client;
static class X509Certificates {
- // TODO SS: Use .NET 8 X509Certificate2.CreateFromPemFile(certPemFilePath, keyPemFilePath) once the Windows32Exception issue is resolved
- public static X509Certificate2 CreateFromPemFile(string certPemFilePath, string keyPemFilePath) {
- try {
- using var publicCert = new X509Certificate2(certPemFilePath);
- using var privateKey = RSA.Create().ImportPrivateKeyFromFile(keyPemFilePath);
- using var certificate = publicCert.CopyWithPrivateKey(privateKey);
-
- return new(certificate.Export(X509ContentType.Pfx));
- }
- catch (Exception ex) {
- throw new CryptographicException($"Failed to load private key: {ex.Message}");
- }
-
- // Notes:
- // using X509Certificate2.CreateFromPemFile(certPemFilePath, keyPemFilePath) would be the ideal choice here,
- // but it's currently causing a Win32Exception specifically on Windows. Alternative implementation is used until the issue is resolved.
- //
- // Error: The SSL connection could not be established, see inner exception. AuthenticationException: Authentication failed because the platform
- // does not support ephemeral keys. Win32Exception: No credentials are available in the security package
- //
- // public static X509Certificate2 CreateFromPemFile(string certPemFilePath, string keyPemFilePath) =>
- // X509Certificate2.CreateFromPemFile(certPemFilePath, keyPemFilePath);
- }
+ // TODO SS: Use .NET 8 X509Certificate2.CreateFromPemFile(certPemFilePath, keyPemFilePath) once the Windows32Exception issue is resolved
+ public static X509Certificate2 CreateFromPemFile(string certPemFilePath, string keyPemFilePath) {
+ try {
+#if NET9_0_OR_GREATER
+ using var publicCert = X509CertificateLoader.LoadCertificateFromFile(certPemFilePath);
+#else
+ using var publicCert = new X509Certificate2(certPemFilePath);
+#endif
+ using var privateKey = RSA.Create().ImportPrivateKeyFromFile(keyPemFilePath);
+ using var certificate = publicCert.CopyWithPrivateKey(privateKey);
+
+#if NET48
+ return new(certificate.Export(X509ContentType.Pfx));
+#else
+ return X509Certificate2.CreateFromPemFile(certPemFilePath, keyPemFilePath);
+#endif
+ } catch (Exception ex) {
+ throw new CryptographicException($"Failed to load private key: {ex.Message}");
+ }
+
+ // Notes:
+ // using X509Certificate2.CreateFromPemFile(certPemFilePath, keyPemFilePath) would be the ideal choice here,
+ // but it's currently causing a Win32Exception specifically on Windows. Alternative implementation is used until the issue is resolved.
+ //
+ // Error: The SSL connection could not be established, see inner exception. AuthenticationException: Authentication failed because the platform
+ // does not support ephemeral keys. Win32Exception: No credentials are available in the security package
+ //
+ // public static X509Certificate2 CreateFromPemFile(string certPemFilePath, string keyPemFilePath) =>
+ // X509Certificate2.CreateFromPemFile(certPemFilePath, keyPemFilePath);
+ }
}
public static class RsaExtensions {
@@ -59,7 +66,7 @@ public static RSA ImportPrivateKeyFromFile(this RSA rsa, string privateKeyPath)
public static RSA ImportPrivateKeyFromFile(this RSA rsa, string privateKeyPath) {
var (content, label) = LoadPemKeyFile(privateKeyPath);
- var privateKey = string.Join(string.Empty, content[1..^1]);
+ var privateKey = string.Join(string.Empty, content[1..^1]);
var privateKeyBytes = Convert.FromBase64String(privateKey);
if (label == RsaPemLabels.Pkcs8PrivateKey)
@@ -104,4 +111,4 @@ public static string ParseKeyLabel(string pemFileHeader) {
return label;
}
-}
\ No newline at end of file
+}
diff --git a/src/EventStore.Client/Core/EventStoreClientSettings.ConnectionString.cs b/src/EventStore.Client/Core/EventStoreClientSettings.ConnectionString.cs
index 48eb84956..2aadebf64 100644
--- a/src/EventStore.Client/Core/EventStoreClientSettings.ConnectionString.cs
+++ b/src/EventStore.Client/Core/EventStoreClientSettings.ConnectionString.cs
@@ -41,7 +41,7 @@ private static class ConnectionStringParser {
private const string ThrowOnAppendFailure = nameof(ThrowOnAppendFailure);
private const string KeepAliveInterval = nameof(KeepAliveInterval);
private const string KeepAliveTimeout = nameof(KeepAliveTimeout);
- private const string UserCertFile = nameof(UserCertFile);
+ private const string UserCertFile = nameof(UserCertFile);
private const string UserKeyFile = nameof(UserKeyFile);
private const string UriSchemeDiscover = "esdb+discover";
@@ -64,8 +64,8 @@ private static class ConnectionStringParser {
{ ThrowOnAppendFailure, typeof(bool) },
{ KeepAliveInterval, typeof(int) },
{ KeepAliveTimeout, typeof(int) },
- { UserCertFile, typeof(string)},
- { UserKeyFile, typeof(string)},
+ { UserCertFile, typeof(string) },
+ { UserKeyFile, typeof(string) },
};
public static EventStoreClientSettings Parse(string connectionString) {
@@ -77,10 +77,10 @@ public static EventStoreClientSettings Parse(string connectionString) {
var scheme = ParseScheme(connectionString.Substring(0, schemeIndex));
currentIndex = schemeIndex + SchemeSeparator.Length;
- var userInfoIndex = connectionString.IndexOf(UserInfoSeparator, currentIndex, StringComparison.Ordinal);
- (string user, string pass)? userInfo = null;
+ var userInfoIndex = connectionString.IndexOf(UserInfoSeparator, currentIndex, StringComparison.Ordinal);
+ (string user, string pass)? userInfo = null;
if (userInfoIndex != -1) {
- userInfo = ParseUserInfo(connectionString.Substring(currentIndex, userInfoIndex - currentIndex));
+ userInfo = ParseUserInfo(connectionString.Substring(currentIndex, userInfoIndex - currentIndex));
currentIndex = userInfoIndex + UserInfoSeparator.Length;
}
@@ -93,7 +93,7 @@ public static EventStoreClientSettings Parse(string connectionString) {
if (questionMarkIndex == -1) questionMarkIndex = int.MaxValue;
var hostSeparatorIndex = Math.Min(Math.Min(slashIndex, questionMarkIndex), endIndex);
- var hosts = ParseHosts(connectionString.Substring(currentIndex, hostSeparatorIndex - currentIndex));
+ var hosts = ParseHosts(connectionString.Substring(currentIndex, hostSeparatorIndex - currentIndex));
currentIndex = hostSeparatorIndex;
string path = "";
@@ -163,11 +163,11 @@ private static EventStoreClientSettings CreateSettings(
if (typedOptions.TryGetValue(NodePreference, out object? nodePreference)) {
settings.ConnectivitySettings.NodePreference = ((string)nodePreference).ToLowerInvariant() switch {
- "leader" => EventStore.Client.NodePreference.Leader,
- "follower" => EventStore.Client.NodePreference.Follower,
- "random" => EventStore.Client.NodePreference.Random,
+ "leader" => EventStore.Client.NodePreference.Leader,
+ "follower" => EventStore.Client.NodePreference.Follower,
+ "random" => EventStore.Client.NodePreference.Random,
"readonlyreplica" => EventStore.Client.NodePreference.ReadOnlyReplica,
- _ => throw new InvalidSettingException($"Invalid NodePreference: {nodePreference}")
+ _ => throw new InvalidSettingException($"Invalid NodePreference: {nodePreference}")
};
}
@@ -184,17 +184,17 @@ private static EventStoreClientSettings CreateSettings(
if (typedOptions.TryGetValue(KeepAliveInterval, out var keepAliveIntervalMs)) {
settings.ConnectivitySettings.KeepAliveInterval = keepAliveIntervalMs switch {
- -1 => Timeout_.InfiniteTimeSpan,
+ -1 => Timeout_.InfiniteTimeSpan,
int value and >= 0 => TimeSpan.FromMilliseconds(value),
- _ => throw new InvalidSettingException($"Invalid KeepAliveInterval: {keepAliveIntervalMs}")
+ _ => throw new InvalidSettingException($"Invalid KeepAliveInterval: {keepAliveIntervalMs}")
};
}
if (typedOptions.TryGetValue(KeepAliveTimeout, out var keepAliveTimeoutMs)) {
settings.ConnectivitySettings.KeepAliveTimeout = keepAliveTimeoutMs switch {
- -1 => Timeout_.InfiniteTimeSpan,
+ -1 => Timeout_.InfiniteTimeSpan,
int value and >= 0 => TimeSpan.FromMilliseconds(value),
- _ => throw new InvalidSettingException($"Invalid KeepAliveTimeout: {keepAliveTimeoutMs}")
+ _ => throw new InvalidSettingException($"Invalid KeepAliveTimeout: {keepAliveTimeoutMs}")
};
}
@@ -221,7 +221,11 @@ private static EventStoreClientSettings CreateSettings(
}
try {
+#if NET9_0_OR_GREATER
+ settings.ConnectivitySettings.TlsCaFile = X509CertificateLoader.LoadCertificateFromFile(tlsCaFilePath);
+#else
settings.ConnectivitySettings.TlsCaFile = new X509Certificate2(tlsCaFilePath);
+#endif
} catch (CryptographicException) {
throw new InvalidClientCertificateException("Failed to load certificate. Invalid file format.");
}
@@ -239,9 +243,9 @@ HttpMessageHandler CreateDefaultHandler() {
return settings.CreateHttpMessageHandler.Invoke();
var handler = new WinHttpHandler {
- TcpKeepAliveEnabled = true,
- TcpKeepAliveTime = settings.ConnectivitySettings.KeepAliveTimeout,
- TcpKeepAliveInterval = settings.ConnectivitySettings.KeepAliveInterval,
+ TcpKeepAliveEnabled = true,
+ TcpKeepAliveTime = settings.ConnectivitySettings.KeepAliveTimeout,
+ TcpKeepAliveInterval = settings.ConnectivitySettings.KeepAliveInterval,
EnableMultipleHttp2Connections = true
};
@@ -285,7 +289,7 @@ HttpMessageHandler CreateDefaultHandler() {
true when settings.ConnectivitySettings.TlsCaFile is not null => (sender, certificate, chain, errors) => {
if (certificate is not X509Certificate2 peerCertificate || chain is null) return false;
- chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust;
+ chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust;
chain.ChainPolicy.CustomTrustStore.Add(settings.ConnectivitySettings.TlsCaFile);
return chain.Build(peerCertificate);
},
diff --git a/test/Directory.Build.props b/test/Directory.Build.props
index 0d2e0dec9..8c770cca2 100644
--- a/test/Directory.Build.props
+++ b/test/Directory.Build.props
@@ -27,6 +27,7 @@
+
@@ -40,4 +41,4 @@
-
\ No newline at end of file
+
diff --git a/test/EventStore.Client.Operations.Tests/AssemblyInfo.cs b/test/EventStore.Client.Operations.Tests/AssemblyInfo.cs
deleted file mode 100644
index b0b47aa73..000000000
--- a/test/EventStore.Client.Operations.Tests/AssemblyInfo.cs
+++ /dev/null
@@ -1 +0,0 @@
-[assembly: CollectionBehavior(DisableTestParallelization = true)]
\ No newline at end of file
diff --git a/test/EventStore.Client.Operations.Tests/EventStore.Client.Operations.Tests.csproj b/test/EventStore.Client.Operations.Tests/EventStore.Client.Operations.Tests.csproj
deleted file mode 100644
index f80438c6b..000000000
--- a/test/EventStore.Client.Operations.Tests/EventStore.Client.Operations.Tests.csproj
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/test/EventStore.Client.Operations.Tests/ResignNodeTests.cs b/test/EventStore.Client.Operations.Tests/ResignNodeTests.cs
deleted file mode 100644
index 6012ae943..000000000
--- a/test/EventStore.Client.Operations.Tests/ResignNodeTests.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-namespace EventStore.Client.Operations.Tests;
-
-public class ResignNodeTests : IClassFixture {
- public ResignNodeTests(ITestOutputHelper output, InsecureClientTestFixture fixture) =>
- Fixture = fixture.With(x => x.CaptureTestRun(output));
-
- InsecureClientTestFixture Fixture { get; }
-
- [Fact]
- public async Task resign_node_does_not_throw() =>
- await Fixture.Operations
- .ResignNodeAsync(userCredentials: TestCredentials.Root)
- .ShouldNotThrowAsync();
-
- [Fact]
- public async Task resign_node_without_credentials_throws() =>
- await Fixture.Operations
- .ResignNodeAsync()
- .ShouldThrowAsync();
-}
\ No newline at end of file
diff --git a/test/EventStore.Client.Operations.Tests/RestartPersistentSubscriptionsTests.cs b/test/EventStore.Client.Operations.Tests/RestartPersistentSubscriptionsTests.cs
deleted file mode 100644
index 1d04d1ca4..000000000
--- a/test/EventStore.Client.Operations.Tests/RestartPersistentSubscriptionsTests.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-namespace EventStore.Client.Operations.Tests;
-
-public class RestartPersistentSubscriptionsTests : IClassFixture {
- public RestartPersistentSubscriptionsTests(ITestOutputHelper output, InsecureClientTestFixture fixture) =>
- Fixture = fixture.With(x => x.CaptureTestRun(output));
-
- InsecureClientTestFixture Fixture { get; }
-
- [Fact]
- public async Task restart_persistent_subscriptions_does_not_throw() =>
- await Fixture.Operations
- .RestartPersistentSubscriptions(userCredentials: TestCredentials.Root)
- .ShouldNotThrowAsync();
-
- [Fact]
- public async Task restart_persistent_subscriptions_without_credentials_throws() =>
- await Fixture.Operations
- .RestartPersistentSubscriptions()
- .ShouldThrowAsync();
-}
\ No newline at end of file
diff --git a/test/EventStore.Client.Operations.Tests/ShutdownNodeAuthenticationTests.cs b/test/EventStore.Client.Operations.Tests/ShutdownNodeAuthenticationTests.cs
deleted file mode 100644
index 4219f616d..000000000
--- a/test/EventStore.Client.Operations.Tests/ShutdownNodeAuthenticationTests.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace EventStore.Client.Operations.Tests;
-
-public class ShutdownNodeAuthenticationTests : IClassFixture {
- public ShutdownNodeAuthenticationTests(ITestOutputHelper output, InsecureClientTestFixture fixture) =>
- Fixture = fixture.With(x => x.CaptureTestRun(output));
-
- InsecureClientTestFixture Fixture { get; }
-
- [Fact]
- public async Task shutdown_without_credentials_throws() =>
- await Fixture.Operations.ShutdownAsync().ShouldThrowAsync();
-}
\ No newline at end of file
diff --git a/test/EventStore.Client.Operations.Tests/ShutdownNodeTests.cs b/test/EventStore.Client.Operations.Tests/ShutdownNodeTests.cs
deleted file mode 100644
index 4c73f52fa..000000000
--- a/test/EventStore.Client.Operations.Tests/ShutdownNodeTests.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace EventStore.Client.Operations.Tests;
-
-public class ShutdownNodeTests : IClassFixture {
- public ShutdownNodeTests(ITestOutputHelper output, InsecureClientTestFixture fixture) =>
- Fixture = fixture.With(x => x.CaptureTestRun(output));
-
- InsecureClientTestFixture Fixture { get; }
-
- [Fact]
- public async Task shutdown_does_not_throw() =>
- await Fixture.Operations.ShutdownAsync(userCredentials: TestCredentials.Root).ShouldNotThrowAsync();
-}
\ No newline at end of file
diff --git a/test/EventStore.Client.PersistentSubscriptions.Tests/AssemblyInfo.cs b/test/EventStore.Client.PersistentSubscriptions.Tests/AssemblyInfo.cs
deleted file mode 100644
index b0b47aa73..000000000
--- a/test/EventStore.Client.PersistentSubscriptions.Tests/AssemblyInfo.cs
+++ /dev/null
@@ -1 +0,0 @@
-[assembly: CollectionBehavior(DisableTestParallelization = true)]
\ No newline at end of file
diff --git a/test/EventStore.Client.PersistentSubscriptions.Tests/Bugs/Issue_1125.cs b/test/EventStore.Client.PersistentSubscriptions.Tests/Bugs/Issue_1125.cs
deleted file mode 100644
index c94429ca3..000000000
--- a/test/EventStore.Client.PersistentSubscriptions.Tests/Bugs/Issue_1125.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-namespace EventStore.Client.PersistentSubscriptions.Tests.Bugs;
-
-public class Issue_1125 : IClassFixture {
- readonly Fixture _fixture;
-
- public Issue_1125(Fixture fixture) => _fixture = fixture;
-
- public static IEnumerable