Skip to content

Commit 2453f70

Browse files
committed
.NET 9, proper byte[] support for FileCache
1 parent a7719a8 commit 2453f70

File tree

7 files changed

+65
-27
lines changed

7 files changed

+65
-27
lines changed

DigitalRuby.SimpleCache.Sandbox/DigitalRuby.SimpleCache.Sandbox.csproj

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net8.0</TargetFramework>
5+
<TargetFramework>net9.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
</PropertyGroup>
@@ -18,8 +18,8 @@
1818
</ItemGroup>
1919

2020
<ItemGroup>
21-
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
22-
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="6.0.0" />
21+
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.1" />
22+
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.1" />
2323
</ItemGroup>
2424

2525
<ItemGroup>

DigitalRuby.SimpleCache.Tests/DigitalRuby.SimpleCache.Tests.csproj

+12-6
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
4+
<TargetFramework>net9.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77

88
<IsPackable>false</IsPackable>
99
</PropertyGroup>
1010

1111
<ItemGroup>
12-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
13-
<PackageReference Include="NUnit" Version="3.13.3" />
14-
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
15-
<PackageReference Include="NUnit.Analyzers" Version="3.3.0" />
16-
<PackageReference Include="coverlet.collector" Version="3.1.2" />
12+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
13+
<PackageReference Include="NUnit" Version="4.3.2" />
14+
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
15+
<PackageReference Include="NUnit.Analyzers" Version="4.6.0">
16+
<PrivateAssets>all</PrivateAssets>
17+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
18+
</PackageReference>
19+
<PackageReference Include="coverlet.collector" Version="6.0.4">
20+
<PrivateAssets>all</PrivateAssets>
21+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
22+
</PackageReference>
1723
</ItemGroup>
1824

1925
<ItemGroup>

DigitalRuby.SimpleCache.Tests/FileCacheTests.cs

+20-5
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,8 @@ public async Task TestFileCache()
8181
tasks.Add(Task.Run(async () =>
8282
{
8383
var item2 = await fileCache.GetAsync<string>("key_" + iCopy);
84-
Assert.Multiple(() =>
85-
{
86-
Assert.That(item2, Is.Not.Null);
87-
Assert.That("key_" + iCopy + "_" + data, Is.EqualTo(item2!.Item));
88-
});
84+
Assert.That(item2, Is.Not.Null);
85+
Assert.That("key_" + iCopy + "_" + data, Is.EqualTo(item2!.Item));
8986
}));
9087
}
9188
await Task.WhenAll(tasks);
@@ -144,4 +141,22 @@ public async Task TestFileCache()
144141
var result = await fileCache.GetAsync<string>("key");
145142
Assert.That(result, Is.Null);
146143
}
144+
145+
/// <summary>
146+
/// Test file cache bytes
147+
/// </summary>
148+
/// <returns>Task</returns>
149+
[Test]
150+
public async Task TestBytes()
151+
{
152+
using FileCache fileCache = new(new() { FreeSpaceThreshold = 20 }, new JsonLZ4Serializer(), this, this, new NullLogger<FileCache>());
153+
var bytes = new byte[999999];
154+
Random.Shared.NextBytes(bytes);
155+
var foundBytes = await fileCache.GetAsync<byte[]>("testbytes");
156+
Assert.That(foundBytes, Is.Null);
157+
await fileCache.SetAsync("testbytes", bytes, new CacheParameters(TimeSpan.FromSeconds(9999.0)));
158+
var foundBytes2 = await fileCache.GetAsync<byte[]>("testbytes");
159+
Assert.That(foundBytes2?.Item, Is.Not.Null);
160+
Assert.That(foundBytes2!.Item, Is.EqualTo(bytes));
161+
}
147162
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
global using System.Diagnostics;
2+
global using System.Linq;
23

34
global using Microsoft.Extensions.Caching.Memory;
45
global using Microsoft.Extensions.Internal;
56
global using Microsoft.Extensions.Logging.Abstractions;
67
global using Microsoft.Extensions.Options;
78

8-
global using DigitalRuby.SimpleCache;
9-
109
global using NUnit.Framework;
1110

1211
namespace DigitalRuby.SimpleCache;

DigitalRuby.SimpleCache.Tests/LayeredCacheTests.cs

