2019-04-15 01:01:50 +01:00
|
|
|
|
// /***************************************************************************
|
2020-07-25 02:01:36 +01:00
|
|
|
|
// Aaru Data Preservation Suite
|
2019-04-15 01:01:50 +01:00
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
//
|
|
|
|
|
|
// Filename : FATX.cs
|
|
|
|
|
|
// Author(s) : Natalia Portillo <claunia@claunia.com>
|
|
|
|
|
|
//
|
2020-07-25 02:01:36 +01:00
|
|
|
|
// Component : Aaru unit testing.
|
2019-04-15 01:01:50 +01:00
|
|
|
|
//
|
|
|
|
|
|
// --[ License ] --------------------------------------------------------------
|
|
|
|
|
|
//
|
|
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
|
|
// it under the terms of the GNU General Public License as
|
|
|
|
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
|
|
//
|
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
//
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
//
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
2020-12-31 23:08:23 +00:00
|
|
|
|
// Copyright © 2011-2021 Natalia Portillo
|
2019-04-15 01:01:50 +01:00
|
|
|
|
// ****************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.IO;
|
2020-02-27 00:33:26 +00:00
|
|
|
|
using Aaru.Checksums;
|
|
|
|
|
|
using Aaru.CommonTypes;
|
|
|
|
|
|
using Aaru.CommonTypes.Interfaces;
|
|
|
|
|
|
using Aaru.CommonTypes.Structs;
|
|
|
|
|
|
using Aaru.DiscImages;
|
2020-07-20 15:43:52 +01:00
|
|
|
|
using Aaru.Filesystems;
|
2020-02-27 00:33:26 +00:00
|
|
|
|
using Aaru.Filters;
|
2019-04-15 01:01:50 +01:00
|
|
|
|
using NUnit.Framework;
|
2020-02-27 00:33:26 +00:00
|
|
|
|
using FileAttributes = Aaru.CommonTypes.Structs.FileAttributes;
|
|
|
|
|
|
using FileSystemInfo = Aaru.CommonTypes.Structs.FileSystemInfo;
|
2019-04-15 01:01:50 +01:00
|
|
|
|
|
2021-03-01 00:52:03 +00:00
|
|
|
|
namespace Aaru.Tests.Filesystems.FATX
|
2019-04-15 01:01:50 +01:00
|
|
|
|
{
|
|
|
|
|
|
[TestFixture]
|
2021-03-01 19:34:30 +00:00
|
|
|
|
public class Xbox : FilesystemTest
|
2019-04-15 01:01:50 +01:00
|
|
|
|
{
|
2021-03-01 19:34:30 +00:00
|
|
|
|
public Xbox() : base("FATX filesystem") {}
|
|
|
|
|
|
|
|
|
|
|
|
public override string _dataFolder => Path.Combine(Consts.TEST_FILES_ROOT, "Filesystems", "Xbox FAT16", "le");
|
|
|
|
|
|
public override IFilesystem _plugin => new XboxFatPlugin();
|
|
|
|
|
|
public override bool _partitions => false;
|
|
|
|
|
|
|
|
|
|
|
|
public override string[] _testFiles => new[]
|
|
|
|
|
|
{
|
|
|
|
|
|
"fatx.img.lz"
|
|
|
|
|
|
};
|
|
|
|
|
|
public override MediaType[] _mediaTypes => new[]
|
|
|
|
|
|
{
|
|
|
|
|
|
MediaType.GENERIC_HDD
|
|
|
|
|
|
};
|
|
|
|
|
|
public override ulong[] _sectors => new ulong[]
|
|
|
|
|
|
{
|
|
|
|
|
|
62720
|
|
|
|
|
|
};
|
|
|
|
|
|
public override uint[] _sectorSize => new uint[]
|
|
|
|
|
|
{
|
|
|
|
|
|
512
|
|
|
|
|
|
};
|
|
|
|
|
|
public override string[] _appId => null;
|
|
|
|
|
|
public override bool[] _bootable => new[]
|
|
|
|
|
|
{
|
|
|
|
|
|
false
|
|
|
|
|
|
};
|
|
|
|
|
|
public override long[] _clusters => new long[]
|
|
|
|
|
|
{
|
|
|
|
|
|
1960
|
|
|
|
|
|
};
|
|
|
|
|
|
public override uint[] _clusterSize => new uint[]
|
|
|
|
|
|
{
|
|
|
|
|
|
16384
|
|
|
|
|
|
};
|
|
|
|
|
|
public override string[] _oemId => null;
|
|
|
|
|
|
public override string[] _type => null;
|
|
|
|
|
|
public override string[] _volumeName => new[]
|
|
|
|
|
|
{
|
|
|
|
|
|
"Volume láb€l"
|
|
|
|
|
|
};
|
|
|
|
|
|
public override string[] _volumeSerial => new[]
|
|
|
|
|
|
{
|
|
|
|
|
|
"4639B7D0"
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2019-04-15 01:01:50 +01:00
|
|
|
|
[SetUp]
|
|
|
|
|
|
public void Init()
|
|
|
|
|
|
{
|
2020-07-20 21:11:32 +01:00
|
|
|
|
_location = Path.Combine(Consts.TEST_FILES_ROOT, "Filesystems", "Xbox FAT16", "le", "fatx.img.lz");
|
|
|
|
|
|
_filter = new LZip();
|
|
|
|
|
|
_filter.Open(_location);
|
|
|
|
|
|
_image = new ZZZRawImage();
|
|
|
|
|
|
Assert.AreEqual(true, _image.Open(_filter));
|
|
|
|
|
|
_fs = new XboxFatPlugin();
|
|
|
|
|
|
|
|
|
|
|
|
_wholePart = new Partition
|
2019-04-15 01:01:50 +01:00
|
|
|
|
{
|
2020-07-20 04:34:16 +01:00
|
|
|
|
Name = "Whole device",
|
2020-07-20 21:11:32 +01:00
|
|
|
|
Length = _image.Info.Sectors,
|
|
|
|
|
|
Size = _image.Info.Sectors * _image.Info.SectorSize
|
2019-04-15 01:01:50 +01:00
|
|
|
|
};
|
|
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
Errno error = _fs.Mount(_image, _wholePart, null, null, null);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual(Errno.NoError, error);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-02-29 18:03:35 +00:00
|
|
|
|
[TearDown]
|
|
|
|
|
|
public void Destroy()
|
2019-04-15 01:01:50 +01:00
|
|
|
|
{
|
2020-07-20 21:11:32 +01:00
|
|
|
|
_fs?.Unmount();
|
|
|
|
|
|
_fs = null;
|
2019-04-15 01:01:50 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
string _location;
|
|
|
|
|
|
IFilter _filter;
|
|
|
|
|
|
IMediaImage _image;
|
|
|
|
|
|
IReadOnlyFilesystem _fs;
|
|
|
|
|
|
Partition _wholePart;
|
2019-04-15 01:01:50 +01:00
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
|
public void MapBlock()
|
|
|
|
|
|
{
|
2020-07-20 21:11:32 +01:00
|
|
|
|
Errno error = _fs.MapBlock("49470015", 0, out long block);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual(Errno.IsDirectory, error);
|
|
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
error = _fs.MapBlock("49470015/TitleImage", 0, out block);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual(Errno.NoSuchFile, error);
|
|
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
error = _fs.MapBlock("49470015/TitleImage.xbx", 0, out block);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual(Errno.NoError, error);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(80, block);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
error = _fs.MapBlock("49470015/7AC2FE88C908/savedata.dat", 2, out block);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual(Errno.NoError, error);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(272, block);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
error = _fs.MapBlock("49470015/7AC2FE88C908/savedata.dat", 200, out block);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual(Errno.InvalidArgument, error);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
|
public void Read()
|
|
|
|
|
|
{
|
|
|
|
|
|
byte[] buffer = new byte[0];
|
2020-07-20 21:11:32 +01:00
|
|
|
|
Errno error = _fs.Read("49470015", 0, 0, ref buffer);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual(Errno.IsDirectory, error);
|
|
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
error = _fs.Read("49470015/TitleImage", 0, 0, ref buffer);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual(Errno.NoSuchFile, error);
|
|
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
error = _fs.Read("49470015/7AC2FE88C908/savedata.dat", 0, 0, ref buffer);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual(Errno.NoError, error);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(0, buffer.Length);
|
|
|
|
|
|
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
|
|
|
|
|
Sha256Context.Data(buffer, out _));
|
|
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
error = _fs.Read("49470015/7AC2FE88C908/savedata.dat", 1, 16, ref buffer);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual(Errno.NoError, error);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(16, buffer.Length);
|
|
|
|
|
|
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual("ff82559d2d0c610ac25b78dcb53a8312e32b56192044deb1f01540581bd54e80",
|
|
|
|
|
|
Sha256Context.Data(buffer, out _));
|
|
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
error = _fs.Read("49470015/7AC2FE88C908/savedata.dat", 248, 131072, ref buffer);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual(Errno.NoError, error);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(61996, buffer.Length);
|
|
|
|
|
|
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual("2eb0d62a96ad28473ce0dd67052efdfae31f371992e1d8309beeeff6f2b46a59",
|
|
|
|
|
|
Sha256Context.Data(buffer, out _));
|
|
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
error = _fs.Read("49470015/7AC2FE88C908/savedata.dat", 131072, 0, ref buffer);
|
2019-04-15 01:01:50 +01:00
|
|
|
|
Assert.AreEqual(Errno.InvalidArgument, error);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-02-29 18:03:35 +00:00
|
|
|
|
[Test]
|
|
|
|
|
|
public void RootDirectory()
|
2019-04-15 01:01:50 +01:00
|
|
|
|
{
|
2020-07-20 21:11:32 +01:00
|
|
|
|
Errno error = _fs.ReadDir("", out List<string> directory);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(Errno.NoError, error);
|
|
|
|
|
|
Assert.AreEqual(6, directory.Count);
|
|
|
|
|
|
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("49470015"));
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("4d5300d1"));
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("4d53006e"));
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("4d530004"));
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("4947007c"));
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("4541003e"));
|
|
|
|
|
|
|
|
|
|
|
|
Assert.AreEqual(false, directory.Contains("d530004"));
|
|
|
|
|
|
Assert.AreEqual(false, directory.Contains("4947007"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
|
public void Stat()
|
|
|
|
|
|
{
|
2020-07-20 21:11:32 +01:00
|
|
|
|
Errno error = _fs.Stat("49470015", out FileEntryInfo stat);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(Errno.NoError, error);
|
|
|
|
|
|
Assert.AreEqual(new DateTime(2007, 3, 6, 15, 8, 44, DateTimeKind.Utc), stat.AccessTimeUtc);
|
|
|
|
|
|
Assert.AreEqual(FileAttributes.Directory, stat.Attributes);
|
2020-07-09 03:05:04 +01:00
|
|
|
|
Assert.AreEqual(null, stat.BackupTimeUtc);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(1, stat.Blocks);
|
|
|
|
|
|
Assert.AreEqual(16384, stat.BlockSize);
|
|
|
|
|
|
Assert.AreEqual(new DateTime(2007, 3, 6, 15, 8, 44, DateTimeKind.Utc), stat.CreationTimeUtc);
|
2020-07-09 03:05:04 +01:00
|
|
|
|
Assert.AreEqual(null, stat.DeviceNo);
|
|
|
|
|
|
Assert.AreEqual(null, stat.GID);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(2, stat.Inode);
|
|
|
|
|
|
Assert.AreEqual(new DateTime(2007, 3, 6, 15, 8, 44, DateTimeKind.Utc), stat.LastWriteTimeUtc);
|
|
|
|
|
|
Assert.AreEqual(16384, stat.Length);
|
|
|
|
|
|
Assert.AreEqual(1, stat.Links);
|
2020-07-09 03:05:04 +01:00
|
|
|
|
Assert.AreEqual(null, stat.Mode);
|
|
|
|
|
|
Assert.AreEqual(null, stat.StatusChangeTimeUtc);
|
|
|
|
|
|
Assert.AreEqual(null, stat.UID);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
error = _fs.Stat("49470015/TitleImage", out stat);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(Errno.NoSuchFile, error);
|
|
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
error = _fs.Stat("49470015/TitleImage.xbx", out stat);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(Errno.NoError, error);
|
|
|
|
|
|
Assert.AreEqual(new DateTime(2013, 5, 14, 12, 50, 8, DateTimeKind.Utc), stat.AccessTimeUtc);
|
|
|
|
|
|
Assert.AreEqual(FileAttributes.None, stat.Attributes);
|
2020-07-09 03:05:04 +01:00
|
|
|
|
Assert.AreEqual(null, stat.BackupTimeUtc);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(1, stat.Blocks);
|
|
|
|
|
|
Assert.AreEqual(16384, stat.BlockSize);
|
|
|
|
|
|
Assert.AreEqual(new DateTime(2013, 5, 14, 12, 50, 8, DateTimeKind.Utc), stat.CreationTimeUtc);
|
2020-07-09 03:05:04 +01:00
|
|
|
|
Assert.AreEqual(null, stat.DeviceNo);
|
|
|
|
|
|
Assert.AreEqual(null, stat.GID);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(3, stat.Inode);
|
|
|
|
|
|
Assert.AreEqual(new DateTime(2013, 5, 14, 12, 50, 8, DateTimeKind.Utc), stat.LastWriteTimeUtc);
|
|
|
|
|
|
Assert.AreEqual(10240, stat.Length);
|
|
|
|
|
|
Assert.AreEqual(1, stat.Links);
|
2020-07-09 03:05:04 +01:00
|
|
|
|
Assert.AreEqual(null, stat.Mode);
|
|
|
|
|
|
Assert.AreEqual(null, stat.StatusChangeTimeUtc);
|
|
|
|
|
|
Assert.AreEqual(null, stat.UID);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
|
public void Statfs()
|
|
|
|
|
|
{
|
2020-07-20 21:11:32 +01:00
|
|
|
|
Errno error = _fs.StatFs(out FileSystemInfo stat);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(Errno.NoError, error);
|
|
|
|
|
|
Assert.AreEqual(1960, stat.Blocks);
|
|
|
|
|
|
Assert.AreEqual(42, stat.FilenameLength);
|
|
|
|
|
|
Assert.AreEqual(0, stat.Files);
|
|
|
|
|
|
Assert.AreEqual(0, stat.FreeBlocks);
|
|
|
|
|
|
Assert.AreEqual(0, stat.FreeFiles);
|
|
|
|
|
|
Assert.AreEqual(0x58544146, stat.Id.Serial32);
|
|
|
|
|
|
Assert.AreEqual("Xbox FAT", stat.Type);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
|
public void SubDirectory()
|
|
|
|
|
|
{
|
2020-07-20 21:11:32 +01:00
|
|
|
|
Errno error = _fs.ReadDir("49470015", out List<string> directory);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(Errno.NoError, error);
|
|
|
|
|
|
Assert.AreEqual(4, directory.Count);
|
|
|
|
|
|
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("TitleImage.xbx"));
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("SaveImage.xbx"));
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("7AC2FE88C908"));
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("TitleMeta.xbx"));
|
|
|
|
|
|
|
|
|
|
|
|
Assert.AreEqual(false, directory.Contains("TitleImage"));
|
|
|
|
|
|
Assert.AreEqual(false, directory.Contains(".xbx"));
|
|
|
|
|
|
Assert.AreEqual(false, directory.Contains("7ac2fe88c908"));
|
|
|
|
|
|
Assert.AreEqual(false, directory.Contains("xbx"));
|
|
|
|
|
|
|
2020-07-20 21:11:32 +01:00
|
|
|
|
error = _fs.ReadDir("49470015/7AC2FE88C908", out directory);
|
2020-02-29 18:03:35 +00:00
|
|
|
|
Assert.AreEqual(Errno.NoError, error);
|
|
|
|
|
|
Assert.AreEqual(3, directory.Count);
|
|
|
|
|
|
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("SaveMeta.xbx"));
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("savedata.dat"));
|
|
|
|
|
|
Assert.AreEqual(true, directory.Contains("saveimage.xbx"));
|
|
|
|
|
|
|
|
|
|
|
|
Assert.AreEqual(false, directory.Contains("savemeta.xbx"));
|
|
|
|
|
|
Assert.AreEqual(false, directory.Contains("SaveData.dat"));
|
|
|
|
|
|
Assert.AreEqual(false, directory.Contains("SaveImage.xbx"));
|
2019-04-15 01:01:50 +01:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|