sprints work

This commit is contained in:
StellaOps Bot
2025-12-24 21:46:08 +02:00
parent 43e2af88f6
commit b9f71fc7e9
161 changed files with 29566 additions and 527 deletions

View File

@@ -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
};
}
}