Statistics
| Branch: | Revision:

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
}