public void MicroStressTest() { // Run a bunch of concurrent reads and writes, make sure we get no exceptions var imc = new EntityFrameworkCache(100); const int NumberOfRequestBatches = 50; // will be multiplied by 5 (3 readers + 1 writer + 1 invalidator) const int NumberOfIterationsPerThread = 100; var startEvent = new ManualResetEvent(false); Action writer = () => { startEvent.WaitOne(); var random = new Random(); for (var i = 0; i < NumberOfIterationsPerThread; ++i) { var randomKey = Guid.NewGuid().ToString("N").Substring(0, 4); var randomValue = randomKey + "_V"; var dependentSets = new List<string>(); var numberOfDependencies = random.Next(5); for (var j = 0; j < numberOfDependencies; ++j) { var randomSetName = new string((char)('A' + random.Next(26)), 1); dependentSets.Add(randomSetName); } imc.PutItem(randomKey, randomValue, dependentSets, TimeSpan.Zero, DateTime.MaxValue); } }; Action invalidator = () => { startEvent.WaitOne(); var random = new Random(); for (var i = 0; i < NumberOfIterationsPerThread; ++i) { var dependentSets = new List<string>(); var numberOfDependencies = random.Next(5); for (var j = 0; j < numberOfDependencies; ++j) { var randomSetName = new string((char)('A' + random.Next(26)), 1); dependentSets.Add(randomSetName); } imc.InvalidateSets(dependentSets); } }; Action reader = () => { startEvent.WaitOne(); for (var i = 0; i < NumberOfIterationsPerThread; ++i) { var randomKey = Guid.NewGuid().ToString("N").Substring(0, 4); object value; if (imc.GetItem(randomKey, out value)) { Assert.AreEqual(randomKey + "_V", value); } } }; var threads = new List<Thread>(); for (var i = 0; i < NumberOfRequestBatches; ++i) { threads.Add(new Thread(() => writer())); threads.Add(new Thread(() => invalidator())); threads.Add(new Thread(() => reader())); threads.Add(new Thread(() => reader())); threads.Add(new Thread(() => reader())); } foreach (var t in threads) { t.Start(); } startEvent.Set(); foreach (var t in threads) { t.Join(); } }
public void DependenciesTest4() { var imc = new EntityFrameworkCache(); imc.PutItem("A", "A1", new[] { "set1" }, TimeSpan.Zero, DateTime.MaxValue); imc.PutItem("B", "B1", new[] { "set1", "set2" }, TimeSpan.Zero, DateTime.MaxValue); imc.PutItem("C", "C1", new[] { "set2", "set3" }, TimeSpan.Zero, DateTime.MaxValue); imc.PutItem("D", "D1", new[] { "set3", "set1" }, TimeSpan.Zero, DateTime.MaxValue); Assert.AreEqual("D|C|B|A", GetItemKeysInLruOrder(imc)); imc.PutItem("B", "C1", new[] { "set3" }, TimeSpan.Zero, DateTime.MaxValue); Assert.AreEqual("B|D|C|A", GetItemKeysInLruOrder(imc)); imc.InvalidateSets(new[] { "set3" }); Assert.AreEqual("A", GetItemKeysInLruOrder(imc)); }