Example #1
0
        public void RestoreBackupFile()
        {
            var creator = cache.Edit("k1");

            creator.PutAt(0, "ABC");
            creator.PutAt(1, "DE");
            creator.Commit();
            cache.Dispose();

            if (journalBackupFile.Exists)
            {
                journalBackupFile.Delete();
            }

            File.Move(journalFile.FullName, journalBackupFile.FullName);
            Assert.That(journalFile.Exists, Is.False);

            cache = DiskLruCache.Open(directory, AppVersion, 2, int.MaxValue);

            var snapshot = cache.Get("k1");

            Assert.That(snapshot, Is.Not.Null);
            Assert.That(snapshot.StringAt(0), Is.EqualTo("ABC"));
            Assert.That(snapshot.LengthAt(0), Is.EqualTo(3));
            Assert.That(snapshot.StringAt(1), Is.EqualTo("DE"));
            Assert.That(snapshot.LengthAt(1), Is.EqualTo(2));

            journalFile.Refresh();

            Assert.That(journalBackupFile.Exists, Is.False);
            Assert.That(journalFile.Exists, Is.True);
        }
Example #2
0
        public void EvictionHonorsLruFromPreviousSession()
        {
            Set("a", "a", "a");
            Set("b", "b", "b");
            Set("c", "c", "c");
            Set("d", "d", "d");
            Set("e", "e", "e");
            Set("f", "f", "f");

            cache.Get("b").Dispose(); // 'B' is now least recently used.
            Assert.That(cache.Size, Is.EqualTo(12));

            cache.Flush();
            cache = DiskLruCache.Open(directory, AppVersion, 2, 10);

            Set("g", "g", "g");
            cache.Flush();

            Assert.That(cache.Size, Is.EqualTo(10));

            AssertAbsent("a");
            AssertValue("b", "b", "b");
            AssertAbsent("c");
            AssertValue("d", "d", "d");
            AssertValue("e", "e", "e");
            AssertValue("f", "f", "f");
            AssertValue("g", "g", "g");
        }
Example #3
0
        public void OpenWithDirtyKeyDeletesAllFilesForThatKey()
        {
            cache.Dispose();

            var cleanFile0 = GetCleanFile("k1", 0);
            var cleanFile1 = GetCleanFile("k1", 1);
            var dirtyFile0 = GetDirtyFile("k1", 0);
            var dirtyFile1 = GetDirtyFile("k1", 1);

            WriteFile(cleanFile0, "A");
            WriteFile(cleanFile1, "B");
            WriteFile(dirtyFile0, "C");
            WriteFile(dirtyFile1, "D");

            // XXX: Original: createJournal("CLEAN k1 1 1", "DIRTY   k1");
            CreateJournal("CLEAN k1 1 1", "DIRTY k1");

            cache = DiskLruCache.Open(directory, AppVersion, 2, int.MaxValue);

            Assert.That(cleanFile0.Exists, Is.False);
            Assert.That(cleanFile1.Exists, Is.False);
            Assert.That(dirtyFile0.Exists, Is.False);
            Assert.That(dirtyFile1.Exists, Is.False);

            Assert.That(cache.Get("k1"), Is.Null);
        }
Example #4
0
        public void EvictionHonorsLruFromCurrentSession()
        {
            cache.Dispose();
            cache = DiskLruCache.Open(directory, AppVersion, 2, 10);
            Set("a", "a", "a");
            Set("b", "b", "b");
            Set("c", "c", "c");
            Set("d", "d", "d");
            Set("e", "e", "e");

            cache.Get("b").Dispose(); // 'B' is now least recently used.

            // Causing the size to grow to 12 should evict 'A'.
            Set("f", "f", "f");

            // Causing the size to grow to 12 should evict 'C'.
            Set("g", "g", "g");

            cache.Flush();

            Assert.That(cache.Size, Is.EqualTo(10));

            AssertAbsent("a");
            AssertValue("b", "b", "b");
            AssertAbsent("c");
            AssertValue("d", "d", "d");
            AssertValue("e", "e", "e");
            AssertValue("f", "f", "f");
        }
Example #5
0
        public void RebuildJournalOnRepeatedEditsWithOpenAndClose()
        {
            long lastJournalLength = 0;
            var  maxWrites         = 2000;

            while (true)
            {
                journalFile.Refresh();
                var journalLength = journalFile.Length;

                Set("a", "a", "a");
                Set("b", "b", "b");

                cache.Dispose();
                cache = DiskLruCache.Open(directory, AppVersion, 2, int.MaxValue);

                if (journalLength < lastJournalLength)
                {
                    Assert.Pass($"Journal compacted from {lastJournalLength} bytes to {journalLength} bytes");
                    break;
                }

                lastJournalLength = journalLength;
                maxWrites--;

                if (maxWrites <= 0)
                {
                    Assert.Fail("exceeded max writes but journal was not rebuilt");
                }
            }
        }
