From 8784a90867ef9b03fada946909bce67485a8c201 Mon Sep 17 00:00:00 2001 From: Berk Arslan Date: Thu, 9 Sep 2021 13:02:41 +0300 Subject: [PATCH 1/4] Issue-4823 - Lucene Analyzer instance creation fix --- DNN Platform/Library/Framework/Reflection.cs | 7 ++++++- .../Search/Internals/LuceneControllerImpl.cs | 12 +++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/DNN Platform/Library/Framework/Reflection.cs b/DNN Platform/Library/Framework/Reflection.cs index bc9ec0893fd..deff68252d7 100644 --- a/DNN Platform/Library/Framework/Reflection.cs +++ b/DNN Platform/Library/Framework/Reflection.cs @@ -302,10 +302,15 @@ public static Type CreateType(string TypeName, string CacheKey, bool UseCache, b } public static object CreateInstance(Type Type) + { + return CreateInstance(Type, null); + } + + public static object CreateInstance(Type Type, object[] args) { if (Type != null) { - return Type.InvokeMember(string.Empty, BindingFlags.CreateInstance, null, null, null, null); + return Type.InvokeMember(string.Empty, BindingFlags.CreateInstance, null, null, args, null); } else { diff --git a/DNN Platform/Library/Services/Search/Internals/LuceneControllerImpl.cs b/DNN Platform/Library/Services/Search/Internals/LuceneControllerImpl.cs index babd65c2965..1ea449619af 100644 --- a/DNN Platform/Library/Services/Search/Internals/LuceneControllerImpl.cs +++ b/DNN Platform/Library/Services/Search/Internals/LuceneControllerImpl.cs @@ -376,7 +376,17 @@ public Analyzer GetCustomAnalyzer() try { var analyzerType = Reflection.CreateType(customAnalyzerType); - analyzer = Reflection.CreateInstance(analyzerType) as Analyzer; + + // If parameterless ctor exists, use that; if not, pass the Lucene Version. + if (analyzerType.GetConstructor(Type.EmptyTypes) != null) + { + analyzer = Reflection.CreateInstance(analyzerType) as Analyzer; + } + else if (analyzerType.GetConstructor(new Type[] { typeof(Lucene.Net.Util.Version) }) != null) + { + analyzer = Reflection.CreateInstance(analyzerType, new object[] { Constants.LuceneVersion }) as Analyzer; + } + if (analyzer == null) { throw new ArgumentException(string.Format( From c60ddebc3cddbf97328ef519627dd785e9c122d9 Mon Sep 17 00:00:00 2001 From: Berk Arslan Date: Thu, 9 Sep 2021 16:02:04 +0300 Subject: [PATCH 2/4] Issue-4823 - UTs added --- .../DotNetNuke.Tests.Core.csproj | 2 + .../Framework/ReflectionTests.cs | 36 +++++++++++++ .../Internals/LuceneControllerImplTests.cs | 52 +++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ReflectionTests.cs create mode 100644 DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Search/Internals/LuceneControllerImplTests.cs diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj b/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj index f7493eeb454..588d014ba43 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj @@ -179,6 +179,7 @@ + @@ -205,6 +206,7 @@ + diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ReflectionTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ReflectionTests.cs new file mode 100644 index 00000000000..4e887217bdd --- /dev/null +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ReflectionTests.cs @@ -0,0 +1,36 @@ +namespace DotNetNuke.Tests.Core.Framework +{ + using System.Text; + using DotNetNuke.Framework; + using NUnit.Framework; + + public class ReflectionTests + { + [Test] + public void CreateInstance_WithArgs_WorksCorrectly() + { + // Arrange + var typeToCreate = typeof(StringBuilder); + var argToPass = new object[] { 1 }; + + // Act + var result = Reflection.CreateInstance(typeToCreate, argToPass) as StringBuilder; + + // Assert + Assert.AreEqual(1, result.Capacity); + } + + [Test] + public void CreateInstance_WithoutArgs_WorksCorrectly() + { + // Arrange + var typeToCreate = typeof(StringBuilder); + + // Act + var result = Reflection.CreateInstance(typeToCreate) as StringBuilder; + + // Assert + Assert.AreEqual(16, result.Capacity); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Search/Internals/LuceneControllerImplTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Search/Internals/LuceneControllerImplTests.cs new file mode 100644 index 00000000000..331e47cfbb6 --- /dev/null +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Search/Internals/LuceneControllerImplTests.cs @@ -0,0 +1,52 @@ +namespace DotNetNuke.Tests.Core.Services.Search.Internals +{ + using System.Data; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; + using DotNetNuke.Services.Search.Internals; + using DotNetNuke.Tests.Utilities.Mocks; + using Lucene.Net.Analysis.Cz; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; + + public class LuceneControllerImplTests + { + [Test] + public void GetCustomAnalyzer_WithTheProvidedAnalyzer_ReturnsTheAnalyzerCorrectly() + { + // Arrange + const string HostSettingsTableName = "HostSettings"; + const string SettingNameColumnName = "SettingName"; + const string SettingValueColumnName = "SettingValue"; + const string SettingIsSecureColumnName = "SettingIsSecure"; + const string CustomAnalyzerCacheKeyName = "Search_CustomAnalyzer"; + const string CzechAnalyzerTypeName = "Lucene.Net.Analysis.Cz.CzechAnalyzer, Lucene.Net.Contrib.Analyzers"; + var services = new ServiceCollection(); + var mockData = MockComponentProvider.CreateDataProvider(); + var hostSettings = new DataTable(HostSettingsTableName); + var nameCol = hostSettings.Columns.Add(SettingNameColumnName); + hostSettings.Columns.Add(SettingValueColumnName); + hostSettings.Columns.Add(SettingIsSecureColumnName); + hostSettings.PrimaryKey = new[] { nameCol }; + hostSettings.Rows.Add(CustomAnalyzerCacheKeyName, CzechAnalyzerTypeName, true); + mockData.Setup(c => c.GetHostSettings()).Returns(hostSettings.CreateDataReader()); + var mockedApplicationStatusInfo = new Mock(); + mockedApplicationStatusInfo.Setup(s => s.Status).Returns(UpgradeStatus.Install); + mockedApplicationStatusInfo.Setup(s => s.ApplicationMapPath).Returns(string.Empty); + services.AddTransient(container => Mock.Of()); + services.AddTransient(container => mockedApplicationStatusInfo.Object); + services.AddTransient(container => Mock.Of()); + Globals.DependencyProvider = services.BuildServiceProvider(); + var cachingProvider = MockComponentProvider.CreateDataCacheProvider(); + var luceneController = new LuceneControllerImpl(); + + // Act + var analyzer = luceneController.GetCustomAnalyzer(); + + // Assert + Assert.IsInstanceOf(analyzer); + } + } +} From 9523448694d909d18db078fd304672c9826682d7 Mon Sep 17 00:00:00 2001 From: Berk Arslan Date: Thu, 9 Sep 2021 17:38:02 +0300 Subject: [PATCH 3/4] Issue-4823 - Fix failing UT --- .../Services/Search/Internals/LuceneControllerImplTests.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Search/Internals/LuceneControllerImplTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Search/Internals/LuceneControllerImplTests.cs index 331e47cfbb6..8f4450861a2 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Search/Internals/LuceneControllerImplTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Search/Internals/LuceneControllerImplTests.cs @@ -4,6 +4,7 @@ using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; using DotNetNuke.Services.Search.Internals; using DotNetNuke.Tests.Utilities.Mocks; using Lucene.Net.Analysis.Cz; @@ -39,7 +40,8 @@ public void GetCustomAnalyzer_WithTheProvidedAnalyzer_ReturnsTheAnalyzerCorrectl services.AddTransient(container => mockedApplicationStatusInfo.Object); services.AddTransient(container => Mock.Of()); Globals.DependencyProvider = services.BuildServiceProvider(); - var cachingProvider = MockComponentProvider.CreateDataCacheProvider(); + MockComponentProvider.CreateDataCacheProvider(); + DataCache.ClearCache(); var luceneController = new LuceneControllerImpl(); // Act From ad085f3581db0f72f752107315adc8149a550d3b Mon Sep 17 00:00:00 2001 From: Berk Arslan Date: Thu, 9 Sep 2021 17:50:05 +0300 Subject: [PATCH 4/4] Issue-4823 - CodeReview changes implemented --- .../Services/Search/Internals/LuceneControllerImpl.cs | 4 ++-- .../DotNetNuke.Tests.Core/Framework/ReflectionTests.cs | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/DNN Platform/Library/Services/Search/Internals/LuceneControllerImpl.cs b/DNN Platform/Library/Services/Search/Internals/LuceneControllerImpl.cs index 1ea449619af..8edc5d22bce 100644 --- a/DNN Platform/Library/Services/Search/Internals/LuceneControllerImpl.cs +++ b/DNN Platform/Library/Services/Search/Internals/LuceneControllerImpl.cs @@ -378,11 +378,11 @@ public Analyzer GetCustomAnalyzer() var analyzerType = Reflection.CreateType(customAnalyzerType); // If parameterless ctor exists, use that; if not, pass the Lucene Version. - if (analyzerType.GetConstructor(Type.EmptyTypes) != null) + if (analyzerType?.GetConstructor(Type.EmptyTypes) != null) { analyzer = Reflection.CreateInstance(analyzerType) as Analyzer; } - else if (analyzerType.GetConstructor(new Type[] { typeof(Lucene.Net.Util.Version) }) != null) + else if (analyzerType?.GetConstructor(new Type[] { typeof(Lucene.Net.Util.Version) }) != null) { analyzer = Reflection.CreateInstance(analyzerType, new object[] { Constants.LuceneVersion }) as Analyzer; } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ReflectionTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ReflectionTests.cs index 4e887217bdd..063226fe2e2 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ReflectionTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ReflectionTests.cs @@ -11,13 +11,13 @@ public void CreateInstance_WithArgs_WorksCorrectly() { // Arrange var typeToCreate = typeof(StringBuilder); - var argToPass = new object[] { 1 }; + var argToPass = new object[] { "one" }; // Act - var result = Reflection.CreateInstance(typeToCreate, argToPass) as StringBuilder; + var result = (StringBuilder)Reflection.CreateInstance(typeToCreate, argToPass); // Assert - Assert.AreEqual(1, result.Capacity); + Assert.AreEqual("one", result.ToString()); } [Test] @@ -27,10 +27,10 @@ public void CreateInstance_WithoutArgs_WorksCorrectly() var typeToCreate = typeof(StringBuilder); // Act - var result = Reflection.CreateInstance(typeToCreate) as StringBuilder; + var result = (StringBuilder)Reflection.CreateInstance(typeToCreate); // Assert - Assert.AreEqual(16, result.Capacity); + Assert.AreEqual(string.Empty, result.ToString()); } } }