public void TestSimple()

in rd-net/Test.RdFramework/SocketProxyTest.cs [18:123]


    public void TestSimple()
    {
      // using var factory = Log.UsingLogFactory(new TextWriterLogFactory(Console.Out, LoggingLevel.TRACE));
      Lifetime.Using(lifetime =>
      {
        var proxyLifetimeDefinition = lifetime.CreateNested();
        var proxyLifetime = proxyLifetimeDefinition.Lifetime;
        {
          SynchronousScheduler.Instance.SetActive(lifetime);

          var serverProtocol = SocketWireTest.Server(lifetime);

          var proxy = new SocketProxy("TestProxy", proxyLifetime, serverProtocol).With(socketProxy =>
            socketProxy.Start());
          Thread.Sleep(SocketWireTest.DefaultTimeout);

          var clientProtocol = SocketWireTest.Client(lifetime, proxy.Port);

          var sp = NewRdSignal<int>().Static(1);
          sp.BindTopLevel(lifetime, serverProtocol, SocketWireTest.Top);

          var cp = NewRdSignal<int>().Static(1);
          cp.BindTopLevel(lifetime, clientProtocol, SocketWireTest.Top);

          var serverLog = new List<int>();
          var clientLog = new List<int>();

          sp.Advise(lifetime, i => serverLog.Add(i));
          cp.Advise(lifetime, i => clientLog.Add(i));

          //Connection is established for now

          sp.Fire(1);

          SpinWaitEx.SpinUntil(() => serverLog.Count == 1);
          SpinWaitEx.SpinUntil(() => clientLog.Count == 1);
          Assert.AreEqual(new List<int> {1}, serverLog);
          Assert.AreEqual(new List<int> {1}, clientLog);

          cp.Fire(2);

          SpinWaitEx.SpinUntil(() => serverLog.Count == 2);
          SpinWaitEx.SpinUntil(() => clientLog.Count == 2);
          Assert.AreEqual(new List<int> {1, 2}, serverLog);
          Assert.AreEqual(new List<int> {1, 2}, clientLog);

          proxy.StopServerToClientMessaging();

          cp.Advise(lifetime, i => Assert.AreNotSame(3, i, "Value {0} mustn't be received", 3));

          sp.Fire(3);

          SpinWaitEx.SpinUntil(() => serverLog.Count == 3);
          Assert.AreEqual(new List<int> {1, 2, 3}, serverLog);


          proxy.StopClientToServerMessaging();

          sp.Advise(lifetime, i => Assert.AreNotSame(4, i, "Value {0} mustn't be received", 4));

          cp.Fire(4);

          SpinWaitEx.SpinUntil(() => clientLog.Count == 3);
          Assert.AreEqual(new List<int> {1, 2, 4}, clientLog);

          //Connection is broken for now

          proxy.StartServerToClientMessaging();

          sp.Fire(5);
          SpinWaitEx.SpinUntil(() => serverLog.Count == 4);
          SpinWaitEx.SpinUntil(() => clientLog.Count == 4);
          Assert.AreEqual(new List<int> {1, 2, 3, 5}, serverLog);
          Assert.AreEqual(new List<int> {1, 2, 4, 5}, clientLog);


          proxy.StartClientToServerMessaging();

          cp.Fire(6);
          SpinWaitEx.SpinUntil(() => serverLog.Count == 5);
          SpinWaitEx.SpinUntil(() => clientLog.Count == 5);
          Assert.AreEqual(new List<int> {1, 2, 3, 5, 6}, serverLog);
          Assert.AreEqual(new List<int> {1, 2, 4, 5, 6}, clientLog);

          //Connection is established for now

          proxyLifetimeDefinition.Terminate();

          
          cp.Advise(lifetime, i => Assert.AreNotSame(7, i, "Value {0} mustn't be received", 7));
          sp.Fire(7);
          
          SpinWaitEx.SpinUntil(() => serverLog.Count == 6);
          Assert.AreEqual(new List<int> {1, 2, 3, 5, 6, 7}, serverLog);


          sp.Advise(lifetime, i => Assert.AreNotSame(8, i, "Value {0} mustn't be received", 8));
          cp.Fire(8);

          SpinWaitEx.SpinUntil(() => clientLog.Count == 6);
          Assert.AreEqual(new List<int> {1, 2, 4, 5, 6, 8}, clientLog);

          //Connection is broken for now, proxy is not alive
        }
      });
    }