Example #6
0
 public void CacheSingleValueOfSizeGreaterThanMaxSize()
 {
     cache.Dispose();
     cache = DiskLruCache.Open(directory, AppVersion, 2, 10);
     Set("a", "aaaaaaaaaaa", "a"); // size=12
     cache.Flush();
     AssertAbsent("a");
 }
Example #7
0
        public async void Initialize(Action onComplete)
        {
            await Task.Run(() => {
                cacheImpl = DiskLruCache.Open(path, version, maxSize, collectFrequency);
            });

            onComplete();
        }
Example #8
0
        public void OpenWithInvalidBlankLineClearsDirectory()
        {
            cache.Dispose();
            GenerateSomeGarbageFiles();
            CreateJournalWithHeader(DiskLruCache.Magic, "1", "100", "2", "x");

            cache = DiskLruCache.Open(directory, AppVersion, 2, int.MaxValue);

            AssertGarbageFilesAllDeleted();
        }
Example #9
0
        public void OpenWithTooManyFileSizesClearsDirectory()
        {
            cache.Dispose();
            GenerateSomeGarbageFiles();
            CreateJournal("CLEAN k1 1 1 1");

            cache = DiskLruCache.Open(directory, AppVersion, 2, int.MaxValue);

            AssertGarbageFilesAllDeleted();
            Assert.That(cache.Get("k1"), Is.Null);
        }
Example #10
0
        public void EditSinceEvicted()
        {
            cache.Dispose();
            cache = DiskLruCache.Open(directory, AppVersion, 2, 10);
            Set("a", "aa", "aaa"); // size 5
            var snapshot = cache.Get("a");

            Set("b", "bb", "bbb"); // size 5
            Set("c", "cc", "ccc"); // size 5; will evict 'A'
            cache.Flush();
            Assert.That(snapshot.Edit(), Is.Null);
        }
Example #11
0
        public void GrowMaxSize()
        {
            cache.Dispose();
            cache = DiskLruCache.Open(directory, AppVersion, 2, 10);

            Set("a", "a", "aaa");   // size 4
            Set("b", "bb", "bbbb"); // size 6

            cache.MaxSize = 20;

            Set("c", "c", "c"); // size 12

            Assert.That(cache.Size, Is.EqualTo(12));
        }
Example #12
0
        public void SetUp()
        {
            var cacheDirectory = Path.Combine(Application.dataPath, "../", CacheDirectory);
            var cachePath      = Path.GetFullPath(cacheDirectory);

            journalFile       = new FileInfo(Path.Combine(cachePath, DiskLruCache.JournalFile));
            journalBackupFile = new FileInfo(Path.Combine(cachePath, DiskLruCache.JournalFileBackup));

            if (Directory.Exists(cachePath))
            {
                Directory.Delete(cachePath, true);
            }

            directory = new DirectoryInfo(cachePath);
            cache     = DiskLruCache.Open(directory, AppVersion, 2, int.MaxValue);
        }
Example #13
0
        public void ReadAndWriteEntryWithoutProperClose()
        {
            var creator = cache.Edit("k1");

            creator.PutAt(0, "A");
            creator.PutAt(1, "B");
            creator.Commit();

            // Simulate a dirty close of 'cache' by opening the cache directory again.
            var cache2   = DiskLruCache.Open(directory, AppVersion, 2, int.MaxValue);
            var snapshot = cache2.Get("k1");

            Assert.That(snapshot.StringAt(0), Is.EqualTo("A"));
            Assert.That(snapshot.LengthAt(0), Is.EqualTo(1));
            Assert.That(snapshot.StringAt(1), Is.EqualTo("B"));
            Assert.That(snapshot.LengthAt(1), Is.EqualTo(1));

            snapshot.Dispose();
            cache2.Dispose();
        }
Example #14
0
        public void ReadAndWriteEntryAcrossCacheOpenAndClose()
        {
            var editor = cache.Edit("k1");

            editor.PutAt(0, "A");
            editor.PutAt(1, "B");
            editor.Commit();

            cache.Dispose();

            cache = DiskLruCache.Open(directory, AppVersion, 2, int.MaxValue);
            var snapshot = cache.Get("k1");

            Assert.That(snapshot.StringAt(0), Is.EqualTo("A"));
            Assert.That(snapshot.LengthAt(0), Is.EqualTo(1));
            Assert.That(snapshot.StringAt(1), Is.EqualTo("B"));
            Assert.That(snapshot.LengthAt(1), Is.EqualTo(1));

            snapshot.Dispose();
        }
