2 using System.Collections.Concurrent;
3 using System.Collections.Generic;
4 using System.Diagnostics;
7 using System.Security.Cryptography;
9 using System.Threading;
10 using System.Threading.Tasks;
11 using NUnit.Framework;
12 using Newtonsoft.Json;
15 namespace Pithos.Core.Test
18 public class SignatureTest
22 public void TestCreate()
24 var hasher = HashAlgorithm.Create("sha256");
25 Assert.IsNotNull(hasher);
29 public void TestHashmapCreation()
31 var file = "e:\\pithos\\vlc-1.1.11-win32.exe";
33 decimal blockSize = 4*1024*1024;
35 var fileSize = new FileInfo(file).Length;
36 var numBlocks = decimal.Ceiling(fileSize/blockSize);
38 var md5 = Signature.CalculateMD5(file);
40 var hash1 = Signature.CalculateTreeHashAsync(file, (int) blockSize,"sha256", 2).Result;
41 Assert.IsNotNull(hash1.Hashes);
42 Assert.AreEqual(numBlocks, hash1.Hashes.Count());
44 var topHash = hash1.TopHash;
45 var hashString = BytesToStr(topHash);
47 var stringHashes = (from hash in hash1.Hashes
48 select BytesToStr(hash)).ToList();
49 var hashes = JsonConvert.SerializeObject(stringHashes);
50 Assert.IsNotNull(topHash);
54 public void TestHashmapStorage()
56 var file = "e:\\pithos\\vlc-1.1.11-win32.exe";
58 decimal blockSize = 4*1024*1024;
60 var fileSize = new FileInfo(file).Length;
61 var numBlocks = decimal.Ceiling(fileSize/blockSize);
63 var md5 = Signature.CalculateMD5(file);
65 var hash1 = Signature.CalculateTreeHashAsync(file, (int) blockSize, "sha256", 2).Result;
66 hash1.FileId = Guid.NewGuid();
67 var task = hash1.Save(@"e:\")
68 .ContinueWith(_ => TreeHash.LoadTreeHash(@"e:\", hash1.FileId)).Unwrap();
69 task.ContinueWith(t =>
72 Assert.AreEqual(hash1.Hashes, hash.Hashes.ToArray());
77 public void TestLargeHashCalculation()
80 var file = "e:\\testFile.tmp";
81 if (!File.Exists(file))
83 byte[] buffer= new byte[300 * 1048576];
84 Random rnd=new Random();
85 rnd.NextBytes(buffer);
86 //Create a 100MB buffer
87 File.WriteAllBytes(file,buffer);
90 decimal blockSize = 4 * 1048576;
93 var stopwatch = Stopwatch.StartNew();
94 var hash1 = Signature.CalculateTreeHashAsync(file, (int)blockSize, "sha256", 1).Result;
96 Trace.WriteLine(stopwatch.Elapsed);
100 var hash2 = Signature.CalculateTreeHashAsync(file, (int)blockSize, "sha256", 2).Result;
102 Trace.WriteLine(stopwatch.Elapsed);
104 Trace.WriteLine("3");
106 var hash3 = Signature.CalculateTreeHashAsync(file, (int)blockSize, "sha256", 3).Result;
108 Trace.WriteLine(stopwatch.Elapsed);
110 Assert.That(hash3.TopHash,Is.EquivalentTo(hash2.TopHash));
116 public static string BytesToStr(byte[] bytes)
118 var str = new StringBuilder();
120 foreach (byte t in bytes)
121 str.AppendFormat("{0:X2}", t);
123 return str.ToString();
128 public void TestTopHashEmpty()
130 using (var hasher = HashAlgorithm.Create("sha256"))
132 var hashEmpty = hasher.ComputeHash(new byte[] {});
134 var empty = new List<byte[]>();
135 var hash = Signature.CalculateTopHash(empty,"sha256");
141 public void TestHashMapsEqual()
144 var account = "890329@vho.grnet.gr";
145 var apiKey = "24989dce4e0fcb072f8cb60c8922be19";
146 var client = new CloudFilesClient(account, apiKey);
147 client.AuthenticationUrl = @"https://pithos.dev.grnet.gr";
148 client.UsePithos = true;
149 client.Authenticate();
150 var fileName = @"vlc-1.1.11-win32.exe";
151 var localHash= Signature.CalculateTreeHashAsync(Path.Combine(@"e:\pithos\", fileName), 4 * 1024 * 1024, "sha256", 2).Result;
152 var upHash= client.GetHashMap(fileName, account, "pithos").Result;
154 Assert.AreEqual(upHash.TopHash, localHash.TopHash);
156 Assert.AreEqual(upHash.Hashes,localHash.Hashes);
160 public void TestAsyncEquivalence()
163 var fileName = @"vlc-1.1.11-win32.exe";
164 var syncHash= Signature.CalculateTreeHash(Path.Combine(@"e:\pithos\", fileName), 4 * 1024 * 1024, "sha256");
165 var asyncHash = Signature.CalculateTreeHashAsync(Path.Combine(@"e:\pithos\", fileName), 4 * 1024 * 1024, "sha256", 2)
168 Assert.AreEqual(syncHash.TopHash, asyncHash.TopHash);
170 Assert.AreEqual(syncHash.Hashes,asyncHash.Hashes);