Statistics
| Branch: | Revision:

root / trunk / Pithos.Core.Test / SnapshotDifferencerTest.cs @ 64171b56

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