public void TestEntryImmutable()
        {
            DefaultDiskStorage storage = GetStorageSupplier(1).Get();

            string resourceId1 = "resource1";

            byte[] value1 = new byte[100];
            value1[80] = 123;
            FileInfo file1 = WriteFileToStorage(storage, resourceId1, value1);

            Assert.AreEqual(100, file1.Length);
            ICollection <IEntry> entries = storage.GetEntries();
            IEntry   entry     = entries.FirstOrDefault();
            DateTime timestamp = entry.Timestamp;

            _clock.SetDateTime(DateTime.Now.AddHours(1));
            storage.GetResource(resourceId1, null);

            // Now the new timestamp show be higher, but the entry should have the same value
            ICollection <IEntry> newEntries = storage.GetEntries();
            IEntry newEntry = newEntries.FirstOrDefault();

            Assert.IsTrue(timestamp < newEntry.Timestamp);
            Assert.AreEqual(timestamp, entry.Timestamp);
        }
        public void TestIterationAndRemoval()
        {
            DefaultDiskStorage storage     = GetStorageSupplier(1).Get();
            string             resourceId0 = "file0";
            string             resourceId1 = "file1";
            string             resourceId2 = "file2";
            string             resourceId3 = "file3";

            byte[] CONTENT0 = Encoding.UTF8.GetBytes("content0");
            byte[] CONTENT1 = Encoding.UTF8.GetBytes("content1-bigger");
            byte[] CONTENT2 = Encoding.UTF8.GetBytes("content2");
            byte[] CONTENT3 = Encoding.UTF8.GetBytes("content3-biggest");

            IList <FileSystemInfo> files = new List <FileSystemInfo>(4);

            DateTime time1 = DateTime.Now;

            files.Add(Write(storage, resourceId0, CONTENT0));

            DateTime time2 = time1.AddMilliseconds(1000);

            _clock.SetDateTime(time2);
            files.Add(Write(storage, resourceId1, CONTENT1));

            DateTime time3 = time2.AddMilliseconds(1000);

            _clock.SetDateTime(time3);
            files.Add(Write(storage, resourceId2, CONTENT2));

            DateTime time4 = time3.AddMilliseconds(1000);

            _clock.SetDateTime(time4);
            files.Add(Write(storage, resourceId3, CONTENT3));

            IList <DefaultDiskStorage.EntryImpl> entries = RetrieveEntries(storage);

            Assert.AreEqual(4, entries.Count);
            Assert.AreEqual(files[0].FullName, ((FileBinaryResource)entries[0].Resource).File.FullName);
            Assert.AreEqual(files[1].FullName, ((FileBinaryResource)entries[1].Resource).File.FullName);
            Assert.AreEqual(files[2].FullName, ((FileBinaryResource)entries[2].Resource).File.FullName);
            Assert.AreEqual(files[3].FullName, ((FileBinaryResource)entries[3].Resource).File.FullName);

            // Try the same after removing 2 entries
            foreach (IEntry entry in storage.GetEntries())
            {
                // Delete the 2 biggest files: key1 and key3 (see the content values)
                if (entry.GetSize() >= CONTENT1.Length)
                {
                    storage.Remove(entry);
                }
            }

            IList <DefaultDiskStorage.EntryImpl> entriesAfterRemoval = RetrieveEntries(storage);

            Assert.AreEqual(2, entriesAfterRemoval.Count);
            Assert.AreEqual(files[0].FullName,
                            ((FileBinaryResource)entriesAfterRemoval[0].Resource).File.FullName);
            Assert.AreEqual(files[2].FullName,
                            ((FileBinaryResource)entriesAfterRemoval[1].Resource).File.FullName);
        }
        /// <summary>
        /// Retrieves a list of entries (the one returned by DiskStorage.Session.entriesIterator)
        /// ordered by timestamp.
        /// <param name="storage"></param>
        /// </summary>
        private static IList <DefaultDiskStorage.EntryImpl> RetrieveEntries(
            DefaultDiskStorage storage)
        {
            List <IEntry> entries = new List <IEntry>(storage.GetEntries());

            entries.Sort((a, b) =>
            {
                DateTime al = a.Timestamp;
                DateTime bl = b.Timestamp;
                return((al < bl) ? -1 : ((al > bl) ? 1 : 0));
            });

            IList <DefaultDiskStorage.EntryImpl> newEntries = new List <DefaultDiskStorage.EntryImpl>();

            foreach (IEntry entry in entries)
            {
                newEntries.Add((DefaultDiskStorage.EntryImpl)entry);
            }

            return(newEntries);
        }
        public void TestEntryIds()
        {
            DefaultDiskStorage storage = GetStorageSupplier(1).Get();

            byte[] value1 = new byte[101];
            byte[] value2 = new byte[102];
            byte[] value3 = new byte[103];
            value1[80] = 123;
            value2[80] = 45;
            value3[80] = 67;
            WriteFileToStorage(storage, "resourceId1", value1);
            WriteFileToStorage(storage, "resourceId2", value2);
            WriteFileToStorage(storage, "resourceId3", value3);

            // Check that resources are retrieved by the right name, before testing getEntries
            IBinaryResource res1 = storage.GetResource("resourceId1", null);
            IBinaryResource res2 = storage.GetResource("resourceId2", null);
            IBinaryResource res3 = storage.GetResource("resourceId3", null);

            CollectionAssert.AreEqual(value1, res1.Read());
            CollectionAssert.AreEqual(value2, res2.Read());
            CollectionAssert.AreEqual(value3, res3.Read());

            // Obtain entries and sort by name
            List <IEntry> entries = new List <IEntry>(storage.GetEntries());

            entries.Sort((a, b) =>
            {
                return(a.Id.CompareTo(b.Id));
            });

            Assert.AreEqual(3, entries.Count);
            Assert.AreEqual("resourceId1", entries[0].Id);
            Assert.AreEqual("resourceId2", entries[1].Id);
            Assert.AreEqual("resourceId3", entries[2].Id);
            CollectionAssert.AreEqual(value1, entries[0].Resource.Read());
            CollectionAssert.AreEqual(value2, entries[1].Resource.Read());
            CollectionAssert.AreEqual(value3, entries[2].Resource.Read());
        }
        public void TestRemoveWithIterator()
        {
            DefaultDiskStorage storage = GetStorageSupplier(1).Get();

            string resourceId1 = "resource1";

            byte[] value1 = new byte[100];
            value1[80] = 101;
            string resourceId2 = "resource2";

            byte[] value2 = new byte[104];
            value2[80] = 102;
            string resourceId3 = "resource3";

            byte[] value3 = new byte[106];
            value3[80] = 103;

            DateTime time1 = DateTime.Now;

            WriteFileToStorage(storage, resourceId1, value1);

            DateTime time2 = time1.AddMilliseconds(1000);

            _clock.SetDateTime(time2);
            WriteFileToStorage(storage, resourceId2, value2);

            _clock.SetDateTime(time2.AddMilliseconds(1000));
            WriteFileToStorage(storage, resourceId3, value3);

            IList <FileSystemInfo> files = FindNewFiles(_directory, new HashSet <FileSystemInfo>(), /*recurse*/ true);

            // There should be 1 file per entry
            Assert.AreEqual(3, files.Count);

            // Now delete entry2
            ICollection <IEntry> entries = storage.GetEntries();

            foreach (var item in entries)
            {
                if (Math.Abs((item.Timestamp - time2).TotalMilliseconds) < 500)
                {
                    storage.Remove(item);
                }
            }

            Assert.IsFalse(storage.Contains(resourceId2, null));
            IList <FileSystemInfo> remaining = FindNewFiles(
                _directory, new HashSet <FileSystemInfo>(), /*recurse*/ true);

            // 2 entries remain
            Assert.AreEqual(2, remaining.Count);

            // None of them with timestamp close to time2
            IList <IEntry> entries1 = new List <IEntry>(storage.GetEntries());

            Assert.AreEqual(2, entries1.Count);

            // First
            IEntry entry = entries1[0];

            Assert.IsFalse(Math.Abs((entry.Timestamp - time2).TotalMilliseconds) < 500);

            // Second
            entry = entries1[1];
            Assert.IsFalse(Math.Abs((entry.Timestamp - time2).TotalMilliseconds) < 500);
        }