root / trunk / Pithos.Core.Test / SnapshotDifferencerTest.cs @ 64171b56
History | View | Annotate | Download (14.2 kB)
1 |
// ----------------------------------------------------------------------- |
---|---|
2 |
// <copyright file="TestDifferencer.cs" company="Microsoft"> |
3 |
// TODO: Update copyright text. |
4 |
// </copyright> |
5 |
// ----------------------------------------------------------------------- |
6 |
|
7 |
using System.Collections; |
8 |
using NUnit.Framework; |
9 |
using Pithos.Interfaces; |
10 |
using Pithos.Network; |
11 |
|
12 |
namespace Pithos.Core.Test |
13 |
{ |
14 |
using System; |
15 |
using System.Collections.Generic; |
16 |
using System.Linq; |
17 |
using System.Text; |
18 |
using Pithos.Core.Agents; |
19 |
|
20 |
[TestFixture] |
21 |
public class SnapshotDifferencerTest |
22 |
{ |
23 |
private ObjectInfo[] _previous; |
24 |
private ObjectInfo[] _current; |
25 |
IEqualityComparer<ObjectInfo> _comparer = new ObjectInfoComparer(); |
26 |
|
27 |
[SetUp] |
28 |
public void Setup() |
29 |
{ |
30 |
_previous = new []{ |
31 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
32 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
33 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name3",Bytes=123,Hash="aa3",Version=1}, |
34 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name4",Bytes=123,Hash="aa4",Version=1}, |
35 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1}, |
36 |
new ObjectInfo{Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
37 |
new ObjectInfo{Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
38 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
39 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
40 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1}, |
41 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name4",Bytes=123,Hash="aa4",Version=1}, |
42 |
new ObjectInfo{Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
43 |
new ObjectInfo{Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
44 |
}; |
45 |
_current = new []{ |
46 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
47 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name3",Bytes=123,Hash="aa3",Version=1}, |
48 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name4",Bytes=1234,Hash="aa45",Version=1}, |
49 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name5",Bytes=123,Hash="aa5",Version=1}, |
50 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1}, |
51 |
new ObjectInfo{Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
52 |
new ObjectInfo{Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
53 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
54 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1}, |
55 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name4",Bytes=1234,Hash="aa45",Version=1}, |
56 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name5",Bytes=123,Hash="aa5",Version=1}, |
57 |
new ObjectInfo{Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
58 |
new ObjectInfo{Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
59 |
}; |
60 |
|
61 |
} |
62 |
|
63 |
[Test] |
64 |
public void when_adding_a_snapshot_for_the_first_time() |
65 |
{ |
66 |
var d1 = new SnapshotDifferencer(); |
67 |
var differencer=d1.Post(_previous); |
68 |
Assert.That(differencer.Deleted,Is.Empty); |
69 |
Assert.That(differencer.Created,Is.EquivalentTo(_previous)); |
70 |
Assert.That(differencer.Changed,Is.Empty); |
71 |
Assert.That(differencer.Unchanged,Is.Empty); |
72 |
} |
73 |
|
74 |
[Test] |
75 |
public void when_adding_a_second_snapshot_with_a_deletion() |
76 |
{ |
77 |
var d1 = new SnapshotDifferencer(); |
78 |
var differencer=d1.Post(_previous).Post(_current); |
79 |
var deleted=new[] |
80 |
{ |
81 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
82 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
83 |
}; |
84 |
Assert.That(differencer.Deleted.ToList(),Is.EquivalentTo(deleted) |
85 |
.Using((IEqualityComparer) new ObjectInfoComparer())); |
86 |
} |
87 |
[Test] |
88 |
public void when_adding_a_second_snapshot_with_an_addition() |
89 |
{ |
90 |
var d1 = new SnapshotDifferencer(); |
91 |
var differencer=d1.Post(_previous).Post(_current); |
92 |
var created = new[] |
93 |
{ |
94 |
new ObjectInfo { Account = "acc1", Container = "Cont1", Name = "Name5", Bytes = 123, Hash = "aa5", Version = 1 }, |
95 |
new ObjectInfo { Account = "acc1", Container = "Cont2", Name = "Name5", Bytes = 123, Hash = "aa5", Version = 1 }, |
96 |
}; |
97 |
Assert.That(differencer.Created.ToList(), Is.EquivalentTo(created) |
98 |
.Using((IEqualityComparer)new ObjectInfoComparer())); |
99 |
} |
100 |
[Test] |
101 |
public void when_adding_a_second_snapshot_with_a_change() |
102 |
{ |
103 |
var d1 = new SnapshotDifferencer(); |
104 |
var differencer=d1.Post(_previous).Post(_current); |
105 |
var changed = new[] { |
106 |
new ObjectInfo { Account = "acc1", Container = "Cont1", Name = "Name4", Bytes = 1234, Hash = "aa45", PreviousHash="aa4", Version = 1 }, |
107 |
new ObjectInfo { Account = "acc1", Container = "Cont2", Name = "Name4", Bytes = 1234, Hash = "aa45", PreviousHash="aa4", Version = 1 }, |
108 |
}; |
109 |
|
110 |
Comparison<ObjectInfo> comparer = (x, y) => |
111 |
{ |
112 |
if (x.Account == y.Account |
113 |
&& x.Container == y.Container |
114 |
&& x.Name == y.Name |
115 |
&& x.Hash == y.Hash |
116 |
&& x.PreviousHash == y.PreviousHash) |
117 |
return 0; |
118 |
return 1; |
119 |
}; |
120 |
|
121 |
Assert.That(differencer.Changed.ToList(), Is.EquivalentTo(changed).Using(comparer)); |
122 |
} |
123 |
|
124 |
[Test] |
125 |
public void when_adding_a_second_snapshot_with_unchanged() |
126 |
{ |
127 |
var d1 = new SnapshotDifferencer(); |
128 |
var differencer=d1.Post(_previous).Post(_current); |
129 |
var unchanged = new[] |
130 |
{ |
131 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
132 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name3",Bytes=123,Hash="aa3",Version=1}, |
133 |
new ObjectInfo{Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
134 |
new ObjectInfo{Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
135 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1}, |
136 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
137 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1}, |
138 |
new ObjectInfo{Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
139 |
new ObjectInfo{Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
140 |
}; |
141 |
Assert.That(differencer.Unchanged.ToList(), Is.EquivalentTo(unchanged) |
142 |
.Using((IEqualityComparer)new ObjectInfoComparer())); |
143 |
} |
144 |
|
145 |
[Test] |
146 |
public void when_adding_a_null_first_snapshot() |
147 |
{ |
148 |
var d1 = new SnapshotDifferencer(); |
149 |
var differencer=d1.Post(null); |
150 |
Assert.That(differencer.Deleted, Is.Empty); |
151 |
Assert.That(differencer.Created, Is.Empty); |
152 |
Assert.That(differencer.Changed, Is.Empty); |
153 |
Assert.That(differencer.Unchanged, Is.Empty); |
154 |
} |
155 |
|
156 |
[Test] |
157 |
public void when_adding_a_null_second_snapshot() |
158 |
{ |
159 |
var d1 = new SnapshotDifferencer(); |
160 |
var differencer=d1.Post(_previous).Post(null); |
161 |
Assert.That(differencer.Deleted, Is.EquivalentTo(_previous)); |
162 |
Assert.That(differencer.Created, Is.Empty); |
163 |
Assert.That(differencer.Changed, Is.Empty); |
164 |
Assert.That(differencer.Unchanged, Is.Empty); |
165 |
} |
166 |
|
167 |
[Test] |
168 |
public void when_adding_no_modifications() |
169 |
{ |
170 |
var d1 = new SnapshotDifferencer(); |
171 |
//NOTE: Must post nomods for all accounts and contaienrs, otherwise the missing |
172 |
//containers will appear deleted |
173 |
var noModItem = new[]{ |
174 |
new NoModificationInfo("acc1", "Cont1"), |
175 |
new NoModificationInfo("acc1", "Cont2"), |
176 |
new NoModificationInfo("acc2", "Cont1"), |
177 |
new NoModificationInfo("acc2", "Cont2"), |
178 |
}; |
179 |
var differencer = d1.Post(_previous) |
180 |
.Post(noModItem); |
181 |
Assert.That(differencer.Deleted, Is.Empty,"should have no deletions"); |
182 |
Assert.That(differencer.Created, Is.Empty,"should have no insertions"); |
183 |
Assert.That(differencer.Changed, Is.Empty,"should have no changes"); |
184 |
Assert.That(differencer.Unchanged, Is.EquivalentTo(_previous),"should be equivalent to previous"); |
185 |
|
186 |
} |
187 |
|
188 |
[Test] |
189 |
public void when_adding_no_mod_for_a_folder() |
190 |
{ |
191 |
var d1 = new SnapshotDifferencer(); |
192 |
//NOTE: Must post nomods for all accounts and contaienrs, otherwise the missing |
193 |
//containers will appear deleted |
194 |
var noModItems = new[]{ |
195 |
new NoModificationInfo("acc1", "Cont1","Folder1"), |
196 |
new NoModificationInfo("acc1", "Cont2"), |
197 |
new NoModificationInfo("acc2", "Cont1"), |
198 |
new NoModificationInfo("acc2", "Cont2"), |
199 |
}; |
200 |
var deleted = new[] |
201 |
{ |
202 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
203 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
204 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name3",Bytes=123,Hash="aa3",Version=1}, |
205 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Name4",Bytes=123,Hash="aa4",Version=1}, |
206 |
}; |
207 |
var unchanged = new[]{ |
208 |
new ObjectInfo{Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1}, |
209 |
new ObjectInfo{Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
210 |
new ObjectInfo{Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
211 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
212 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
213 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1}, |
214 |
new ObjectInfo{Account="acc1",Container="Cont2",Name="Name4",Bytes=123,Hash="aa4",Version=1}, |
215 |
new ObjectInfo{Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1}, |
216 |
new ObjectInfo{Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1}, |
217 |
}; |
218 |
var differencer = d1.Post(_previous) |
219 |
.Post(noModItems); |
220 |
|
221 |
|
222 |
Assert.That(differencer.Deleted.ToList(), Is.EquivalentTo(deleted).Using(_comparer), "should have deletions only from acc1/cont1"); |
223 |
Assert.That(differencer.Created, Is.Empty,"should have no insertions"); |
224 |
Assert.That(differencer.Changed, Is.Empty,"should have no changes"); |
225 |
Assert.That(differencer.Unchanged, Is.EquivalentTo(unchanged).Using(_comparer),"should be equivalent to previous except the direct leafs of acc1/cont1"); |
226 |
|
227 |
} |
228 |
|
229 |
} |
230 |
|
231 |
|
232 |
} |