public void GetOrAddWithCacheHitTest()
        {
            // Arrange
            // Arrange
            var invocationCount = 0;
            Func<int, string> valueFactory = k =>
                {
                    invocationCount++;
                    return Convert.ToString(k);
                };
            var cache = new LockOnWriteCache<int, string>();

            // Act
            cache.GetOrAdd(1, valueFactory);

            var value = cache.GetOrAdd(1, valueFactory);

            // Assert
            Assert.That(value, Is.EqualTo("1"));
            Assert.That(invocationCount, Is.EqualTo(1));
        }
Example #2
0
        public void GetOrAddWithCacheHitTest()
        {
            // Arrange
            // Arrange
            var invocationCount             = 0;
            Func <int, string> valueFactory = k =>
            {
                invocationCount++;
                return(Convert.ToString(k));
            };
            var cache = new LockOnWriteCache <int, string>();

            // Act
            cache.GetOrAdd(1, valueFactory);

            var value = cache.GetOrAdd(1, valueFactory);

            // Assert
            Assert.That(value, Is.EqualTo("1"));
            Assert.That(invocationCount, Is.EqualTo(1));
        }
        public void GetOrAddWithoutCacheHitAndConcurrencyTest()
        {
            // Arrange
            var monitor = new Object();
            var invocationCount = 0;
            Func<int, string> valueFactory = k =>
                {
                    lock (monitor)
                    {
                        Monitor.Wait(monitor);
                    }

                    invocationCount++;
                    return Convert.ToString(k);
                };
            var cache = new LockOnWriteCache<int, string>();

            // Act
            var firstTask = Task.Factory.StartNew(() => cache.GetOrAdd(1, valueFactory));
            var secondTask = Task.Factory.StartNew(() => cache.GetOrAdd(1, valueFactory));

            firstTask.Wait(500);
            secondTask.Wait(500);

            Assert.That(firstTask.IsCompleted, Is.False);
            Assert.That(secondTask.IsCompleted, Is.False);

            lock (monitor)
            {
                Monitor.Pulse(monitor);
            }

            Task.WaitAll(firstTask, secondTask);

            // Assert
            Assert.That(firstTask.Result, Is.EqualTo("1"));
            Assert.That(secondTask.Result, Is.EqualTo("1"));
            Assert.That(invocationCount, Is.EqualTo(1));
        }
Example #4
0
        public void GetOrAddWithoutCacheHitAndConcurrencyTest()
        {
            // Arrange
            var monitor                     = new Object();
            var invocationCount             = 0;
            Func <int, string> valueFactory = k =>
            {
                lock (monitor)
                {
                    Monitor.Wait(monitor);
                }

                invocationCount++;
                return(Convert.ToString(k));
            };
            var cache = new LockOnWriteCache <int, string>();

            // Act
            var firstTask  = Task.Factory.StartNew(() => cache.GetOrAdd(1, valueFactory));
            var secondTask = Task.Factory.StartNew(() => cache.GetOrAdd(1, valueFactory));

            firstTask.Wait(500);
            secondTask.Wait(500);

            Assert.That(firstTask.IsCompleted, Is.False);
            Assert.That(secondTask.IsCompleted, Is.False);

            lock (monitor)
            {
                Monitor.Pulse(monitor);
            }

            Task.WaitAll(firstTask, secondTask);

            // Assert
            Assert.That(firstTask.Result, Is.EqualTo("1"));
            Assert.That(secondTask.Result, Is.EqualTo("1"));
            Assert.That(invocationCount, Is.EqualTo(1));
        }
Example #5
0
        /// <inheritdoc/>
        public IProxyTemplate GetProxyTemplate(Type declaringType, IEnumerable <Type> interfaceTypes)
        {
            if (declaringType == null)
            {
                throw new ArgumentNullException("declaringType");
            }

            //if (interfaceTypes == null)
            //    throw new ArgumentNullException("interfaceTypes");

            // Create proxy definition.
            var proxyDefinition = CreateProxyDefinition(declaringType, interfaceTypes);

            // Get or generate proxy template.
            return(_proxyTemplateCache.GetOrAdd(proxyDefinition, GenerateProxyTemplate));
        }