up
Some checks failed
Feedser CI / build-and-test (push) Has been cancelled

This commit is contained in:
2025-10-06 01:13:41 +03:00
parent b6ef66e057
commit bb7eda17a8
163 changed files with 801 additions and 248 deletions

View File

@@ -117,6 +117,7 @@ You have to read `./ARCHITECTURE.md` for more information.
- **Determinism**: Sort keys, normalize timestamps to UTC ISO8601, avoid nondeterministic data in exports and tests.
- **Status tracking**: Update your modules `TASKS.md` as you progress (TODO → DOING → DONE/BLOCKED).
- **Tests**: Add/extend fixtures and unit tests per change; never regress determinism or precedence.
- **Test layout**: Use module-specific projects in `StellaOps.Feedser.<Component>.Tests`; shared fixtures/harnesses live in `StellaOps.Feedser.Testing`.
---

View File

@@ -62,7 +62,7 @@ StellaOps.Feedser.Normalization/ # Canonical mappers, validators, version-ra
StellaOps.Feedser.Merge/ # Identity graph, precedence, deterministic merge
StellaOps.Feedser.Exporter.Json/
StellaOps.Feedser.Exporter.TrivyDb/
StellaOps.Feedser.Tests/ # Unit, component, integration & golden fixtures
StellaOps.Feedser.<Component>.Tests/ # Component-scoped unit/integration suites (Core, Storage.Mongo, Source.*, Exporter.*, WebService, etc.)
```
---

View File

@@ -11,4 +11,19 @@
<ExcludeAssets>runtime</ExcludeAssets>
</ProjectReference>
</ItemGroup>
<ItemGroup Condition="$([System.String]::Copy('$(MSBuildProjectName)').EndsWith('.Tests'))">
<PackageReference Include="coverlet.collector" Version="6.0.4" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.8" />
<PackageReference Include="Mongo2Go" Version="3.1.3" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" Version="8.4.0" />
<Compile Include="$(MSBuildThisFileDirectory)StellaOps.Feedser.Tests.Shared\AssemblyInfo.cs" Link="Shared\AssemblyInfo.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StellaOps.Feedser.Tests.Shared\MongoFixtureCollection.cs" Link="Shared\MongoFixtureCollection.cs" />
<ProjectReference Include="$(MSBuildThisFileDirectory)StellaOps.Feedser.Testing\StellaOps.Feedser.Testing.csproj" />
<Using Include="StellaOps.Feedser.Testing" />
<Using Include="Xunit" />
</ItemGroup>
</Project>

View File

@@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using StellaOps.Feedser.Core.Jobs;
namespace StellaOps.Feedser.Tests.Core;
namespace StellaOps.Feedser.Core.Tests;
public sealed class JobCoordinatorTests
{

View File

@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../StellaOps.Feedser.Core/StellaOps.Feedser.Core.csproj" />
</ItemGroup>
</Project>

View File

@@ -25,3 +25,8 @@ Out: business logic of connectors/exporters, HTTP handlers (owned by WebService)
- Metrics: job.run.started/succeeded/failed, job.durationMs, job.concurrent.rejected, job.alreadyRunning.
- Logs: kind, trigger, params hash, lease holder, outcome; redact params containing secrets.
- Honor CancellationToken early and often.
## Tests
- Author and review coverage in `../StellaOps.Feedser.Core.Tests`.
- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`.
- Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios.

View File

