Exemplo n.º 1
0
        public static async Task RunInContextAsync(
            TestCacheProvider cacheProvider,
            LogLevel logLevel,
            bool cacheAllQueries,
            params Func <ApplicationDbContext, DebugLoggerProvider, Task>[] actions)
        {
            await _semaphoreSlim.WaitAsync();

            try
            {
                var serviceProvider      = GetConfiguredContextServiceProvider(cacheProvider, logLevel, cacheAllQueries);
                var cacheServiceProvider = serviceProvider.GetRequiredService <IEFCacheServiceProvider>();
                cacheServiceProvider.ClearAllCachedEntries();
                using (var serviceScope = serviceProvider.GetRequiredService <IServiceScopeFactory>().CreateScope())
                {
                    foreach (var action in actions)
                    {
                        using (var context = serviceScope.ServiceProvider.GetRequiredService <ApplicationDbContext>())
                        {
                            await action(context, (DebugLoggerProvider)serviceProvider.GetRequiredService <ILoggerProvider>());
                        }
                    }
                }
            }
            finally
            {
                _semaphoreSlim.Release();
            }
        }
Exemplo n.º 2
0
        public void TestSecondLevelCacheUsingProjections(TestCacheProvider cacheProvider)
        {
            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false, (context, loggerProvider) =>
            {
                var isActive = true;
                var name     = "Product1";

                var list2 = context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive == isActive && product.ProductName == name)
                            .Select(x => x.ProductId)
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .ToList();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(list2.Any());

                list2 = context.Products
                        .OrderBy(product => product.ProductNumber)
                        .Where(product => product.IsActive == isActive && product.ProductName == name)
                        .Select(x => x.ProductId)
                        .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                        .ToList();
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(list2.Any());
            });
        }
Exemplo n.º 3
0
        public void TestQueriesUsingDifferentParameterValuesWillNotUseTheCache(TestCacheProvider cacheProvider)
        {
            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false, (context, loggerProvider) =>
            {
                var list1 = context.Products.Include(x => x.TagProducts).ThenInclude(x => x.Tag)
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive && product.ProductName == "Product1")
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .ToList();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());

                var list2 = context.Products.Include(x => x.TagProducts).ThenInclude(x => x.Tag)
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => !product.IsActive && product.ProductName == "Product1")
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .ToList();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());

                var list3 = context.Products.Include(x => x.TagProducts).ThenInclude(x => x.Tag)
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => !product.IsActive && product.ProductName == "Product2")
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .ToList();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());

                var list4 = context.Products.Include(x => x.TagProducts).ThenInclude(x => x.Tag)
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => !product.IsActive && product.ProductName == "Product2")
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .ToList();
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
            });
        }
Exemplo n.º 4
0
        public void TestEqualsMethodWillUseTheCache(TestCacheProvider cacheProvider)
        {
            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false, (context, loggerProvider) =>
            {
                var item1 = context.Products
                            .Where(product => product.ProductId == 2 && product.ProductName.Equals("Product1"))
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .FirstOrDefault();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsNotNull(item1);

                var item2 = context.Products
                            .Where(product => product.ProductId == 2 && product.ProductName.Equals("Product1"))
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .FirstOrDefault();
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
                Assert.IsNotNull(item2);

                var item3 = context.Products
                            .Where(product => product.ProductId == 1 && product.ProductName.Equals("Product1"))
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .FirstOrDefault();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsNull(item3);
            });
        }
        public void TestQueriesUsingExplicitTransactionsWillNotUseTheCache(TestCacheProvider cacheProvider)
        {
            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false, (context, loggerProvider) =>
            {
                using (var txn = context.Database.BeginTransaction())
                {
                    // Read and modify an entity
                    var entity1  = context.Tags.Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45)).First();
                    entity1.Name = "FOO";

                    // Save the change, cache will be invalidated
                    context.SaveChanges();

                    // Read the same entity again
                    entity1 = context.Tags.Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45)).First();
                    // It will not get cached
                    Assert.AreEqual(0, loggerProvider.GetCacheHitCount());

                    // Call some method
                    // THIS METHOD THROWS AN EXCEPTION SO THE TRANSACTION IS NEVER COMMITTED
                    throw new TimeoutException();

                    // (we never hit these lines, so the cache is not invalidated and the transaction is not committed)
                    context.SaveChanges();
                    txn.Commit();
                }
            });
        }
