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()); } }
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; } }
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); } }
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; } }
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; } }
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); }); }
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}"); }
public IndexingEngineForInitialDataGenerator(InMemorySearchEngine searchEngine) : base(searchEngine) { }