Example #15
0
        public void EvictOnUpdate()
        {
            cache.Dispose();
            cache = DiskLruCache.Open(directory, AppVersion, 2, 10);

            Set("a", "a", "aa"); // size 3
            Set("b", "b", "bb"); // size 3
            Set("c", "c", "cc"); // size 3

            Assert.That(cache.Size, Is.EqualTo(9));

            // Causing the size to grow to 11 should evict 'A'.
            Set("b", "b", "bbbb");
            cache.Flush();

            Assert.That(cache.Size, Is.EqualTo(8));

            AssertAbsent("a");
            AssertValue("b", "b", "bbbb");
            AssertValue("c", "c", "cc");
        }
Example #16
0
        public void OpenWithTruncatedLineDiscardsThatLine()
        {
            cache.Dispose();
            WriteFile(GetCleanFile("k1", 0), "A");
            WriteFile(GetCleanFile("k1", 1), "B");

            using (var writer =
                       new StreamWriter(journalFile.Open(FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))) {
                writer.Write(DiskLruCache.Magic + "\n" + DiskLruCache.Version1 + "\n100\n2\n\nCLEAN k1 1 1");
            }

            cache = DiskLruCache.Open(directory, AppVersion, 2, int.MaxValue);
            Assert.That(cache.Get("k1"), Is.Null);

            // The journal is not corrupt when editing after a truncated line.
            Set("k1", "C", "D");

            cache.Dispose();
            cache = DiskLruCache.Open(directory, AppVersion, 2, int.MaxValue);

            AssertValue("k1", "C", "D");
        }
Example #17
0
        public void JournalFileIsPreferredOverBackupFile()
        {
            var creator = cache.Edit("k1");

            creator.PutAt(0, "ABC");
            creator.PutAt(1, "DE");
            creator.Commit();
            cache.Flush();

            File.Copy(journalFile.FullName, journalBackupFile.FullName);

            creator = cache.Edit("k2");
            creator.PutAt(0, "F");
            creator.PutAt(1, "GH");
            creator.Commit();
            cache.Dispose();

            Assert.That(journalFile.Exists, Is.True);
            Assert.That(journalBackupFile.Exists, Is.True);

            cache = DiskLruCache.Open(directory, AppVersion, 2, int.MaxValue);

            var snapshotA = cache.Get("k1");

            Assert.That(snapshotA.StringAt(0), Is.EqualTo("ABC"));
            Assert.That(snapshotA.LengthAt(0), Is.EqualTo(3));
            Assert.That(snapshotA.StringAt(1), Is.EqualTo("DE"));
            Assert.That(snapshotA.LengthAt(1), Is.EqualTo(2));

            var snapshotB = cache.Get("k2");

            Assert.That(snapshotB.StringAt(0), Is.EqualTo("F"));
            Assert.That(snapshotB.LengthAt(0), Is.EqualTo(1));
            Assert.That(snapshotB.StringAt(1), Is.EqualTo("GH"));
            Assert.That(snapshotB.LengthAt(1), Is.EqualTo(2));

            Assert.That(journalBackupFile.Exists, Is.True);
            Assert.That(journalFile.Exists, Is.True);
        }
Example #18
0
        public void EvictOnInsert()
        {
            cache.Dispose();
            cache = DiskLruCache.Open(directory, AppVersion, 2, 10);

            Set("a", "a", "aaa");   // size 4
            Set("b", "bb", "bbbb"); // size 6
            Assert.That(cache.Size, Is.EqualTo(10));

            // Cause the size to grow to 12 should evict 'A'.
            Set("c", "c", "c");
            cache.Flush();
            Assert.That(cache.Size, Is.EqualTo(8));
            AssertAbsent("a");
            AssertValue("b", "bb", "bbbb");
            AssertValue("c", "c", "c");

            // Causing the size to grow to 10 should evict nothing.
            Set("d", "d", "d");
            cache.Flush();
            Assert.That(cache.Size, Is.EqualTo(10));
            AssertAbsent("a");
            AssertValue("b", "bb", "bbbb");
            AssertValue("c", "c", "c");
            AssertValue("d", "d", "d");

            // Causing the size to grow to 18 should evict 'B' and 'C'.
            Set("e", "eeee", "eeee");
            cache.Flush();
            Assert.That(cache.Size, Is.EqualTo(10));
            AssertAbsent("a");
            AssertAbsent("b");
            AssertAbsent("c");
            AssertValue("d", "d", "d");
            AssertValue("e", "eeee", "eeee");
        }
Example #19
0
 public void ConstructorDoesNotAllowZeroCacheSize()
 {
     Assert.Catch <ArgumentException>(() => {
         DiskLruCache.Open(directory, AppVersion, 2, 0);
     });
 }
Example #20
0
 public void ConstructorDoesNotAllowZeroValuesPerEntry()
 {
     Assert.Catch <ArgumentException>(() => {
         DiskLruCache.Open(directory, AppVersion, 0, 10);
     });
 }