Exemplo n.º 6
0
        public void TestSecondLevelCacheInTwoDifferentContextsDoesNotHitTheDatabase(TestCacheProvider cacheProvider)
        {
            var isActive = true;
            var name     = "Product2";

            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false,
                                           (context, loggerProvider) =>
            {
                var list2 = context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive == isActive && product.ProductName == name)
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .ToList();
                Assert.IsTrue(list2.Any());
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
            },
                                           (context, loggerProvider) =>
            {
                var list3 = context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive == isActive && product.ProductName == name)
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .ToList();
                Assert.IsTrue(list3.Any());
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
            });
        }
Exemplo n.º 7
0
        public async Task TestSecondLevelCacheUsingTwoCountAsyncMethods(TestCacheProvider cacheProvider)
        {
            await EFServiceProvider.RunInContextAsync(cacheProvider, LogLevel.Debug, false,
                                                      async (context, loggerProvider) =>
            {
                var isActive = true;
                var name     = "Product2";

                var count = await context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive == isActive && product.ProductName == name)
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .CountAsync();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(count > 0);

                count = await context.Products
                        .OrderBy(product => product.ProductNumber)
                        .Where(product => product.IsActive == isActive && product.ProductName == name)
                        .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                        .CountAsync();
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(count > 0);
            });
        }
Exemplo n.º 8
0
        public async Task TestCacheAllQueriesWithNotCacheableWorks(TestCacheProvider cacheProvider)
        {
            await EFServiceProvider.RunInContextAsync(cacheProvider, LogLevel.Debug, true,
                                                      async (context, loggerProvider) =>
            {
                var isActive = true;
                var name     = "Product1";

                var list1 = await context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive == isActive && product.ProductName == name)
                            .NotCacheable()
                            .ToListAsync();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(list1.Any());

                var list2 = await context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive == isActive && product.ProductName == name)
                            .NotCacheable()
                            .ToListAsync();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(list2.Any());
            });
        }
Exemplo n.º 9
0
        public virtual void TestObjectCacheInvalidationWithOneRoot(TestCacheProvider cacheProvider)
        {
            var          cacheService  = EFServiceProvider.GetCacheServiceProvider(cacheProvider);
            var          efCachePolicy = new EFCachePolicy().Timeout(TimeSpan.FromMinutes(10)).ExpirationMode(CacheExpirationMode.Absolute);
            const string rootCacheKey  = "EFSecondLevelCache.Core.AspNetCoreSample.DataLayer.Entities.Product";

            cacheService.InvalidateCacheDependencies(new EFCacheKey {
                CacheDependencies = new HashSet <string> {
                    rootCacheKey
                }
            });

            var key11888622 = new EFCacheKey
            {
                KeyHash           = "11888622",
                CacheDependencies = new HashSet <string> {
                    rootCacheKey
                }
            };
            var val11888622 = cacheService.GetValue(key11888622, efCachePolicy);

            Assert.IsNull(val11888622);

            cacheService.InsertValue(
                key11888622,
                new EFCachedData {
                Scalar = "Test1"
            }, efCachePolicy);

            var key44513A63 = new EFCacheKey
            {
                KeyHash           = "44513A63",
                CacheDependencies = new HashSet <string> {
                    rootCacheKey
                }
            };
            var val44513A63 = cacheService.GetValue(key44513A63, efCachePolicy);

            Assert.IsNull(val44513A63);

            cacheService.InsertValue(
                key44513A63,
                new EFCachedData {
                Scalar = "Test1"
            }, efCachePolicy);

            cacheService.InvalidateCacheDependencies(new EFCacheKey {
                CacheDependencies = new HashSet <string> {
                    rootCacheKey
                }
            });

            val11888622 = cacheService.GetValue(key11888622, efCachePolicy);
            Assert.IsNull(val11888622);

            val44513A63 = cacheService.GetValue(key44513A63, efCachePolicy);
            Assert.IsNull(val44513A63);
        }
