up
Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Export Center CI / export-ci (push) Has been cancelled
Notify Smoke Test / Notify Unit Tests (push) Has been cancelled
Notify Smoke Test / Notifier Service Tests (push) Has been cancelled
Notify Smoke Test / Notification Smoke Test (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
Scanner Analyzers / Discover Analyzers (push) Has been cancelled
Scanner Analyzers / Build Analyzers (push) Has been cancelled
Scanner Analyzers / Test Language Analyzers (push) Has been cancelled
Scanner Analyzers / Validate Test Fixtures (push) Has been cancelled
Scanner Analyzers / Verify Deterministic Output (push) Has been cancelled
Signals CI & Image / signals-ci (push) Has been cancelled
Signals Reachability Scoring & Events / reachability-smoke (push) Has been cancelled
Signals Reachability Scoring & Events / sign-and-upload (push) Has been cancelled

This commit is contained in:
StellaOps Bot
2025-12-13 00:20:26 +02:00
parent e1f1bef4c1
commit 564df71bfb
2376 changed files with 334389 additions and 328032 deletions

View File

@@ -1,6 +1,7 @@
using System;
using System.Buffers.Binary;
using System.IO;
using Microsoft.Data.Sqlite;
using Microsoft.Extensions.Logging.Abstractions;
using StellaOps.Scanner.Analyzers.OS.Rpm;
using Xunit;
@@ -9,6 +10,42 @@ namespace StellaOps.Scanner.Analyzers.OS.Tests.Rpm;
public sealed class RpmDatabaseReaderTests
{
[Theory]
[InlineData("hdr")]
[InlineData("header")]
[InlineData("headerBlob")]
public void ReadsHeaders_FromSqlite_WhenHeaderBlobColumnPresent(string headerColumnName)
{
var root = Directory.CreateTempSubdirectory("rpmdb-sqlite");
try
{
var rpmPath = Path.Combine(root.FullName, "var", "lib", "rpm");
Directory.CreateDirectory(rpmPath);
var sqlitePath = Path.Combine(rpmPath, "rpmdb.sqlite");
CreateSqliteRpmdb(sqlitePath, headerColumnName);
var reader = new RpmDatabaseReader(NullLogger.Instance);
var headers = reader.ReadHeaders(root.FullName, CancellationToken.None);
Assert.Single(headers);
var header = headers[0];
Assert.Equal("sqlite-pkg", header.Name);
Assert.Equal("2.0.0", header.Version);
Assert.Equal("aarch64", header.Architecture);
}
finally
{
try
{
root.Delete(recursive: true);
}
catch
{
}
}
}
[Fact]
public void FallsBackToLegacyPackages_WhenSqliteMissing()
{
@@ -42,6 +79,36 @@ public sealed class RpmDatabaseReaderTests
}
}
private static void CreateSqliteRpmdb(string sqlitePath, string headerColumnName)
{
var connectionString = new SqliteConnectionStringBuilder
{
DataSource = sqlitePath,
Mode = SqliteOpenMode.ReadWriteCreate,
}.ToString();
using var connection = new SqliteConnection(connectionString);
connection.Open();
using var create = connection.CreateCommand();
create.CommandText = $@"CREATE TABLE Packages (
pkgKey INTEGER PRIMARY KEY,
pkgId BLOB,
""{headerColumnName}"" BLOB
);";
create.ExecuteNonQuery();
var header = CreateRpmHeader("sqlite-pkg", "2.0.0", "aarch64");
using var insert = connection.CreateCommand();
insert.CommandText = $@"INSERT INTO Packages (pkgKey, pkgId, ""{headerColumnName}"")
VALUES ($key, $pkgId, $hdr);";
insert.Parameters.AddWithValue("$key", 1);
insert.Parameters.AddWithValue("$pkgId", new byte[] { 0x01, 0x02, 0x03, 0x04 }); // not an RPM header
insert.Parameters.AddWithValue("$hdr", header);
insert.ExecuteNonQuery();
}
private static byte[] CreateLegacyPackagesFile()
{
const int pageSize = 4096;