コード例 #1
0
        public void RepositoryStart_DataProviderExtensions_OverrideDefault()
        {
            var dbProvider         = new InMemoryDataProvider();
            var securityDbProvider = new MemoryDataProvider(DatabaseStorage.CreateEmpty());
            var searchEngine       = new InMemorySearchEngine(GetInitialIndex());
            var accessProvider     = new DesktopAccessProvider();
            var emvrProvider       = new ElevatedModificationVisibilityRule();

            // switch this ON here for testing purposes (to check that repo start does not override it)
            SnTrace.Custom.Enabled = true;

            // switch this ON here for testing purposes (to check that repo start does not override it)
            SnTrace.Custom.Enabled = true;

            var repoBuilder = new RepositoryBuilder()
                              .UseAccessProvider(new DesktopAccessProvider())
                              .UseDataProvider(dbProvider)
                              .UseInitialData(GetInitialData())
                              .UseBlobMetaDataProvider(new InMemoryBlobStorageMetaDataProvider(dbProvider))
                              .UseBlobProviderSelector(new InMemoryBlobProviderSelector())
                              .UseAccessTokenDataProviderExtension(new TestAccessTokenDataProvider()) // ACTION: set test provider
                              .UseSecurityDataProvider(securityDbProvider)
                              .UseSearchEngine(searchEngine)
                              .UseAccessProvider(accessProvider)
                              .UseElevatedModificationVisibilityRuleProvider(emvrProvider)
                              .StartIndexingEngine(false)
                              .StartWorkflowEngine(false)
                              .UseTraceCategories("Test", "Web", "System");

            using (Repository.Start(repoBuilder))
            {
                Assert.AreEqual(typeof(TestAccessTokenDataProvider), DataStore.GetDataProviderExtension <IAccessTokenDataProviderExtension>().GetType());
            }
        }
コード例 #2
0
        public void Test1()
        {
            var searchEngine = new InMemorySearchEngine();

            var page = searchEngine.SearchAsync("aaa", 1, 10).Result;

            var enumerator = page.GetEnumerator();

            var current = enumerator.Current;

            while (enumerator.MoveNext(cancellationToken: CancellationToken.None).Result)
            {
                current = enumerator.Current;
            }
        }
コード例 #3
0
        public void RepositoryStart_NamedProviders()
        {
            var dbProvider         = new InMemoryDataProvider();
            var securityDbProvider = new MemoryDataProvider(DatabaseStorage.CreateEmpty());
            var searchEngine       = new InMemorySearchEngine(GetInitialIndex());
            var accessProvider     = new DesktopAccessProvider();
            var emvrProvider       = new ElevatedModificationVisibilityRule();

            // switch this ON here for testing purposes (to check that repo start does not override it)
            SnTrace.Custom.Enabled = true;

            var repoBuilder = new RepositoryBuilder()
                              .UseAccessProvider(new DesktopAccessProvider())
                              .UseDataProvider(dbProvider)
                              .UseInitialData(GetInitialData())
                              .UseBlobMetaDataProvider(new InMemoryBlobStorageMetaDataProvider(dbProvider))
                              .UseBlobProviderSelector(new InMemoryBlobProviderSelector())
                              .AddBlobProvider(new InMemoryBlobProvider())
                              .UseSecurityDataProvider(securityDbProvider)
                              .UseSecurityMessageProvider(new DefaultMessageProvider(new MessageSenderManager()))
                              .UseSearchEngine(searchEngine)
                              .UseAccessProvider(accessProvider)
                              .UseElevatedModificationVisibilityRuleProvider(emvrProvider)
                              .StartIndexingEngine(false)
                              .StartWorkflowEngine(false)
                              .UseTraceCategories("Test", "Web", "System");

            using (Repository.Start(repoBuilder))
            {
                Assert.AreSame(dbProvider, Providers.Instance.DataStore.DataProvider);
                Assert.AreEqual(searchEngine, SearchManager.SearchEngine);
                Assert.AreEqual(accessProvider, AccessProvider.Current);
                Assert.AreEqual(emvrProvider, Providers.Instance.ElevatedModificationVisibilityRuleProvider);

                // Currently this does not work, because the property below re-creates the security
                // db provider from the prototype, so it cannot be ref equal with the original.
                // Assert.AreEqual(securityDbProvider, SecurityHandler.SecurityContext.DataProvider);
                Assert.AreEqual(securityDbProvider, Providers.Instance.SecurityDataProvider);

                // Check a few trace categories that were switched ON above.
                Assert.IsTrue(SnTrace.Custom.Enabled);
                Assert.IsTrue(SnTrace.Test.Enabled);
                Assert.IsTrue(SnTrace.Web.Enabled);
                Assert.IsTrue(SnTrace.System.Enabled);
                Assert.IsFalse(SnTrace.TaskManagement.Enabled);
                Assert.IsFalse(SnTrace.Workflow.Enabled);
            }
        }
