2 using System.Collections.Generic;
5 using System.Security.Cryptography;
7 using System.Threading;
8 using System.Threading.Tasks;
10 using Newtonsoft.Json;
13 namespace Pithos.Core.Test
16 public class SignatureTest
20 public void TestCreate()
22 var hasher = HashAlgorithm.Create("sha256");
23 Assert.IsNotNull(hasher);
27 public void TestHashmapCreation()
29 var file = "e:\\pithos\\vlc-1.1.11-win32.exe";
31 decimal blockSize = 4*1024*1024;
33 var fileSize = new FileInfo(file).Length;
34 var numBlocks = decimal.Ceiling(fileSize/blockSize);
36 var md5 = Signature.CalculateMD5(file);
38 var hash1 = Signature.CalculateTreeHashAsync(file, (int) blockSize,"sha256").Result;
39 Assert.IsNotNull(hash1.Hashes);
40 Assert.AreEqual(numBlocks, hash1.Hashes.Count());
42 var topHash = hash1.TopHash;
43 var hashString = BytesToStr(topHash);
45 var stringHashes = (from hash in hash1.Hashes
46 select BytesToStr(hash)).ToList();
47 var hashes = JsonConvert.SerializeObject(stringHashes);
48 Assert.IsNotNull(topHash);
52 public void TestHashmapStorage()
54 var file = "e:\\pithos\\vlc-1.1.11-win32.exe";
56 decimal blockSize = 4*1024*1024;
58 var fileSize = new FileInfo(file).Length;
59 var numBlocks = decimal.Ceiling(fileSize/blockSize);
61 var md5 = Signature.CalculateMD5(file);
63 var hash1 = Signature.CalculateTreeHashAsync(file, (int) blockSize, "sha256").Result;
64 hash1.FileId = Guid.NewGuid();
65 var task = hash1.Save(@"e:\")
66 .ContinueWith(_ => TreeHash.LoadTreeHash(@"e:\", hash1.FileId)).Unwrap();
67 task.ContinueWith(t =>
70 Assert.AreEqual(hash1.Hashes, hash.Hashes.ToArray());
75 public static string BytesToStr(byte[] bytes)
77 var str = new StringBuilder();
79 foreach (byte t in bytes)
80 str.AppendFormat("{0:X2}", t);
82 return str.ToString();
87 public void TestTopHashEmpty()
89 using (var hasher = HashAlgorithm.Create("sha256"))
91 var hashEmpty = hasher.ComputeHash(new byte[] {});
93 var empty = new List<byte[]>();
94 var hash = Signature.CalculateTopHash(empty,"sha256");
100 public void TestHashMapsEqual()
103 CloudFilesClient client = new CloudFilesClient();
104 client.AuthenticationUrl = @"https://pithos.dev.grnet.gr";
105 client.UsePithos = true;
106 var account = "890329@vho.grnet.gr";
107 client.Authenticate(account, "24989dce4e0fcb072f8cb60c8922be19");
108 var fileName = @"vlc-1.1.11-win32.exe";
109 var localHash= Signature.CalculateTreeHashAsync(Path.Combine(@"e:\pithos\", fileName), 4 * 1024 * 1024, "sha256").Result;
110 var upHash= client.GetHashMap(fileName, account, "pithos").Result;
112 Assert.AreEqual(upHash.TopHash, localHash.TopHash);
114 Assert.AreEqual(upHash.Hashes,localHash.Hashes);
118 public void TestAsyncEquivalence()
121 var fileName = @"vlc-1.1.11-win32.exe";
122 var syncHash= Signature.CalculateTreeHash(Path.Combine(@"e:\pithos\", fileName), 4 * 1024 * 1024, "sha256");
123 var asyncHash = Signature.CalculateTreeHashAsync(Path.Combine(@"e:\pithos\", fileName), 4 * 1024 * 1024, "sha256")
126 Assert.AreEqual(syncHash.TopHash, asyncHash.TopHash);
128 Assert.AreEqual(syncHash.Hashes,asyncHash.Hashes);