// 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(); } }