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); }