Exemple #1
0
        public void Test_Cached( )
        {
            CachingQueryRunner   cachingQueryRunner;
            Mock <IQueryRunner>  mockQueryRunner;
            IQueryRunner         queryRunner;
            StructuredQuery      structuredQuery;
            QuerySettings        settings;
            QueryBuild           queryBuild;
            QueryResult          result;
            IQuerySqlBuilder     queryBuilder        = MockQuerySqlBuilder( );
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            structuredQuery = new StructuredQuery( );
            settings        = new QuerySettings( );
            queryBuild      = new QueryBuild( );
            result          = new QueryResult(queryBuild);

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            mockQueryRunner.Setup(x => x.ExecutePrebuiltQuery(structuredQuery, settings, It.IsNotNull <QueryBuild>()))
            .Returns(() =>
            {
                return(result);
            })
            .Verifiable( );
            queryRunner        = mockQueryRunner.Object;
            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);

            Assert.That(cachingQueryRunner.ExecuteQuery(structuredQuery, settings),
                        Is.SameAs(result));
            Assert.That(cachingQueryRunner.Cache,
                        Has.Count.EqualTo(1));

            mockQueryRunner.Verify(x => x.ExecutePrebuiltQuery(structuredQuery, settings, It.IsNotNull <QueryBuild>( )), Times.Exactly(1));
            mockQueryRunner.VerifyAll( );
        }
Exemple #2
0
        public void Test_EnsureResultsFromDifferentInstancesReturnCorrectRequestColumnData( )
        {
            CachingQueryRunner   cachingQueryRunner;
            Mock <IQueryRunner>  mockQueryRunner;
            IQueryRunner         queryRunner;
            QuerySettings        settings;
            QueryBuild           queryBuild;
            QueryResult          result;
            IQuerySqlBuilder     queryBuilder        = MockQuerySqlBuilder( );
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            StructuredQuery sq1 = new StructuredQuery {
                RootEntity = new ResourceEntity("test:person")
            };

            sq1.SelectColumns.Add(new SelectColumn {
                Expression = new ResourceExpression(sq1.RootEntity, "core:name")
            });

            StructuredQuery sq2 = new StructuredQuery {
                RootEntity = new ResourceEntity("test:person")
            };

            sq2.SelectColumns.Add(new SelectColumn {
                Expression = new ResourceExpression(sq2.RootEntity, "core:name")
            });

            Assert.That(sq1.SelectColumns [0].ColumnId, Is.Not.EqualTo(sq2.SelectColumns [0].ColumnId));

            settings   = new QuerySettings( );
            queryBuild = new QueryBuild( );
            result     = new QueryResult(queryBuild);
            result.Columns.Add(new ResultColumn {
                RequestColumn = sq1.SelectColumns [0]
            });

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            mockQueryRunner.Setup(x => x.ExecutePrebuiltQuery(sq1, settings, It.IsNotNull <QueryBuild>( )))
            .Returns(() => result)
            .Verifiable( );
            queryRunner        = mockQueryRunner.Object;
            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);

            QueryResult result1 = cachingQueryRunner.ExecuteQuery(sq1, settings);

            Assert.That(result1.Columns [0].RequestColumn, Is.EqualTo(sq1.SelectColumns [0]));

            QueryResult result2 = cachingQueryRunner.ExecuteQuery(sq2, settings);

            Assert.That(result2.Columns [0].RequestColumn, Is.EqualTo(sq2.SelectColumns [0]));

            mockQueryRunner.Verify(x => x.ExecutePrebuiltQuery(sq1, settings, It.IsNotNull <QueryBuild>( )), Times.Exactly(1));
            mockQueryRunner.VerifyAll( );
        }
Exemple #3
0
        [Ignore]        // Blocking layer has been disabled for this cache.
        public void Test_EnsureCached_TwoThreads(bool resultIsUserSpecific, bool runAsDifferentUser, bool expectedToCache)
        {
            CachingQueryRunner      cachingQueryRunner;
            Mock <IQuerySqlBuilder> mockQuerySqlBuilder;
            Mock <IQueryRunner>     mockQueryRunner;
            IQueryRunner            queryRunner;
            StructuredQuery         structuredQuery;
            QuerySettings           settings1;
            QuerySettings           settings2;
            QueryBuild           queryBuild;
            QueryResult          result;
            IQuerySqlBuilder     queryBuilder;
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            structuredQuery     = new StructuredQuery( );
            settings1           = new QuerySettings( );
            settings1.RunAsUser = 1;
            settings2           = new QuerySettings( );
            settings2.RunAsUser = runAsDifferentUser ? 2 : 1;
            queryBuild          = new QueryBuild( );
            result = new QueryResult(queryBuild);
            queryBuild.DataReliesOnCurrentUser = resultIsUserSpecific;

            mockQuerySqlBuilder = new Mock <IQuerySqlBuilder>(MockBehavior.Strict);
            mockQuerySqlBuilder.Setup(x => x.BuildSql(It.IsAny <StructuredQuery>( ), It.IsNotNull <QuerySqlBuilderSettings>( ))).Returns(queryBuild);
            queryBuilder = mockQuerySqlBuilder.Object;

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            mockQueryRunner.Setup(x => x.ExecutePrebuiltQuery(structuredQuery, It.IsNotNull <QuerySettings>(), It.IsNotNull <QueryBuild>( )))
            .Returns(() =>
            {
                Thread.Sleep(100);
                return(result);
            })
            .Verifiable( );
            queryRunner        = mockQueryRunner.Object;
            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);

            Task task1 = Task.Factory.StartNew(() => cachingQueryRunner.ExecuteQuery(structuredQuery, settings1));

            Thread.Sleep(1);   // BlockIfPending can handle overlapping, but no coincident requests
            Task task2 = Task.Factory.StartNew(() => cachingQueryRunner.ExecuteQuery(structuredQuery, settings2));

            Task.WaitAll(task1, task2);

            int calls = expectedToCache ? 1 : 2;

            mockQueryRunner.Verify(x => x.ExecutePrebuiltQuery(structuredQuery, It.IsNotNull <QuerySettings>(), It.IsNotNull <QueryBuild>( )), Times.Exactly(calls));
            mockQueryRunner.VerifyAll( );
        }
