sprints work
This commit is contained in:
@@ -21,7 +21,7 @@ public sealed class SliceEndpointsTests : IClassFixture<ScannerApplicationFixtur
|
||||
public SliceEndpointsTests(ScannerApplicationFixture fixture)
|
||||
{
|
||||
_fixture = fixture;
|
||||
_client = fixture.CreateClient();
|
||||
_client = fixture.Factory.CreateClient();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -346,7 +346,11 @@ public sealed class SliceDiffComputerTests
|
||||
Status = SliceVerdictStatus.Reachable,
|
||||
Confidence = 0.95
|
||||
},
|
||||
Manifest = new Scanner.Core.ScanManifest()
|
||||
Manifest = Scanner.Core.ScanManifest.CreateBuilder("test-scan", "sha256:test")
|
||||
.WithConcelierSnapshot("sha256:concel")
|
||||
.WithExcititorSnapshot("sha256:excititor")
|
||||
.WithLatticePolicyHash("sha256:policy")
|
||||
.Build()
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -357,120 +361,118 @@ public sealed class SliceDiffComputerTests
|
||||
public sealed class SliceCacheTests
|
||||
{
|
||||
[Fact]
|
||||
public void TryGet_EmptyCache_ReturnsFalse()
|
||||
public async Task TryGetAsync_EmptyCache_ReturnsNull()
|
||||
{
|
||||
// Arrange
|
||||
var options = Microsoft.Extensions.Options.Options.Create(new SliceCacheOptions());
|
||||
using var cache = new SliceCache(options);
|
||||
|
||||
// Act
|
||||
var found = cache.TryGet("nonexistent", out var entry);
|
||||
var result = await cache.TryGetAsync("nonexistent");
|
||||
|
||||
// Assert
|
||||
Assert.False(found);
|
||||
Assert.Null(entry);
|
||||
Assert.Null(result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Set_ThenGet_ReturnsEntry()
|
||||
public async Task SetAsync_ThenTryGetAsync_ReturnsEntry()
|
||||
{
|
||||
// Arrange
|
||||
var options = Microsoft.Extensions.Options.Options.Create(new SliceCacheOptions());
|
||||
using var cache = new SliceCache(options);
|
||||
var slice = CreateTestSlice();
|
||||
var cacheResult = CreateTestCacheResult();
|
||||
|
||||
// Act
|
||||
cache.Set("key1", slice, "sha256:abc123");
|
||||
var found = cache.TryGet("key1", out var entry);
|
||||
await cache.SetAsync("key1", cacheResult, TimeSpan.FromMinutes(5));
|
||||
var result = await cache.TryGetAsync("key1");
|
||||
|
||||
// Assert
|
||||
Assert.True(found);
|
||||
Assert.NotNull(entry);
|
||||
Assert.Equal("sha256:abc123", entry.Digest);
|
||||
Assert.NotNull(result);
|
||||
Assert.Equal("sha256:abc123", result!.SliceDigest);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryGet_IncrementsCacheStats()
|
||||
public async Task TryGetAsync_IncrementsCacheStats()
|
||||
{
|
||||
// Arrange
|
||||
var options = Microsoft.Extensions.Options.Options.Create(new SliceCacheOptions());
|
||||
using var cache = new SliceCache(options);
|
||||
var slice = CreateTestSlice();
|
||||
cache.Set("key1", slice, "sha256:abc123");
|
||||
var cacheResult = CreateTestCacheResult();
|
||||
await cache.SetAsync("key1", cacheResult, TimeSpan.FromMinutes(5));
|
||||
|
||||
// Act
|
||||
cache.TryGet("key1", out _); // hit
|
||||
cache.TryGet("missing", out _); // miss
|
||||
await cache.TryGetAsync("key1"); // hit
|
||||
await cache.TryGetAsync("missing"); // miss
|
||||
|
||||
var stats = cache.GetStats();
|
||||
var stats = cache.GetStatistics();
|
||||
|
||||
// Assert
|
||||
Assert.Equal(1, stats.HitCount);
|
||||
Assert.Equal(1, stats.MissCount);
|
||||
Assert.Equal(0.5, stats.HitRate);
|
||||
Assert.Equal(0.5, stats.HitRate, 2);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Clear_RemovesAllEntries()
|
||||
public async Task ClearAsync_RemovesAllEntries()
|
||||
{
|
||||
// Arrange
|
||||
var options = Microsoft.Extensions.Options.Options.Create(new SliceCacheOptions());
|
||||
using var cache = new SliceCache(options);
|
||||
var slice = CreateTestSlice();
|
||||
cache.Set("key1", slice, "sha256:abc123");
|
||||
cache.Set("key2", slice, "sha256:def456");
|
||||
var cacheResult = CreateTestCacheResult();
|
||||
await cache.SetAsync("key1", cacheResult, TimeSpan.FromMinutes(5));
|
||||
await cache.SetAsync("key2", cacheResult, TimeSpan.FromMinutes(5));
|
||||
|
||||
// Act
|
||||
cache.Clear();
|
||||
var stats = cache.GetStats();
|
||||
await cache.ClearAsync();
|
||||
var stats = cache.GetStatistics();
|
||||
|
||||
// Assert
|
||||
Assert.Equal(0, stats.ItemCount);
|
||||
Assert.Equal(0, stats.EntryCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Invalidate_RemovesSpecificEntry()
|
||||
public async Task RemoveAsync_RemovesSpecificEntry()
|
||||
{
|
||||
// Arrange
|
||||
var options = Microsoft.Extensions.Options.Options.Create(new SliceCacheOptions());
|
||||
using var cache = new SliceCache(options);
|
||||
var slice = CreateTestSlice();
|
||||
cache.Set("key1", slice, "sha256:abc123");
|
||||
cache.Set("key2", slice, "sha256:def456");
|
||||
var cacheResult = CreateTestCacheResult();
|
||||
await cache.SetAsync("key1", cacheResult, TimeSpan.FromMinutes(5));
|
||||
await cache.SetAsync("key2", cacheResult, TimeSpan.FromMinutes(5));
|
||||
|
||||
// Act
|
||||
cache.Invalidate("key1");
|
||||
await cache.RemoveAsync("key1");
|
||||
|
||||
// Assert
|
||||
Assert.False(cache.TryGet("key1", out _));
|
||||
Assert.True(cache.TryGet("key2", out _));
|
||||
Assert.Null(await cache.TryGetAsync("key1"));
|
||||
Assert.NotNull(await cache.TryGetAsync("key2"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Disabled_NeverCaches()
|
||||
public async Task Disabled_NeverCaches()
|
||||
{
|
||||
// Arrange
|
||||
var options = Microsoft.Extensions.Options.Options.Create(new SliceCacheOptions { Enabled = false });
|
||||
using var cache = new SliceCache(options);
|
||||
var slice = CreateTestSlice();
|
||||
var cacheResult = CreateTestCacheResult();
|
||||
|
||||
// Act
|
||||
cache.Set("key1", slice, "sha256:abc123");
|
||||
var found = cache.TryGet("key1", out _);
|
||||
await cache.SetAsync("key1", cacheResult, TimeSpan.FromMinutes(5));
|
||||
var result = await cache.TryGetAsync("key1");
|
||||
|
||||
// Assert
|
||||
Assert.False(found);
|
||||
Assert.Null(result);
|
||||
}
|
||||
|
||||
private static ReachabilitySlice CreateTestSlice()
|
||||
private static CachedSliceResult CreateTestCacheResult()
|
||||
{
|
||||
return new ReachabilitySlice
|
||||
return new CachedSliceResult
|
||||
{
|
||||
Inputs = new SliceInputs { GraphDigest = "sha256:graph123" },
|
||||
Query = new SliceQuery(),
|
||||
Subgraph = new SliceSubgraph(),
|
||||
Verdict = new SliceVerdict { Status = SliceVerdictStatus.Unknown, Confidence = 0.0 },
|
||||
Manifest = new Scanner.Core.ScanManifest()
|
||||
SliceDigest = "sha256:abc123",
|
||||
Verdict = "Reachable",
|
||||
Confidence = 0.95,
|
||||
PathWitnesses = new List<string> { "main->vuln" },
|
||||
CachedAt = DateTimeOffset.UtcNow
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user