@@ -10,7 +10,7 @@ using System.Threading.Tasks;
using StellaOps.Feedser.Exporter.Json;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Exporter.Json;
namespace StellaOps.Feedser.Exporter.Json.Tests;
public sealed class JsonExportSnapshotBuilderTests : IDisposable
{

View File

@@ -11,7 +11,7 @@ using StellaOps.Feedser.Storage.Mongo.Advisories;
using StellaOps.Feedser.Storage.Mongo.Exporting;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Exporter.Json;
namespace StellaOps.Feedser.Exporter.Json.Tests;
public sealed class JsonExporterDependencyInjectionRoutineTests
{

View File

@@ -8,7 +8,7 @@ using System.Threading.Tasks;
using StellaOps.Feedser.Exporter.Json;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Exporter.Json;
namespace StellaOps.Feedser.Exporter.Json.Tests;
public sealed class JsonExporterParitySmokeTests : IDisposable
{

View File

@@ -15,7 +15,7 @@ using StellaOps.Feedser.Models;
using StellaOps.Feedser.Storage.Mongo.Advisories;
using StellaOps.Feedser.Storage.Mongo.Exporting;
namespace StellaOps.Feedser.Tests.Exporter.Json;
namespace StellaOps.Feedser.Exporter.Json.Tests;
public sealed class JsonFeedExporterTests : IDisposable
{

View File

@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../StellaOps.Feedser.Core/StellaOps.Feedser.Core.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Exporter.Json/StellaOps.Feedser.Exporter.Json.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" />
</ItemGroup>
</Project>

View File

@@ -4,7 +4,7 @@ using System.IO;
using StellaOps.Feedser.Exporter.Json;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Exporter.Json;
namespace StellaOps.Feedser.Exporter.Json.Tests;
public sealed class VulnListJsonExportPathResolverTests
{

View File

@@ -21,3 +21,8 @@ Out: ORAS push and Trivy DB BoltDB writing (owned by Trivy exporter).
## Observability & security expectations
- Metrics: export.json.records, bytes, duration, delta.changed.
- Logs: target path, record counts, digest; no sensitive data.
## Tests
- Author and review coverage in `../StellaOps.Feedser.Exporter.Json.Tests`.
- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`.
- Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios.

View File

@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../StellaOps.Feedser.Exporter.Json/StellaOps.Feedser.Exporter.Json.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Exporter.TrivyDb/StellaOps.Feedser.Exporter.TrivyDb.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" />
</ItemGroup>
</Project>

View File

@@ -2,7 +2,7 @@ using System;
using StellaOps.Feedser.Exporter.TrivyDb;
using StellaOps.Feedser.Storage.Mongo.Exporting;
namespace StellaOps.Feedser.Tests.Exporter.TrivyDb;
namespace StellaOps.Feedser.Exporter.TrivyDb.Tests;
public sealed class TrivyDbExportPlannerTests
{

View File

@@ -14,7 +14,7 @@ using StellaOps.Feedser.Models;
using StellaOps.Feedser.Storage.Mongo.Advisories;
using StellaOps.Feedser.Storage.Mongo.Exporting;
namespace StellaOps.Feedser.Tests.Exporter.TrivyDb;
namespace StellaOps.Feedser.Exporter.TrivyDb.Tests;
public sealed class TrivyDbFeedExporterTests : IDisposable
{

View File

@@ -7,7 +7,7 @@ using System.Text.Json;
using System.Security.Cryptography;
using StellaOps.Feedser.Exporter.TrivyDb;
namespace StellaOps.Feedser.Tests.Exporter.TrivyDb;
namespace StellaOps.Feedser.Exporter.TrivyDb.Tests;
public sealed class TrivyDbOciWriterTests : IDisposable
{

View File

@@ -6,7 +6,7 @@ using System.Text;
using System.Text.Json;
using StellaOps.Feedser.Exporter.TrivyDb;
namespace StellaOps.Feedser.Tests.Exporter.TrivyDb;
namespace StellaOps.Feedser.Exporter.TrivyDb.Tests;
public sealed class TrivyDbPackageBuilderTests
{

View File

@@ -22,3 +22,8 @@ Out: signing (external pipeline), scanner behavior.
## Observability & security expectations
- Metrics: export.trivy.records, size_bytes, duration, oras.push.success/fail.
- Logs: export path, repo/tag, digest; redact credentials; backoff on push errors.
## Tests
- Author and review coverage in `../StellaOps.Feedser.Exporter.TrivyDb.Tests`.
- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`.
- Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios.

View File

@@ -4,7 +4,7 @@ using Microsoft.Extensions.Time.Testing;
using StellaOps.Feedser.Merge.Services;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Merge;
namespace StellaOps.Feedser.Merge.Tests;
public sealed class AdvisoryPrecedenceMergerTests
{

View File

@@ -2,7 +2,7 @@ using System;
using StellaOps.Feedser.Merge.Services;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Merge;
namespace StellaOps.Feedser.Merge.Tests;
public sealed class AffectedPackagePrecedenceResolverTests
{

View File

@@ -2,7 +2,7 @@ using System.Linq;
using StellaOps.Feedser.Merge.Services;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Merge;
namespace StellaOps.Feedser.Merge.Tests;
public sealed class CanonicalHashCalculatorTests
{

View File

@@ -1,7 +1,7 @@
using StellaOps.Feedser.Merge.Comparers;
using StellaOps.Feedser.Normalization.Distro;
namespace StellaOps.Feedser.Tests.Merge;
namespace StellaOps.Feedser.Merge.Tests;
public sealed class DebianEvrComparerTests
{

View File

@@ -4,7 +4,7 @@ using StellaOps.Feedser.Merge.Services;
using StellaOps.Feedser.Models;
using StellaOps.Feedser.Storage.Mongo.MergeEvents;
namespace StellaOps.Feedser.Tests.Merge;
namespace StellaOps.Feedser.Merge.Tests;
public sealed class MergeEventWriterTests
{

View File

@@ -9,9 +9,9 @@ using StellaOps.Feedser.Merge.Services;
using StellaOps.Feedser.Models;
using StellaOps.Feedser.Storage.Mongo;
using StellaOps.Feedser.Storage.Mongo.MergeEvents;
using StellaOps.Feedser.Tests.Storage;
using StellaOps.Feedser.Testing;
namespace StellaOps.Feedser.Tests.Merge;
namespace StellaOps.Feedser.Merge.Tests;
[Collection("mongo-fixture")]
public sealed class MergePrecedenceIntegrationTests : IAsyncLifetime

View File

@@ -1,7 +1,7 @@
using StellaOps.Feedser.Merge.Comparers;
using StellaOps.Feedser.Normalization.Distro;
namespace StellaOps.Feedser.Tests.Merge;
namespace StellaOps.Feedser.Merge.Tests;
public sealed class NevraComparerTests
{

View File

@@ -1,6 +1,6 @@
using StellaOps.Feedser.Merge.Comparers;
namespace StellaOps.Feedser.Tests.Merge;
namespace StellaOps.Feedser.Merge.Tests;
public sealed class SemanticVersionRangeResolverTests
{

View File

@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../StellaOps.Feedser.Merge/StellaOps.Feedser.Merge.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Normalization/StellaOps.Feedser.Normalization.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" />
</ItemGroup>
</Project>

View File

@@ -23,3 +23,8 @@ Out: fetching/parsing, exporter packaging, signing.
## Observability & security expectations
- Metrics: merge.delta.count, merge.identity.conflicts, merge.range.overrides, merge.duration_ms.
- Logs: decisions (why replaced), keys involved, hashes; avoid dumping large blobs; redact secrets (none expected).
## Tests
- Author and review coverage in `../StellaOps.Feedser.Merge.Tests`.
- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`.
- Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios.

View File

@@ -1,7 +1,7 @@
using System.Linq;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Models;
namespace StellaOps.Feedser.Models.Tests;
public sealed class AdvisoryTests
{

View File

@@ -1,7 +1,7 @@
using System;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Models;
namespace StellaOps.Feedser.Models.Tests;
public sealed class AffectedPackageStatusTests
{

View File

@@ -1,6 +1,6 @@
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Models;
namespace StellaOps.Feedser.Models.Tests;
public sealed class AliasSchemeRegistryTests
{

View File

@@ -2,7 +2,7 @@ using System.Collections.Generic;
using System.Globalization;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Models;
namespace StellaOps.Feedser.Models.Tests;
internal static class CanonicalExampleFactory
{

View File

@@ -1,11 +1,11 @@
using System.Text;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Models;
namespace StellaOps.Feedser.Models.Tests;
public sealed class CanonicalExamplesTests
{
private static readonly string FixtureRoot = Path.Combine(GetProjectRoot(), "Models", "Fixtures");
private static readonly string FixtureRoot = Path.Combine(GetProjectRoot(), "Fixtures");
private const string UpdateEnvVar = "UPDATE_GOLDENS";
[Trait("Category", "GoldenSnapshots")]

View File

@@ -3,7 +3,7 @@ using System.Linq;
using System.Text.Json;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Models;
namespace StellaOps.Feedser.Models.Tests;
public sealed class CanonicalJsonSerializerTests
{

View File

@@ -1,6 +1,6 @@
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Models;
namespace StellaOps.Feedser.Models.Tests;
public sealed class SeverityNormalizationTests
{

View File

@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" />
</ItemGroup>
</Project>

View File

@@ -23,3 +23,8 @@ Out: fetching/parsing external schemas, storage, HTTP.
- No secrets; purely in-memory types.
- Provide debug renders for test snapshots (canonical JSON).
- Emit model version identifiers in logs when canonical structures change; keep adapters for older readers until deprecated.
## Tests
- Author and review coverage in `../StellaOps.Feedser.Models.Tests`.
- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`.
- Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios.

View File

@@ -33,7 +33,7 @@ This playbook captures the policies and workflow required when evolving the cano
## Testing Checklist
- `StellaOps.Feedser.Tests.Models` update unit tests and golden examples.
- `StellaOps.Feedser.Models.Tests` update unit tests and golden examples.
- `Serialization determinism` ensure the hash regression tests cover the new fields.
- Exporter integration (`Json`, `TrivyDb`) confirm manifests include provenance + tree metadata
for the new shape.

View File

@@ -1,6 +1,6 @@
using StellaOps.Feedser.Normalization.Identifiers;
namespace StellaOps.Feedser.Tests.Normalization;
namespace StellaOps.Feedser.Normalization.Tests;
public sealed class CpeNormalizerTests
{

View File

@@ -1,7 +1,7 @@
using StellaOps.Feedser.Models;
using StellaOps.Feedser.Normalization.Cvss;
namespace StellaOps.Feedser.Tests.Normalization;
namespace StellaOps.Feedser.Normalization.Tests;
public sealed class CvssMetricNormalizerTests
{

View File

@@ -1,6 +1,6 @@
using StellaOps.Feedser.Normalization.Distro;
namespace StellaOps.Feedser.Tests.Normalization;
namespace StellaOps.Feedser.Normalization.Tests;
public sealed class DebianEvrParserTests
{

View File

@@ -1,6 +1,6 @@
using StellaOps.Feedser.Normalization.Text;
namespace StellaOps.Feedser.Tests.Normalization;
namespace StellaOps.Feedser.Normalization.Tests;
public sealed class DescriptionNormalizerTests
{

View File

@@ -1,6 +1,6 @@
using StellaOps.Feedser.Normalization.Distro;
namespace StellaOps.Feedser.Tests.Normalization;
namespace StellaOps.Feedser.Normalization.Tests;
public sealed class NevraParserTests
{

View File

@@ -1,7 +1,7 @@
using System.Linq;
using StellaOps.Feedser.Normalization.Identifiers;
namespace StellaOps.Feedser.Tests.Normalization;
namespace StellaOps.Feedser.Normalization.Tests;
public sealed class PackageUrlNormalizerTests
{

View File

@@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Normalization/StellaOps.Feedser.Normalization.csproj" />
</ItemGroup>
</Project>

View File

@@ -24,10 +24,10 @@ using StellaOps.Feedser.Storage.Mongo;
using StellaOps.Feedser.Storage.Mongo.Advisories;
using StellaOps.Feedser.Storage.Mongo.Documents;
using StellaOps.Feedser.Storage.Mongo.Dtos;
using StellaOps.Feedser.Tests.Storage;
using StellaOps.Feedser.Testing;
using StellaOps.Feedser.Models;
namespace StellaOps.Feedser.Tests.Source.CertFr;
namespace StellaOps.Feedser.Source.CertFr.Tests;
[Collection("mongo-fixture")]
public sealed class CertFrConnectorTests : IAsyncLifetime

View File

@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Source.CertFr/StellaOps.Feedser.Source.CertFr.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" />
</ItemGroup>
<ItemGroup>
<None Include="CertFr/Fixtures/**" CopyToOutputDirectory="Always" />
</ItemGroup>
</Project>

View File

@@ -21,3 +21,8 @@ Out: OVAL or package-level authority.
## Observability & security expectations
- Metrics: certfr.fetch.items, certfr.parse.fail, certfr.map.count.
- Logs: feed URL(s), item ids/urls, extraction durations; no PII; allowlist hostnames.
## Tests
- Author and review coverage in `../StellaOps.Feedser.Source.CertFr.Tests`.
- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`.
- Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios.

View File

@@ -26,9 +26,9 @@ using StellaOps.Feedser.Storage.Mongo;
using StellaOps.Feedser.Storage.Mongo.Advisories;
using StellaOps.Feedser.Storage.Mongo.Documents;
using StellaOps.Feedser.Storage.Mongo.Dtos;
using StellaOps.Feedser.Tests.Storage;
using StellaOps.Feedser.Testing;
namespace StellaOps.Feedser.Tests.Source.CertIn;
namespace StellaOps.Feedser.Source.CertIn.Tests;
[Collection("mongo-fixture")]
public sealed class CertInConnectorTests : IAsyncLifetime

View File

@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Source.CertIn/StellaOps.Feedser.Source.CertIn.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" />
</ItemGroup>
<ItemGroup>
<None Include="CertIn/Fixtures/**" CopyToOutputDirectory="Always" />
</ItemGroup>
</Project>

View File

@@ -22,3 +22,8 @@ Out: package range authority; scraping behind auth walls.
## Observability & security expectations
- Metrics: certin.fetch.items, certin.parse.fail, certin.map.enriched_count.
- Logs: advisory codes, CVE counts per advisory, timing; allowlist host; redact personal data if present.
## Tests
- Author and review coverage in `../StellaOps.Feedser.Source.CertIn.Tests`.
- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`.
- Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios.

View File

@@ -2,7 +2,7 @@ using System.Net;
using System.Net.Http;
using StellaOps.Feedser.Source.Common.Testing;
namespace StellaOps.Feedser.Tests.Source.Common;
namespace StellaOps.Feedser.Source.Common.Tests;
public sealed class CannedHttpMessageHandlerTests
{

View File

@@ -1,6 +1,6 @@
using StellaOps.Feedser.Source.Common.Html;
namespace StellaOps.Feedser.Tests.Source.Common;
namespace StellaOps.Feedser.Source.Common.Tests;
public sealed class HtmlContentSanitizerTests
{

View File

@@ -1,7 +1,7 @@
using NuGet.Versioning;
using StellaOps.Feedser.Source.Common.Packages;
namespace StellaOps.Feedser.Tests.Source.Common;
namespace StellaOps.Feedser.Source.Common.Tests;
public sealed class PackageCoordinateHelperTests
{

View File

@@ -1,6 +1,6 @@
using StellaOps.Feedser.Source.Common.Pdf;
namespace StellaOps.Feedser.Tests.Source.Common;
namespace StellaOps.Feedser.Source.Common.Tests;
public sealed class PdfTextExtractorTests
{

View File

@@ -1,6 +1,6 @@
using StellaOps.Feedser.Source.Common.Fetch;
namespace StellaOps.Feedser.Tests.Source.Common;
namespace StellaOps.Feedser.Source.Common.Tests;
public sealed class SourceFetchServiceTests
{

View File

@@ -1,7 +1,7 @@
using MongoDB.Bson;
using StellaOps.Feedser.Source.Common.Cursors;
namespace StellaOps.Feedser.Tests.Source.Common;
namespace StellaOps.Feedser.Source.Common.Tests;
public sealed class TimeWindowCursorPlannerTests
{

View File

@@ -1,6 +1,6 @@
using StellaOps.Feedser.Source.Common.Url;
namespace StellaOps.Feedser.Tests.Source.Common;
namespace StellaOps.Feedser.Source.Common.Tests;
public sealed class UrlNormalizerTests
{

View File

@@ -4,7 +4,7 @@ using Json.Schema;
using Microsoft.Extensions.Logging.Abstractions;
using StellaOps.Feedser.Source.Common.Json;
namespace StellaOps.Feedser.Tests.Source.Json;
namespace StellaOps.Feedser.Source.Common.Tests.Json;
public sealed class JsonSchemaValidatorTests
{

View File

@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" />
</ItemGroup>
</Project>

View File

@@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging.Abstractions;
using FeedserXmlSchemaValidator = StellaOps.Feedser.Source.Common.Xml.XmlSchemaValidator;
using FeedserXmlSchemaValidationException = StellaOps.Feedser.Source.Common.Xml.XmlSchemaValidationException;
namespace StellaOps.Feedser.Tests.Source.Xml;
namespace StellaOps.Feedser.Source.Common.Tests.Xml;
public sealed class XmlSchemaValidatorTests
{

View File

@@ -25,3 +25,8 @@ Out: connector-specific schemas/mapping rules, merge precedence.
- Metrics: http.req.count, http.retry.count, rate_limit.remaining, validator.fail.count.
- Logs include uri, status, retries, etag; redact tokens and auth headers.
- Distributed tracing hooks and per-connector counters should be wired centrally for consistent observability.
## Tests
- Author and review coverage in `../StellaOps.Feedser.Source.Common.Tests`.
- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`.
- Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios.

View File

@@ -1,3 +1,3 @@
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("StellaOps.Feedser.Tests")]
[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Common.Tests")]

View File

@@ -8,10 +8,10 @@ using StellaOps.Feedser.Source.Distro.RedHat;
using StellaOps.Feedser.Source.Distro.RedHat.Configuration;
using StellaOps.Feedser.Storage.Mongo;
using StellaOps.Feedser.Storage.Mongo.Advisories;
using StellaOps.Feedser.Tests.Source.TestInfrastructure;
using StellaOps.Feedser.Tests.Storage;
using StellaOps.Feedser.Testing;
using StellaOps.Feedser.Testing;
namespace StellaOps.Feedser.Tests.Source.Distro.RedHat;
namespace StellaOps.Feedser.Source.Distro.RedHat.Tests;
[Collection("mongo-fixture")]
public sealed class RedHatConnectorHarnessTests : IAsyncLifetime

View File

@@ -21,12 +21,12 @@ using StellaOps.Feedser.Models;
using StellaOps.Feedser.Storage.Mongo;
using StellaOps.Feedser.Storage.Mongo.Advisories;
using StellaOps.Feedser.Storage.Mongo.Documents;
using StellaOps.Feedser.Tests.Storage;
using StellaOps.Feedser.Testing;
using StellaOps.Plugin;
using Xunit;
using Xunit.Abstractions;
namespace StellaOps.Feedser.Tests.Source.Distro.RedHat;
namespace StellaOps.Feedser.Source.Distro.RedHat.Tests;
[Collection("mongo-fixture")]
public sealed class RedHatConnectorTests : IAsyncLifetime

View File

@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Source.Distro.RedHat/StellaOps.Feedser.Source.Distro.RedHat.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" />
</ItemGroup>
<ItemGroup>
<None Include="RedHat/Fixtures/*.json" CopyToOutputDirectory="Always" />
</ItemGroup>
</Project>

View File

@@ -21,3 +21,8 @@ Out: building RPM artifacts; cross-distro reconciliation beyond Red Hat.
## Observability & security expectations
- Metrics: redhat.fetch.items, redhat.oval.defs, redhat.parse.fail, redhat.map.affected_rpm.
- Logs: cursor bounds, advisory ids, NEVRA counts; allowlist Red Hat endpoints.
## Tests
- Author and review coverage in `../StellaOps.Feedser.Source.Distro.RedHat.Tests`.
- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`.
- Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios.

View File

@@ -23,9 +23,9 @@ using StellaOps.Feedser.Storage.Mongo;
using StellaOps.Feedser.Storage.Mongo.Advisories;
using StellaOps.Feedser.Storage.Mongo.Documents;
using StellaOps.Feedser.Storage.Mongo.Dtos;
using StellaOps.Feedser.Tests.Storage;
using StellaOps.Feedser.Testing;
namespace StellaOps.Feedser.Tests.Source.Ics.Kaspersky;
namespace StellaOps.Feedser.Source.Ics.Kaspersky.Tests;
[Collection("mongo-fixture")]
public sealed class KasperskyConnectorTests : IAsyncLifetime

View File

@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Source.Ics.Kaspersky/StellaOps.Feedser.Source.Ics.Kaspersky.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" />
</ItemGroup>
<ItemGroup>
<None Include="Kaspersky/Fixtures/**" CopyToOutputDirectory="Always" />
</ItemGroup>
</Project>

View File

@@ -22,3 +22,8 @@ Out: firmware downloads; reverse-engineering artifacts.
## Observability & security expectations
- Metrics: icsk.fetch.items, icsk.parse.fail, icsk.map.affected_count.
- Logs: slugs, vendor/product counts, timing; allowlist host.
## Tests
- Author and review coverage in `../StellaOps.Feedser.Source.Ics.Kaspersky.Tests`.
- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`.
- Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios.

View File

@@ -25,9 +25,9 @@ using StellaOps.Feedser.Storage.Mongo.Documents;
using StellaOps.Feedser.Storage.Mongo.Dtos;
using StellaOps.Feedser.Storage.Mongo.JpFlags;
using Xunit.Abstractions;
using StellaOps.Feedser.Tests.Storage;
using StellaOps.Feedser.Testing;
namespace StellaOps.Feedser.Tests.Source.Jvn;
namespace StellaOps.Feedser.Source.Jvn.Tests;
[Collection("mongo-fixture")]
public sealed class JvnConnectorTests : IAsyncLifetime

View File

@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Source.Jvn/StellaOps.Feedser.Source.Jvn.csproj" />
<ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" />
</ItemGroup>
<ItemGroup>
<None Include="Jvn/Fixtures/**" CopyToOutputDirectory="Always" />
</ItemGroup>
</Project>

View File

@@ -23,3 +23,8 @@ Out: overriding distro or PSIRT ranges without concrete evidence; scraping unoff
## Observability & security expectations
- Metrics: jvn.fetch.requests, jvn.items, jvn.parse.fail, jvn.map.enriched_count, jvn.flags.jp_count.
- Logs: window bounds, jvndb ids processed, vendor_status distribution; redact API keys.
## Tests
- Author and review coverage in `../StellaOps.Feedser.Source.Jvn.Tests`.
- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`.
- Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios.

Some files were not shown because too many files have changed in this diff Show More