diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8de9d25..18b14e2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,21 +16,22 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: | 8.0.x 9.0.x + 10.0.x - name: Restore dependencies run: dotnet restore - name: Build run: dotnet build -c Release --no-restore - name: Test - run: dotnet test -c Release --no-build --logger GitHubActions + run: dotnet test -c Release --no-build - name: Upload coverage reports to Codecov with GitHub Action uses: codecov/codecov-action@v5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a88dca0..3068bcf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,23 +6,24 @@ on: tags: - '**' -permissions: - contents: write - jobs: release: + permissions: + id-token: write # enable GitHub OIDC token issuance for this job + contents: write # enable github releases runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: | 8.0.x 9.0.x + 10.0.x - name: Restore dependencies run: dotnet restore @@ -31,8 +32,15 @@ jobs: - name: Package run: dotnet pack -c Release --no-build --property:PackageOutputPath=../../nupkgs + + - name: NuGet login (OIDC → temp API key) + uses: NuGet/login@v1 + id: login + with: + user: viceroypenguin + - name: Push to Nuget - run: dotnet nuget push "./nupkgs/*.nupkg" --source "https://api.nuget.org/v3/index.json" --api-key ${{ secrets.NUGETPUBLISHKEY }} + run: dotnet nuget push "./nupkgs/*.nupkg" --source "https://api.nuget.org/v3/index.json" --api-key ${{ steps.login.outputs.NUGET_API_KEY }} - name: Create Release uses: ncipollo/release-action@v1 diff --git a/Directory.Build.props b/Directory.Build.props index a3449c8..4020a62 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,7 @@ - latest + net8.0;net9.0;net10.0 + 14 enable $(WarningsAsErrors);nullable; @@ -11,12 +12,12 @@ true true - true false + true true true true diff --git a/Directory.Packages.props b/Directory.Packages.props index 90c6e3d..932483c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,12 +6,10 @@ - - - - - - + + + + @@ -22,14 +20,21 @@ - - - - + + + + + + + + + + + - - + + diff --git a/Immediate.Cache.slnx b/Immediate.Cache.slnx index c80f1b3..6492521 100644 --- a/Immediate.Cache.slnx +++ b/Immediate.Cache.slnx @@ -5,6 +5,7 @@ + diff --git a/global.json b/global.json new file mode 100644 index 0000000..f17b86a --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "test": { + "runner": "Microsoft.Testing.Platform" + } +} diff --git a/src/Immediate.Cache.Shared/Immediate.Cache.Shared.csproj b/src/Immediate.Cache.Shared/Immediate.Cache.Shared.csproj index b7d1f0c..8cd9f4d 100644 --- a/src/Immediate.Cache.Shared/Immediate.Cache.Shared.csproj +++ b/src/Immediate.Cache.Shared/Immediate.Cache.Shared.csproj @@ -1,7 +1,6 @@ - net8.0;net9.0 Immediate.Cache @@ -12,8 +11,4 @@ - - - - diff --git a/src/Immediate.Cache/Immediate.Cache.csproj b/src/Immediate.Cache/Immediate.Cache.csproj index 782040c..a1e4184 100644 --- a/src/Immediate.Cache/Immediate.Cache.csproj +++ b/src/Immediate.Cache/Immediate.Cache.csproj @@ -1,7 +1,6 @@ - net8.0;net9.0 true false diff --git a/tests/Immediate.Cache.FunctionalTests/ApplicationCacheTests.cs b/tests/Immediate.Cache.FunctionalTests/ApplicationCacheTests.cs index c5dc751..da522f7 100644 --- a/tests/Immediate.Cache.FunctionalTests/ApplicationCacheTests.cs +++ b/tests/Immediate.Cache.FunctionalTests/ApplicationCacheTests.cs @@ -20,12 +20,12 @@ public ApplicationCacheTests() _serviceProvider = services.BuildServiceProvider(); } - [Test] + [Fact] public async Task GetValueCachesValue() { var request = new GetValue.Query(Value: 1); var cache = _serviceProvider.GetRequiredService(); - var response = await cache.GetValue(request); + var response = await cache.GetValue(request, TestContext.Current.CancellationToken); Assert.Equal(1, response.Value); Assert.True(response.ExecutedHandler); @@ -34,7 +34,7 @@ public async Task GetValueCachesValue() Assert.True(memoryCache.TryGetValue($"GetValue(query: {request.Value})", out var _)); } - [Test] + [Fact] public async Task SetValueCachesValue() { var request = new GetValue.Query(Value: 2); @@ -44,13 +44,13 @@ public async Task SetValueCachesValue() var memoryCache = _serviceProvider.GetRequiredService(); Assert.True(memoryCache.TryGetValue($"GetValue(query: {request.Value})", out var _)); - var response = await cache.GetValue(request); + var response = await cache.GetValue(request, TestContext.Current.CancellationToken); Assert.Equal(4, response.Value); Assert.False(response.ExecutedHandler); } - [Test] + [Fact] public async Task RemoveValueRemovesValue() { var request = new GetValue.Query(Value: 3); @@ -60,20 +60,20 @@ public async Task RemoveValueRemovesValue() var memoryCache = _serviceProvider.GetRequiredService(); Assert.True(memoryCache.TryGetValue($"GetValue(query: {request.Value})", out var _)); - var response = await cache.GetValue(request); + var response = await cache.GetValue(request, TestContext.Current.CancellationToken); Assert.Equal(4, response.Value); Assert.False(response.ExecutedHandler); cache.RemoveValue(request); - response = await cache.GetValue(request); + response = await cache.GetValue(request, TestContext.Current.CancellationToken); Assert.Equal(3, response.Value); Assert.True(response.ExecutedHandler); } - [Test] + [Fact] public async Task SimultaneousAccessIsSerialized() { var request1 = new DelayGetValue.Query() @@ -89,8 +89,8 @@ public async Task SimultaneousAccessIsSerialized() }; var cache = _serviceProvider.GetRequiredService(); - var response1Task = cache.GetValue(request1); - var response2Task = cache.GetValue(request2); + var response1Task = cache.GetValue(request1, TestContext.Current.CancellationToken); + var response2Task = cache.GetValue(request2, TestContext.Current.CancellationToken); // both waiting until tcs triggered Assert.False(response1Task.IsCompleted); @@ -121,7 +121,7 @@ public async Task SimultaneousAccessIsSerialized() Assert.Equal(response1.RandomValue, response2.RandomValue); } - [Test] + [Fact] public async Task ProperlyUsesCancellationToken() { var request = new DelayGetValue.Query() @@ -150,13 +150,13 @@ public async Task ProperlyUsesCancellationToken() Name = "Request2", }; - var response = await cache.GetValue(request2); + _ = await cache.GetValue(request2, TestContext.Current.CancellationToken); Assert.Equal(1, request.TimesExecuted); Assert.Equal(0, request2.TimesExecuted); } - [Test] + [Fact] public async Task CancellingFirstAccessOperatesCorrectly() { using var cts1 = new CancellationTokenSource(); @@ -196,7 +196,7 @@ public async Task CancellingFirstAccessOperatesCorrectly() Assert.True(response2Task.IsCanceled); } - [Test] + [Fact] public async Task CancellingSecondAccessOperatesCorrectly() { using var cts1 = new CancellationTokenSource(); @@ -236,7 +236,7 @@ public async Task CancellingSecondAccessOperatesCorrectly() Assert.True(response2Task.IsCanceled); } - [Test] + [Fact] public async Task RemovingValueCancelsExistingOperation() { var request = new DelayGetValue.Query() @@ -265,7 +265,7 @@ public async Task RemovingValueCancelsExistingOperation() Assert.True(response.ExecutedHandler); } - [Test] + [Fact] public async Task SettingValueCancelsExistingOperation() { var request = new DelayGetValue.Query() @@ -275,7 +275,7 @@ public async Task SettingValueCancelsExistingOperation() }; var cache = _serviceProvider.GetRequiredService(); - var responseTask = cache.GetValue(request, default); + var responseTask = cache.GetValue(request, TestContext.Current.CancellationToken); await request.WaitForTestToStartExecuting.Task; @@ -291,7 +291,7 @@ public async Task SettingValueCancelsExistingOperation() Assert.Equal(1, request.TimesCancelled); } - [Test] + [Fact] public async Task ExceptionGetsPropagatedCorrectly() { var request = new DelayGetValue.Query() @@ -302,13 +302,13 @@ public async Task ExceptionGetsPropagatedCorrectly() }; var cache = _serviceProvider.GetRequiredService(); - var responseTask = cache.GetValue(request, default); + var responseTask = cache.GetValue(request, TestContext.Current.CancellationToken); var ex = await Assert.ThrowsAsync(async () => await responseTask); Assert.Equal("Test Exception 1", ex.Message); } - [Test] + [Fact] public async Task TransformWorksWhenNoValueCachedInitially() { var request = new DelayGetValue.Query() @@ -327,13 +327,13 @@ public async Task TransformWorksWhenNoValueCachedInitially() Assert.Equal(6, transformedResponse.Value); Assert.Equal(1, transformation.TimesExecuted); - var cachedResponse = await cache.GetValue(request); + var cachedResponse = await cache.GetValue(request, TestContext.Current.CancellationToken); Assert.Equal(6, cachedResponse.Value); Assert.True(cachedResponse.RandomValue == transformedResponse.RandomValue); } - [Test] + [Fact] public async Task TransformWorksWhenValueCachedInitially() { var request = new DelayGetValue.Query() @@ -345,7 +345,7 @@ public async Task TransformWorksWhenValueCachedInitially() var cache = _serviceProvider.GetRequiredService(); - var cachedResponse = await cache.GetValue(request); + var cachedResponse = await cache.GetValue(request, TestContext.Current.CancellationToken); Assert.Equal(1, cachedResponse.Value); var transformation = new DelayGetValueCache.TransformParameters { Adder = 5 }; @@ -355,13 +355,13 @@ public async Task TransformWorksWhenValueCachedInitially() Assert.Equal(6, transformedResponse.Value); Assert.Equal(1, transformation.TimesExecuted); - cachedResponse = await cache.GetValue(request); + cachedResponse = await cache.GetValue(request, TestContext.Current.CancellationToken); Assert.Equal(6, cachedResponse.Value); Assert.True(cachedResponse.RandomValue == transformedResponse.RandomValue); } - [Test] + [Fact] public async Task TransformWorksWhenValueChanges() { var request = new DelayGetValue.Query() @@ -373,7 +373,7 @@ public async Task TransformWorksWhenValueChanges() var cache = _serviceProvider.GetRequiredService(); - var cachedResponse = await cache.GetValue(request); + var cachedResponse = await cache.GetValue(request, TestContext.Current.CancellationToken); Assert.Equal(1, cachedResponse.Value); var transformation = new DelayGetValueCache.TransformParameters { Adder = 5 }; @@ -387,13 +387,13 @@ public async Task TransformWorksWhenValueChanges() Assert.Equal(9, transformedResponse.Value); Assert.Equal(2, transformation.TimesExecuted); - cachedResponse = await cache.GetValue(request); + cachedResponse = await cache.GetValue(request, TestContext.Current.CancellationToken); Assert.Equal(9, cachedResponse.Value); Assert.True(cachedResponse.RandomValue == transformedResponse.RandomValue); } - [Test] + [Fact] public async Task TransformWorksWhenMultipleSimultaneous() { var request = new DelayGetValue.Query() diff --git a/tests/Immediate.Cache.FunctionalTests/Immediate.Cache.FunctionalTests.csproj b/tests/Immediate.Cache.FunctionalTests/Immediate.Cache.FunctionalTests.csproj index f9234de..7078f23 100644 --- a/tests/Immediate.Cache.FunctionalTests/Immediate.Cache.FunctionalTests.csproj +++ b/tests/Immediate.Cache.FunctionalTests/Immediate.Cache.FunctionalTests.csproj @@ -1,27 +1,19 @@ - + - net8.0;net9.0 + Exe - - - - + + - - - - - +