namespace Aaru.Tests.Issues;
using System;
using System.Collections.Generic;
using System.Text;
using Aaru.CommonTypes;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces;
using Aaru.CommonTypes.Structs;
using Aaru.Core;
using NUnit.Framework;
/// This will extract (and discard data) all files in all filesystems detected in an image.
public abstract class FsExtractIssueTest
{
public abstract string DataFolder { get; }
public abstract string TestFile { get; }
public abstract Dictionary ParsedOptions { get; }
public abstract bool Debug { get; }
public abstract bool Xattrs { get; }
public abstract string Encoding { get; }
public abstract bool ExpectPartitions { get; }
public abstract string Namespace { get; }
[Test]
public void Test()
{
Environment.CurrentDirectory = DataFolder;
var filtersList = new FiltersList();
IFilter inputFilter = filtersList.GetFilter(TestFile);
Dictionary options = ParsedOptions;
options["debug"] = Debug.ToString();
Assert.IsNotNull(inputFilter, "Cannot open specified file.");
Encoding encodingClass = null;
if(Encoding != null)
encodingClass = Claunia.Encoding.Encoding.GetEncoding(Encoding);
PluginBase plugins = GetPluginBase.Instance;
var imageFormat = ImageFormat.Detect(inputFilter) as IMediaImage;
Assert.NotNull(imageFormat, "Image format not identified, not proceeding with analysis.");
Assert.AreEqual(ErrorNumber.NoError, imageFormat.Open(inputFilter), "Unable to open image format");
List partitions = Partitions.GetAll(imageFormat);
if(partitions.Count == 0)
{
Assert.IsFalse(ExpectPartitions, "No partitions found");
partitions.Add(new Partition
{
Description = "Whole device",
Length = imageFormat.Info.Sectors,
Offset = 0,
Size = imageFormat.Info.SectorSize * imageFormat.Info.Sectors,
Sequence = 1,
Start = 0
});
}
var filesystemFound = false;
for(var i = 0; i < partitions.Count; i++)
{
Filesystems.Identify(imageFormat, out List idPlugins, partitions[i]);
if(idPlugins.Count == 0)
continue;
IReadOnlyFilesystem plugin;
ErrorNumber error;
if(idPlugins.Count > 1)
{
foreach(string pluginName in idPlugins)
if(plugins.ReadOnlyFilesystems.TryGetValue(pluginName, out plugin))
{
Assert.IsNotNull(plugin, "Could not instantiate filesystem plugin");
var fs = (IReadOnlyFilesystem)plugin.GetType().GetConstructor(Type.EmptyTypes)?.
Invoke(Array.Empty