Пример #1
0
        public void TestIsEnabled()
        {
            IDiskStorage     storage = CreateDiskStorage(TESTCACHE_CURRENT_VERSION);
            DiskStorageCache cache   = CreateDiskCache(storage, false);

            Assert.IsTrue(cache.IsEnabled);
        }
Пример #2
0
        public void TestVersioning()
        {
            // Define data that will be written to cache
            ICacheKey key = new SimpleCacheKey("version_test");

            byte[] value = new byte[32];
            value[0] = 118; // 'v'

            // Set up cache with version == 1
            IDiskStorage     storage1 = CreateDiskStorage(TESTCACHE_CURRENT_VERSION);
            DiskStorageCache cache1   = CreateDiskCache(storage1, false);

            // Write test data to cache 1
            cache1.Insert(key, WriterCallbacks.From(value));

            // Get cached file
            IBinaryResource resource1 = GetResource(storage1, key);

            Assert.IsNotNull(resource1);

            // Set up cache with version == 2
            IDiskStorage     storageSupplier2 = CreateDiskStorage(TESTCACHE_NEXT_VERSION);
            DiskStorageCache cache2           = CreateDiskCache(storageSupplier2, false);

            // Write test data to cache 2
            cache2.Insert(key, WriterCallbacks.From(value));

            // Get cached file
            IBinaryResource resource2 = GetResource(storageSupplier2, key);

            Assert.IsNotNull(resource2);

            // Make sure filenames of the two file are different
            Assert.IsFalse(resource2.Equals(resource1));
        }
Пример #3
0
        public void Initialize()
        {
            _clock = MockSystemClock.Get();
            _clock.SetDateTime(DateTime.Now);
            NoOpDiskTrimmableRegistry.Instance.ResetCounter();
            _diskTrimmableRegistry = NoOpDiskTrimmableRegistry.Instance;
            _cacheEventListener    = new DuplicatingCacheEventListener();

            // We know the directory will be this
            _cacheDirectory = new DirectoryInfo(
                Path.Combine(ApplicationData.Current.LocalCacheFolder.Path, CACHE_TYPE));
            _cacheDirectory.Create();
            if (!_cacheDirectory.Exists)
            {
                throw new Exception(
                          string.Format(
                              "Cannot create cache dir: {0}: directory {1}",
                              ApplicationData.Current.LocalCacheFolder.Path,
                              _cacheDirectory.Exists ? "already exists" : "does not exist"));
            }

            _storage = CreateDiskStorage(TESTCACHE_VERSION_START_OF_VERSIONING);
            _cache   = CreateDiskCache(_storage, false);
            Assert.IsTrue(((NoOpDiskTrimmableRegistry)_diskTrimmableRegistry).RegisterDiskTrimmableCount == 1);
        }
        /// <summary>
        /// Builds the <see cref="DiskStorageCache"/>.
        /// </summary>
        public static DiskStorageCache BuildDiskStorageCache(
            DiskCacheConfig diskCacheConfig,
            IDiskStorage diskStorage)
        {
            Params parameters = new Params(
                diskCacheConfig.MinimumSizeLimit,
                diskCacheConfig.LowDiskSpaceSizeLimit,
                diskCacheConfig.DefaultSizeLimit);

            return(new DiskStorageCache(
                       diskStorage,
                       diskCacheConfig.EntryEvictionComparatorSupplier,
                       parameters,
                       diskCacheConfig.CacheEventListener,
                       diskCacheConfig.CacheErrorLogger,
                       diskCacheConfig.DiskTrimmableRegistry,
                       diskCacheConfig.IndexPopulateAtStartupEnabled));
        }