Exemplo n.º 10
0
 protected virtual IEFCacheServiceProvider GetCacheServiceProvider(TestCacheProvider cacheProvider)
 {
     return(cacheProvider switch
     {
         TestCacheProvider.BuiltInInMemory => EFServiceProvider.GetInMemoryCacheServiceProvider(),
         TestCacheProvider.CacheManagerCoreInMemory => EFServiceProvider.GetCacheManagerCoreInMemory(),
         TestCacheProvider.CacheManagerCoreRedis => EFServiceProvider.GetCacheManagerCoreRedis(),
         _ => throw new NotSupportedException($"{cacheProvider} is not supported."),
     });
        public virtual void TestParallelInsertsAndRemoves(TestCacheProvider cacheProvider)
        {
            var cacheService  = EFServiceProvider.GetCacheServiceProvider(cacheProvider);
            var efCachePolicy = new EFCachePolicy().Timeout(TimeSpan.FromMinutes(10)).ExpirationMode(CacheExpirationMode.Absolute);

            var tests = new List <Action>();

            for (var i = 0; i < 4000; i++)
            {
                var i1 = i;
                tests.Add(() =>
                          cacheService.InsertValue(
                              new EFCacheKey(new HashSet <string> {
                    "entity1", "entity2"
                })
                {
                    KeyHash = $"EF_key{i1}"
                }, new EFCachedData {
                    NonQuery = i1
                }, efCachePolicy));
            }

            for (var i = 0; i < 400; i++)
            {
                if (i % 2 == 0)
                {
                    tests.Add(() => cacheService.InvalidateCacheDependencies(new EFCacheKey(new HashSet <string> {
                        "entity1"
                    })
                    {
                        KeyHash = $"EF_key{i}"
                    }));
                }
                else
                {
                    tests.Add(() => cacheService.InvalidateCacheDependencies(new EFCacheKey(new HashSet <string> {
                        "entity2"
                    })
                    {
                        KeyHash = $"EF_key{i}"
                    }));
                }
            }

            Parallel.Invoke(tests.OrderBy(a => RandomNumberProvider.Next()).ToArray());

            var value1 = cacheService.GetValue(new EFCacheKey(new HashSet <string> {
                "entity1", "entity2"
            })
            {
                KeyHash = "EF_key1"
            }, efCachePolicy);

            Assert.IsNull(value1);
        }
Exemplo n.º 12
0
        public virtual void TestCacheInvalidationWithSimilarRoots(TestCacheProvider cacheProvider)
        {
            var cacheService  = EFServiceProvider.GetCacheServiceProvider(cacheProvider);
            var efCachePolicy = new EFCachePolicy().Timeout(TimeSpan.FromMinutes(10)).ExpirationMode(CacheExpirationMode.Absolute);
            var key1          = new EFCacheKey
            {
                KeyHash           = "EF_key1",
                CacheDependencies = new HashSet <string> {
                    "entity1", "entity2"
                }
            };

            cacheService.InsertValue(
                key1,
                new EFCachedData {
                Scalar = "value1"
            }, efCachePolicy);

            var key2 = new EFCacheKey
            {
                KeyHash           = "EF_key2",
                CacheDependencies = new HashSet <string> {
                    "entity2"
                }
            };

            cacheService.InsertValue(
                key2,
                new EFCachedData {
                Scalar = "value2"
            },
                efCachePolicy);


            var value1 = cacheService.GetValue(key1, efCachePolicy);

            Assert.IsNotNull(value1);

            var value2 = cacheService.GetValue(key2, efCachePolicy);

            Assert.IsNotNull(value2);

            cacheService.InvalidateCacheDependencies(new EFCacheKey {
                CacheDependencies = new HashSet <string> {
                    "entity2"
                }
            });

            value1 = cacheService.GetValue(key1, efCachePolicy);
            Assert.IsNull(value1);

            value2 = cacheService.GetValue(key2, efCachePolicy);
            Assert.IsNull(value2);
        }
        public void TestIncludeMethodAndProjectionAffectsKeyCache(TestCacheProvider cacheProvider)
        {
            var isActive = true;
            var name     = "Product1";

            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false,
                                           (context, loggerProvider) =>
            {
                var product1IncludeTags = context.Products
                                          .Where(product => product.IsActive == isActive && product.ProductName == name)
                                          .Include(x => x.TagProducts).ThenInclude(x => x.Tag)
                                          .Select(x => new { Name = x.ProductName, Tag = x.TagProducts.Select(y => y.Tag) })
                                          .OrderBy(x => x.Name)
                                          .FirstOrDefault();
                Assert.IsNotNull(product1IncludeTags);
            },
                                           (context, loggerProvider) =>
            {
                var firstProductIncludeTags = context.Products
                                              .Where(product => product.IsActive == isActive && product.ProductName == name)
                                              .Include(x => x.TagProducts).ThenInclude(x => x.Tag)
                                              .Select(x => new { Name = x.ProductName, Tag = x.TagProducts.Select(y => y.Tag) })
                                              .OrderBy(x => x.Name)
                                              .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                                              .FirstOrDefault();
                Assert.IsNotNull(firstProductIncludeTags);
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
            },
                                           (context, loggerProvider) =>
            {
                var firstProductIncludeTags2 = context.Products
                                               .Where(product => product.IsActive == isActive && product.ProductName == name)
                                               .Include(x => x.TagProducts).ThenInclude(x => x.Tag)
                                               .Select(x => new { Name = x.ProductName, Tag = x.TagProducts.Select(y => y.Tag) })
                                               .OrderBy(x => x.Name)
                                               .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                                               .FirstOrDefault();
                Assert.IsNotNull(firstProductIncludeTags2);
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
            },
                                           (context, loggerProvider) =>
            {
                var firstProduct = context.Products
                                   .Where(product => product.IsActive == isActive && product.ProductName == name)
                                   .Select(x => new { Name = x.ProductName, Tag = x.TagProducts.Select(y => y.Tag) })
                                   .OrderBy(x => x.Name)
                                   .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                                   .FirstOrDefault();
                Assert.IsNotNull(firstProduct);
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
            });
        }
