Skip to content

Commit

Permalink
Migrate the hash calculation methods from Ops-Tools-Build and add one…
Browse files Browse the repository at this point in the history
… for validating file hashes

references #297
  • Loading branch information
pvandervelde committed May 27, 2017
1 parent 91141a2 commit 89f7abe
Show file tree
Hide file tree
Showing 13 changed files with 1,070 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/nbuildkit/tasks/CustomDictionary.xml
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,9 @@

<Acronym>Pi</Acronym>

<!-- Encryption algorithm -->
<Acronym>SHA</Acronym>

<!-- Strong name tool -->
<Acronym>Sn</Acronym>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
//-----------------------------------------------------------------------
// <copyright company="nBuildKit">
// Copyright (c) nBuildKit. All rights reserved.
// Licensed under the Apache License, Version 2.0 license. See LICENCE.md file in the project root for full license information.
// </copyright>
//-----------------------------------------------------------------------

using System.IO;
using System.Reflection;
using Microsoft.Build.Utilities;
using NBuildKit.MsBuild.Tasks.Tests;
using Nuclei;
using NUnit.Framework;

namespace NBuildKit.MsBuild.Tasks.FileSystem
{
[TestFixture]
public sealed class CalculateFileHashTest : TaskTest
{
[Test]
public void ExecuteWithEmptyPath()
{
InitializeBuildEngine();

var task = new CalculateFileHash();
task.BuildEngine = BuildEngine.Object;
task.Algorithm = "md5";
task.Path = new TaskItem(string.Empty);

var result = task.Execute();
Assert.IsFalse(result);

VerifyNumberOfLogMessages(numberOfErrorMessages: 1, numberOfWarningMessages: 0, numberOfNormalMessages: 0);
}

[Test]
public void ExecuteWithInvalidHashAlgorithm()
{
var directory = Assembly.GetExecutingAssembly().LocalDirectoryPath();
var filePath = Path.Combine(directory, "FileToHash.txt");

InitializeBuildEngine();

var task = new CalculateFileHash();
task.BuildEngine = BuildEngine.Object;
task.Algorithm = "stuff";
task.Path = new TaskItem(filePath);

var result = task.Execute();
Assert.IsFalse(result);

VerifyNumberOfLogMessages(numberOfErrorMessages: 2, numberOfWarningMessages: 0, numberOfNormalMessages: 1);
}

[Test]
public void ExecuteWithMD5()
{
var directory = Assembly.GetExecutingAssembly().LocalDirectoryPath();
var filePath = Path.Combine(directory, "FileToHash.txt");

InitializeBuildEngine();

var task = new CalculateFileHash();
task.BuildEngine = BuildEngine.Object;
task.Algorithm = "md5";
task.Path = new TaskItem(filePath);

var result = task.Execute();
Assert.IsTrue(result);

Assert.AreEqual("B5D4379F6B3E960EA12132B34E8E65C9", task.Hash);

VerifyNumberOfLogMessages(numberOfErrorMessages: 0, numberOfWarningMessages: 0, numberOfNormalMessages: 1);
}

[Test]
public void ExecuteWithNonExistingPath()
{
InitializeBuildEngine();

var task = new CalculateFileHash();
task.BuildEngine = BuildEngine.Object;
task.Algorithm = "md5";
task.Path = new TaskItem(@"c:\this\path\does\not\exist.txt");

var result = task.Execute();
Assert.IsFalse(result);

VerifyNumberOfLogMessages(numberOfErrorMessages: 1, numberOfWarningMessages: 0, numberOfNormalMessages: 1);
}

[Test]
public void ExecuteWithNullPath()
{
InitializeBuildEngine();

var task = new CalculateFileHash();
task.BuildEngine = BuildEngine.Object;
task.Algorithm = "md5";
task.Path = null;

var result = task.Execute();
Assert.IsFalse(result);

VerifyNumberOfLogMessages(numberOfErrorMessages: 1, numberOfWarningMessages: 0, numberOfNormalMessages: 0);
}

[Test]
public void ExecuteWithSHA1()
{
var directory = Assembly.GetExecutingAssembly().LocalDirectoryPath();
var filePath = Path.Combine(directory, "FileToHash.txt");

InitializeBuildEngine();

var task = new CalculateFileHash();
task.BuildEngine = BuildEngine.Object;
task.Algorithm = "sha1";
task.Path = new TaskItem(filePath);

var result = task.Execute();
Assert.IsTrue(result);

Assert.AreEqual("FFC0F8E69E3753E3A4087E197C160261F3EF11D5", task.Hash);

VerifyNumberOfLogMessages(numberOfErrorMessages: 0, numberOfWarningMessages: 0, numberOfNormalMessages: 1);
}

[Test]
public void ExecuteWithSHA256()
{
var directory = Assembly.GetExecutingAssembly().LocalDirectoryPath();
var filePath = Path.Combine(directory, "FileToHash.txt");

InitializeBuildEngine();

var task = new CalculateFileHash();
task.BuildEngine = BuildEngine.Object;
task.Algorithm = "sha256";
task.Path = new TaskItem(filePath);

var result = task.Execute();
Assert.IsTrue(result);

Assert.AreEqual("A65235E41B8072B726FDEBB63DEEF3EBDFE4FED516F510608DA6BB1497ED11BA", task.Hash);

VerifyNumberOfLogMessages(numberOfErrorMessages: 0, numberOfWarningMessages: 0, numberOfNormalMessages: 1);
}

[Test]
public void ExecuteWithSHA512()
{
var directory = Assembly.GetExecutingAssembly().LocalDirectoryPath();
var filePath = Path.Combine(directory, "FileToHash.txt");

InitializeBuildEngine();

var task = new CalculateFileHash();
task.BuildEngine = BuildEngine.Object;
task.Algorithm = "sha512";
task.Path = new TaskItem(filePath);

var result = task.Execute();
Assert.IsTrue(result);

Assert.AreEqual("9E340E6C4B70FA6E9F1F5D25859F57E1FCC7A0B3A49B94AE5B3E64090FCC4CA4E2490E10556C85E0B84F634B68EC6C7312F834A875A76EC5996ABDED70C214F1", task.Hash);

VerifyNumberOfLogMessages(numberOfErrorMessages: 0, numberOfWarningMessages: 0, numberOfNormalMessages: 1);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
//-----------------------------------------------------------------------
// <copyright company="nBuildKit">
// Copyright (c) nBuildKit. All rights reserved.
// Licensed under the Apache License, Version 2.0 license. See LICENCE.md file in the project root for full license information.
// </copyright>
//-----------------------------------------------------------------------

using System;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Text;
using Microsoft.Build.Utilities;
using NBuildKit.MsBuild.Tasks.Tests;
using Nuclei;
using NUnit.Framework;

namespace NBuildKit.MsBuild.Tasks.FileSystem
{
[TestFixture]
public sealed class ReadHashesFromFileTest : TaskTest
{
[Test]
public void ExecuteWithEmptyPath()
{
InitializeBuildEngine();

var task = new ReadHashesFromFile();
task.BuildEngine = BuildEngine.Object;
task.Path = new TaskItem(string.Empty);

var result = task.Execute();
Assert.IsFalse(result);

VerifyNumberOfLogMessages(numberOfErrorMessages: 1, numberOfWarningMessages: 0, numberOfNormalMessages: 0);
}

[Test]
public void ExecuteWithMultipleEntries()
{
var directory = Assembly.GetExecutingAssembly().LocalDirectoryPath();
var filePath = Path.Combine(
directory,
string.Format(
CultureInfo.InvariantCulture,
"{0}.json",
Guid.NewGuid().ToString()));

var text =
@"[
{ ""IsEndValue"": false, ""Algorithm"": ""SHA256"", ""File"": ""c:\\temp\\myfile1.txt"", ""Hash"":""AB"" },
{ ""IsEndValue"": false, ""Algorithm"": ""SHA384"", ""File"": ""c:\\temp\\myfile2.txt"", ""Hash"":""CD"" },
{ ""IsEndValue"": false, ""Algorithm"": ""SHA512"", ""File"": ""c:\\temp\\myfile3.txt"", ""Hash"":""EF"" },
{ ""IsEndValue"": true }
]
";
using (var writer = new StreamWriter(filePath, false, Encoding.UTF8))
{
writer.WriteLine(text);
}

InitializeBuildEngine();

var task = new ReadHashesFromFile();
task.BuildEngine = BuildEngine.Object;
task.Path = new TaskItem(filePath);

var result = task.Execute();
Assert.IsTrue(result);

var hashes = task.Hashes;
Assert.AreEqual(3, hashes.Length);
Assert.AreEqual(@"c:\temp\myfile1.txt", hashes[0].ItemSpec);
Assert.AreEqual("SHA256", hashes[0].GetMetadata("Algorithm"));
Assert.AreEqual("AB", hashes[0].GetMetadata("Hash"));

Assert.AreEqual(@"c:\temp\myfile2.txt", hashes[1].ItemSpec);
Assert.AreEqual("SHA384", hashes[1].GetMetadata("Algorithm"));
Assert.AreEqual("CD", hashes[1].GetMetadata("Hash"));

Assert.AreEqual(@"c:\temp\myfile3.txt", hashes[2].ItemSpec);
Assert.AreEqual("SHA512", hashes[2].GetMetadata("Algorithm"));
Assert.AreEqual("EF", hashes[2].GetMetadata("Hash"));

VerifyNumberOfLogMessages(numberOfErrorMessages: 0, numberOfWarningMessages: 0, numberOfNormalMessages: 1);
}

[Test]
public void ExecuteWithNonExistingPath()
{
InitializeBuildEngine();

var task = new ReadHashesFromFile();
task.BuildEngine = BuildEngine.Object;
task.Path = new TaskItem(@"c:\this\path\does\not\exist.txt");

var result = task.Execute();
Assert.IsFalse(result);

VerifyNumberOfLogMessages(numberOfErrorMessages: 1, numberOfWarningMessages: 0, numberOfNormalMessages: 1);
}

[Test]
public void ExecuteWithNullPath()
{
InitializeBuildEngine();

var task = new ReadHashesFromFile();
task.BuildEngine = BuildEngine.Object;
task.Path = null;

var result = task.Execute();
Assert.IsFalse(result);

VerifyNumberOfLogMessages(numberOfErrorMessages: 1, numberOfWarningMessages: 0, numberOfNormalMessages: 0);
}

[Test]
public void ExecuteWithoutEntries()
{
var directory = Assembly.GetExecutingAssembly().LocalDirectoryPath();
var filePath = Path.Combine(
directory,
string.Format(
CultureInfo.InvariantCulture,
"{0}.json",
Guid.NewGuid().ToString()));

var text =
@"[
{ ""IsEndValue"": true }
]
";
using (var writer = new StreamWriter(filePath, false, Encoding.UTF8))
{
writer.WriteLine(text);
}

InitializeBuildEngine();

var task = new ReadHashesFromFile();
task.BuildEngine = BuildEngine.Object;
task.Path = new TaskItem(filePath);

var result = task.Execute();
Assert.IsTrue(result);

var hashes = task.Hashes;
Assert.AreEqual(0, hashes.Length);

VerifyNumberOfLogMessages(numberOfErrorMessages: 0, numberOfWarningMessages: 0, numberOfNormalMessages: 1);
}

[Test]
public void ExecuteWithSingleEntry()
{
var directory = Assembly.GetExecutingAssembly().LocalDirectoryPath();
var filePath = Path.Combine(
directory,
string.Format(
CultureInfo.InvariantCulture,
"{0}.json",
Guid.NewGuid().ToString()));

var text =
@"[
{ ""IsEndValue"": false, ""Algorithm"": ""SHA256"", ""File"": ""c:\\temp\\myfile.txt"", ""Hash"":""ABCDEFGH"" },
{ ""IsEndValue"": true }
]
";
using (var writer = new StreamWriter(filePath, false, Encoding.UTF8))
{
writer.WriteLine(text);
}

InitializeBuildEngine();

var task = new ReadHashesFromFile();
task.BuildEngine = BuildEngine.Object;
task.Path = new TaskItem(filePath);

var result = task.Execute();
Assert.IsTrue(result);

var hashes = task.Hashes;
Assert.AreEqual(1, hashes.Length);
Assert.AreEqual(@"c:\temp\myfile.txt", hashes[0].ItemSpec);
Assert.AreEqual("SHA256", hashes[0].GetMetadata("Algorithm"));
Assert.AreEqual("ABCDEFGH", hashes[0].GetMetadata("Hash"));

VerifyNumberOfLogMessages(numberOfErrorMessages: 0, numberOfWarningMessages: 0, numberOfNormalMessages: 1);
}
}
}
Loading

0 comments on commit 89f7abe

Please sign in to comment.