Пример #5
0
        private DiskStorageCache CreateDiskCache(
            IDiskStorage diskStorage,
            bool indexPopulateAtStartupEnabled)
        {
            Params diskStorageCacheParams = new Params(
                0,
                FILE_CACHE_MAX_SIZE_LOW_LIMIT,
                FILE_CACHE_MAX_SIZE_HIGH_LIMIT);

            return(new DiskStorageCache(
                       diskStorage,
                       new DefaultEntryEvictionComparatorSupplier(),
                       diskStorageCacheParams,
                       _cacheEventListener,
                       NoOpCacheErrorLogger.Instance,
                       _diskTrimmableRegistry,
                       indexPopulateAtStartupEnabled,
                       _clock));
        }
        public void TestGet_InternalCacheDir()
        {
            DirectoryInfo cacheDir = new DirectoryInfo(ApplicationData.Current.LocalCacheFolder.Path);

            DynamicDefaultDiskStorage storage = CreateInternalCacheDirStorage();

            // Initial state
            Assert.IsNull(storage._currentState.DiskStorageDelegate);

            // After first initialization
            IDiskStorage diskStorageDelegate = storage.Get();

            Assert.AreEqual(diskStorageDelegate, storage._currentState.DiskStorageDelegate);
            Assert.IsTrue(diskStorageDelegate.GetType() == typeof(DefaultDiskStorage));

            DirectoryInfo baseDir = new DirectoryInfo(Path.Combine(cacheDir.FullName, _baseDirectoryName));

            Assert.IsTrue(baseDir.Exists);
            Assert.IsTrue(GetStorageSubdirectory(baseDir, 1).Exists);

            // no change => should get back the same storage instance
            IDiskStorage storage2 = storage.Get();

            Assert.AreEqual(diskStorageDelegate, storage2);

            // Root directory has been moved (proxy for delete). So we should get back a different instance
            DirectoryInfo baseDirOrig = new DirectoryInfo(baseDir.FullName);

            Assert.IsTrue(baseDirOrig.RenameTo(new DirectoryInfo(
                                                   Path.Combine(cacheDir.FullName, "dummydir"))));
            IDiskStorage storage3 = storage.Get();

            Assert.AreNotEqual(diskStorageDelegate, storage3);
            Assert.IsTrue(storage3.GetType() == typeof(DefaultDiskStorage));
            baseDir.Refresh();
            Assert.IsTrue(baseDir.Exists);
            Assert.IsTrue(GetStorageSubdirectory(baseDir, 1).Exists);
        }
Пример #7
0
 internal State(FileSystemInfo rootDirectory, IDiskStorage diskStorageDelegate)
 {
     DiskStorageDelegate = diskStorageDelegate;
     RootDirectory       = rootDirectory;
 }
Пример #8
0
 /// <summary>
 /// Creates a new <see cref="DiskStorageCache"/> from
 /// the given <see cref="DiskCacheConfig"/>.
 ///
 /// @deprecated use
 /// <see cref="DiskStorageCacheFactory.BuildDiskStorageCache"/>.
 /// </summary>
 public static DiskStorageCache BuildDiskStorageCache(
     DiskCacheConfig diskCacheConfig,
     IDiskStorage diskStorage)
 {
     return(DiskStorageCacheFactory.BuildDiskStorageCache(diskCacheConfig, diskStorage));
 }
Пример #9
0
 private IBinaryResource GetResource(IDiskStorage storage, ICacheKey key)
 {
     return(storage.GetResource(CacheKeyUtil.GetFirstResourceId(key), key));
 }
        /// <summary>
        /// Instantiates the <see cref="DiskStorageCache"/>.
        /// </summary>
        public DiskStorageCache(
            IDiskStorage diskStorage,
            IEntryEvictionComparatorSupplier entryEvictionComparatorSupplier,
            Params parameters,
            ICacheEventListener cacheEventListener,
            ICacheErrorLogger cacheErrorLogger,
            IDiskTrimmableRegistry diskTrimmableRegistry,
            bool indexPopulateAtStartupEnabled,
            Clock clock = null)
        {
            _lowDiskSpaceCacheSizeLimit = parameters.LowDiskSpaceCacheSizeLimit;
            _defaultCacheSizeLimit      = parameters.DefaultCacheSizeLimit;
            _cacheSizeLimit             = parameters.DefaultCacheSizeLimit;
            _statFsHelper = StatFsHelper.Instance;

            _storage = diskStorage;

            _entryEvictionComparatorSupplier = entryEvictionComparatorSupplier;

            _cacheSizeLastUpdateTime = default(DateTime);

            _cacheEventListener = cacheEventListener;

            _cacheSizeLimitMinimum = parameters.CacheSizeLimitMinimum;

            _cacheErrorLogger = cacheErrorLogger;

            _cacheStats = new CacheStats();

            if (diskTrimmableRegistry != null)
            {
                diskTrimmableRegistry.RegisterDiskTrimmable(this);
            }

            _clock = clock ?? SystemClock.Get();

            _indexPopulateAtStartupEnabled = indexPopulateAtStartupEnabled;

            _resourceIndex = new HashSet <string>();

            if (_indexPopulateAtStartupEnabled)
            {
                Task.Run(() =>
                {
                    try
                    {
                        lock (_lock)
                        {
                            MaybeUpdateFileCacheSize();
                        }
                    }
                    finally
                    {
                        _countdownEvent.Signal();
                    }
                });
            }
            else
            {
                _countdownEvent.Reset(0);
            }
        }