diff --git a/SabreTools.FileTypes.Test/FileTypeToolTests.cs b/SabreTools.FileTypes.Test/FileTypeToolTests.cs new file mode 100644 index 00000000..9a4eb332 --- /dev/null +++ b/SabreTools.FileTypes.Test/FileTypeToolTests.cs @@ -0,0 +1,128 @@ +using System; +using System.IO; +using SabreTools.Hashing; +using SabreTools.IO.Extensions; +using Xunit; + +namespace SabreTools.FileTypes.Test +{ + public class FileTypeToolTests + { + private static readonly HashType[] _defaultHashes = [HashType.CRC32, HashType.MD5, HashType.SHA1]; + + private const long _expectedSize = 125; + private const string _expectedCrc = "ba02a660"; + private const string _expectedMd5 = "b722871eaa950016296184d026c5dec9"; + private const string _expectedSha1 = "eea1ee2d801d830c4bdad4df3c8da6f9f52d1a9f"; + + #region GetInfo + + [Fact] + public void GetInfo_File_EmptyPath() + { + string input = string.Empty; + BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes); + + Assert.Null(actual.Filename); + Assert.Null(actual.Size); + Assert.Null(actual.CRC); + Assert.Null(actual.MD5); + Assert.Null(actual.SHA1); + } + + [Fact] + public void GetInfo_File_NotExists() + { + string input = "INVALID"; + BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes); + + Assert.Null(actual.Filename); + Assert.Null(actual.Size); + Assert.Null(actual.CRC); + Assert.Null(actual.MD5); + Assert.Null(actual.SHA1); + } + + [Fact] + public void GetInfo_File_NoHeader() + { + string input = Path.Combine(Environment.CurrentDirectory, "TestData", "file-to-hash.bin"); + BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes); + + Assert.Equal("file-to-hash.bin", actual.Filename); + Assert.Equal(_expectedSize, actual.Size); + Assert.Equal(_expectedCrc, actual.CRC.ToHexString()); + Assert.Equal(_expectedMd5, actual.MD5.ToHexString()); + Assert.Equal(_expectedSha1, actual.SHA1.ToHexString()); + } + + [Fact] + public void GetInfo_File_NullHeader() + { + string input = Path.Combine(Environment.CurrentDirectory, "TestData", "file-to-hash.bin"); + string? header = null; + BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes, header); + + Assert.Equal("file-to-hash.bin", actual.Filename); + Assert.Equal(_expectedSize, actual.Size); + Assert.Equal(_expectedCrc, actual.CRC.ToHexString()); + Assert.Equal(_expectedMd5, actual.MD5.ToHexString()); + Assert.Equal(_expectedSha1, actual.SHA1.ToHexString()); + } + + [Fact] + public void GetInfo_File_EmptyHeader() + { + string input = Path.Combine(Environment.CurrentDirectory, "TestData", "file-to-hash.bin"); + string? header = string.Empty; + BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes, header); + + Assert.Equal("file-to-hash.bin", actual.Filename); + Assert.Equal(_expectedSize, actual.Size); + Assert.Equal(_expectedCrc, actual.CRC.ToHexString()); + Assert.Equal(_expectedMd5, actual.MD5.ToHexString()); + Assert.Equal(_expectedSha1, actual.SHA1.ToHexString()); + } + + [Fact] + public void GetInfo_File_NonMatchingHeader() + { + string input = Path.Combine(Environment.CurrentDirectory, "TestData", "file-to-hash.bin"); + string? header = "nes"; + BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes, header); + + Assert.Equal("file-to-hash.bin", actual.Filename); + Assert.Equal(_expectedSize, actual.Size); + Assert.Equal(_expectedCrc, actual.CRC.ToHexString()); + Assert.Equal(_expectedMd5, actual.MD5.ToHexString()); + Assert.Equal(_expectedSha1, actual.SHA1.ToHexString()); + } + + [Fact] + public void GetInfo_Stream_Null() + { + Stream? input = null; + BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes); + + Assert.Null(actual.Size); + Assert.Null(actual.CRC); + Assert.Null(actual.MD5); + Assert.Null(actual.SHA1); + } + + [Fact] + public void GetInfo_Stream_Valid() + { + string path = Path.Combine(Environment.CurrentDirectory, "TestData", "file-to-hash.bin"); + Stream? input = File.OpenRead(path); + BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes); + + Assert.Equal(_expectedSize, actual.Size); + Assert.Equal(_expectedCrc, actual.CRC.ToHexString()); + Assert.Equal(_expectedMd5, actual.MD5.ToHexString()); + Assert.Equal(_expectedSha1, actual.SHA1.ToHexString()); + } + + #endregion + } +} \ No newline at end of file diff --git a/SabreTools.FileTypes.Test/SabreTools.FileTypes.Test.csproj b/SabreTools.FileTypes.Test/SabreTools.FileTypes.Test.csproj index 26cab7a2..a32c3749 100644 --- a/SabreTools.FileTypes.Test/SabreTools.FileTypes.Test.csproj +++ b/SabreTools.FileTypes.Test/SabreTools.FileTypes.Test.csproj @@ -7,6 +7,16 @@ enable + + + + + + + Always + + + diff --git a/SabreTools.FileTypes.Test/TestData/file-to-hash.bin b/SabreTools.FileTypes.Test/TestData/file-to-hash.bin new file mode 100644 index 00000000..7724139e --- /dev/null +++ b/SabreTools.FileTypes.Test/TestData/file-to-hash.bin @@ -0,0 +1 @@ +This is just a file that has a known set of hashes to make sure that everything with hashing is still working as anticipated. \ No newline at end of file diff --git a/SabreTools.FileTypes/FileTypeTool.cs b/SabreTools.FileTypes/FileTypeTool.cs index 6bc0fc2e..e58666ff 100644 --- a/SabreTools.FileTypes/FileTypeTool.cs +++ b/SabreTools.FileTypes/FileTypeTool.cs @@ -43,8 +43,10 @@ namespace SabreTools.FileTypes /// Populated BaseFile object if success, empty on error public static BaseFile GetInfo(string input, HashType[] hashes, string? header) { - // Add safeguard if file doesn't exist - if (!File.Exists(input)) + // Add safeguard if file is invalid + if (string.IsNullOrEmpty(input)) + return new BaseFile(); + else if (!File.Exists(input)) return new BaseFile(); try