コード例 #4
0
        public void RepositoryStart_AuditEventWriter_Database()
        {
            var originalWriter = SnLog.AuditEventWriter;
            var auditWriter    = new DatabaseAuditEventWriter();

            var dbProvider         = new InMemoryDataProvider();
            var securityDbProvider = new MemoryDataProvider(DatabaseStorage.CreateEmpty());
            var searchEngine       = new InMemorySearchEngine(GetInitialIndex());
            var accessProvider     = new DesktopAccessProvider();
            var emvrProvider       = new ElevatedModificationVisibilityRule();

            try
            {
                // Clear the slot to ensure a real test.
                Providers.Instance.AuditEventWriter = null;

                var repoBuilder = new RepositoryBuilder()
                                  .UseAccessProvider(new DesktopAccessProvider())
                                  .UseDataProvider(dbProvider)
                                  .UseAuditEventWriter(auditWriter) // <-- The important line
                                  .UseInitialData(GetInitialData())
                                  .UseBlobMetaDataProvider(new InMemoryBlobStorageMetaDataProvider(dbProvider))
                                  .UseBlobProviderSelector(new InMemoryBlobProviderSelector())
                                  .AddBlobProvider(new InMemoryBlobProvider())
                                  .UseSecurityDataProvider(securityDbProvider)
                                  .UseSecurityMessageProvider(new DefaultMessageProvider(new MessageSenderManager()))
                                  .UseSearchEngine(searchEngine)
                                  .UseAccessProvider(accessProvider)
                                  .UseElevatedModificationVisibilityRuleProvider(emvrProvider)
                                  .StartIndexingEngine(false)
                                  .StartWorkflowEngine(false)
                                  .UseTraceCategories("Test", "Web", "System");

                using (Repository.Start(repoBuilder))
                {
                    Assert.AreSame(auditWriter, Providers.Instance.AuditEventWriter);
                    Assert.AreSame(auditWriter, SnLog.AuditEventWriter);
                }
            }
            finally
            {
                SnLog.AuditEventWriter = originalWriter;
            }
        }
コード例 #5
0
        public void RepositoryStart_NullPopulator()
        {
            var dbProvider2 = new InMemoryDataProvider();

            Providers.Instance.DataProvider = dbProvider2;
            var securityDbProvider = new MemoryDataProvider(DatabaseStorage.CreateEmpty());
            var searchEngine       = new InMemorySearchEngine(GetInitialIndex());
            var accessProvider     = new DesktopAccessProvider();
            var emvrProvider       = new ElevatedModificationVisibilityRule();

            var repoBuilder = new RepositoryBuilder()
                              .UseAccessProvider(new DesktopAccessProvider())
                              .UseDataProvider(dbProvider2)
                              .UseInitialData(GetInitialData())
                              .UseBlobMetaDataProvider(new InMemoryBlobStorageMetaDataProvider(dbProvider2))
                              .UseBlobProviderSelector(new InMemoryBlobProviderSelector())
                              .AddBlobProvider(new InMemoryBlobProvider())
                              .UseSecurityDataProvider(securityDbProvider)
                              .UseSecurityMessageProvider(new DefaultMessageProvider(new MessageSenderManager()))
                              .UseSearchEngine(searchEngine)
                              .UseAccessProvider(accessProvider)
                              .UseElevatedModificationVisibilityRuleProvider(emvrProvider)
                              .StartIndexingEngine(false)
                              .StartWorkflowEngine(false)
                              .UseTraceCategories("Test", "Web", "System");

            var originalIsOuterSearchEngineEnabled = Indexing.IsOuterSearchEngineEnabled;

            Indexing.IsOuterSearchEngineEnabled = false;
            try
            {
                using (Repository.Start(repoBuilder))
                {
                    Assert.IsFalse(SearchManager.IsOuterEngineEnabled);
                    Assert.AreEqual(typeof(InternalSearchEngine), SearchManager.SearchEngine.GetType());
                    var populator = SearchManager.GetIndexPopulator();
                    Assert.AreEqual(typeof(NullPopulator), populator.GetType());
                }
            }
            finally
            {
                Indexing.IsOuterSearchEngineEnabled = originalIsOuterSearchEngineEnabled;
            }
        }
