// // Licensed under the MIT License. See LICENSE file in the project root for full license information. // namespace MUnique.OpenMU.Tests; using Microsoft.Extensions.Logging.Abstractions; using Moq; using MUnique.OpenMU.GameLogic; using MUnique.OpenMU.GameServer; using MUnique.OpenMU.GameServer.MessageHandler; using MUnique.OpenMU.Network.PlugIns; using MUnique.OpenMU.PlugIns; /// /// Unit tests for the . /// [TestFixture] public class PacketHandlerPlugInContainerTest { private const byte HandlerKey = 0xF1; private static readonly ClientVersion Season6E3English = new(6, 3, ClientLanguage.English); private static readonly ClientVersion Season9E2English = new(9, 2, ClientLanguage.English); /// /// Tests if the the plug in of correct version is selected when the plugin for the exact version is available. /// [Test] public void SelectPlugInOfCorrectVersionWhenExactVersionIsAvailable() { var manager = new PlugInManager(null, new NullLoggerFactory(), null, null); manager.RegisterPlugIn(); manager.RegisterPlugIn(); manager.RegisterPlugIn(); var clientVersionProvider = new Mock(); clientVersionProvider.Setup(p => p.ClientVersion).Returns(Season6E3English); var containerForSeason6 = new MainPacketHandlerPlugInContainer(clientVersionProvider.Object, manager, new NullLoggerFactory()); containerForSeason6.Initialize(); var handler = containerForSeason6[HandlerKey]; Assert.That(handler!.GetType(), Is.EqualTo(typeof(PacketHandlerSeason6))); } /// /// Tests if the the plug in of correct version is selected when only plugins for lower versions are available. /// [Test] public void SelectPlugInOfCorrectVersionWhenLowerVersionsAreAvailable() { var manager = new PlugInManager(null, new NullLoggerFactory(), null, null); manager.RegisterPlugIn(); manager.RegisterPlugIn(); var clientVersionProvider = new Mock(); clientVersionProvider.Setup(p => p.ClientVersion).Returns(Season9E2English); var containerForSeason9 = new MainPacketHandlerPlugInContainer(clientVersionProvider.Object, manager, new NullLoggerFactory()); containerForSeason9.Initialize(); var handler = containerForSeason9[HandlerKey]; Assert.That(handler!.GetType(), Is.EqualTo(typeof(PacketHandlerSeason6))); } /// /// Tests if plugins of the correct language are selected. /// [Test] public void SelectPlugInOfCorrectLanguage() { var manager = new PlugInManager(null, new NullLoggerFactory(), null, null); manager.RegisterPlugIn(); manager.RegisterPlugIn(); var clientVersionProvider = new Mock(); clientVersionProvider.Setup(p => p.ClientVersion).Returns(Season6E3English); var containerForSeason6 = new MainPacketHandlerPlugInContainer(clientVersionProvider.Object, manager, new NullLoggerFactory()); containerForSeason6.Initialize(); var handler = containerForSeason6[HandlerKey]; Assert.That(handler!.GetType(), Is.EqualTo(typeof(PacketHandlerSeason6))); } /// /// Tests if plugins of invariant language and version are selected. /// [Test] public void SelectInvariantPlugIn() { var manager = new PlugInManager(null, new NullLoggerFactory(), null, null); manager.RegisterPlugIn(); var clientVersionProvider = new Mock(); clientVersionProvider.Setup(p => p.ClientVersion).Returns(Season6E3English); var containerForSeason6 = new MainPacketHandlerPlugInContainer(clientVersionProvider.Object, manager, new NullLoggerFactory()); containerForSeason6.Initialize(); var handler = containerForSeason6[HandlerKey]; Assert.That(handler!.GetType(), Is.EqualTo(typeof(PacketHandlerInvariant))); } /// /// Tests if another plugin is getting 'effective' when the currently effective plugin gets deactivated. /// [Test] public void SelectPlugInAfterDeactivation() { var manager = new PlugInManager(null, new NullLoggerFactory(), null, null); manager.RegisterPlugIn(); manager.RegisterPlugIn(); var clientVersionProvider = new Mock(); clientVersionProvider.Setup(p => p.ClientVersion).Returns(Season6E3English); var containerForSeason6 = new MainPacketHandlerPlugInContainer(clientVersionProvider.Object, manager, new NullLoggerFactory()); containerForSeason6.Initialize(); manager.DeactivatePlugIn(typeof(PacketHandlerSeason6)); var handler = containerForSeason6[HandlerKey]; Assert.That(handler, Is.Not.Null); Assert.That(handler!.GetType(), Is.EqualTo(typeof(PacketHandlerSeason1))); } /// /// Tests if the language specific plugin has priority over the invariant one. /// [Test] public void SelectLanguageSpecificOverInvariant() { var manager = new PlugInManager(null, new NullLoggerFactory(), null, null); manager.RegisterPlugIn(); manager.RegisterPlugIn(); manager.RegisterPlugIn(); var clientVersionProvider = new Mock(); clientVersionProvider.Setup(p => p.ClientVersion).Returns(Season6E3English); var containerForSeason6 = new MainPacketHandlerPlugInContainer(clientVersionProvider.Object, manager, new NullLoggerFactory()); containerForSeason6.Initialize(); var handler = containerForSeason6[HandlerKey]; Assert.That(handler!.GetType(), Is.EqualTo(typeof(PacketHandlerSeason6English))); } /// /// Test packet handler implementation for season 1. /// [MinimumClient(1, 0, ClientLanguage.Invariant)] public class PacketHandlerSeason1 : IPacketHandlerPlugIn { /// public byte Key => HandlerKey; /// public bool IsEncryptionExpected => false; /// public ValueTask HandlePacketAsync(Player player, Memory packet) { // does nothing here return ValueTask.CompletedTask; } } /// /// Test packet handler implementation for season 6. /// [MinimumClient(6, 3, ClientLanguage.Invariant)] public class PacketHandlerSeason6 : IPacketHandlerPlugIn { /// public byte Key => HandlerKey; /// public bool IsEncryptionExpected => false; /// public ValueTask HandlePacketAsync(Player player, Memory packet) { // does nothing here return ValueTask.CompletedTask; } } /// /// Test packet handler implementation for season 6 english. /// [MinimumClient(6, 3, ClientLanguage.English)] public class PacketHandlerSeason6English : IPacketHandlerPlugIn { /// public byte Key => HandlerKey; /// public bool IsEncryptionExpected => false; /// public ValueTask HandlePacketAsync(Player player, Memory packet) { // does nothing here return ValueTask.CompletedTask; } } /// /// Test packet handler implementation for season 6 chinese. /// [MinimumClient(6, 3, ClientLanguage.Chinese)] public class PacketHandlerSeason6Chinese : IPacketHandlerPlugIn { /// public byte Key => HandlerKey; /// public bool IsEncryptionExpected => false; /// public ValueTask HandlePacketAsync(Player player, Memory packet) { // does nothing here return ValueTask.CompletedTask; } } /// /// Test packet handler implementation for season 9. /// [MinimumClient(9, 2, ClientLanguage.Invariant)] public class PacketHandlerSeason9 : IPacketHandlerPlugIn { /// public byte Key => HandlerKey; /// public bool IsEncryptionExpected => false; /// public ValueTask HandlePacketAsync(Player player, Memory packet) { // does nothing here return ValueTask.CompletedTask; } } /// /// Invariant test packet handler implementation for all versions. /// public class PacketHandlerInvariant : IPacketHandlerPlugIn { /// public byte Key => HandlerKey; /// public bool IsEncryptionExpected => false; /// public ValueTask HandlePacketAsync(Player player, Memory packet) { // does nothing here return ValueTask.CompletedTask; } } }