Exemple #4
0
        public void TestSetup( )
        {
            CachingQueryRunner   cachingQueryRunner;
            Mock <IQueryRunner>  mockQueryRunner;
            IQueryRunner         queryRunner;
            IQuerySqlBuilder     queryBuilder        = MockQuerySqlBuilder( );
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            queryRunner     = mockQueryRunner.Object;

            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);

            cachingQueryRunner.Clear( );
        }
Exemple #5
0
        public void QueryRunner( )
        {
            IQueryRunner instance = Factory.QueryRunner;

            Assert.That(instance, Is.TypeOf <CachingQueryRunner>( ));

            CachingQueryRunner cachingRunner = ( CachingQueryRunner )instance;

            Assert.That(cachingRunner.QueryRunner, Is.TypeOf <QueryRunner>( ));

            QueryRunner runner = ( QueryRunner )cachingRunner.QueryRunner;

            Assert.That(runner.QuerySqlBuilder, Is.TypeOf <CachingQuerySqlBuilder>( ));
            Assert.That(runner.DatabaseProvider, Is.TypeOf <DatabaseProvider>( ));
        }
Exemple #6
0
        public void Test_EnsureCached(bool resultIsUserSpecific, bool runAsDifferentUser, bool expectedToCache)
        {
            CachingQueryRunner      cachingQueryRunner;
            Mock <IQuerySqlBuilder> mockQuerySqlBuilder;
            Mock <IQueryRunner>     mockQueryRunner;
            IQueryRunner            queryRunner;
            StructuredQuery         structuredQuery;
            QuerySettings           settings;
            QueryBuild           queryBuild;
            QueryResult          result;
            IQuerySqlBuilder     queryBuilder;
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            structuredQuery    = new StructuredQuery( );
            settings           = new QuerySettings( );
            settings.RunAsUser = 1;
            queryBuild         = new QueryBuild( );
            result             = new QueryResult(queryBuild);
            queryBuild.DataReliesOnCurrentUser = resultIsUserSpecific;

            mockQuerySqlBuilder = new Mock <IQuerySqlBuilder>(MockBehavior.Strict);
            mockQuerySqlBuilder.Setup(x => x.BuildSql(It.IsAny <StructuredQuery>( ), It.IsNotNull <QuerySqlBuilderSettings>( ))).Returns(queryBuild);
            queryBuilder = mockQuerySqlBuilder.Object;

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            mockQueryRunner.Setup(x => x.ExecutePrebuiltQuery(structuredQuery, settings, It.IsNotNull <QueryBuild>( )))
            .Returns(() => result)
            .Verifiable( );
            queryRunner        = mockQueryRunner.Object;
            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);

            cachingQueryRunner.ExecuteQuery(structuredQuery, settings);
            if (runAsDifferentUser)
            {
                settings.RunAsUser = 2;
            }
            cachingQueryRunner.ExecuteQuery(structuredQuery, settings);

            int calls = expectedToCache ? 1 : 2;

            mockQueryRunner.Verify(x => x.ExecutePrebuiltQuery(structuredQuery, settings, It.IsNotNull <QueryBuild>( )), Times.Exactly(calls));
            mockQueryRunner.VerifyAll( );
        }
