root / trunk / Pithos.Core.Test / SnapshotDifferencerTest.cs @ 275a059e
History | View | Annotate | Download (28.9 kB)
1 | 99e6329f | Panagiotis Kanavos | // ----------------------------------------------------------------------- |
---|---|---|---|
2 | 99e6329f | Panagiotis Kanavos | // <copyright file="TestDifferencer.cs" company="Microsoft"> |
3 | 99e6329f | Panagiotis Kanavos | // TODO: Update copyright text. |
4 | 99e6329f | Panagiotis Kanavos | // </copyright> |
5 | 99e6329f | Panagiotis Kanavos | // ----------------------------------------------------------------------- |
6 | 99e6329f | Panagiotis Kanavos | |
7 | 99e6329f | Panagiotis Kanavos | using System.Collections; |
8 | 99e6329f | Panagiotis Kanavos | using NUnit.Framework; |
9 | 99e6329f | Panagiotis Kanavos | using Pithos.Interfaces; |
10 | 99e6329f | Panagiotis Kanavos | using Pithos.Network; |
11 | 99e6329f | Panagiotis Kanavos | |
12 | 99e6329f | Panagiotis Kanavos | namespace Pithos.Core.Test |
13 | 99e6329f | Panagiotis Kanavos | { |
14 | 99e6329f | Panagiotis Kanavos | using System; |
15 | 99e6329f | Panagiotis Kanavos | using System.Collections.Generic; |
16 | 99e6329f | Panagiotis Kanavos | using System.Linq; |
17 | 99e6329f | Panagiotis Kanavos | using System.Text; |
18 | 99e6329f | Panagiotis Kanavos | using Pithos.Core.Agents; |
19 | 99e6329f | Panagiotis Kanavos | |
20 | 99e6329f | Panagiotis Kanavos | [TestFixture] |
21 | 99e6329f | Panagiotis Kanavos | public class SnapshotDifferencerTest |
22 | 99e6329f | Panagiotis Kanavos | { |
23 | 99e6329f | Panagiotis Kanavos | private ObjectInfo[] _previous; |
24 | 99e6329f | Panagiotis Kanavos | private ObjectInfo[] _current; |
25 | 5e10d44f | Panagiotis Kanavos | readonly IEqualityComparer<ObjectInfo> _comparer = new ObjectInfoComparer(); |
26 | 5e10d44f | Panagiotis Kanavos | private readonly Uri _testUri = new Uri("http://test"); |
27 | 99e6329f | Panagiotis Kanavos | |
28 | 99e6329f | Panagiotis Kanavos | [SetUp] |
29 | 99e6329f | Panagiotis Kanavos | public void Setup() |
30 | 99e6329f | Panagiotis Kanavos | { |
31 | 99e6329f | Panagiotis Kanavos | _previous = new []{ |
32 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="1"}, |
33 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="2"}, |
34 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name3",Bytes=123,Hash="aa3",Version=1,UUID="3"}, |
35 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name4",Bytes=123,Hash="aa4",Version=1,UUID="4"}, |
36 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1,UUID="5"}, |
37 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="6"}, |
38 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="7"}, |
39 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="8"}, |
40 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="9"}, |
41 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1,UUID="10"}, |
42 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name4",Bytes=123,Hash="aa4",Version=1,UUID="11"}, |
43 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="12"}, |
44 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="13"}, |
45 | 99e6329f | Panagiotis Kanavos | }; |
46 | 99e6329f | Panagiotis Kanavos | _current = new []{ |
47 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="2"}, |
48 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name3",Bytes=123,Hash="aa3",Version=1,UUID="3"}, |
49 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name4",Bytes=1234,Hash="aa45",Version=1,UUID="4"}, |
50 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name5",Bytes=123,Hash="aa5",Version=1,UUID="14"}, |
51 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1,UUID="5"}, |
52 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="6"}, |
53 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="7"}, |
54 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="9"}, |
55 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1,UUID="10"}, |
56 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name4",Bytes=1234,Hash="aa45",Version=1,UUID="11"}, |
57 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name5",Bytes=123,Hash="aa5",Version=1,UUID="15"}, |
58 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="12"}, |
59 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="13"}, |
60 | 99e6329f | Panagiotis Kanavos | }; |
61 | 99e6329f | Panagiotis Kanavos | |
62 | 99e6329f | Panagiotis Kanavos | } |
63 | 99e6329f | Panagiotis Kanavos | |
64 | 99e6329f | Panagiotis Kanavos | [Test] |
65 | 99e6329f | Panagiotis Kanavos | public void when_adding_a_snapshot_for_the_first_time() |
66 | 99e6329f | Panagiotis Kanavos | { |
67 | 99e6329f | Panagiotis Kanavos | var d1 = new SnapshotDifferencer(); |
68 | 99e6329f | Panagiotis Kanavos | var differencer=d1.Post(_previous); |
69 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Deleted,Is.Empty); |
70 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Created,Is.EquivalentTo(_previous)); |
71 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Changed,Is.Empty); |
72 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Moved, Is.Empty, "should have no moves"); |
73 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Unchanged,Is.Empty); |
74 | 99e6329f | Panagiotis Kanavos | } |
75 | 99e6329f | Panagiotis Kanavos | |
76 | 99e6329f | Panagiotis Kanavos | [Test] |
77 | 99e6329f | Panagiotis Kanavos | public void when_adding_a_second_snapshot_with_a_deletion() |
78 | 99e6329f | Panagiotis Kanavos | { |
79 | 99e6329f | Panagiotis Kanavos | var d1 = new SnapshotDifferencer(); |
80 | 99e6329f | Panagiotis Kanavos | var differencer=d1.Post(_previous).Post(_current); |
81 | 99e6329f | Panagiotis Kanavos | var deleted=new[] |
82 | 99e6329f | Panagiotis Kanavos | { |
83 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="1"}, |
84 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="8"}, |
85 | 99e6329f | Panagiotis Kanavos | }; |
86 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Deleted.ToList(),Is.EquivalentTo(deleted) |
87 | 99e6329f | Panagiotis Kanavos | .Using((IEqualityComparer) new ObjectInfoComparer())); |
88 | 99e6329f | Panagiotis Kanavos | } |
89 | 99e6329f | Panagiotis Kanavos | [Test] |
90 | 99e6329f | Panagiotis Kanavos | public void when_adding_a_second_snapshot_with_an_addition() |
91 | 99e6329f | Panagiotis Kanavos | { |
92 | 99e6329f | Panagiotis Kanavos | var d1 = new SnapshotDifferencer(); |
93 | 99e6329f | Panagiotis Kanavos | var differencer=d1.Post(_previous).Post(_current); |
94 | 99e6329f | Panagiotis Kanavos | var created = new[] |
95 | 99e6329f | Panagiotis Kanavos | { |
96 | b666b39a | Panagiotis Kanavos | new ObjectInfo { Account = "acc1", Container = "Cont1", Name = "Name5", Bytes = 123, Hash = "aa5", Version = 1,UUID="14" }, |
97 | b666b39a | Panagiotis Kanavos | new ObjectInfo { Account = "acc1", Container = "Cont2", Name = "Name5", Bytes = 123, Hash = "aa5", Version = 1,UUID="15" }, |
98 | 99e6329f | Panagiotis Kanavos | }; |
99 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Created.ToList(), Is.EquivalentTo(created) |
100 | 99e6329f | Panagiotis Kanavos | .Using((IEqualityComparer)new ObjectInfoComparer())); |
101 | 99e6329f | Panagiotis Kanavos | } |
102 | 99e6329f | Panagiotis Kanavos | [Test] |
103 | 99e6329f | Panagiotis Kanavos | public void when_adding_a_second_snapshot_with_a_change() |
104 | 99e6329f | Panagiotis Kanavos | { |
105 | 99e6329f | Panagiotis Kanavos | var d1 = new SnapshotDifferencer(); |
106 | 99e6329f | Panagiotis Kanavos | var differencer=d1.Post(_previous).Post(_current); |
107 | 99e6329f | Panagiotis Kanavos | var changed = new[] { |
108 | b666b39a | Panagiotis Kanavos | new ObjectInfo { Account = "acc1", Container = "Cont1", Name = "Name4", Bytes = 1234, Hash = "aa45", PreviousHash="aa4", Version = 1,UUID="4" }, |
109 | b666b39a | Panagiotis Kanavos | new ObjectInfo { Account = "acc1", Container = "Cont2", Name = "Name4", Bytes = 1234, Hash = "aa45", PreviousHash="aa4", Version = 1,UUID="11" }, |
110 | 99e6329f | Panagiotis Kanavos | }; |
111 | 64171b56 | Panagiotis Kanavos | |
112 | 64171b56 | Panagiotis Kanavos | Comparison<ObjectInfo> comparer = (x, y) => |
113 | 64171b56 | Panagiotis Kanavos | { |
114 | 64171b56 | Panagiotis Kanavos | if (x.Account == y.Account |
115 | 64171b56 | Panagiotis Kanavos | && x.Container == y.Container |
116 | 64171b56 | Panagiotis Kanavos | && x.Name == y.Name |
117 | 64171b56 | Panagiotis Kanavos | && x.Hash == y.Hash |
118 | 64171b56 | Panagiotis Kanavos | && x.PreviousHash == y.PreviousHash) |
119 | 64171b56 | Panagiotis Kanavos | return 0; |
120 | 64171b56 | Panagiotis Kanavos | return 1; |
121 | 64171b56 | Panagiotis Kanavos | }; |
122 | 64171b56 | Panagiotis Kanavos | |
123 | 64171b56 | Panagiotis Kanavos | Assert.That(differencer.Changed.ToList(), Is.EquivalentTo(changed).Using(comparer)); |
124 | 99e6329f | Panagiotis Kanavos | } |
125 | 99e6329f | Panagiotis Kanavos | |
126 | 99e6329f | Panagiotis Kanavos | [Test] |
127 | b666b39a | Panagiotis Kanavos | public void when_adding_a_second_snapshot_with_a_rename() |
128 | b666b39a | Panagiotis Kanavos | { |
129 | b666b39a | Panagiotis Kanavos | var d1 = new SnapshotDifferencer(); |
130 | b666b39a | Panagiotis Kanavos | var current = new[]{ |
131 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="1"}, |
132 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="2"}, |
133 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name3a",Bytes=123,Hash="aa3",Version=1,UUID="3"}, |
134 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name4",Bytes=123,Hash="aa4",Version=1,UUID="4"}, |
135 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1,UUID="5"}, |
136 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="6"}, |
137 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="7"}, |
138 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="8"}, |
139 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="9"}, |
140 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1,UUID="10"}, |
141 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name4",Bytes=123,Hash="aa4",Version=1,UUID="11"}, |
142 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="12"}, |
143 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="13"}, |
144 | b666b39a | Panagiotis Kanavos | }; |
145 | b666b39a | Panagiotis Kanavos | |
146 | b666b39a | Panagiotis Kanavos | var differencer=d1.Post(_previous).Post(current); |
147 | b666b39a | Panagiotis Kanavos | var moved = new[] { |
148 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name3a",Bytes=123,Hash="aa3",PreviousHash="aa3",Version=1,UUID="3"} |
149 | b666b39a | Panagiotis Kanavos | }; |
150 | b666b39a | Panagiotis Kanavos | |
151 | b666b39a | Panagiotis Kanavos | Comparison<ObjectInfo> comparer = (x, y) => |
152 | b666b39a | Panagiotis Kanavos | { |
153 | b666b39a | Panagiotis Kanavos | if (x.Account == y.Account |
154 | b666b39a | Panagiotis Kanavos | && x.Container == y.Container |
155 | b666b39a | Panagiotis Kanavos | && x.Name == y.Name |
156 | b666b39a | Panagiotis Kanavos | && x.Hash == y.Hash |
157 | b666b39a | Panagiotis Kanavos | && x.PreviousHash == y.PreviousHash) |
158 | b666b39a | Panagiotis Kanavos | return 0; |
159 | b666b39a | Panagiotis Kanavos | return 1; |
160 | b666b39a | Panagiotis Kanavos | }; |
161 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Moved.ToList(), Is.EquivalentTo(moved).Using(comparer)); |
162 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Deleted, Is.Empty); |
163 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Created, Is.Empty); |
164 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Changed, Is.Empty); |
165 | b666b39a | Panagiotis Kanavos | //Assert.That(differencer.Unchanged, Is.Empty); |
166 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Moved.ToList(), Is.EquivalentTo(moved).Using(comparer)); |
167 | b666b39a | Panagiotis Kanavos | } |
168 | b666b39a | Panagiotis Kanavos | |
169 | b666b39a | Panagiotis Kanavos | [Test] |
170 | b666b39a | Panagiotis Kanavos | public void when_adding_a_second_snapshot_with_a_changed_rename() |
171 | b666b39a | Panagiotis Kanavos | { |
172 | b666b39a | Panagiotis Kanavos | var d1 = new SnapshotDifferencer(); |
173 | b666b39a | Panagiotis Kanavos | var current = new[]{ |
174 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="1"}, |
175 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="2"}, |
176 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name3a",Bytes=123,Hash="aa35",Version=1,UUID="3"}, |
177 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name4",Bytes=123,Hash="aa4",Version=1,UUID="4"}, |
178 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1,UUID="5"}, |
179 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="6"}, |
180 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="7"}, |
181 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="8"}, |
182 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="9"}, |
183 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1,UUID="10"}, |
184 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name4",Bytes=123,Hash="aa4",Version=1,UUID="11"}, |
185 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="12"}, |
186 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="13"}, |
187 | 5e10d44f | Panagiotis Kanavos | }; |
188 | 5e10d44f | Panagiotis Kanavos | var unchanged = new[]{ |
189 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="1",PreviousHash="aa1"}, |
190 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="2",PreviousHash="aa2"}, |
191 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name4",Bytes=123,Hash="aa4",Version=1,UUID="4",PreviousHash="aa4"}, |
192 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1,UUID="5",PreviousHash="aa4"}, |
193 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="6",PreviousHash="aa1"}, |
194 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="7",PreviousHash="aa2"}, |
195 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="8",PreviousHash="aa1"}, |
196 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="9",PreviousHash="aa2"}, |
197 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1,UUID="10",PreviousHash="aa3"}, |
198 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name4",Bytes=123,Hash="aa4",Version=1,UUID="11",PreviousHash="aa4"}, |
199 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="12",PreviousHash="aa1"}, |
200 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="13",PreviousHash="aa2"}, |
201 | b666b39a | Panagiotis Kanavos | }; |
202 | b666b39a | Panagiotis Kanavos | |
203 | b666b39a | Panagiotis Kanavos | var differencer = d1.Post(_previous).Post(current); |
204 | b666b39a | Panagiotis Kanavos | var moved = new[] { |
205 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name3a",Bytes=123,Hash="aa35",PreviousHash="aa3",Version=1,UUID="3"} |
206 | b666b39a | Panagiotis Kanavos | }; |
207 | b666b39a | Panagiotis Kanavos | |
208 | b666b39a | Panagiotis Kanavos | Comparison<ObjectInfo> comparer = (x, y) => |
209 | b666b39a | Panagiotis Kanavos | { |
210 | b666b39a | Panagiotis Kanavos | if (x.Account == y.Account |
211 | b666b39a | Panagiotis Kanavos | && x.Container == y.Container |
212 | b666b39a | Panagiotis Kanavos | && x.Name == y.Name |
213 | b666b39a | Panagiotis Kanavos | && x.Hash == y.Hash |
214 | b666b39a | Panagiotis Kanavos | && x.PreviousHash == y.PreviousHash) |
215 | b666b39a | Panagiotis Kanavos | return 0; |
216 | b666b39a | Panagiotis Kanavos | return 1; |
217 | b666b39a | Panagiotis Kanavos | }; |
218 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Moved.ToList(), Is.EquivalentTo(moved).Using(comparer)); |
219 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Deleted, Is.Empty); |
220 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Created, Is.Empty); |
221 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Changed, Is.Empty); |
222 | 5e10d44f | Panagiotis Kanavos | Assert.That(differencer.Unchanged, Is.EquivalentTo(unchanged).Using(comparer)); |
223 | b666b39a | Panagiotis Kanavos | } |
224 | b666b39a | Panagiotis Kanavos | |
225 | b666b39a | Panagiotis Kanavos | [Test] |
226 | b666b39a | Panagiotis Kanavos | public void when_adding_a_second_snapshot_with_a_move() |
227 | b666b39a | Panagiotis Kanavos | { |
228 | b666b39a | Panagiotis Kanavos | var d1 = new SnapshotDifferencer(); |
229 | b666b39a | Panagiotis Kanavos | var current = new[]{ |
230 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="1"}, |
231 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="2"}, |
232 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Folder1/Name3",Bytes=123,Hash="aa3",Version=1,UUID="3"}, |
233 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name4",Bytes=123,Hash="aa4",Version=1,UUID="4"}, |
234 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1,UUID="5"}, |
235 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="6"}, |
236 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="7"}, |
237 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="8"}, |
238 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="9"}, |
239 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1,UUID="10"}, |
240 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name4",Bytes=123,Hash="aa4",Version=1,UUID="11"}, |
241 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="12"}, |
242 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="13"}, |
243 | b666b39a | Panagiotis Kanavos | }; |
244 | b666b39a | Panagiotis Kanavos | |
245 | b666b39a | Panagiotis Kanavos | var differencer=d1.Post(_previous).Post(current); |
246 | b666b39a | Panagiotis Kanavos | var moved = new[] { |
247 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Folder1/Name3",Bytes=123,Hash="aa3",PreviousHash="aa3",Version=1}, |
248 | b666b39a | Panagiotis Kanavos | }; |
249 | b666b39a | Panagiotis Kanavos | |
250 | b666b39a | Panagiotis Kanavos | Comparison<ObjectInfo> comparer = (x, y) => |
251 | b666b39a | Panagiotis Kanavos | { |
252 | b666b39a | Panagiotis Kanavos | if (x.Account == y.Account |
253 | b666b39a | Panagiotis Kanavos | && x.Container == y.Container |
254 | b666b39a | Panagiotis Kanavos | && x.Name == y.Name |
255 | b666b39a | Panagiotis Kanavos | && x.Hash == y.Hash |
256 | b666b39a | Panagiotis Kanavos | && x.PreviousHash == y.PreviousHash) |
257 | b666b39a | Panagiotis Kanavos | return 0; |
258 | b666b39a | Panagiotis Kanavos | return 1; |
259 | b666b39a | Panagiotis Kanavos | }; |
260 | b666b39a | Panagiotis Kanavos | |
261 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Deleted, Is.Empty); |
262 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Created, Is.Empty); |
263 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Changed, Is.Empty); |
264 | b666b39a | Panagiotis Kanavos | //Assert.That(differencer.Unchanged, Is.Empty); |
265 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Moved.ToList(), Is.EquivalentTo(moved).Using(comparer)); |
266 | b666b39a | Panagiotis Kanavos | } |
267 | b666b39a | Panagiotis Kanavos | |
268 | b666b39a | Panagiotis Kanavos | [Test] |
269 | 99e6329f | Panagiotis Kanavos | public void when_adding_a_second_snapshot_with_unchanged() |
270 | 99e6329f | Panagiotis Kanavos | { |
271 | 99e6329f | Panagiotis Kanavos | var d1 = new SnapshotDifferencer(); |
272 | 99e6329f | Panagiotis Kanavos | var differencer=d1.Post(_previous).Post(_current); |
273 | 99e6329f | Panagiotis Kanavos | var unchanged = new[] |
274 | 99e6329f | Panagiotis Kanavos | { |
275 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="2"}, |
276 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name3",Bytes=123,Hash="aa3",Version=1,UUID="3"}, |
277 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="6"}, |
278 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="7"}, |
279 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1,UUID="5"}, |
280 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="9"}, |
281 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1,UUID="10"}, |
282 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="12"}, |
283 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="13"}, |
284 | 99e6329f | Panagiotis Kanavos | }; |
285 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Unchanged.ToList(), Is.EquivalentTo(unchanged) |
286 | 99e6329f | Panagiotis Kanavos | .Using((IEqualityComparer)new ObjectInfoComparer())); |
287 | 99e6329f | Panagiotis Kanavos | } |
288 | 99e6329f | Panagiotis Kanavos | |
289 | 99e6329f | Panagiotis Kanavos | [Test] |
290 | 99e6329f | Panagiotis Kanavos | public void when_adding_a_null_first_snapshot() |
291 | 99e6329f | Panagiotis Kanavos | { |
292 | 99e6329f | Panagiotis Kanavos | var d1 = new SnapshotDifferencer(); |
293 | 99e6329f | Panagiotis Kanavos | var differencer=d1.Post(null); |
294 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Deleted, Is.Empty); |
295 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Created, Is.Empty); |
296 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Changed, Is.Empty); |
297 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Moved, Is.Empty, "should have no moves"); |
298 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Unchanged, Is.Empty); |
299 | 99e6329f | Panagiotis Kanavos | } |
300 | 99e6329f | Panagiotis Kanavos | |
301 | 99e6329f | Panagiotis Kanavos | [Test] |
302 | 99e6329f | Panagiotis Kanavos | public void when_adding_a_null_second_snapshot() |
303 | 99e6329f | Panagiotis Kanavos | { |
304 | 99e6329f | Panagiotis Kanavos | var d1 = new SnapshotDifferencer(); |
305 | 99e6329f | Panagiotis Kanavos | var differencer=d1.Post(_previous).Post(null); |
306 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Deleted, Is.EquivalentTo(_previous)); |
307 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Created, Is.Empty); |
308 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Changed, Is.Empty); |
309 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Moved, Is.Empty, "should have no moves"); |
310 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Unchanged, Is.Empty); |
311 | 99e6329f | Panagiotis Kanavos | } |
312 | 99e6329f | Panagiotis Kanavos | |
313 | 99e6329f | Panagiotis Kanavos | [Test] |
314 | 99e6329f | Panagiotis Kanavos | public void when_adding_no_modifications() |
315 | 99e6329f | Panagiotis Kanavos | { |
316 | 99e6329f | Panagiotis Kanavos | var d1 = new SnapshotDifferencer(); |
317 | 99e6329f | Panagiotis Kanavos | //NOTE: Must post nomods for all accounts and contaienrs, otherwise the missing |
318 | 99e6329f | Panagiotis Kanavos | //containers will appear deleted |
319 | 99e6329f | Panagiotis Kanavos | var noModItem = new[]{ |
320 | 99e6329f | Panagiotis Kanavos | new NoModificationInfo("acc1", "Cont1"), |
321 | 99e6329f | Panagiotis Kanavos | new NoModificationInfo("acc1", "Cont2"), |
322 | 99e6329f | Panagiotis Kanavos | new NoModificationInfo("acc2", "Cont1"), |
323 | 99e6329f | Panagiotis Kanavos | new NoModificationInfo("acc2", "Cont2"), |
324 | 99e6329f | Panagiotis Kanavos | }; |
325 | 99e6329f | Panagiotis Kanavos | var differencer = d1.Post(_previous) |
326 | 99e6329f | Panagiotis Kanavos | .Post(noModItem); |
327 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Deleted, Is.Empty,"should have no deletions"); |
328 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Created, Is.Empty,"should have no insertions"); |
329 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Changed, Is.Empty,"should have no changes"); |
330 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Moved, Is.Empty, "should have no moves"); |
331 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Unchanged, Is.EquivalentTo(_previous),"should be equivalent to previous"); |
332 | 99e6329f | Panagiotis Kanavos | |
333 | 99e6329f | Panagiotis Kanavos | } |
334 | 99e6329f | Panagiotis Kanavos | |
335 | 99e6329f | Panagiotis Kanavos | [Test] |
336 | 99e6329f | Panagiotis Kanavos | public void when_adding_no_mod_for_a_folder() |
337 | 99e6329f | Panagiotis Kanavos | { |
338 | 99e6329f | Panagiotis Kanavos | var d1 = new SnapshotDifferencer(); |
339 | 99e6329f | Panagiotis Kanavos | //NOTE: Must post nomods for all accounts and contaienrs, otherwise the missing |
340 | 99e6329f | Panagiotis Kanavos | //containers will appear deleted |
341 | 99e6329f | Panagiotis Kanavos | var noModItems = new[]{ |
342 | 99e6329f | Panagiotis Kanavos | new NoModificationInfo("acc1", "Cont1","Folder1"), |
343 | 99e6329f | Panagiotis Kanavos | new NoModificationInfo("acc1", "Cont2"), |
344 | 99e6329f | Panagiotis Kanavos | new NoModificationInfo("acc2", "Cont1"), |
345 | 99e6329f | Panagiotis Kanavos | new NoModificationInfo("acc2", "Cont2"), |
346 | 99e6329f | Panagiotis Kanavos | }; |
347 | 99e6329f | Panagiotis Kanavos | var deleted = new[] |
348 | 99e6329f | Panagiotis Kanavos | { |
349 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="1"}, |
350 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="2"}, |
351 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name3",Bytes=123,Hash="aa3",Version=1,UUID="3"}, |
352 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Name4",Bytes=123,Hash="aa4",Version=1,UUID="4"}, |
353 | 99e6329f | Panagiotis Kanavos | }; |
354 | 99e6329f | Panagiotis Kanavos | var unchanged = new[]{ |
355 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1,UUID="5",PreviousHash="aa4"}, |
356 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="6",PreviousHash="aa1"}, |
357 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="7",PreviousHash="aa2"}, |
358 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="8",PreviousHash="aa1"}, |
359 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="9",PreviousHash="aa2"}, |
360 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1,UUID="10",PreviousHash="aa3"}, |
361 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc1",Container="Cont2",Name="Name4",Bytes=123,Hash="aa4",Version=1,UUID="11",PreviousHash="aa4"}, |
362 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1,UUID="12",PreviousHash="aa1"}, |
363 | 5e10d44f | Panagiotis Kanavos | new ObjectInfo{StorageUri=_testUri,Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1,UUID="13",PreviousHash="aa2"}, |
364 | 99e6329f | Panagiotis Kanavos | }; |
365 | 99e6329f | Panagiotis Kanavos | var differencer = d1.Post(_previous) |
366 | 99e6329f | Panagiotis Kanavos | .Post(noModItems); |
367 | 99e6329f | Panagiotis Kanavos | |
368 | 99e6329f | Panagiotis Kanavos | |
369 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Deleted.ToList(), Is.EquivalentTo(deleted).Using(_comparer), "should have deletions only from acc1/cont1"); |
370 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Created, Is.Empty,"should have no insertions"); |
371 | 99e6329f | Panagiotis Kanavos | Assert.That(differencer.Changed, Is.Empty,"should have no changes"); |
372 | b666b39a | Panagiotis Kanavos | Assert.That(differencer.Moved, Is.Empty, "should have no moves"); |
373 | 5e10d44f | Panagiotis Kanavos | var actualUnchanged = differencer.Unchanged.OrderBy(i => i.Uri.ToString()).ToArray(); |
374 | 5e10d44f | Panagiotis Kanavos | var expectedUnchanged = unchanged.OrderBy(i => i.Uri.ToString()).ToArray(); |
375 | 5e10d44f | Panagiotis Kanavos | Assert.That(actualUnchanged, Is.EquivalentTo(expectedUnchanged).Using(_comparer),"should be equivalent to previous except the direct leafs of acc1/cont1"); |
376 | 99e6329f | Panagiotis Kanavos | |
377 | 99e6329f | Panagiotis Kanavos | } |
378 | 99e6329f | Panagiotis Kanavos | |
379 | 99e6329f | Panagiotis Kanavos | } |
380 | 99e6329f | Panagiotis Kanavos | |
381 | 99e6329f | Panagiotis Kanavos | |
382 | 99e6329f | Panagiotis Kanavos | } |