Exemplo n.º 14
0
        public static IServiceProvider GetConfiguredContextServiceProvider(
            TestCacheProvider cacheProvider,
            LogLevel logLevel,
            bool cacheAllQueries)
        {
            var services = new ServiceCollection();

            services.AddOptions();
            var basePath = Directory.GetCurrentDirectory();

            Console.WriteLine($"Using `{basePath}` as the ContentRootPath");
            var configuration = new Microsoft.Extensions.Configuration.ConfigurationBuilder()
                                .SetBasePath(basePath)
                                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                                .Build();

            services.AddSingleton(_ => configuration);

            var loggerProvider = new DebugLoggerProvider();

            services.AddLogging(cfg => cfg.AddConsole().AddDebug().AddProvider(loggerProvider).SetMinimumLevel(logLevel));

            services.AddEFSecondLevelCache(options =>
            {
                switch (cacheProvider)
                {
                case TestCacheProvider.BuiltInInMemory:
                    options.UseMemoryCacheProvider();
                    break;

                case TestCacheProvider.CacheManagerCoreInMemory:
                    options.UseCacheManagerCoreProvider();
                    addCacheManagerCoreInMemory(services);
                    break;

                case TestCacheProvider.CacheManagerCoreRedis:
                    options.UseCacheManagerCoreProvider();
                    addCacheManagerCoreRedis(services);
                    break;
                }

                if (cacheAllQueries)
                {
                    options.CacheAllQueries(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(30));
                }
            });

            services.AddConfiguredMsSqlDbContext(GetConnectionString(basePath, configuration));

            return(services.BuildServiceProvider());
        }
