Statistics
| Branch: | Revision:

root / trunk / Pithos.Network.Test / SignatureTest.cs @ 422c9598

History | View | Annotate | Download (5.6 kB)

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
}