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
-
-
-
-
+
+
-
-
-
-
-
+