Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PROPOSAL] Add Download Attribute Transformer #1710

Merged
merged 13 commits into from
May 5, 2016
Merged
Prev Previous commit
Next Next commit
Output array of hashes + merge FileHash into FileService
techman83 committed May 3, 2016

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit cd6a38c5c76bd7595fbbb03d6c48041163dfc869
2 changes: 0 additions & 2 deletions Netkan/CKAN-netkan.csproj
Original file line number Diff line number Diff line change
@@ -38,8 +38,6 @@
<Compile Include="Constants.cs" />
<Compile Include="Services\FileService.cs" />
<Compile Include="Services\IFileService.cs" />
<Compile Include="Services\FileHash.cs" />
<Compile Include="Services\IFileHash.cs" />
<Compile Include="Services\IModuleService.cs" />
<Compile Include="Services\CachingHttpService.cs" />
<Compile Include="ConsoleUser.cs">
2 changes: 0 additions & 2 deletions Netkan/Program.cs
Original file line number Diff line number Diff line change
@@ -46,7 +46,6 @@ public static int Main(string[] args)

var moduleService = new ModuleService();
var fileService = new FileService();
var fileHash = new FileHash();
var http = new CachingHttpService(FindCache(new KSPManager(new ConsoleUser(false))));

var netkan = ReadNetkan();
@@ -58,7 +57,6 @@ public static int Main(string[] args)
var transformer = new NetkanTransformer(
http,
fileService,
fileHash,
moduleService,
Options.GitHubToken,
Options.PreRelease
21 changes: 0 additions & 21 deletions Netkan/Services/FileHash.cs

This file was deleted.

28 changes: 27 additions & 1 deletion Netkan/Services/FileService.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System.IO;
using System;
using System.IO;
using System.Security.Cryptography;

namespace CKAN.NetKAN.Services
{
@@ -8,5 +10,29 @@ public long GetSizeBytes(string filePath)
{
return new FileInfo(filePath).Length;
}

public string GetFileHashSha1(string filePath)
{
using (FileStream fs = new FileStream(@filePath, FileMode.Open))
using (BufferedStream bs = new BufferedStream(fs))
using (var sha1 = new SHA1Managed())
{
byte[] hash = sha1.ComputeHash(bs);

return BitConverter.ToString(hash).Replace("-", "");
}
}

public string GetFileHashSha256(string filePath)
{
using (FileStream fs = new FileStream(@filePath, FileMode.Open))
using (BufferedStream bs = new BufferedStream(fs))
using (var sha256 = new SHA256Managed())
{
byte[] hash = sha256.ComputeHash(bs);

return BitConverter.ToString(hash).Replace("-", "");
}
}
}
}
7 changes: 0 additions & 7 deletions Netkan/Services/IFileHash.cs

This file was deleted.

2 changes: 2 additions & 0 deletions Netkan/Services/IFileService.cs
Original file line number Diff line number Diff line change
@@ -3,5 +3,7 @@
internal interface IFileService
{
long GetSizeBytes(string filePath);
string GetFileHashSha1(string filePath);
string GetFileHashSha256(string filePath);
}
}
22 changes: 18 additions & 4 deletions Netkan/Transformers/DownloadHashTransformer.cs
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@
using CKAN.NetKAN.Model;
using CKAN.NetKAN.Services;
using log4net;
using Newtonsoft.Json.Linq;

namespace CKAN.NetKAN.Transformers
{
@@ -13,14 +14,14 @@ internal sealed class DownloadHashTransformer : ITransformer
private static readonly ILog Log = LogManager.GetLogger(typeof(DownloadHashTransformer));

private readonly IHttpService _http;
private readonly IFileHash _fileHash;
private readonly IFileService _fileService;

public string Name { get { return "download_hash"; } }

public DownloadHashTransformer(IHttpService http, IFileHash fileHash)
public DownloadHashTransformer(IHttpService http, IFileService fileService)
{
_http = http;
_fileHash = fileHash;
_fileService = fileService;
}

public Metadata Transform(Metadata metadata)
@@ -36,7 +37,20 @@ public Metadata Transform(Metadata metadata)

if (file != null)
{
json["download_hash"] = _fileHash.GetFileHash(file);
var sha1 = new JObject();
sha1.Add("type", "sha1");
sha1.Add("digest", _fileService.GetFileHashSha1(file));

var sha256 = new JObject();
sha256.Add("type", "sha256");
sha256.Add("digest", _fileService.GetFileHashSha256(file));

json["download_hash"] = new JArray();

var download_hashJson = (JArray)json["download_hash"];

download_hashJson.Add(sha1);
download_hashJson.Add(sha256);
}

Log.DebugFormat("Transformed metadata:{0}{1}", Environment.NewLine, json);
3 changes: 1 addition & 2 deletions Netkan/Transformers/NetkanTransformer.cs
Original file line number Diff line number Diff line change
@@ -19,7 +19,6 @@ internal sealed class NetkanTransformer : ITransformer
public NetkanTransformer(
IHttpService http,
IFileService fileService,
IFileHash fileHash,
IModuleService moduleService,
string githubToken,
bool prerelease
@@ -41,7 +40,7 @@ bool prerelease
// specify a before or after property.
new VersionedOverrideTransformer(before: new string[] { null }, after: new string[] { null }),
new DownloadSizeTransformer(http, fileService),
new DownloadHashTransformer(http, fileHash),
new DownloadHashTransformer(http, fileService),
new GeneratedByTransformer(),
new OptimusPrimeTransformer(),
new StripNetkanMetadataTransformer(),
1 change: 1 addition & 0 deletions Netkan/Transformers/PropertySortTransformer.cs
Original file line number Diff line number Diff line change
@@ -40,6 +40,7 @@ internal sealed class PropertySortTransformer : ITransformer
{ "install", 22 },
{ "download", 23 },
{ "download_size", 24 },
{ "download_hash", 25 },

{ "x_generated_by", int.MaxValue }
};
25 changes: 0 additions & 25 deletions Tests/NetKAN/Services/FileHashTests.cs

This file was deleted.

30 changes: 30 additions & 0 deletions Tests/NetKAN/Services/FileServiceTests.cs
Original file line number Diff line number Diff line change
@@ -21,5 +21,35 @@ public void GetsFileSizeCorrectly()
"FileService should return the correct file size."
);
}