コード例 #6
0
        public void RepositoryStart_IndexAnalyzers()
        {
            var searchEngineImpl = new InMemorySearchEngine(GetInitialIndex());

            Test(repoBuilder =>
            {
                repoBuilder.UseSearchEngine(searchEngineImpl);
            }, () =>
            {
                var searchEngine = Providers.Instance.SearchEngine;

                Assert.AreSame(searchEngineImpl, searchEngine);

                var expectedAnalyzers = GetAnalyzers(ContentTypeManager.Instance.IndexingInfo);
                var analyzers         = searchEngine.GetAnalyzers();
                analyzers.Should().Equal(expectedAnalyzers);

                // double check
                ResetContentTypeManager();
                ContentType.GetByName("GenericContent");
                var analyzers2 = searchEngine.GetAnalyzers();
                analyzers2.Should().Equal(expectedAnalyzers);
            });
        }
コード例 #7
0
        public void Indexing_ExecuteUnprocessed_FaultTolerance()
        {
            // Temporary storages for manage repository's restart.
            InMemoryDataProvider dataProvider   = null;
            InMemorySearchEngine searchProvider = null;

            // Storage for new contents' ids and version ids
            var ids = new Tuple <int, int> [4];

            // Regular start.
            Test(() =>
            {
                // Memorize instances.
                dataProvider   = (InMemoryDataProvider)DataProvider.Current;
                searchProvider = (InMemorySearchEngine)SearchManager.SearchEngine;

                // Create 8 activities.
                for (int i = 0; i < 4; i++)
                {
                    // "Add" activity (1, 3, 5, 7).
                    var content = Content.CreateNew("SystemFolder", Repository.Root, $"Folder{i}");
                    content.Save();
                    ids[i] = new Tuple <int, int>(content.Id, content.ContentHandler.VersionId);
                    // "Update" activity (2, 4, 6, 8).
                    content.Index++;
                    content.Save();
                }
            });

            // Error simulation: remove the index document of the "Folder2", "Folder3".
            var versions = dataProvider.DB.Versions
                           .Where(v => v.VersionId == ids[1].Item2 || v.VersionId == ids[2].Item2);

            foreach (var version in versions)
            {
                version.IndexDocument = new byte[0];
            }

            // Roll back the time. Expected unprocessed sequence when next restart:
            //   Update "Folder2" (error), Add "Folder3", Update "Folder3", ...
            ((InMemoryIndexingEngine)searchProvider.IndexingEngine)
            .WriteActivityStatusToIndex(new IndexingActivityStatus {
                LastActivityId = 3
            });

            // ACTION
            // Restart the repository with the known provider instances.
            var originalLogger = Configuration.Providers.Instance.EventLogger;
            var logger         = new TestEventLoggerForIndexing_ExecuteUnprocessed_FaultTolerance();

            try
            {
                Test(builder =>
                {
                    builder
                    .UseLogger(logger)
                    .UseDataProvider(dataProvider)
                    .UseSearchEngine(searchProvider);
                }, () =>
                {
                    // Do nothing but started successfully
                });
            }
            catch (Exception e)
            {
                Assert.Fail("Restart failed: " + e.Message);
            }
            finally
            {
                Configuration.Providers.Instance.EventLogger = originalLogger;
            }

            // ASSERT
            // 1 - Check the indexing status
            // Before fix the last activity id was ok but the status had 3 gaps
            // After fix all activities need to be executed.
            var status = ((InMemoryIndexingEngine)searchProvider.IndexingEngine)
                         .ReadActivityStatusFromIndex();

            Assert.AreEqual(8, status.LastActivityId);
            Assert.AreEqual(0, status.Gaps.Length);

            // 2 - Check the existing warning in the log.
            // The original version (before fix) contained three unwanted lines:
            // Error: Indexing activity execution error. Activity: #5 (AddDocument)\r\nAttempting to deserialize an empty stream.
            // Error: Indexing activity execution error. Activity: #4 (UpdateDocument)\r\nAttempting to deserialize an empty stream.
            // Error: Indexing activity execution error. Activity: #6 (UpdateDocument)\r\nAttempting to deserialize an empty stream.
            // After fix only one warning is expected with the list of the problematic versionIds
            var relevatEvent = logger.Events
                               .FirstOrDefault(e => e.StartsWith("Warning: Cannot index"));

            Assert.IsNotNull(relevatEvent);

            var expectedIds = $"{ids[1].Item1},{ids[1].Item2}; {ids[2].Item1},{ids[2].Item2}";

            Assert.IsTrue(relevatEvent.Contains(expectedIds), $"Expected Ids: {expectedIds}, Event src: {relevatEvent}");
        }
コード例 #8
0
 public IndexingEngineForInitialDataGenerator(InMemorySearchEngine searchEngine) : base(searchEngine)
 {
 }