Statistics
| Branch: | Revision:

root / trunk / Pithos.Core.Test / SnapshotDifferencerTest.cs @ 99e6329f

History | View | Annotate | Download (13.5 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", Version = 1 },
107
                new ObjectInfo { Account = "acc1", Container = "Cont2", Name = "Name4", Bytes = 1234, Hash = "aa45", Version = 1 },
108
            };
109
            Assert.That(differencer.Changed.ToList(), Is.EquivalentTo(changed)
110
                .Using((IEqualityComparer)new ObjectInfoComparer()));
111
        }
112

    
113
        [Test]
114
        public void when_adding_a_second_snapshot_with_unchanged()
115
        {
116
            var d1 = new SnapshotDifferencer();            
117
            var differencer=d1.Post(_previous).Post(_current);
118
            var unchanged = new[]
119
                                {
120
                                new ObjectInfo{Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1},
121
                                new ObjectInfo{Account="acc1",Container="Cont1",Name="Name3",Bytes=123,Hash="aa3",Version=1},
122
                                new ObjectInfo{Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1},
123
                                new ObjectInfo{Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1},  
124
                                new ObjectInfo{Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1},  
125
                                new ObjectInfo{Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1},
126
                                new ObjectInfo{Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1},
127
                                new ObjectInfo{Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1},
128
                                new ObjectInfo{Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1},                                    
129
                                };            
130
            Assert.That(differencer.Unchanged.ToList(), Is.EquivalentTo(unchanged)
131
                .Using((IEqualityComparer)new ObjectInfoComparer()));
132
        }
133

    
134
        [Test]
135
        public void when_adding_a_null_first_snapshot()
136
        {
137
            var d1 = new SnapshotDifferencer();            
138
            var differencer=d1.Post(null);
139
            Assert.That(differencer.Deleted, Is.Empty);
140
            Assert.That(differencer.Created, Is.Empty);
141
            Assert.That(differencer.Changed, Is.Empty);
142
            Assert.That(differencer.Unchanged, Is.Empty);
143
        }
144

    
145
        [Test]
146
        public void when_adding_a_null_second_snapshot()
147
        {
148
            var d1 = new SnapshotDifferencer();            
149
            var differencer=d1.Post(_previous).Post(null);
150
            Assert.That(differencer.Deleted, Is.EquivalentTo(_previous));
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_no_modifications()
158
        {
159
            var d1 = new SnapshotDifferencer();
160
            //NOTE: Must post nomods for all accounts and contaienrs, otherwise the missing
161
            //containers will appear deleted
162
            var noModItem = new[]{
163
                                    new NoModificationInfo("acc1", "Cont1"),
164
                                    new NoModificationInfo("acc1", "Cont2"),
165
                                    new NoModificationInfo("acc2", "Cont1"),
166
                                    new NoModificationInfo("acc2", "Cont2"),
167
                                };
168
            var differencer = d1.Post(_previous)
169
                .Post(noModItem);
170
            Assert.That(differencer.Deleted, Is.Empty,"should have no deletions");
171
            Assert.That(differencer.Created, Is.Empty,"should have no insertions");
172
            Assert.That(differencer.Changed, Is.Empty,"should have no changes");
173
            Assert.That(differencer.Unchanged, Is.EquivalentTo(_previous),"should be equivalent to previous");
174
            
175
        }
176

    
177
        [Test]
178
        public void when_adding_no_mod_for_a_folder()
179
        {
180
            var d1 = new SnapshotDifferencer();
181
            //NOTE: Must post nomods for all accounts and contaienrs, otherwise the missing
182
            //containers will appear deleted
183
            var noModItems = new[]{
184
                                    new NoModificationInfo("acc1", "Cont1","Folder1"),
185
                                    new NoModificationInfo("acc1", "Cont2"),
186
                                    new NoModificationInfo("acc2", "Cont1"),
187
                                    new NoModificationInfo("acc2", "Cont2"),
188
                                };
189
            var deleted = new[]
190
                            {
191
                                new ObjectInfo{Account="acc1",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1},
192
                                new ObjectInfo{Account="acc1",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1},
193
                                new ObjectInfo{Account="acc1",Container="Cont1",Name="Name3",Bytes=123,Hash="aa3",Version=1},
194
                                new ObjectInfo{Account="acc1",Container="Cont1",Name="Name4",Bytes=123,Hash="aa4",Version=1},
195
                            };
196
            var unchanged = new[]{
197
                                new ObjectInfo{Account="acc1",Container="Cont1",Name="Folder1/Name1",Bytes=123,Hash="aa4",Version=1},
198
                                new ObjectInfo{Account="acc2",Container="Cont1",Name="Name1",Bytes=123,Hash="aa1",Version=1},
199
                                new ObjectInfo{Account="acc2",Container="Cont1",Name="Name2",Bytes=123,Hash="aa2",Version=1},
200
                                new ObjectInfo{Account="acc1",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1},
201
                                new ObjectInfo{Account="acc1",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1},
202
                                new ObjectInfo{Account="acc1",Container="Cont2",Name="Name3",Bytes=123,Hash="aa3",Version=1},
203
                                new ObjectInfo{Account="acc1",Container="Cont2",Name="Name4",Bytes=123,Hash="aa4",Version=1},
204
                                new ObjectInfo{Account="acc2",Container="Cont2",Name="Name1",Bytes=123,Hash="aa1",Version=1},
205
                                new ObjectInfo{Account="acc2",Container="Cont2",Name="Name2",Bytes=123,Hash="aa2",Version=1},
206
                            };
207
            var differencer = d1.Post(_previous)
208
                .Post(noModItems);
209

    
210
            
211
            Assert.That(differencer.Deleted.ToList(), Is.EquivalentTo(deleted).Using(_comparer), "should have deletions only from acc1/cont1");
212
            Assert.That(differencer.Created, Is.Empty,"should have no insertions");
213
            Assert.That(differencer.Changed, Is.Empty,"should have no changes");
214
            Assert.That(differencer.Unchanged, Is.EquivalentTo(unchanged).Using(_comparer),"should be equivalent to previous except the direct leafs of acc1/cont1");
215
            
216
        }
217

    
218
    }
219

    
220
    
221
}