示例#1
0
 public void OnMessageCommit(Address clientAddress, ClientMessage message)
 {
     if (!clientAddress.IsEmpty)
     {
         InteractionLink.OnMessageCommit(clientAddress, message.ID);
     }
     simulationRun.messages.Add(message);
 }
示例#2
0
        public void InteractionLinkTest()
        {
            Random random      = new Random();
            var    defaultPort = random.Next(1024, 32768);

            using (Listener listener = new Listener(null, defaultPort))
            {
                InteractionLink myLink       = null;
                AutoResetEvent  onLink       = new AutoResetEvent(false),
                                onRegister   = new AutoResetEvent(false),
                                onUnregister = new AutoResetEvent(false),
                                onMessage    = new AutoResetEvent(false);
                Guid   me = Guid.NewGuid();
                Guid   lastTargetEntity = Guid.Empty;
                byte[] lastData         = null;
                listener.OnNewInteractionLink = lnk =>
                {
                    myLink = lnk;
                    lnk.OnRegisterReceiver = receiver =>
                    {
                        Assert.AreEqual(receiver, me);
                        onRegister.Set();
                    };
                    lnk.OnMessage = (msg, sender) =>
                    {
                        Assert.AreEqual(msg.ID.From, me);
                        lastTargetEntity = msg.ID.To;
                        lastData         = msg.Body;
                        onMessage.Set();
                    };
                    lnk.OnUnregisterReceiver = receiver =>
                    {
                        Assert.AreEqual(receiver, me);
                        onUnregister.Set();
                    };
                    onLink.Set();
                };
                using (TcpClient client = new TcpClient("localhost", defaultPort))
                {
                    Assert.IsTrue(onLink.WaitOne());

                    var stream = client.GetStream();

                    for (int k = 0; k < 3; k++)
                    {
                        me = Guid.NewGuid();
                        Register(stream, me);
                        Assert.IsTrue(onRegister.WaitOne());

                        for (int i = 0; i < 10; i++)
                        {
                            Guid target = Guid.NewGuid();
                            for (int j = 0; j < 10; j++)
                            {
                                byte[] data = random.NextBytes(0, 100);
                                SendMessage(stream, new Message(me, target, 0, data, 5));
                                Assert.IsTrue(onMessage.WaitOne());
                                Assert.AreEqual(lastTargetEntity, target);
                                Assert.IsTrue(Helper.AreEqual(data, lastData));
                            }
                        }
                        Unregister(stream, me);
                        Assert.IsTrue(onUnregister.WaitOne());
                    }
                }
            }
        }
示例#3
0
        public void FullInteractionLinkTest()
        {
            Random random = new Random();
            var    timing = new BaseDB.TimingContainer();

            timing.msGenerationBudget = 210;
            timing.msComputation      = 20;
            timing.msApplication      = 20;
            timing.recoverySteps      = 2;
            BaseDB.TimingPoller       = new DBType.FunctionPollable <BaseDB.TimingContainer>(() => timing);

            SimulationRun run = new SimulationRun(
                new BaseDB.ConfigContainer()
            {
                extent = Int3.One, r = 1f / 8, m = 1f / 16
            },
                ShardID.Zero,
                new Entity[]
            {
                new Entity(
                    new EntityID(Guid.NewGuid(), Simulation.MySpace.Center),
                    Vec3.Zero,
                    new SineLogic()),
            }
                );

            var defaultPort = random.Next(1024, 32768);

            run.InstallConsensusCluster(3, defaultPort + 1, true);

            bool keepRunning = true;
            //parallel evolution:
            var task = Task.Run(() =>
            {
                for (int i = 0; keepRunning; i++)
                {
                    var rs = run.AdvanceTLG(true, true);
                    Assert.AreEqual(rs.IntermediateSDS.entities.Count, 1);
                    Assert.AreEqual(rs.SDS.FinalEntities.Length, 1);
                }
            });

            List <TimeSpan> deltas = new List <TimeSpan>();

            using (Listener listener = new Listener(null, defaultPort))
            {
                InteractionLink myLink       = null;
                AutoResetEvent  onLink       = new AutoResetEvent(false),
                                onRegister   = new AutoResetEvent(false),
                                onUnregister = new AutoResetEvent(false),
                                onMessage    = new AutoResetEvent(false);
                Guid   me = Guid.NewGuid();
                Guid   lastTargetEntity = Guid.Empty;
                byte[] lastData         = null;
                listener.OnNewInteractionLink = lnk =>
                {
                    myLink = lnk;
                    lnk.OnRegisterReceiver = receiver =>
                    {
                        Assert.AreEqual(receiver, me);
                        onRegister.Set();
                    };
                    lnk.OnMessage = (msg, sender) =>
                    {
                        Assert.AreEqual(msg.ID.From, me);

                        run.RelayMessageToConsensus(msg, sender);

                        lastTargetEntity = msg.ID.To;
                        lastData         = msg.Body;
                        onMessage.Set();
                    };
                    lnk.OnUnregisterReceiver = receiver =>
                    {
                        Assert.AreEqual(receiver, me);
                        onUnregister.Set();
                    };
                    onLink.Set();
                };


                using (TcpClient client = new TcpClient("localhost", defaultPort))
                {
                    var stream = client.GetStream();
                    Assert.IsTrue(onLink.WaitOne());
                    Register(stream, me);
                    Assert.IsTrue(onRegister.WaitOne());

                    Message findEntity = new Message(me, Guid.Empty, 0, null, 50);
                    SendMessage(stream, findEntity);                     //broadcast, find entity


                    int gen;
                    ReadMessageDelivered(stream, findEntity.MessageID);
                    Message broadCastResponse = ReadMessage(stream, out gen, 0);
                    Assert.AreEqual(broadCastResponse.Data.Length, 16);
                    Assert.AreEqual(broadCastResponse.To, me);

                    Guid entityID = broadCastResponse.From;


                    for (int i = 0; i < 10; i++)
                    {
                        float f = random.NextFloat(0, 100);
                        Console.WriteLine(i + ": " + f);
                        Message job = new Message(me, entityID, 0, BitConverter.GetBytes(f), 50);
                        var     t0  = PreciseTime.Now;
                        SendMessage(stream, job);
                        ReadMessageDelivered(stream, job.MessageID);

                        Message response = ReadMessage(stream, out gen, 1);

                        var delta = PreciseTime.Now - t0;
                        deltas.Add(delta.TimeSpan);

                        Assert.AreEqual(response.To, me);
                        Assert.AreEqual(response.From, entityID);
                        Assert.IsNotNull(response.Data);
                        Assert.AreEqual(response.Data.Length, 4);
                        float rs = BitConverter.ToSingle(response.Data, 0);
                        Assert.AreEqual((float)Math.Sin(f), rs, i + ": " + f);
                    }
                }
            }
            keepRunning = false;
            task.Wait();

            foreach (var t in deltas)
            {
                Debug.WriteLine(t);
            }
        }