示例#1
0
        public void Multiple_contexts_running_concurrently_can_log_command_trees_except_trees_for_cached_queries()
        {
            // Make sure no logs get initialization trees
            using (var context = new BlogContextAllTrees())
            {
                ExtendedSqlAzureExecutionStrategy.ExecuteNew(
                    () =>
                {
                    context.Database.Initialize(force: false);
                });
            }

            // Run the test code once to log both update and query trees
            using (var context = new BlogContextAllTrees())
            {
                var logger = new CommandTreeLogger(context);
                DbInterception.Add(logger);

                try
                {
                    BlogContext.DoStuff(context);
                }
                finally
                {
                    DbInterception.Remove(logger);
                }

#if NET40
                Assert.Equal(7, logger.Log.Count);
#else
                Assert.Equal(8, logger.Log.Count);
#endif

                Assert.True(logger.Log.OfType <DbQueryCommandTree>().Any(t => t.DataSpace == DataSpace.CSpace));
                Assert.True(logger.Log.OfType <DbInsertCommandTree>().Any(t => t.DataSpace == DataSpace.SSpace));
#if !NET40
                Assert.True(logger.Log.OfType <DbUpdateCommandTree>().Any(t => t.DataSpace == DataSpace.SSpace));
#endif
            }

            // Now run again multiple times concurrently--only update trees logged
            var loggers = new ConcurrentBag <CommandTreeLogger>();

            const int executionCount = 5;
            ExecuteInParallel(
                () =>
            {
                using (var context = new BlogContextAllTrees())
                {
                    var logger = new CommandTreeLogger(context);
                    DbInterception.Add(logger);
                    loggers.Add(logger);

                    try
                    {
                        BlogContext.DoStuff(context);
                    }
                    finally
                    {
                        DbInterception.Remove(logger);
                    }
                }
            }, executionCount);

            Assert.Equal(executionCount, loggers.Count);

            foreach (var logger in loggers)
            {
#if NET40
                Assert.Equal(1, logger.Log.Count);
#else
                Assert.Equal(2, logger.Log.Count);
#endif

                Assert.False(logger.Log.OfType <DbQueryCommandTree>().Any(t => t.DataSpace == DataSpace.CSpace));
                Assert.True(logger.Log.OfType <DbInsertCommandTree>().Any(t => t.DataSpace == DataSpace.SSpace));
#if !NET40
                Assert.True(logger.Log.OfType <DbUpdateCommandTree>().Any(t => t.DataSpace == DataSpace.SSpace));
#endif
            }
        }
        public void Multiple_contexts_running_concurrently_can_log_command_trees_except_trees_for_cached_queries()
        {
            // Make sure no logs get initialization trees
            using (var context = new BlogContextAllTrees())
            {
                ExtendedSqlAzureExecutionStrategy.ExecuteNew(
                    () =>
                    {
                        context.Database.Initialize(force: false);
                    });
            }

            // Run the test code once to log both update and query trees
            using (var context = new BlogContextAllTrees())
            {
                var logger = new CommandTreeLogger(context);
                DbInterception.Add(logger);

                try
                {
                    BlogContext.DoStuff(context);
                }
                finally
                {
                    DbInterception.Remove(logger);
                }

#if NET40
                Assert.Equal(7, logger.Log.Count);
#else
                Assert.Equal(8, logger.Log.Count);
#endif

                Assert.True(logger.Log.OfType<DbQueryCommandTree>().Any(t => t.DataSpace == DataSpace.CSpace));
                Assert.True(logger.Log.OfType<DbInsertCommandTree>().Any(t => t.DataSpace == DataSpace.SSpace));
#if !NET40
                Assert.True(logger.Log.OfType<DbUpdateCommandTree>().Any(t => t.DataSpace == DataSpace.SSpace));
#endif
            }

            // Now run again multiple times concurrently--only update trees logged
            var loggers = new ConcurrentBag<CommandTreeLogger>();

            const int executionCount = 5;
            ExecuteInParallel(
                () =>
                    {
                        using (var context = new BlogContextAllTrees())
                        {
                            var logger = new CommandTreeLogger(context);
                            DbInterception.Add(logger);
                            loggers.Add(logger);

                            try
                            {
                                BlogContext.DoStuff(context);
                            }
                            finally
                            {
                                DbInterception.Remove(logger);
                            }
                        }
                    }, executionCount);

            Assert.Equal(executionCount, loggers.Count);

            foreach (var logger in loggers)
            {
#if NET40
                Assert.Equal(1, logger.Log.Count);
#else
                Assert.Equal(2, logger.Log.Count);
#endif

                Assert.False(logger.Log.OfType<DbQueryCommandTree>().Any(t => t.DataSpace == DataSpace.CSpace));
                Assert.True(logger.Log.OfType<DbInsertCommandTree>().Any(t => t.DataSpace == DataSpace.SSpace));
#if !NET40
                Assert.True(logger.Log.OfType<DbUpdateCommandTree>().Any(t => t.DataSpace == DataSpace.SSpace));
#endif
            }
        }