[Test]
public void GetsFileHashSha1Correctly()
{
// Arrange
var sut = new FileService();

// Act
var result = sut.GetFileHashSha1(TestData.DogeCoinFlagZip());

// Assert
Assert.That(result, Is.EqualTo("47B6ED5F502AD914744882858345BE030A29E1AA"),
"FileService should return the correct file SHA1 hash."
);
}

[Test]
public void GetsFileHashSha256Correctly()
{
// Arrange
var sut = new FileService();

// Act
var result = sut.GetFileHashSha256(TestData.DogeCoinFlagZip());

// Assert
Assert.That(result, Is.EqualTo("EC955DB772FBA8CAA62BF61C180D624C350D792C6F573D35A5EAEE3898DCF7C1"),
"FileService should return the correct file SHA256 hash."
);
}
}
}
39 changes: 27 additions & 12 deletions Tests/NetKAN/Transformers/DownloadHashTransformerTests.cs
Original file line number Diff line number Diff line change
@@ -16,18 +16,22 @@ public void AddsDownloadHash()
{
// Arrange
const string downloadFilePath = "/DoesNotExist.zip";
const string downloadHash = "47B6ED5F502AD914744882858345BE030A29E1AA";
const string downloadHashSha1 = "47B6ED5F502AD914744882858345BE030A29E1AA";
const string downloadHashSha256 = "EC955DB772FBA8CAA62BF61C180D624C350D792C6F573D35A5EAEE3898DCF7C1";

var mHttp = new Mock<IHttpService>();
var mFileHash = new Mock<IFileHash>();
var mFileService = new Mock<IFileService>();

mHttp.Setup(i => i.DownloadPackage(It.IsAny<Uri>(), It.IsAny<string>()))
.Returns(downloadFilePath);

mFileHash.Setup(i => i.GetFileHash(downloadFilePath))
.Returns(downloadHash);
mFileService.Setup(i => i.GetFileHashSha1(downloadFilePath))
.Returns(downloadHashSha1);

var sut = new DownloadHashTransformer(mHttp.Object, mFileHash.Object);
mFileService.Setup(i => i.GetFileHashSha256(downloadFilePath))
.Returns(downloadHashSha256);

var sut = new DownloadHashTransformer(mHttp.Object, mFileService.Object);

var json = new JObject();
json["spec_version"] = 1;
@@ -37,23 +41,34 @@ public void AddsDownloadHash()
var result = sut.Transform(new Metadata(json));
var transformedJson = result.Json();

// Collection Comparison
var sha1 = new JObject();
sha1.Add("type", "sha1");
sha1.Add("digest", downloadHashSha1);

var sha256 = new JObject();
sha256.Add("type", "sha256");
sha256.Add("digest", downloadHashSha256);

var download_hashJson = new JArray();
download_hashJson.Add(sha1);
download_hashJson.Add(sha256);

// Assert
Assert.That((string)transformedJson["download_hash"], Is.EqualTo(downloadHash),
"DownloadHashTransformer should add a download_hash property equal to the calculated hash of the file."
);
CollectionAssert.AreEquivalent(transformedJson["download_hash"],download_hashJson);
}

[Test]
public void DoesNothingIfFileDoesNotExist()
{
// Arrange
var mHttp = new Mock<IHttpService>();
var mFileHash = new Mock<IFileHash>();
var mFileService = new Mock<IFileService>();

mHttp.Setup(i => i.DownloadPackage(It.IsAny<Uri>(), It.IsAny<string>()))
.Returns((string)null);

var sut = new DownloadHashTransformer(mHttp.Object, mFileHash.Object);
var sut = new DownloadHashTransformer(mHttp.Object, mFileService.Object);

var json = new JObject();
json["spec_version"] = 1;
@@ -74,9 +89,9 @@ public void DoesNothingIfDownloadDoesNotExist()
{
// Arrange
var mHttp = new Mock<IHttpService>();
var mFileHash = new Mock<IFileHash>();
var mFileService = new Mock<IFileService>();

var sut = new DownloadHashTransformer(mHttp.Object, mFileHash.Object);
var sut = new DownloadHashTransformer(mHttp.Object, mFileService.Object);

var json = new JObject();
json["spec_version"] = 1;
1 change: 0 additions & 1 deletion Tests/Tests.csproj
Original file line number Diff line number Diff line change
@@ -144,7 +144,6 @@
<Compile Include="NetKAN\SDMod.cs" />
<Compile Include="NetKAN\MainClass.cs" />
<Compile Include="NetKAN\Services\FileServiceTests.cs" />
<Compile Include="NetKAN\Services\FileHashTests.cs" />
<Compile Include="NetKAN\Services\ModuleServiceTests.cs" />
<Compile Include="NetKAN\Sources\Github\GithubApiTests.cs" />
<Compile Include="NetKAN\Sources\Spacedock\SpacedockApiTests.cs" />