feat: Add RustFS artifact object store and migration tool
- Implemented RustFsArtifactObjectStore for managing artifacts in RustFS. - Added unit tests for RustFsArtifactObjectStore functionality. - Created a RustFS migrator tool to transfer objects from S3 to RustFS. - Introduced policy preview and report models for API integration. - Added fixtures and tests for policy preview and report functionality. - Included necessary metadata and scripts for cache_pkg package.
This commit is contained in:
		@@ -0,0 +1,37 @@
 | 
			
		||||
using System.Text;
 | 
			
		||||
using StellaOps.Bench.ScannerAnalyzers.Baseline;
 | 
			
		||||
using Xunit;
 | 
			
		||||
 | 
			
		||||
namespace StellaOps.Bench.ScannerAnalyzers.Tests;
 | 
			
		||||
 | 
			
		||||
public sealed class BaselineLoaderTests
 | 
			
		||||
{
 | 
			
		||||
    [Fact]
 | 
			
		||||
    public async Task LoadAsync_ReadsCsvIntoDictionary()
 | 
			
		||||
    {
 | 
			
		||||
        var csv = """
 | 
			
		||||
            scenario,iterations,sample_count,mean_ms,p95_ms,max_ms
 | 
			
		||||
            node_monorepo_walk,5,4,9.4303,36.1354,45.0012
 | 
			
		||||
            python_site_packages_walk,5,10,12.1000,18.2000,26.3000
 | 
			
		||||
            """;
 | 
			
		||||
 | 
			
		||||
        var path = await WriteTempFileAsync(csv);
 | 
			
		||||
 | 
			
		||||
        var result = await BaselineLoader.LoadAsync(path, CancellationToken.None);
 | 
			
		||||
 | 
			
		||||
        Assert.Equal(2, result.Count);
 | 
			
		||||
        var entry = Assert.Contains("node_monorepo_walk", result);
 | 
			
		||||
        Assert.Equal(5, entry.Iterations);
 | 
			
		||||
        Assert.Equal(4, entry.SampleCount);
 | 
			
		||||
        Assert.Equal(9.4303, entry.MeanMs, 4);
 | 
			
		||||
        Assert.Equal(36.1354, entry.P95Ms, 4);
 | 
			
		||||
        Assert.Equal(45.0012, entry.MaxMs, 4);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static async Task<string> WriteTempFileAsync(string content)
 | 
			
		||||
    {
 | 
			
		||||
        var path = Path.Combine(Path.GetTempPath(), $"baseline-{Guid.NewGuid():N}.csv");
 | 
			
		||||
        await File.WriteAllTextAsync(path, content, Encoding.UTF8);
 | 
			
		||||
        return path;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,41 @@
 | 
			
		||||
using System.Text.Json;
 | 
			
		||||
using StellaOps.Bench.ScannerAnalyzers;
 | 
			
		||||
using StellaOps.Bench.ScannerAnalyzers.Baseline;
 | 
			
		||||
using StellaOps.Bench.ScannerAnalyzers.Reporting;
 | 
			
		||||
using Xunit;
 | 
			
		||||
 | 
			
		||||
namespace StellaOps.Bench.ScannerAnalyzers.Tests;
 | 
			
		||||
 | 
			
		||||
public sealed class BenchmarkJsonWriterTests
 | 
			
		||||
{
 | 
			
		||||
    [Fact]
 | 
			
		||||
    public async Task WriteAsync_EmitsMetadataAndScenarioDetails()
 | 
			
		||||
    {
 | 
			
		||||
        var metadata = new BenchmarkJsonMetadata("1.0", DateTimeOffset.Parse("2025-10-23T12:00:00Z"), "abc123", "ci");
 | 
			
		||||
        var result = new ScenarioResult(
 | 
			
		||||
            "scenario",
 | 
			
		||||
            "Scenario",
 | 
			
		||||
            SampleCount: 5,
 | 
			
		||||
            MeanMs: 10,
 | 
			
		||||
            P95Ms: 12,
 | 
			
		||||
            MaxMs: 20,
 | 
			
		||||
            Iterations: 5,
 | 
			
		||||
            ThresholdMs: 5000);
 | 
			
		||||
        var baseline = new BaselineEntry("scenario", 5, 5, 9, 11, 10);
 | 
			
		||||
        var report = new BenchmarkScenarioReport(result, baseline, 1.2);
 | 
			
		||||
 | 
			
		||||
        var path = Path.Combine(Path.GetTempPath(), $"bench-{Guid.NewGuid():N}.json");
 | 
			
		||||
        await BenchmarkJsonWriter.WriteAsync(path, metadata, new[] { report }, CancellationToken.None);
 | 
			
		||||
 | 
			
		||||
        using var document = JsonDocument.Parse(await File.ReadAllTextAsync(path));
 | 
			
		||||
        var root = document.RootElement;
 | 
			
		||||
 | 
			
		||||
        Assert.Equal("1.0", root.GetProperty("schemaVersion").GetString());
 | 
			
		||||
        Assert.Equal("abc123", root.GetProperty("commit").GetString());
 | 
			
		||||
        var scenario = root.GetProperty("scenarios")[0];
 | 
			
		||||
        Assert.Equal("scenario", scenario.GetProperty("id").GetString());
 | 
			
		||||
        Assert.Equal(20, scenario.GetProperty("maxMs").GetDouble());
 | 
			
		||||
        Assert.Equal(10, scenario.GetProperty("baseline").GetProperty("maxMs").GetDouble());
 | 
			
		||||
        Assert.True(scenario.GetProperty("regression").GetProperty("breached").GetBoolean());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,58 @@
 | 
			
		||||
using StellaOps.Bench.ScannerAnalyzers;
 | 
			
		||||
using StellaOps.Bench.ScannerAnalyzers.Baseline;
 | 
			
		||||
using StellaOps.Bench.ScannerAnalyzers.Reporting;
 | 
			
		||||
using Xunit;
 | 
			
		||||
 | 
			
		||||
namespace StellaOps.Bench.ScannerAnalyzers.Tests;
 | 
			
		||||
 | 
			
		||||
public sealed class BenchmarkScenarioReportTests
 | 
			
		||||
{
 | 
			
		||||
    [Fact]
 | 
			
		||||
    public void RegressionRatio_ComputedWhenBaselinePresent()
 | 
			
		||||
    {
 | 
			
		||||
        var result = new ScenarioResult(
 | 
			
		||||
            "scenario",
 | 
			
		||||
            "Scenario",
 | 
			
		||||
            SampleCount: 5,
 | 
			
		||||
            MeanMs: 10,
 | 
			
		||||
            P95Ms: 12,
 | 
			
		||||
            MaxMs: 20,
 | 
			
		||||
            Iterations: 5,
 | 
			
		||||
            ThresholdMs: 5000);
 | 
			
		||||
 | 
			
		||||
        var baseline = new BaselineEntry(
 | 
			
		||||
            "scenario",
 | 
			
		||||
            Iterations: 5,
 | 
			
		||||
            SampleCount: 5,
 | 
			
		||||
            MeanMs: 8,
 | 
			
		||||
            P95Ms: 11,
 | 
			
		||||
            MaxMs: 15);
 | 
			
		||||
 | 
			
		||||
        var report = new BenchmarkScenarioReport(result, baseline, regressionLimit: 1.2);
 | 
			
		||||
 | 
			
		||||
        Assert.True(report.MaxRegressionRatio.HasValue);
 | 
			
		||||
        Assert.Equal(20d / 15d, report.MaxRegressionRatio.Value, 6);
 | 
			
		||||
        Assert.True(report.RegressionBreached);
 | 
			
		||||
        Assert.Contains("+33.3%", report.BuildRegressionFailureMessage());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    public void RegressionRatio_NullWhenBaselineMissing()
 | 
			
		||||
    {
 | 
			
		||||
        var result = new ScenarioResult(
 | 
			
		||||
            "scenario",
 | 
			
		||||
            "Scenario",
 | 
			
		||||
            SampleCount: 5,
 | 
			
		||||
            MeanMs: 10,
 | 
			
		||||
            P95Ms: 12,
 | 
			
		||||
            MaxMs: 20,
 | 
			
		||||
            Iterations: 5,
 | 
			
		||||
            ThresholdMs: 5000);
 | 
			
		||||
 | 
			
		||||
        var report = new BenchmarkScenarioReport(result, baseline: null, regressionLimit: 1.2);
 | 
			
		||||
 | 
			
		||||
        Assert.Null(report.MaxRegressionRatio);
 | 
			
		||||
        Assert.False(report.RegressionBreached);
 | 
			
		||||
        Assert.Null(report.BuildRegressionFailureMessage());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,32 @@
 | 
			
		||||
using StellaOps.Bench.ScannerAnalyzers;
 | 
			
		||||
using StellaOps.Bench.ScannerAnalyzers.Baseline;
 | 
			
		||||
using StellaOps.Bench.ScannerAnalyzers.Reporting;
 | 
			
		||||
using Xunit;
 | 
			
		||||
 | 
			
		||||
namespace StellaOps.Bench.ScannerAnalyzers.Tests;
 | 
			
		||||
 | 
			
		||||
public sealed class PrometheusWriterTests
 | 
			
		||||
{
 | 
			
		||||
    [Fact]
 | 
			
		||||
    public void Write_EmitsMetricsForScenario()
 | 
			
		||||
    {
 | 
			
		||||
        var result = new ScenarioResult(
 | 
			
		||||
            "scenario_a",
 | 
			
		||||
            "Scenario A",
 | 
			
		||||
            SampleCount: 5,
 | 
			
		||||
            MeanMs: 10,
 | 
			
		||||
            P95Ms: 12,
 | 
			
		||||
            MaxMs: 20,
 | 
			
		||||
            Iterations: 5,
 | 
			
		||||
            ThresholdMs: 5000);
 | 
			
		||||
        var baseline = new BaselineEntry("scenario_a", 5, 5, 9, 11, 18);
 | 
			
		||||
        var report = new BenchmarkScenarioReport(result, baseline, 1.2);
 | 
			
		||||
 | 
			
		||||
        var path = Path.Combine(Path.GetTempPath(), $"metrics-{Guid.NewGuid():N}.prom");
 | 
			
		||||
        PrometheusWriter.Write(path, new[] { report });
 | 
			
		||||
 | 
			
		||||
        var contents = File.ReadAllText(path);
 | 
			
		||||
        Assert.Contains("scanner_analyzer_bench_max_ms{scenario=\"scenario_a\"} 20", contents);
 | 
			
		||||
        Assert.Contains("scanner_analyzer_bench_regression_ratio{scenario=\"scenario_a\"}", contents);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,26 @@
 | 
			
		||||
<Project Sdk="Microsoft.NET.Sdk">
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <TargetFramework>net10.0</TargetFramework>
 | 
			
		||||
    <Nullable>enable</Nullable>
 | 
			
		||||
    <ImplicitUsings>enable</ImplicitUsings>
 | 
			
		||||
    <LangVersion>preview</LangVersion>
 | 
			
		||||
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
 | 
			
		||||
    <PackageReference Include="xunit" Version="2.9.2" />
 | 
			
		||||
    <PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
 | 
			
		||||
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 | 
			
		||||
      <PrivateAssets>all</PrivateAssets>
 | 
			
		||||
    </PackageReference>
 | 
			
		||||
    <PackageReference Include="coverlet.collector" Version="6.0.4">
 | 
			
		||||
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 | 
			
		||||
      <PrivateAssets>all</PrivateAssets>
 | 
			
		||||
    </PackageReference>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ProjectReference Include="..\StellaOps.Bench.ScannerAnalyzers\StellaOps.Bench.ScannerAnalyzers.csproj" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
		Reference in New Issue
	
	Block a user