Statistics
| Branch: | Revision:

root / trunk / Pithos.Network.Test / SignatureTest.cs @ 6ef37eeb

History | View | Annotate | Download (5.6 kB)

1 9c4346c9 Panagiotis Kanavos
using System;
2 422c9598 Panagiotis Kanavos
using System.Collections.Concurrent;
3 9c4346c9 Panagiotis Kanavos
using System.Collections.Generic;
4 422c9598 Panagiotis Kanavos
using System.Diagnostics;
5 9c4346c9 Panagiotis Kanavos
using System.IO;
6 9c4346c9 Panagiotis Kanavos
using System.Linq;
7 9c4346c9 Panagiotis Kanavos
using System.Security.Cryptography;
8 9c4346c9 Panagiotis Kanavos
using System.Text;
9 9c4346c9 Panagiotis Kanavos
using System.Threading;
10 9c4346c9 Panagiotis Kanavos
using System.Threading.Tasks;
11 9c4346c9 Panagiotis Kanavos
using NUnit.Framework;
12 9c4346c9 Panagiotis Kanavos
using Newtonsoft.Json;
13 1caef52e Panagiotis Kanavos
using Pithos.Network;
14 9c4346c9 Panagiotis Kanavos
15 9c4346c9 Panagiotis Kanavos
namespace Pithos.Core.Test
16 9c4346c9 Panagiotis Kanavos
{
17 9c4346c9 Panagiotis Kanavos
    [TestFixture]
18 9c4346c9 Panagiotis Kanavos
    public class SignatureTest
19 9c4346c9 Panagiotis Kanavos
    {
20 9c4346c9 Panagiotis Kanavos
21 9c4346c9 Panagiotis Kanavos
        [Test]
22 9c4346c9 Panagiotis Kanavos
        public void TestCreate()
23 9c4346c9 Panagiotis Kanavos
        {
24 9c4346c9 Panagiotis Kanavos
            var hasher = HashAlgorithm.Create("sha256");
25 9c4346c9 Panagiotis Kanavos
            Assert.IsNotNull(hasher);
26 9c4346c9 Panagiotis Kanavos
        }
27 9c4346c9 Panagiotis Kanavos
28 9c4346c9 Panagiotis Kanavos
        [Test]
29 9c4346c9 Panagiotis Kanavos
        public void TestHashmapCreation()
30 9c4346c9 Panagiotis Kanavos
        {
31 9c4346c9 Panagiotis Kanavos
            var file = "e:\\pithos\\vlc-1.1.11-win32.exe";
32 9c4346c9 Panagiotis Kanavos
33 9c4346c9 Panagiotis Kanavos
            decimal blockSize = 4*1024*1024;
34 9c4346c9 Panagiotis Kanavos
35 9c4346c9 Panagiotis Kanavos
            var fileSize = new FileInfo(file).Length;
36 9c4346c9 Panagiotis Kanavos
            var numBlocks = decimal.Ceiling(fileSize/blockSize);
37 9c4346c9 Panagiotis Kanavos
38 9c4346c9 Panagiotis Kanavos
            var md5 = Signature.CalculateMD5(file);            
39 9c4346c9 Panagiotis Kanavos
40 422c9598 Panagiotis Kanavos
            var hash1 = Signature.CalculateTreeHashAsync(file, (int) blockSize,"sha256", 2).Result;
41 9c4346c9 Panagiotis Kanavos
            Assert.IsNotNull(hash1.Hashes);
42 9c4346c9 Panagiotis Kanavos
            Assert.AreEqual(numBlocks, hash1.Hashes.Count());
43 9c4346c9 Panagiotis Kanavos
44 9c4346c9 Panagiotis Kanavos
            var topHash = hash1.TopHash;
45 9c4346c9 Panagiotis Kanavos
            var hashString = BytesToStr(topHash);
46 9c4346c9 Panagiotis Kanavos
47 9c4346c9 Panagiotis Kanavos
            var stringHashes = (from hash in hash1.Hashes
48 9c4346c9 Panagiotis Kanavos
                               select BytesToStr(hash)).ToList();
49 9c4346c9 Panagiotis Kanavos
            var hashes = JsonConvert.SerializeObject(stringHashes);
50 9c4346c9 Panagiotis Kanavos
            Assert.IsNotNull(topHash);
51 9c4346c9 Panagiotis Kanavos
        }
52 9c4346c9 Panagiotis Kanavos
        
53 9c4346c9 Panagiotis Kanavos
        [Test]
54 9c4346c9 Panagiotis Kanavos
        public void TestHashmapStorage()
55 9c4346c9 Panagiotis Kanavos
        {
56 9c4346c9 Panagiotis Kanavos
            var file = "e:\\pithos\\vlc-1.1.11-win32.exe";
57 9c4346c9 Panagiotis Kanavos
58 9c4346c9 Panagiotis Kanavos
            decimal blockSize = 4*1024*1024;
59 9c4346c9 Panagiotis Kanavos
60 9c4346c9 Panagiotis Kanavos
            var fileSize = new FileInfo(file).Length;
61 9c4346c9 Panagiotis Kanavos
            var numBlocks = decimal.Ceiling(fileSize/blockSize);
62 9c4346c9 Panagiotis Kanavos
63 9c4346c9 Panagiotis Kanavos
            var md5 = Signature.CalculateMD5(file);
64 9c4346c9 Panagiotis Kanavos
65 422c9598 Panagiotis Kanavos
            var hash1 = Signature.CalculateTreeHashAsync(file, (int) blockSize, "sha256", 2).Result;
66 9c4346c9 Panagiotis Kanavos
            hash1.FileId = Guid.NewGuid();
67 9c4346c9 Panagiotis Kanavos
            var task = hash1.Save(@"e:\")
68 9c4346c9 Panagiotis Kanavos
                .ContinueWith(_ => TreeHash.LoadTreeHash(@"e:\", hash1.FileId)).Unwrap();            
69 9c4346c9 Panagiotis Kanavos
            task.ContinueWith(t =>
70 9c4346c9 Panagiotis Kanavos
            {                
71 9c4346c9 Panagiotis Kanavos
                var hash = t.Result;
72 9c4346c9 Panagiotis Kanavos
                Assert.AreEqual(hash1.Hashes, hash.Hashes.ToArray());
73 9c4346c9 Panagiotis Kanavos
            }).Wait();
74 9c4346c9 Panagiotis Kanavos
        }
75 9c4346c9 Panagiotis Kanavos
76 422c9598 Panagiotis Kanavos
        [Test]
77 422c9598 Panagiotis Kanavos
        public void TestLargeHashCalculation()
78 422c9598 Panagiotis Kanavos
        {
79 422c9598 Panagiotis Kanavos
80 422c9598 Panagiotis Kanavos
            var file = "e:\\testFile.tmp";
81 422c9598 Panagiotis Kanavos
            if (!File.Exists(file))
82 422c9598 Panagiotis Kanavos
            {
83 422c9598 Panagiotis Kanavos
                byte[] buffer= new byte[300 * 1048576];
84 422c9598 Panagiotis Kanavos
                Random rnd=new Random();
85 422c9598 Panagiotis Kanavos
                rnd.NextBytes(buffer);                
86 422c9598 Panagiotis Kanavos
                //Create a 100MB buffer
87 422c9598 Panagiotis Kanavos
                File.WriteAllBytes(file,buffer);                
88 422c9598 Panagiotis Kanavos
            }
89 422c9598 Panagiotis Kanavos
90 422c9598 Panagiotis Kanavos
            decimal blockSize = 4 * 1048576;
91 422c9598 Panagiotis Kanavos
92 422c9598 Panagiotis Kanavos
            Trace.WriteLine("1");
93 422c9598 Panagiotis Kanavos
            var stopwatch = Stopwatch.StartNew();            
94 422c9598 Panagiotis Kanavos
            var hash1 = Signature.CalculateTreeHashAsync(file, (int)blockSize, "sha256", 1).Result;
95 422c9598 Panagiotis Kanavos
            stopwatch.Stop();
96 422c9598 Panagiotis Kanavos
            Trace.WriteLine(stopwatch.Elapsed);
97 422c9598 Panagiotis Kanavos
            
98 422c9598 Panagiotis Kanavos
            Trace.WriteLine("2");
99 422c9598 Panagiotis Kanavos
            stopwatch.Restart();            
100 422c9598 Panagiotis Kanavos
            var hash2 = Signature.CalculateTreeHashAsync(file, (int)blockSize, "sha256", 2).Result;
101 422c9598 Panagiotis Kanavos
            stopwatch.Stop();
102 422c9598 Panagiotis Kanavos
            Trace.WriteLine(stopwatch.Elapsed);
103 422c9598 Panagiotis Kanavos
104 422c9598 Panagiotis Kanavos
            Trace.WriteLine("3");
105 422c9598 Panagiotis Kanavos
            stopwatch.Restart();
106 422c9598 Panagiotis Kanavos
            var hash3 = Signature.CalculateTreeHashAsync(file, (int)blockSize, "sha256", 3).Result;
107 422c9598 Panagiotis Kanavos
            stopwatch.Stop();
108 422c9598 Panagiotis Kanavos
            Trace.WriteLine(stopwatch.Elapsed);
109 422c9598 Panagiotis Kanavos
110 422c9598 Panagiotis Kanavos
            Assert.That(hash3.TopHash,Is.EquivalentTo(hash2.TopHash));
111 422c9598 Panagiotis Kanavos
112 422c9598 Panagiotis Kanavos
113 422c9598 Panagiotis Kanavos
            
114 422c9598 Panagiotis Kanavos
        }
115 422c9598 Panagiotis Kanavos
116 9c4346c9 Panagiotis Kanavos
        public static string BytesToStr(byte[] bytes)
117 9c4346c9 Panagiotis Kanavos
        {
118 9c4346c9 Panagiotis Kanavos
            var str = new StringBuilder();
119 9c4346c9 Panagiotis Kanavos
120 9c4346c9 Panagiotis Kanavos
            foreach (byte t in bytes)
121 9c4346c9 Panagiotis Kanavos
                str.AppendFormat("{0:X2}", t);
122 9c4346c9 Panagiotis Kanavos
            
123 9c4346c9 Panagiotis Kanavos
            return str.ToString();
124 9c4346c9 Panagiotis Kanavos
        }
125 9c4346c9 Panagiotis Kanavos
126 9c4346c9 Panagiotis Kanavos
127 9c4346c9 Panagiotis Kanavos
        [Test]
128 9c4346c9 Panagiotis Kanavos
        public void TestTopHashEmpty()
129 9c4346c9 Panagiotis Kanavos
        {
130 9c4346c9 Panagiotis Kanavos
            using (var hasher = HashAlgorithm.Create("sha256"))
131 9c4346c9 Panagiotis Kanavos
            {
132 9c4346c9 Panagiotis Kanavos
                var hashEmpty = hasher.ComputeHash(new byte[] {});                
133 9c4346c9 Panagiotis Kanavos
134 9c4346c9 Panagiotis Kanavos
                var empty = new List<byte[]>();
135 9c4346c9 Panagiotis Kanavos
                var hash = Signature.CalculateTopHash(empty,"sha256");
136 9c4346c9 Panagiotis Kanavos
                Assert.IsNull(hash);
137 9c4346c9 Panagiotis Kanavos
            }
138 9c4346c9 Panagiotis Kanavos
        }
139 a27aa447 Panagiotis Kanavos
140 a27aa447 Panagiotis Kanavos
        [Test]
141 a27aa447 Panagiotis Kanavos
        public void TestHashMapsEqual()
142 a27aa447 Panagiotis Kanavos
        {
143 a27aa447 Panagiotis Kanavos
144 cfed7823 Panagiotis Kanavos
            var account = "890329@vho.grnet.gr";
145 c53aa229 Panagiotis Kanavos
            var apiKey = "24989dce4e0fcb072f8cb60c8922be19";
146 c53aa229 Panagiotis Kanavos
            var client = new CloudFilesClient(account, apiKey);
147 c53aa229 Panagiotis Kanavos
            client.AuthenticationUrl = @"https://pithos.dev.grnet.gr";
148 c53aa229 Panagiotis Kanavos
            client.UsePithos = true;            
149 c53aa229 Panagiotis Kanavos
            client.Authenticate();
150 a27aa447 Panagiotis Kanavos
            var fileName = @"vlc-1.1.11-win32.exe";
151 422c9598 Panagiotis Kanavos
            var localHash= Signature.CalculateTreeHashAsync(Path.Combine(@"e:\pithos\", fileName), 4 * 1024 * 1024, "sha256", 2).Result;
152 cfed7823 Panagiotis Kanavos
            var upHash= client.GetHashMap(fileName, account, "pithos").Result;
153 a27aa447 Panagiotis Kanavos
154 a27aa447 Panagiotis Kanavos
            Assert.AreEqual(upHash.TopHash, localHash.TopHash);
155 a27aa447 Panagiotis Kanavos
156 a27aa447 Panagiotis Kanavos
            Assert.AreEqual(upHash.Hashes,localHash.Hashes);
157 a27aa447 Panagiotis Kanavos
        }
158 a27aa447 Panagiotis Kanavos
        
159 a27aa447 Panagiotis Kanavos
        [Test]
160 a27aa447 Panagiotis Kanavos
        public void TestAsyncEquivalence()
161 a27aa447 Panagiotis Kanavos
        {
162 a27aa447 Panagiotis Kanavos
163 a27aa447 Panagiotis Kanavos
            var fileName = @"vlc-1.1.11-win32.exe";
164 a27aa447 Panagiotis Kanavos
            var syncHash= Signature.CalculateTreeHash(Path.Combine(@"e:\pithos\", fileName), 4 * 1024 * 1024, "sha256");
165 422c9598 Panagiotis Kanavos
            var asyncHash = Signature.CalculateTreeHashAsync(Path.Combine(@"e:\pithos\", fileName), 4 * 1024 * 1024, "sha256", 2)
166 a27aa447 Panagiotis Kanavos
                .Result;
167 a27aa447 Panagiotis Kanavos
168 a27aa447 Panagiotis Kanavos
            Assert.AreEqual(syncHash.TopHash, asyncHash.TopHash);
169 a27aa447 Panagiotis Kanavos
170 a27aa447 Panagiotis Kanavos
            Assert.AreEqual(syncHash.Hashes,asyncHash.Hashes);
171 a27aa447 Panagiotis Kanavos
        }
172 9c4346c9 Panagiotis Kanavos
    }
173 9c4346c9 Panagiotis Kanavos
174 9c4346c9 Panagiotis Kanavos
}