public void OnMessageCommit(Address clientAddress, ClientMessage message) { if (!clientAddress.IsEmpty) { InteractionLink.OnMessageCommit(clientAddress, message.ID); } simulationRun.messages.Add(message); }
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()); } } } }
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); } }