+9
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ public void Setup()
2323
memoryCache, fileCache, distributedCache, this, new NullLogger<LayeredCache>());
2424
}
2525

26+
/// <summary>
27+
/// Teardown
28+
/// </summary>
29+
[TearDown]
30+
public void Teardown()
31+
{
32+
layeredCache?.Dispose();
33+
}
34+
2635
/// <summary>
2736
/// Test GetOrCreate prevents cache storm
2837
/// </summary>

DigitalRuby.SimpleCache/DigitalRuby.SimpleCache.csproj

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
4+
<TargetFramework>net9.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
88
<GenerateDocumentationFile>true</GenerateDocumentationFile>
99
<IsPackable>true</IsPackable>
10-
<Version>2.0.1</Version>
10+
<Version>3.0.1</Version>
1111
<Title>Simple Cache</Title>
1212
<Authors>jjxtra</Authors>
1313
<Company>Digital Ruby, LLC</Company>
@@ -18,7 +18,7 @@
1818
<PackageReadmeFile>README.md</PackageReadmeFile>
1919
<RepositoryUrl>https://github.com/DigitalRuby/SimplePubSub</RepositoryUrl>
2020
<PackageTags>cache;simple;easy;ram;memory;file;disk;redis;distributed;idistributedcache;iconnectionmultiplexer;lock;distributedlock;stackexchange;stackoverflow;connectionmultiplexer;lazy;task;storm;lazycache;caching;invalidation;expiration;synchronization;powerful;layer;layers;layered;layeredcache</PackageTags>
21-
<PackageReleaseNotes>.NET 8</PackageReleaseNotes>
21+
<PackageReleaseNotes>.NET 9</PackageReleaseNotes>
2222
<AssemblyVersion></AssemblyVersion>
2323
<FileVersion></FileVersion>
2424
<PackageLicenseExpression>MIT</PackageLicenseExpression>
@@ -37,12 +37,12 @@
3737

3838
<ItemGroup>
3939
<PackageReference Include="DigitalRuby.Polly.Contrib.DuplicateRequestCollapser" Version="0.3.0-v030-0001" />
40-
<PackageReference Include="K4os.Compression.LZ4.Streams" Version="1.3.6" />
41-
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
42-
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="8.0.0" />
43-
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.0" />
44-
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0" />
45-
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
40+
<PackageReference Include="K4os.Compression.LZ4.Streams" Version="1.3.8" />
41+
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.1" />
42+
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.1" />
43+
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.1" />
44+
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.1" />
45+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.1" />
4646
<PackageReference Include="SauceControl.Blake2Fast" Version="2.0.0" />
4747
</ItemGroup>
4848

DigitalRuby.SimpleCache/FileCache.cs

+11-2
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ public Task ClearAsync()
208208
/// <inheritdoc />
209209
public sealed class FileCache : BackgroundService, IFileCache
210210
{
211+
private static readonly Type byteArrayType = typeof(byte[]);
211212
private static readonly TimeSpan cleanupLoopDelay = TimeSpan.FromMilliseconds(1.0);
212213

213214
private readonly MultithreadedKeyLocker keyLocker = new(512);
@@ -323,8 +324,16 @@ public FileCache(FileCacheOptions options,
323324
{
324325
throw new IOException("Byte counts are off for file cache item");
325326
}
326-
var item = (T?)Serializer.Deserialize(bytes, typeof(T?)) ?? throw new IOException("Corrupt cache file " + fileName);
327-
var result = new FileCacheItem<T>(new DateTimeOffset(ticks, TimeSpan.Zero), item, size);
327+
FileCacheItem<T> result;
328+
if (typeof(T) == byteArrayType)
329+
{
330+
result = new FileCacheItem<T>(new DateTimeOffset(ticks, TimeSpan.Zero), (T)(object)bytes, size);
331+
}
332+
else
333+
{
334+
var item = (T?)Serializer.Deserialize(bytes, typeof(T?)) ?? throw new IOException("Corrupt cache file " + fileName);
335+
result = new FileCacheItem<T>(new DateTimeOffset(ticks, TimeSpan.Zero), item, size);
336+
}
328337
logger.LogDebug("File cache hit {key}, {fileName}", key, fileName);
329338
return result;
330339
}

0 commit comments

Comments
 (0)