From 727122166ae990c2554a16a7d9d9518a825b1b62 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Tue, 4 Feb 2025 14:32:25 +0300 Subject: [PATCH] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D1=8B,=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=D1=87=D0=B0=20=D0=BF=D0=BE=20=D1=81=D0=B5?= =?UTF-8?q?=D1=82=D0=B8=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= =?UTF-8?q?,=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D1=8B=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE=20=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=B0=D0=B7=D0=B8=D0=BB=D0=B8=D0=B7=D1=83=D1=8E=D1=82?= =?UTF-8?q?=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mROA.Test/FrontendFinalTest.cs | 88 +++++++++++++++++++ mROA.Test/ITestController.cs | 58 +++++++++--- mROA.Test/obj/mROA.Test.csproj.nuget.g.props | 6 +- .../FrontendContextRepository.cs | 4 +- .../Implementation/TransmittedSharedObject.cs | 20 ++++- mROA/obj/mROA.csproj.nuget.g.props | 4 +- 6 files changed, 161 insertions(+), 19 deletions(-) create mode 100644 mROA.Test/FrontendFinalTest.cs diff --git a/mROA.Test/FrontendFinalTest.cs b/mROA.Test/FrontendFinalTest.cs new file mode 100644 index 0000000..965dd3a --- /dev/null +++ b/mROA.Test/FrontendFinalTest.cs @@ -0,0 +1,88 @@ +using System.Net; +using System.Net.Sockets; +using System.Reflection; +using mROA.Implementation; + +namespace mROA.Test; + +public class FrontendFinalTest +{ + private StreamBasedInteractionModule _interactionModule; + private StreamBasedFrontendInteractionModule _frontendInteractionModule; + private JsonFrontendSerialisationModule _frontendSerialisationModule; + private ISerialisationModule _serialisationModule; + private IExecuteModule _executeModule; + private IMethodRepository _methodRepository; + private IContextRepository _contextRepository; + bool isTestNotFinished = true; + private IContextRepository _frontendContextRepository; + + [SetUp] + public void Setup() + { + var repo = new MethodRepository(); + repo.CollectForAssembly(Assembly.GetExecutingAssembly()); + _methodRepository = repo; + var repo2 = new ContextRepository(); + repo2.FillSingletons(Assembly.GetExecutingAssembly()); + _contextRepository = repo2; + _interactionModule = new StreamBasedInteractionModule(); + + _serialisationModule = new JsonSerialisationModule(_interactionModule, _methodRepository); + + _executeModule = new LaunchReadyExecutionModule(_methodRepository, _serialisationModule, _contextRepository); + TransmissionConfig.BackendRepository = _contextRepository; + + _frontendInteractionModule = new StreamBasedFrontendInteractionModule(); + _frontendSerialisationModule = new JsonFrontendSerialisationModule(_frontendInteractionModule); + _frontendContextRepository = new FrontendContextRepository(new Dictionary { + { typeof(ITestController), typeof(TestControllerRemoteEndpoint) }, + {typeof(ITestParameter), typeof(TestParameterRemoteEndpoint)} + }, _frontendSerialisationModule); + TransmissionConfig.FrontendRepository = _frontendContextRepository; + TransmissionConfig.SetupBackendRepository(); + + Task.Run(() => + { + TcpListener listener = new TcpListener(IPAddress.Loopback, 4567); + listener.Start(); + + var stream = listener.AcceptTcpClient().GetStream(); + + Console.WriteLine("Client connected"); + + _interactionModule.RegisterClient(stream); + + while (isTestNotFinished) ; + }); + + var tcpClient = new TcpClient(); + tcpClient.Connect(IPAddress.Loopback, 4567); + _frontendInteractionModule.ServerStream = tcpClient.GetStream(); + + } + + [Test] + public void CallTest() + { + + + var singleton = _frontendContextRepository.GetSingleObject(typeof(ITestController)) as ITestController; + + var x = singleton.B(); + Console.WriteLine(x); + } + + [Test] + public void TransmittionTest() + { + var singleton = _frontendContextRepository.GetSingleObject(typeof(ITestController)) as ITestController; + + var next = singleton.SharedObjectTransmitionTest().Value; + var parameter = singleton.GetTestParameter().Value; + var x = next.Parametrized(new TestParameter { A = 100, LinkedObject = new (parameter!)}); + + + + } +} \ No newline at end of file diff --git a/mROA.Test/ITestController.cs b/mROA.Test/ITestController.cs index 5d407f0..d22a0c7 100644 --- a/mROA.Test/ITestController.cs +++ b/mROA.Test/ITestController.cs @@ -1,4 +1,5 @@ -using mROA.Implementation; +using System.Text.Json; +using mROA.Implementation; namespace mROA.Test; @@ -47,7 +48,7 @@ public class TestController : ITestController public int Parametrized(TestParameter parameter) { - return parameter.A + parameter.LinkedObject.Value.Test; + return parameter.A + parameter.LinkedObject.Value.Test(); } public TransmittedSharedObject GetTestParameter() @@ -59,12 +60,12 @@ public class TestController : ITestController [SharedObjectInterafce] public interface ITestParameter { - public int Test { get; } + public int Test(); } public class TestParameterInstance : ITestParameter { - public int Test => 10; + public int Test() => 10; } public class TransmissionTestController : ITestController @@ -102,7 +103,7 @@ public class TransmissionTestController : ITestController public int Parametrized(TestParameter parameter) { - return parameter.A * parameter.LinkedObject.Value.Test; + return parameter.A * parameter.LinkedObject.Value.Test(); } public TransmittedSharedObject GetTestParameter() @@ -117,9 +118,10 @@ public class TestParameter public TransmittedSharedObject LinkedObject { get; set; } } -public class TestControllerRemoteEndoint(int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) +public class TestControllerRemoteEndpoint(int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) : ITestController, IRemoteObject { + public void A() { serialisationModule.PostCallRequest(new JsonCallRequest { CommandId = 0, ObjectId = id }); @@ -134,46 +136,80 @@ public class TestControllerRemoteEndoint(int id, ISerialisationModule.IFrontendS public int B() { + TransmissionConfig.SetupBackendRepository(); var request = new JsonCallRequest { CommandId = 2, ObjectId = id }; serialisationModule.PostCallRequest(request); var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) .GetAwaiter().GetResult(); - return (int)response.Result!; + TransmissionConfig.SetupFrontendRepository(); + var convertation = response.Result! is JsonElement e ? e.Deserialize() : (int)response.Result!; + return convertation; } public async Task BAsync(CancellationToken cancellationToken) { + TransmissionConfig.SetupBackendRepository(); var request = new JsonCallRequest { CommandId = 3, ObjectId = id }; serialisationModule.PostCallRequest(request); var response = await serialisationModule.GetNextCommandExecution(request.CallRequestId); - return (int)response.Result!; + TransmissionConfig.SetupFrontendRepository(); + var convertation = response.Result! is JsonElement e ? e.Deserialize() : (int)response.Result!; + return convertation; } public TransmittedSharedObject SharedObjectTransmitionTest() { + TransmissionConfig.SetupBackendRepository(); + var request = new JsonCallRequest { CommandId = 4, ObjectId = id }; serialisationModule.PostCallRequest(request); var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) .GetAwaiter().GetResult(); - return (TransmittedSharedObject)response.Result!; + TransmissionConfig.SetupFrontendRepository(); + var convertation = response.Result! is JsonElement e ? e.Deserialize>()! : (TransmittedSharedObject)response.Result!; + return convertation; } public int Parametrized(TestParameter parameter) { var request = new JsonCallRequest { CommandId = 5, ObjectId = id, Parameter = parameter }; + TransmissionConfig.SetupBackendRepository(); + serialisationModule.PostCallRequest(request); var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) .GetAwaiter().GetResult(); - return (int)response.Result!; + + TransmissionConfig.SetupFrontendRepository(); + var convertation = response.Result! is JsonElement e ? e.Deserialize() : (int)response.Result!; + return convertation; } public TransmittedSharedObject GetTestParameter() { + TransmissionConfig.SetupBackendRepository(); var request = new JsonCallRequest { CommandId = 6, ObjectId = id }; serialisationModule.PostCallRequest(request); var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) .GetAwaiter().GetResult(); - return (TransmittedSharedObject)response.Result!; + TransmissionConfig.SetupFrontendRepository(); + var convertation = response.Result! is JsonElement e ? e.Deserialize>() : (TransmittedSharedObject)response.Result!; + return convertation; + } + + public int Id => id; +} + +public class TestParameterRemoteEndpoint(int id, ISerialisationModule.IFrontendSerialisationModule serialisationModule) : ITestParameter, IRemoteObject{ + public int Test() + { + var request = new JsonCallRequest { CommandId = 7, ObjectId = id }; + serialisationModule.PostCallRequest(request); + var response = serialisationModule.GetNextCommandExecution(request.CallRequestId) + .GetAwaiter().GetResult(); + TransmissionConfig.SetupFrontendRepository(); + var convertation = response.Result! is JsonElement e ? e.Deserialize() : (int)response.Result!; + TransmissionConfig.SetupBackendRepository(); + return convertation; } public int Id => id; diff --git a/mROA.Test/obj/mROA.Test.csproj.nuget.g.props b/mROA.Test/obj/mROA.Test.csproj.nuget.g.props index f0b8464..92a05d6 100644 --- a/mROA.Test/obj/mROA.Test.csproj.nuget.g.props +++ b/mROA.Test/obj/mROA.Test.csproj.nuget.g.props @@ -5,12 +5,12 @@ NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ - C:\Users\Mimm\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + C:\Users\Mikhail\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages PackageReference 6.12.0 - + @@ -21,6 +21,6 @@ - C:\Users\Mimm\.nuget\packages\nunit.analyzers\4.6.0 + C:\Users\Mikhail\.nuget\packages\nunit.analyzers\4.6.0 \ No newline at end of file diff --git a/mROA/Implementation/FrontendContextRepository.cs b/mROA/Implementation/FrontendContextRepository.cs index 2b9ef9b..e749035 100644 --- a/mROA/Implementation/FrontendContextRepository.cs +++ b/mROA/Implementation/FrontendContextRepository.cs @@ -2,7 +2,7 @@ namespace mROA.Implementation; -public class FrontendContextRepository(Dictionary remoteTypes, ISerialisationModule serialisationModule) : IContextRepository +public class FrontendContextRepository(Dictionary remoteTypes, ISerialisationModule.IFrontendSerialisationModule serialisationModule) : IContextRepository { private FrozenDictionary _remoteTypes = remoteTypes.ToFrozenDictionary(); @@ -33,7 +33,7 @@ public class FrontendContextRepository(Dictionary remoteTypes, ISeri public object GetSingleObject(Type type) { - throw new NotSupportedException(); + return Activator.CreateInstance(remoteTypes[type], -1, serialisationModule)!; } public int GetObjectIndex(object o) diff --git a/mROA/Implementation/TransmittedSharedObject.cs b/mROA/Implementation/TransmittedSharedObject.cs index d3a9a30..366b05e 100644 --- a/mROA/Implementation/TransmittedSharedObject.cs +++ b/mROA/Implementation/TransmittedSharedObject.cs @@ -5,6 +5,17 @@ namespace mROA.Implementation; public static class TransmissionConfig { public static IContextRepository DefaultContextRepository { get; set; } + public static IContextRepository BackendRepository { get; set; } + public static IContextRepository FrontendRepository { get; set; } + + public static void SetupBackendRepository() + { + DefaultContextRepository = BackendRepository; + } + public static void SetupFrontendRepository() + { + DefaultContextRepository = FrontendRepository; + } } public class TransmittedSharedObject @@ -17,9 +28,16 @@ public class TransmittedSharedObject [JsonIgnore] public IContextRepository Context { get; set; } + public TransmittedSharedObject() + { + } + public TransmittedSharedObject(T value) + { + ContextId = TransmissionConfig.DefaultContextRepository.GetObjectIndex(value); + } + public static implicit operator T(TransmittedSharedObject value) => value.Value!; public static implicit operator TransmittedSharedObject(T value) => new() { ContextId = TransmissionConfig.DefaultContextRepository.GetObjectIndex(value) }; - } \ No newline at end of file diff --git a/mROA/obj/mROA.csproj.nuget.g.props b/mROA/obj/mROA.csproj.nuget.g.props index 7f9c9db..721d876 100644 --- a/mROA/obj/mROA.csproj.nuget.g.props +++ b/mROA/obj/mROA.csproj.nuget.g.props @@ -5,12 +5,12 @@ NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ - C:\Users\Mimm\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + C:\Users\Mikhail\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages PackageReference 6.12.0 - + \ No newline at end of file