// Copyright (c) StellaOps. All rights reserved.
// Licensed under AGPL-3.0-or-later. See LICENSE in the project root.
using FluentAssertions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using StellaOps.BinaryIndex.Disassembly.B2R2;
using StellaOps.BinaryIndex.Disassembly.Iced;
using Xunit;
namespace StellaOps.BinaryIndex.Disassembly.Tests;
///
/// Tests for the disassembly plugin capabilities reporting.
///
[Trait("Category", "Unit")]
public sealed class PluginCapabilitiesTests
{
[Fact]
public void IcedPlugin_ReportsCorrectCapabilities()
{
// Arrange
var logger = NullLogger.Instance;
var plugin = new IcedDisassemblyPlugin(logger);
// Act
var capabilities = plugin.Capabilities;
// Assert
capabilities.PluginId.Should().Be("stellaops.disasm.iced");
capabilities.Name.Should().Contain("Iced");
capabilities.SupportedArchitectures.Should().Contain(CpuArchitecture.X86);
capabilities.SupportedArchitectures.Should().Contain(CpuArchitecture.X86_64);
capabilities.SupportedArchitectures.Should().NotContain(CpuArchitecture.ARM64);
capabilities.SupportedFormats.Should().Contain(BinaryFormat.ELF);
capabilities.SupportedFormats.Should().Contain(BinaryFormat.PE);
capabilities.SupportedFormats.Should().Contain(BinaryFormat.Raw);
capabilities.SupportsLifting.Should().BeFalse();
capabilities.Priority.Should().BeGreaterThan(0);
}
[Fact]
public void B2R2Plugin_ReportsCorrectCapabilities()
{
// Arrange
var logger = NullLogger.Instance;
var plugin = new B2R2DisassemblyPlugin(logger);
// Act
var capabilities = plugin.Capabilities;
// Assert
capabilities.PluginId.Should().Be("stellaops.disasm.b2r2");
capabilities.Name.Should().Contain("B2R2");
capabilities.SupportedArchitectures.Should().Contain(CpuArchitecture.X86);
capabilities.SupportedArchitectures.Should().Contain(CpuArchitecture.X86_64);
capabilities.SupportedArchitectures.Should().Contain(CpuArchitecture.ARM32);
capabilities.SupportedArchitectures.Should().Contain(CpuArchitecture.ARM64);
capabilities.SupportedArchitectures.Should().Contain(CpuArchitecture.MIPS32);
capabilities.SupportedArchitectures.Should().Contain(CpuArchitecture.RISCV64);
capabilities.SupportedFormats.Should().Contain(BinaryFormat.ELF);
capabilities.SupportedFormats.Should().Contain(BinaryFormat.PE);
capabilities.SupportedFormats.Should().Contain(BinaryFormat.MachO);
capabilities.SupportsLifting.Should().BeTrue();
capabilities.SupportsCfgRecovery.Should().BeTrue();
}
[Fact]
public void IcedPlugin_CanHandle_ReturnsTrueForX86Elf()
{
// Arrange
var logger = NullLogger.Instance;
var plugin = new IcedDisassemblyPlugin(logger);
// Act & Assert
plugin.Capabilities.CanHandle(CpuArchitecture.X86, BinaryFormat.ELF).Should().BeTrue();
plugin.Capabilities.CanHandle(CpuArchitecture.X86_64, BinaryFormat.PE).Should().BeTrue();
plugin.Capabilities.CanHandle(CpuArchitecture.ARM64, BinaryFormat.ELF).Should().BeFalse();
}
[Fact]
public void B2R2Plugin_CanHandle_ReturnsTrueForArm64Elf()
{
// Arrange
var logger = NullLogger.Instance;
var plugin = new B2R2DisassemblyPlugin(logger);
// Act & Assert
plugin.Capabilities.CanHandle(CpuArchitecture.ARM64, BinaryFormat.ELF).Should().BeTrue();
plugin.Capabilities.CanHandle(CpuArchitecture.ARM32, BinaryFormat.MachO).Should().BeTrue();
plugin.Capabilities.CanHandle(CpuArchitecture.RISCV64, BinaryFormat.ELF).Should().BeTrue();
}
}