Exemplo n.º 15
0
        public static void InitializePdaProducingPdvmSimulation <TPDVM>(
            out TestGraph graph,
            out Func <int, int, IEnumerable <string> > simulate)
            where TPDVM : TestPDVM, new()
        {
            graph = new TestGraph();

            var transitionProvider = new TestTransitionProvider(graph);
            var cacheProvider      =
                new TestCacheProvider <int, int, int, TestPdaConstructingContext, TestPdaConstructingGssNode>();

            var contextProcessor = new PdaExtractingContextProcessor <int, int, int, TestEdge>();

            var pdvm       = new TPDVM();
            var simulation = new PdaConstructingPdvmSimulation(
                contextProcessor, cacheProvider, transitionProvider,
                () => pdvm);

            simulate = (startVertex, maxCyclesExpansion) =>
            {
                var start = simulation.Load(startVertex, 1, -1);
                simulation.Run();

                var finals = pdvm.Finals;
                var paths  = new List <string>();
                PdaContextDecoder.ExtractWords(
                    start,
                    context => finals.Contains(context),
                    maxCyclesExpansion,
                    rawPath =>
                {
                    var path = string.Join(" ", rawPath.Select(edge => edge.Tag));
                    paths.Add(path);

                    return(true);
                },
                    _ => { });

                foreach (var path in paths)
                {
                    Console.WriteLine(path);
                }

                using (var writer = new StreamWriter(Path.GetTempPath() + "contexts.dot"))
                {
                    DumpPda(start, writer);
                }

                return(paths);
            };
        }
Exemplo n.º 16
0
        public static void InitializePdaProducingSimulation(
            Func <int, int> startStatesProvider,
            Func <int> startStackSymbolsProvider,
            out TestDPDA dpda,
            out TestGraph graph,
            out Func <int, int, IEnumerable <string> > simulate)
        {
            dpda  = new TestDPDA(startStatesProvider, startStackSymbolsProvider);
            graph = new TestGraph();

            var transitionProvider = new TestTransitionProvider(graph);
            var cacheProvider      =
                new TestCacheProvider <int, int, int, TestPdaConstructingContext, TestPdaConstructingGssNode>();

            var contextProcessor = new PdaExtractingContextProcessor <int, int, int, TestEdge>();

            var simulation = new PdaConstructingSimulation(
                dpda, contextProcessor, cacheProvider, transitionProvider);

            var finalsInternal = new HashSet <TestPdaConstructingContext>();

            simulation.OnFinalState += head => finalsInternal.Add(head.CurrentContext);

            simulate = (startVertex, maxCyclesExpansion) =>
            {
                var start = simulation.Load(startVertex);
                simulation.Run();

                var paths = new List <string>();
                PdaContextDecoder.ExtractWords(
                    start,
                    context => finalsInternal.Contains(context),
                    maxCyclesExpansion,
                    rawPath =>
                {
                    var path = string.Join(" ", rawPath.Select(edge => edge.Tag));
                    paths.Add(path);

                    return(true);
                },
                    _ => { });

                using (var writer = new StreamWriter(Path.GetTempPath() + "contexts.dot"))
                {
                    DumpPda(start, writer);
                }

                return(paths);
            };
        }
Exemplo n.º 17
0
        public void TestSecondLevelCacheUsingDifferentSyncMethods(TestCacheProvider cacheProvider)
        {
            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false,
                                           (context, loggerProvider) =>
            {
                var isActive = true;
                var name     = "Product1";

                var count = context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive == isActive && product.ProductName == name)
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .Count();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(count > 0);

                var list1 = context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive == isActive && product.ProductName == name)
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .ToList();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(list1.Any());

                var product1 = context.Products
                               .OrderBy(product => product.ProductNumber)
                               .Where(product => product.IsActive == isActive && product.ProductName == name)
                               .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                               .FirstOrDefault();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(product1 != null);

                var any = context.Products
                          .OrderBy(product => product.ProductNumber)
                          .Where(product => product.IsActive == isActive && product.ProductName == "Product2")
                          .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                          .Any();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(any);

                var sum = context.Products
                          .OrderBy(product => product.ProductNumber)
                          .Where(product => product.IsActive == isActive && product.ProductName == "Product2")
                          .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                          .Sum(x => x.ProductId);
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(sum > 0);
            });
        }
