Add tests for SBOM generation determinism across multiple formats

- Created `StellaOps.TestKit.Tests` project for unit tests related to determinism.
- Implemented `DeterminismManifestTests` to validate deterministic output for canonical bytes and strings, file read/write operations, and error handling for invalid schema versions.
- Added `SbomDeterminismTests` to ensure identical inputs produce consistent SBOMs across SPDX 3.0.1 and CycloneDX 1.6/1.7 formats, including parallel execution tests.
- Updated project references in `StellaOps.Integration.Determinism` to include the new determinism testing library.
This commit is contained in:
master
2025-12-23 18:56:12 +02:00
committed by StellaOps Bot
parent 7ac70ece71
commit 491e883653
409 changed files with 23797 additions and 17779 deletions

View File

@@ -157,6 +157,42 @@ public sealed class GhsaConnectorTests : IAsyncLifetime
Assert.Empty(pendingMappings.AsDocumentArray);
}
[Fact]
public async Task FetchAsync_ResumesFromPersistedCursorWindow()
{
var initialTime = new DateTimeOffset(2024, 10, 7, 0, 0, 0, TimeSpan.Zero);
await EnsureHarnessAsync(initialTime);
var harness = _harness!;
var since = initialTime - TimeSpan.FromDays(8);
var until = initialTime - TimeSpan.FromDays(7);
var stateRepository = harness.ServiceProvider.GetRequiredService<ISourceStateRepository>();
await stateRepository.UpdateCursorAsync(
GhsaConnectorPlugin.SourceName,
new DocumentObject
{
["currentWindowStart"] = since.UtcDateTime,
["currentWindowEnd"] = until.UtcDateTime,
["nextPage"] = 2,
["pendingDocuments"] = new DocumentArray(),
["pendingMappings"] = new DocumentArray(),
},
initialTime,
CancellationToken.None);
var listUri = new Uri($"https://ghsa.test/security/advisories?updated_since={Uri.EscapeDataString(since.ToString("O"))}&updated_until={Uri.EscapeDataString(until.ToString("O"))}&page=2&per_page=5");
harness.Handler.AddJsonResponse(listUri, """{"advisories":[],"pagination":{"page":2,"has_next_page":false}}""");
harness.Handler.SetFallback(_ => new HttpResponseMessage(HttpStatusCode.NotFound));
var connector = new GhsaConnectorPlugin().Create(harness.ServiceProvider);
await connector.FetchAsync(harness.ServiceProvider, CancellationToken.None);
var request = Assert.Single(harness.Handler.Requests);
Assert.Equal(listUri, request.Uri);
harness.Handler.AssertNoPendingResponses();
}
private async Task EnsureHarnessAsync(DateTimeOffset initialTime)
{
if (_harness is not null)