Statistics
| Branch: | Revision:

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
}