Exemplo n.º 18
0
        public async Task TestSecondLevelCacheUsingAsyncMethodsDoesNotHitTheDatabase(TestCacheProvider cacheProvider)
        {
            await EFServiceProvider.RunInContextAsync(cacheProvider, LogLevel.Debug, false,
                                                      async (context, loggerProvider) =>
            {
                var isActive = true;
                var name     = "Product1";

                var list1 = await context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive == isActive && product.ProductName == name)
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .ToListAsync();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(list1.Any());

                var list2 = await context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive == isActive && product.ProductName == name)
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .ToListAsync();
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(list2.Any());

                var list3 = await context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive == isActive && product.ProductName == name)
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .ToListAsync();
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(list3.Any());

                var list4 = await context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive == isActive && product.ProductName == "Product2")
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .ToListAsync();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsTrue(list4.Any());

                var product1 = await context.Products
                               .OrderBy(product => product.ProductNumber)
                               .Where(product => product.IsActive == isActive && product.ProductName == "Product2")
                               .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                               .FirstOrDefaultAsync();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsNotNull(product1);
            });
        }
Exemplo n.º 19
0
        public void TestIncludeMethodAffectsKeyCache(TestCacheProvider cacheProvider)
        {
            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false, (context, loggerProvider) =>
            {
                var firstProductIncludeTags = context.Products.Include(x => x.TagProducts).ThenInclude(x => x.Tag)
                                              .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                                              .FirstOrDefault();
                Assert.IsNotNull(firstProductIncludeTags);
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());

                var firstProduct = context.Products.Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45)).FirstOrDefault();
                Assert.IsNotNull(firstProduct);
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
            });
        }
Exemplo n.º 20
0
        public static IEFCacheServiceProvider GetCacheServiceProvider(TestCacheProvider provider)
        {
            var services = new ServiceCollection();

            services.AddOptions();
            services.AddLogging(cfg => cfg.AddConsole().AddDebug());

            switch (provider)
            {
            case TestCacheProvider.BuiltInInMemory:
                services.AddEFSecondLevelCache(options => options.UseMemoryCacheProvider());
                break;

            case TestCacheProvider.CacheManagerCoreInMemory:
                services.AddEFSecondLevelCache(options => options.UseCacheManagerCoreProvider());
                addCacheManagerCoreInMemory(services);
                break;

            case TestCacheProvider.CacheManagerCoreRedis:
                services.AddEFSecondLevelCache(options => options.UseCacheManagerCoreProvider());
                addCacheManagerCoreRedis(services);
                break;

            case TestCacheProvider.EasyCachingCoreInMemory:
                const string providerName1 = "InMemory1";
                services.AddEFSecondLevelCache(options => options.UseEasyCachingCoreProvider(providerName1));
                addEasyCachingCoreInMemory(services, providerName1);
                break;

            case TestCacheProvider.EasyCachingCoreRedis:
                const string providerName2 = "Redis1";
                services.AddEFSecondLevelCache(options => options.UseEasyCachingCoreProvider(providerName2));
                addEasyCachingCoreRedis(services, providerName2);
                break;

            case TestCacheProvider.EasyCachingCoreHybrid:
                const string providerName3 = "Hybrid1";
                services.AddEFSecondLevelCache(options => options.UseEasyCachingCoreProvider(providerName3, isHybridCache: true));
                addEasyCachingCoreHybrid(services, providerName3);
                break;
            }

            var serviceProvider = services.BuildServiceProvider();
            var cacheProvider   = serviceProvider.GetRequiredService <IEFCacheServiceProvider>();

            cacheProvider.ClearAllCachedEntries();
            return(cacheProvider);
        }
