diff --git a/SabreTools.Hashing.Test/HashToolTests.cs b/SabreTools.Hashing.Test/HashToolTests.cs new file mode 100644 index 0000000..0ad3ed4 --- /dev/null +++ b/SabreTools.Hashing.Test/HashToolTests.cs @@ -0,0 +1,125 @@ +using System; +using System.IO; +using Xunit; + +namespace SabreTools.Hashing.Test +{ + public class HashToolTests + { + private static readonly string _hashFilePath = Path.Combine(Environment.CurrentDirectory, "TestData", "file-to-hash.bin"); + + #region Known File Information + + private const long _hashFileSize = 125; + private const string _crc32 = "ba02a660"; + private const string _crc64 = "a0e0009c18b5338d"; + private const string _md5 = "b722871eaa950016296184d026c5dec9"; + private const string _sha1 = "eea1ee2d801d830c4bdad4df3c8da6f9f52d1a9f"; + private const string _sha256 = "fdb02dee8c319c52087382c45f099c90d0b6cc824850aff28c1bfb2884b7b855"; + private const string _sha384 = "e276c49618fff25bc1fe2e0659cd0ef0e7c1186563b063e07c52323b9899f3ce9b091be04d6208444b3ef1265e879074"; + private const string _sha512 = "15d69514eb628c2403e945a7cafd1d27e557f6e336c69b63ea17e7ed9d256cc374ee662f09305836d6de37fdae59d83883b982aa8446e4ff26346b6b6b50b240"; + private const string _spamsum = "3:hMCPQCE6AFQxWyENFACBE+rW6Tj7SMQmKozr9MVERk:hZRdxZENFs+rPSromek"; + private const string _xxhash32 = "8e331daa"; + private const string _xxhash64 = "082bf6f0a49e1e18"; + private const string _xxhash3 = "040474eb0eda9ff2"; + private const string _xxhash128 = "d934b4b4a5e1e11baeef8012fbcd11e8"; + + #endregion + + [Fact] + public void GetStandardHashesTest() + { + bool gotHashes = HashTool.GetStandardHashes(_hashFilePath, out long actualSize, out string? crc32, out string? md5, out string? sha1); + + Assert.True(gotHashes); + Assert.Equal(_hashFileSize, actualSize); + Assert.Equal(_crc32, crc32); + Assert.Equal(_md5, md5); + Assert.Equal(_sha1, sha1); + } + + [Fact] + public void GetFileHashesTest() + { + var hashDict = HashTool.GetFileHashes(_hashFilePath); + + Assert.NotNull(hashDict); + Assert.Equal(_crc32, hashDict[HashType.CRC32]); + Assert.Equal(_crc64, hashDict[HashType.CRC64]); + Assert.Equal(_md5, hashDict[HashType.MD5]); + Assert.Equal(_sha1, hashDict[HashType.SHA1]); + Assert.Equal(_sha256, hashDict[HashType.SHA256]); + Assert.Equal(_sha384, hashDict[HashType.SHA384]); + Assert.Equal(_sha512, hashDict[HashType.SHA512]); + Assert.Equal(_spamsum, hashDict[HashType.SpamSum]); + Assert.Equal(_xxhash32, hashDict[HashType.XxHash32]); + Assert.Equal(_xxhash64, hashDict[HashType.XxHash64]); + Assert.Equal(_xxhash3, hashDict[HashType.XxHash3]); + Assert.Equal(_xxhash128, hashDict[HashType.XxHash128]); + } + + [Fact] + public void GetFileHashesAndSizeTest() + { + var hashDict = HashTool.GetFileHashesAndSize(_hashFilePath, out long actualSize); + + Assert.Equal(_hashFileSize, actualSize); + Assert.NotNull(hashDict); + Assert.Equal(_crc32, hashDict[HashType.CRC32]); + Assert.Equal(_crc32, hashDict[HashType.CRC32]); + Assert.Equal(_crc64, hashDict[HashType.CRC64]); + Assert.Equal(_md5, hashDict[HashType.MD5]); + Assert.Equal(_sha1, hashDict[HashType.SHA1]); + Assert.Equal(_sha256, hashDict[HashType.SHA256]); + Assert.Equal(_sha384, hashDict[HashType.SHA384]); + Assert.Equal(_sha512, hashDict[HashType.SHA512]); + Assert.Equal(_spamsum, hashDict[HashType.SpamSum]); + Assert.Equal(_xxhash32, hashDict[HashType.XxHash32]); + Assert.Equal(_xxhash64, hashDict[HashType.XxHash64]); + Assert.Equal(_xxhash3, hashDict[HashType.XxHash3]); + Assert.Equal(_xxhash128, hashDict[HashType.XxHash128]); + } + + [Fact] + public void GetByteArrayHashesTest() + { + byte[] fileBytes = File.ReadAllBytes(_hashFilePath); + var hashDict = HashTool.GetByteArrayHashes(fileBytes); + + Assert.NotNull(hashDict); + Assert.Equal(_crc32, hashDict[HashType.CRC32]); + Assert.Equal(_crc64, hashDict[HashType.CRC64]); + Assert.Equal(_md5, hashDict[HashType.MD5]); + Assert.Equal(_sha1, hashDict[HashType.SHA1]); + Assert.Equal(_sha256, hashDict[HashType.SHA256]); + Assert.Equal(_sha384, hashDict[HashType.SHA384]); + Assert.Equal(_sha512, hashDict[HashType.SHA512]); + Assert.Equal(_spamsum, hashDict[HashType.SpamSum]); + Assert.Equal(_xxhash32, hashDict[HashType.XxHash32]); + Assert.Equal(_xxhash64, hashDict[HashType.XxHash64]); + Assert.Equal(_xxhash3, hashDict[HashType.XxHash3]); + Assert.Equal(_xxhash128, hashDict[HashType.XxHash128]); + } + + [Fact] + public void GetStreamHashesTest() + { + var fileStream = File.OpenRead(_hashFilePath); + var hashDict = HashTool.GetStreamHashes(fileStream); + + Assert.NotNull(hashDict); + Assert.Equal(_crc32, hashDict[HashType.CRC32]); + Assert.Equal(_crc64, hashDict[HashType.CRC64]); + Assert.Equal(_md5, hashDict[HashType.MD5]); + Assert.Equal(_sha1, hashDict[HashType.SHA1]); + Assert.Equal(_sha256, hashDict[HashType.SHA256]); + Assert.Equal(_sha384, hashDict[HashType.SHA384]); + Assert.Equal(_sha512, hashDict[HashType.SHA512]); + Assert.Equal(_spamsum, hashDict[HashType.SpamSum]); + Assert.Equal(_xxhash32, hashDict[HashType.XxHash32]); + Assert.Equal(_xxhash64, hashDict[HashType.XxHash64]); + Assert.Equal(_xxhash3, hashDict[HashType.XxHash3]); + Assert.Equal(_xxhash128, hashDict[HashType.XxHash128]); + } + } +} \ No newline at end of file diff --git a/SabreTools.Hashing.Test/SabreTools.Hashing.Test.csproj b/SabreTools.Hashing.Test/SabreTools.Hashing.Test.csproj new file mode 100644 index 0000000..5e54824 --- /dev/null +++ b/SabreTools.Hashing.Test/SabreTools.Hashing.Test.csproj @@ -0,0 +1,36 @@ + + + + net6.0;net8.0 + false + enable + + + + + + + + + Always + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/SabreTools.Hashing.Test/TestData/file-to-hash.bin b/SabreTools.Hashing.Test/TestData/file-to-hash.bin new file mode 100644 index 0000000..7724139 --- /dev/null +++ b/SabreTools.Hashing.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.Hashing.sln b/SabreTools.Hashing.sln index 4bc4d90..b5fcb40 100644 --- a/SabreTools.Hashing.sln +++ b/SabreTools.Hashing.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Hashing", "SabreTools.Hashing\SabreTools.Hashing.csproj", "{F7E34528-080E-4E60-B9D1-8ADF70A24BB0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Hashing.Test", "SabreTools.Hashing.Test\SabreTools.Hashing.Test.csproj", "{A2BCBFDE-685B-4817-B724-050A99E02601}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -18,5 +20,9 @@ Global {F7E34528-080E-4E60-B9D1-8ADF70A24BB0}.Debug|Any CPU.Build.0 = Debug|Any CPU {F7E34528-080E-4E60-B9D1-8ADF70A24BB0}.Release|Any CPU.ActiveCfg = Release|Any CPU {F7E34528-080E-4E60-B9D1-8ADF70A24BB0}.Release|Any CPU.Build.0 = Release|Any CPU + {A2BCBFDE-685B-4817-B724-050A99E02601}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2BCBFDE-685B-4817-B724-050A99E02601}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2BCBFDE-685B-4817-B724-050A99E02601}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2BCBFDE-685B-4817-B724-050A99E02601}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal