Added fix for maximum error response
[pithos-ms-client] / trunk / Pithos.Network.Test / SignatureTest.cs
1 using System;
2 using System.Collections.Concurrent;
3 using System.Collections.Generic;
4 using System.Diagnostics;
5 using System.IO;
6 using System.Linq;
7 using System.Security.Cryptography;
8 using System.Text;
9 using System.Threading;
10 using System.Threading.Tasks;
11 using NUnit.Framework;
12 using Newtonsoft.Json;
13 using Pithos.Network;
14
15 namespace Pithos.Core.Test
16 {
17     [TestFixture]
18     public class SignatureTest
19     {
20
21         [Test]
22         public void TestCreate()
23         {
24             var hasher = HashAlgorithm.Create("sha256");
25             Assert.IsNotNull(hasher);
26         }
27
28         [Test]
29         public void TestHashmapCreation()
30         {
31             var file = "e:\\pithos\\vlc-1.1.11-win32.exe";
32
33             decimal blockSize = 4*1024*1024;
34
35             var fileSize = new FileInfo(file).Length;
36             var numBlocks = decimal.Ceiling(fileSize/blockSize);
37
38             var md5 = Signature.CalculateMD5(file);            
39
40             var hash1 = Signature.CalculateTreeHashAsync(file, (int) blockSize,"sha256", 2).Result;
41             Assert.IsNotNull(hash1.Hashes);
42             Assert.AreEqual(numBlocks, hash1.Hashes.Count());
43
44             var topHash = hash1.TopHash;
45             var hashString = BytesToStr(topHash);
46
47             var stringHashes = (from hash in hash1.Hashes
48                                select BytesToStr(hash)).ToList();
49             var hashes = JsonConvert.SerializeObject(stringHashes);
50             Assert.IsNotNull(topHash);
51         }
52         
53         [Test]
54         public void TestHashmapStorage()
55         {
56             var file = "e:\\pithos\\vlc-1.1.11-win32.exe";
57
58             decimal blockSize = 4*1024*1024;
59
60             var fileSize = new FileInfo(file).Length;
61             var numBlocks = decimal.Ceiling(fileSize/blockSize);
62
63             var md5 = Signature.CalculateMD5(file);
64
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 =>
70             {                
71                 var hash = t.Result;
72                 Assert.AreEqual(hash1.Hashes, hash.Hashes.ToArray());
73             }).Wait();
74         }
75
76         [Test]
77         public void TestLargeHashCalculation()
78         {
79
80             var file = "e:\\testFile.tmp";
81             if (!File.Exists(file))
82             {
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);                
88             }
89
90             decimal blockSize = 4 * 1048576;
91
92             Trace.WriteLine("1");
93             var stopwatch = Stopwatch.StartNew();            
94             var hash1 = Signature.CalculateTreeHashAsync(file, (int)blockSize, "sha256", 1).Result;
95             stopwatch.Stop();
96             Trace.WriteLine(stopwatch.Elapsed);
97             
98             Trace.WriteLine("2");
99             stopwatch.Restart();            
100             var hash2 = Signature.CalculateTreeHashAsync(file, (int)blockSize, "sha256", 2).Result;
101             stopwatch.Stop();
102             Trace.WriteLine(stopwatch.Elapsed);
103
104             Trace.WriteLine("3");
105             stopwatch.Restart();
106             var hash3 = Signature.CalculateTreeHashAsync(file, (int)blockSize, "sha256", 3).Result;
107             stopwatch.Stop();
108             Trace.WriteLine(stopwatch.Elapsed);
109
110             Assert.That(hash3.TopHash,Is.EquivalentTo(hash2.TopHash));
111
112
113             
114         }
115
116         public static string BytesToStr(byte[] bytes)
117         {
118             var str = new StringBuilder();
119
120             foreach (byte t in bytes)
121                 str.AppendFormat("{0:X2}", t);
122             
123             return str.ToString();
124         }
125
126
127         [Test]
128         public void TestTopHashEmpty()
129         {
130             using (var hasher = HashAlgorithm.Create("sha256"))
131             {
132                 var hashEmpty = hasher.ComputeHash(new byte[] {});                
133
134                 var empty = new List<byte[]>();
135                 var hash = Signature.CalculateTopHash(empty,"sha256");
136                 Assert.IsNull(hash);
137             }
138         }
139
140         [Test]
141         public void TestHashMapsEqual()
142         {
143
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;
153
154             Assert.AreEqual(upHash.TopHash, localHash.TopHash);
155
156             Assert.AreEqual(upHash.Hashes,localHash.Hashes);
157         }
158         
159         [Test]
160         public void TestAsyncEquivalence()
161         {
162
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)
166                 .Result;
167
168             Assert.AreEqual(syncHash.TopHash, asyncHash.TopHash);
169
170             Assert.AreEqual(syncHash.Hashes,asyncHash.Hashes);
171         }
172     }
173
174 }