Exemplo n.º 21
0
        public void TestUsersWithAllDataTypes(TestCacheProvider cacheProvider)
        {
            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false,
                                           (context, loggerProvider) =>
            {
                var items1 = context.Users
                             .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                             .ToList();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsNotNull(items1);

                var items2 = context.Users
                             .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                             .ToList();
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
                Assert.IsNotNull(items2);
            });
        }
        public void TestRemoveTptDataShouldInvalidateTheCacheAutomatically(TestCacheProvider cacheProvider)
        {
            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false,
                                           (context, loggerProvider) =>
            {
                var list1 = context.Posts.OfType <Page>().Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45)).ToList();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());

                var list2 = context.Posts.OfType <Page>().Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45)).ToList();
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());

                var post1   = context.Posts.First(post => post.Id == 1);
                post1.Title = $"Post{RandomNumberProvider.Next()}";
                context.SaveChanges();

                var list3 = context.Posts.OfType <Page>().Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45)).ToList();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
            });
        }
        public virtual void TestInsertingNullValues(TestCacheProvider cacheProvider)
        {
            var cacheService  = EFServiceProvider.GetCacheServiceProvider(cacheProvider);
            var efCachePolicy = new EFCachePolicy().Timeout(TimeSpan.FromMinutes(10)).ExpirationMode(CacheExpirationMode.Absolute);
            var key1          = new EFCacheKey(new HashSet <string> {
                "entity1", "entity2"
            })
            {
                KeyHash = "EF_key1"
            };

            cacheService.InsertValue(
                key1,
                null, efCachePolicy);

            var value1 = cacheService.GetValue(key1, efCachePolicy);

            Assert.IsTrue(value1.IsNull, $"value1 is `{value1}`");
        }
        public async Task TestCacheableWorksWithSPs(TestCacheProvider cacheProvider)
        {
            await EFServiceProvider.RunInContextAsync(cacheProvider, LogLevel.Debug, false, async (context, loggerProvider) =>
            {
                var blogId = 1;
                var blogs  = await context.Set <BlogData>()
                             .FromSqlRaw("usp_GetBlogData {0}", blogId)
                             .Cacheable()
                             .ToListAsync();
                Assert.IsTrue(blogs.Any());
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());

                blogs = await context.Set <BlogData>()
                        .FromSqlRaw("usp_GetBlogData {0}", blogId)
                        .Cacheable()
                        .ToListAsync();
                Assert.IsTrue(blogs.Any());
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
            });
        }
Exemplo n.º 25
0
        public void TestNullValuesWillUseTheCache(TestCacheProvider cacheProvider)
        {
            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false, (context, loggerProvider) =>
            {
                var item1 = context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive && product.ProductName == "Product1xx")
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .FirstOrDefault();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsNull(item1);

                var item2 = context.Products
                            .OrderBy(product => product.ProductNumber)
                            .Where(product => product.IsActive && product.ProductName == "Product1xx")
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .FirstOrDefault();
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
                Assert.IsNull(item2);
            });
        }