Exemple #7
0
        public void Test_EnsureDifferentInstancesCanCacheMatch( )
        {
            CachingQueryRunner   cachingQueryRunner;
            Mock <IQueryRunner>  mockQueryRunner;
            IQueryRunner         queryRunner;
            QuerySettings        settings;
            QueryBuild           queryBuild;
            QueryResult          result;
            IQuerySqlBuilder     queryBuilder        = MockQuerySqlBuilder( );
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            StructuredQuery sq1 = ReportHelpers.BuildFilterQuery("Name='test1'", new EntityRef("test:person"), true);

            sq1.SelectColumns.Add(new SelectColumn {
                Expression = new ResourceExpression(sq1.RootEntity, "core:name")
            });

            StructuredQuery sq2 = ReportHelpers.BuildFilterQuery("Name='test1'", new EntityRef("test:person"), true);

            sq2.SelectColumns.Add(new SelectColumn {
                Expression = new ResourceExpression(sq2.RootEntity, "core:name")
            });

            settings   = new QuerySettings( );
            queryBuild = new QueryBuild( );
            result     = new QueryResult(queryBuild);

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            mockQueryRunner.Setup(x => x.ExecutePrebuiltQuery(sq1, settings, It.IsNotNull <QueryBuild>( )))
            .Returns(() => result)
            .Verifiable( );
            queryRunner        = mockQueryRunner.Object;
            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);

            cachingQueryRunner.ExecuteQuery(sq1, settings);
            cachingQueryRunner.ExecuteQuery(sq2, settings);

            mockQueryRunner.Verify(x => x.ExecutePrebuiltQuery(sq1, settings, It.IsNotNull <QueryBuild>( )), Times.Exactly(1));
            mockQueryRunner.VerifyAll( );
        }
Exemple #8
0
        public void Test_Ctor( )
        {
            CachingQueryRunner   cachingQueryRunner;
            Mock <IQueryRunner>  mockQueryRunner;
            IQueryRunner         queryRunner;
            IQuerySqlBuilder     queryBuilder        = MockQuerySqlBuilder( );
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            queryRunner     = mockQueryRunner.Object;

            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);
            Assert.That(cachingQueryRunner,
                        Has.Property("QueryRunner").SameAs(queryRunner));
            Assert.That(cachingQueryRunner,
                        Has.Property("UserRuleSetProvider").SameAs(userRuleSetProvider));
            Assert.That(cachingQueryRunner,
                        Has.Property("Cache").Not.Null
                        .And.Property("Cache").Count.EqualTo(0));
            Assert.That(cachingQueryRunner.CacheInvalidator, Is.Not.Null);

            mockQueryRunner.VerifyAll( );
        }
Exemple #9
0
        internal static void Test_Scenario(StructuredQuery structuredQuery, Action invalidationCallback, bool expectInvalidation)
        {
            CachingQueryRunner      cachingQueryRunner;
            Mock <IQuerySqlBuilder> mockQuerySqlBuilder;
            Mock <IQueryRunner>     mockQueryRunner;
            IQueryRunner            queryRunner;
            QuerySettings           settings;
            QueryResult             result;
            QueryBuild           prebuiltQuery;
            IQuerySqlBuilder     queryBuilder;
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            settings      = new QuerySettings( );
            prebuiltQuery = new QueryBuild( );
            result        = new QueryResult(prebuiltQuery);

            var cacheInvalidators = new CacheInvalidatorFactory( ).CacheInvalidatorsList_TestOnly;

            mockQuerySqlBuilder = new Mock <IQuerySqlBuilder>(MockBehavior.Loose);
            mockQuerySqlBuilder.Setup(x => x.BuildSql(It.IsAny <StructuredQuery>( ), It.IsNotNull <QuerySqlBuilderSettings>( ))).Returns(prebuiltQuery);
            queryBuilder = mockQuerySqlBuilder.Object;

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            mockQueryRunner.Setup(x => x.ExecutePrebuiltQuery(It.IsAny <StructuredQuery>( ), settings, prebuiltQuery))
            .Returns <StructuredQuery, QuerySettings, QueryBuild>((sq, qs, pbq) =>
            {
                QueryRunner.IdentifyCacheDependencies(sq, settings);
                return(result);
            })
            .Verifiable( );
            queryRunner = mockQueryRunner.Object;

            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);

            try
            {
                // Add current cache invalidator to global factory
                cacheInvalidators.Add(cachingQueryRunner.CacheInvalidator);

                using (var scope = Factory.Current.BeginLifetimeScope(cb =>
                {
                    cb.Register(c => cachingQueryRunner).As <ICacheService>( );
                }))
                    using (Factory.SetCurrentScope(scope))
                    {
                        // Run first time
                        cachingQueryRunner.ExecuteQuery(structuredQuery.DeepCopy( ), settings);

                        // Perform potential invalidation task
                        using (new SecurityBypassContext( ))
                        {
                            invalidationCallback( );
                        }

                        // Run second time
                        cachingQueryRunner.ExecuteQuery(structuredQuery.DeepCopy( ), settings);
                    }

                int times = expectInvalidation ? 2 : 1;
                mockQueryRunner.Verify(x => x.ExecutePrebuiltQuery(It.IsAny <StructuredQuery>( ), settings, It.IsAny <QueryBuild>( )), Times.Exactly(times));
                mockQueryRunner.VerifyAll( );
            }
            finally
            {
                // Restore cache invalidators
                cacheInvalidators.Remove(cachingQueryRunner.CacheInvalidator);
            }
        }