Exemplo n.º 26
0
            public void Setup()
            {
                ((Hierarchy)LogManager.GetRepository()).Root.AddAppender(this);
                _logs = new List <LoggingEvent>();

                _cacheProvider = new TestCacheProvider(new XmlReferenceCache(CreateEmptyMetadata()));

                _metadata = new XmlModelMetadata
                {
                    Model = "A", Property = "B", Type = "string"
                };

                var element = XElement.Parse("<A><ResourceReference ref='1'/></A>");

                _step = new ResolveReferenceStep(
                    _cacheProvider, new[]
                {
                    _metadata
                });

                _resourceWorkItem = new ApiLoaderWorkItem("filename", 1, element, 1);
            }
        public void TestCachingByteArrays(TestCacheProvider cacheProvider)
        {
            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false,
                                           (context, loggerProvider) =>
            {
                User user1;
                const string user1Name = "User1";
                var binaryData         = new byte[] { 1, 2, 3 };

                if (!context.Users.Any(user => user.Name == user1Name))
                {
                    user1 = new User {
                        Name = user1Name, ImageData = binaryData
                    };
                    user1 = context.Users.Add(user1).Entity;
                }
                else
                {
                    user1           = context.Users.First(user => user.Name == user1Name);
                    user1.ImageData = binaryData;
                }
                context.SaveChanges();

                var userData = context.Users
                               .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                               .FirstOrDefault(p => p.Id == user1.Id);
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsNotNull(userData);
                CollectionAssert.AreEqual(binaryData, userData.ImageData);

                userData = context.Users
                           .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                           .FirstOrDefault(p => p.Id == user1.Id);
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());
                Assert.IsNotNull(userData);
                CollectionAssert.AreEqual(binaryData, userData.ImageData);
            });
        }
        public async Task TestCacheInvalidationWorksWithSPs(TestCacheProvider cacheProvider)
        {
            await EFServiceProvider.RunInContextAsync(cacheProvider, LogLevel.Debug, false, async (context, loggerProvider) =>
            {
                var blogId = 1;
                var blogs  = await context.Set <BlogData>()
                             .FromSqlRaw("usp_GetBlogData {0}", blogId)
                             .Cacheable()
                             .ToListAsync();
                Assert.IsTrue(blogs.Any());
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());

                blogs = await context.Set <BlogData>()
                        .FromSqlRaw("usp_GetBlogData {0}", blogId)
                        .Cacheable()
                        .ToListAsync();
                Assert.IsTrue(blogs.Any());
                Assert.AreEqual(1, loggerProvider.GetCacheHitCount());

                var product = new Product
                {
                    IsActive      = false,
                    ProductName   = $"Product{RandomNumberProvider.Next()}",
                    ProductNumber = RandomNumberProvider.Next().ToString(),
                    Notes         = "Notes ...",
                    UserId        = 1
                };
                context.Products.Add(product);
                await context.SaveChangesAsync();

                blogs = await context.Set <BlogData>()
                        .FromSqlRaw("usp_GetBlogData {0}", blogId)
                        .Cacheable()
                        .ToListAsync();
                Assert.IsTrue(blogs.Any());
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
            });
        }
Exemplo n.º 29
0
        public void PerformanceTest(TestCacheProvider cacheProvider)
        {
            const decimal loopCount = 1000;

            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Warning, false, (context, debugLoggerProvider) =>
            {
                Stopwatch watch = new Stopwatch();
                watch.Start();

                // run normal queries
                for (int i = 0; i < loopCount; i++)
                {
                    var result = context.Posts.Where(post => post.Id >= 0).Take(100).ToList();
                }

                var uncachedTimeSpan = watch.Elapsed;

                // cache the query result
                var posts = context.Posts.Where(post => post.Id >= 0).Take(100).Cacheable().ToList();

                watch.Restart();

                // run cached queries
                for (int i = 0; i < loopCount; i++)
                {
                    var result = context.Posts.Where(post => post.Id >= 0).Take(100).Cacheable().ToList();
                }

                var cachedTimeSpan = watch.Elapsed;

                var message = $"Average database query duration [+{TimeSpan.FromTicks((long)(uncachedTimeSpan.Ticks / loopCount))}].\n" +
                              $"Average cache query duration [+{TimeSpan.FromTicks((long)(cachedTimeSpan.Ticks / loopCount))}].\n" +
                              $"Cached queries are x{(uncachedTimeSpan.Ticks / (decimal)cachedTimeSpan.Ticks) - 1:N2} times faster.";

                Assert.IsTrue(uncachedTimeSpan > cachedTimeSpan, message);
            });
        }
Exemplo n.º 30
0
        public void Test2DifferentCollectionsWillNotUseTheCache(TestCacheProvider cacheProvider)
        {
            EFServiceProvider.RunInContext(cacheProvider, LogLevel.Debug, false,
                                           (context, loggerProvider) =>
            {
                var collection1 = new[] { 1, 2, 3 };

                var item1 = context.Products
                            .Where(product => collection1.Contains(product.ProductId))
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .FirstOrDefault();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsNotNull(item1);

                var collection2 = new[] { 1, 2, 3, 4 };

                var item2 = context.Products
                            .Where(product => collection2.Contains(product.ProductId))
                            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(45))
                            .FirstOrDefault();
                Assert.AreEqual(0, loggerProvider.GetCacheHitCount());
                Assert.IsNotNull(item2);
            });
        }