public void MessageSerializeDeserialize() { var log = new WM.Logger(); var udpClient = new UdpClient(); var udpSend = new WM.Net.UDPSend(udpClient, log); udpSend.remoteIP = "127.0.0.1"; udpSend.remotePort = 8890; udpSend.Init(); var avatarState = new WM.Net.AvatarState(); { // To skip one-time Xml serializer initialization. var messageXML = WM.Net.Message.EncodeObjectAsXml(avatarState); } var numIterations = 1000; { var start = DateTime.Now; for (int i = 0; i < numIterations; ++i) { var messageXML = WM.Net.Message.EncodeObjectAsXml(avatarState); udpSend.SendString(messageXML); } var end = DateTime.Now; log.Enabled = true; log.Debug("Sending " + numIterations + " times an XML Message encoded AvatarState took " + (end - start).TotalMilliseconds); log.Enabled = false; } { var MessageBeginTag = @"<Message>"; var MessageEndTag = @"<\Message>"; var start = DateTime.Now; for (int i = 0; i < numIterations; ++i) { var message = Message.EncodeObject(avatarState); udpSend.SendString(MessageBeginTag); udpSend.Send(message.Data); udpSend.SendString(MessageEndTag); } var end = DateTime.Now; log.Enabled = true; log.Debug("Sending " + numIterations + " times a Binary encoded AvatarState took " + (end - start).TotalMilliseconds); log.Enabled = false; } }
public void Test_ArchiVR_Multiplay_NominalWorkflow_Full_2Clients() { var log = new WM.Logger(); #region Setup // Create an application instance that will act as server. applicationServer = CreateApplication("Server"); applications.Add(applicationServer); // Create an application instance that will connect as client 1. applicationClient1 = CreateApplication("Client1"); applications.Add(applicationClient1); // Create an application instance that will connect as client 2. applicationClient2 = CreateApplication("Client2"); applications.Add(applicationClient2); #endregion // Disable logging. foreach (var application in applications) { application.Logger.Enabled = false; } #region Check initial application state Assert.AreEqual(0, applicationServer.Server.NumClients); Assert.AreEqual(0, applicationClient1.Server.NumClients); Assert.AreEqual(0, applicationClient2.Server.NumClients); Assert.IsFalse(applicationServer.Client.Connected); Assert.IsFalse(applicationClient1.Client.Connected); Assert.IsFalse(applicationClient2.Client.Connected); Assert.AreEqual(DefaultAvatarID, applicationServer.Player.AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient1.Player.AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient2.Player.AvatarID); Assert.AreEqual("Server player", applicationServer.Player.Name); Assert.AreEqual("Client1 player", applicationClient1.Player.Name); Assert.AreEqual("Client2 player", applicationClient2.Player.Name); #endregion Check initial application state // Enable logging. foreach (var application in applications) { application.Logger.Enabled = true; } #region Start Server. applications[0].Logger.Header("Start Server"); // WHEN the ServerApplication is initialized to 'Server' network mode... { Assert.AreEqual(NetworkMode.Standalone, applicationServer.NetworkMode); applicationServer.QueueCommand(new InitNetworkCommand(NetworkMode.Server)); Assert.AreEqual(NetworkMode.Standalone, applicationServer.NetworkMode); UpdateApplications(); // Make queued commands execute. } // ... THEN ... { // ... its network mode is 'Server' Assert.AreEqual(NetworkMode.Server, applicationServer.NetworkMode); // ... its Server is Running // TODO: Assert.AreEqual(ServerState.Running, applicationServer.Server.State); // ... its Client is automatically connected to that server. Assert.AreEqual(1, applicationServer.Server.NumClients); Assert.IsTrue(applicationServer.Client.Connected); // Server application is connected to the Server and introduced its own Player. Assert.AreEqual(1, applicationServer.Players.Count); Assert.AreEqual(0, applicationClient1.Players.Count); Assert.AreEqual(0, applicationClient2.Players.Count); } #endregion //WM.Logger.Enabled = true; #region Connect Client1 applicationClient1.Logger.Header("Connect Client1"); // WHEN the Client1 application is initialized to 'Client' network mode... { Assert.AreEqual(NetworkMode.Standalone, applicationClient1.NetworkMode); applicationClient1.QueueCommand(new InitNetworkCommand(NetworkMode.Client)); Assert.AreEqual(NetworkMode.Standalone, applicationClient1.NetworkMode); UpdateApplications(); // Make queued commands execute. } // ... THEN ... { // ... its network mode is 'Server' Assert.AreEqual(NetworkMode.Client, applicationClient1.NetworkMode); // ... its Server is not Running // TODO: Assert.AreEqual(ServerState.Running, applicationClient1.Server.State); // ... its Client is connected to the Server application's Server. Assert.IsTrue(applicationClient1.Client.Connected); Assert.AreEqual(2, applicationServer.Server.NumClients); // Server and Client1 application are connected to the Server and introduced their own Player. Assert.AreEqual(2, applicationServer.Players.Count); Assert.AreEqual(2, applicationClient1.Players.Count); Assert.AreEqual(0, applicationClient2.Players.Count); } #endregion #region Connect Client2 applicationClient2.Logger.Header("Connect Client2"); // WHEN the Client2 application is initialized to 'Client' network mode... { Assert.AreEqual(NetworkMode.Standalone, applicationClient2.NetworkMode); applicationClient2.QueueCommand(new InitNetworkCommand(NetworkMode.Client)); Assert.AreEqual(NetworkMode.Standalone, applicationClient2.NetworkMode); UpdateApplications(); // Make queued commands execute. } // ... THEN ... { // ... its network mode is 'Server' Assert.AreEqual(NetworkMode.Client, applicationClient2.NetworkMode); // ... its Server is not Running // TODO: Assert.AreEqual(ServerState.Running, applicationClient2.Server.State); // ... its Client is connected to the Server application's Server. Assert.IsTrue(applicationClient2.Client.Connected); Assert.AreEqual(3, applicationServer.Server.NumClients); // All clients are connected to the server and introduced their own Player. Assert.AreEqual(3, applicationServer.Players.Count); Assert.AreEqual(3, applicationClient1.Players.Count); Assert.AreEqual(3, applicationClient2.Players.Count); } #endregion #region Change server Avatar applicationServer.Logger.Header("Set Server avatar to Avatar1"); applicationServer.SetPlayerAvatar(Avatar1ID); UpdateApplications(); // Make queued commands execute. // Server should now have changed avatar on all connected applications. Assert.AreEqual(Avatar1ID, applicationServer.Player.AvatarID); Assert.AreEqual(Avatar1ID, applicationClient1.Players[applicationServer.Player.ID].AvatarID); Assert.AreEqual(Avatar1ID, applicationClient2.Players[applicationServer.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationServer.Players[applicationClient1.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient1.Player.AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient2.Players[applicationClient1.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationServer.Players[applicationClient2.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient1.Players[applicationClient2.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient2.Player.AvatarID); #endregion #region Change server player name applicationServer.Logger.Header("Change Server player name"); applicationServer.SetPlayerName("New Server player"); UpdateApplications(); // Make queued commands execute. // Server should now have changed avatar on all connected applications. Assert.AreEqual(Avatar1ID, applicationServer.Player.AvatarID); Assert.AreEqual(Avatar1ID, applicationClient1.Players[applicationServer.Player.ID].AvatarID); Assert.AreEqual(Avatar1ID, applicationClient2.Players[applicationServer.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationServer.Players[applicationClient1.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient1.Player.AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient2.Players[applicationClient1.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationServer.Players[applicationClient2.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient1.Players[applicationClient2.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient2.Player.AvatarID); Assert.AreEqual("New Server player", applicationServer.Player.Name); Assert.AreEqual("New Server player", applicationClient1.Players[applicationServer.Player.ID].Name); Assert.AreEqual("New Server player", applicationClient2.Players[applicationServer.Player.ID].Name); Assert.AreEqual("Client1 player", applicationClient1.Player.Name); Assert.AreEqual("Client2 player", applicationClient2.Player.Name); #endregion #region Change Client1 player name applicationClient1.Logger.Header("Change Server player name"); applicationClient1.SetPlayerName("New Client1 player"); UpdateApplications(); // Make queued commands execute. // Server should now have changed avatar on all connected applications. Assert.AreEqual(Avatar1ID, applicationServer.Player.AvatarID); Assert.AreEqual(Avatar1ID, applicationClient1.Players[applicationServer.Player.ID].AvatarID); Assert.AreEqual(Avatar1ID, applicationClient2.Players[applicationServer.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationServer.Players[applicationClient1.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient1.Player.AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient2.Players[applicationClient1.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationServer.Players[applicationClient2.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient1.Players[applicationClient2.Player.ID].AvatarID); Assert.AreEqual(DefaultAvatarID, applicationClient2.Player.AvatarID); // Check Server player name Assert.AreEqual("New Server player", applicationServer.Player.Name); Assert.AreEqual("New Server player", applicationClient1.Players[applicationServer.Player.ID].Name); Assert.AreEqual("New Server player", applicationClient2.Players[applicationServer.Player.ID].Name); // Check Client1 player name Assert.AreEqual("New Client1 player", applicationServer.Players[applicationClient1.Player.ID].Name); Assert.AreEqual("New Client1 player", applicationClient1.Player.Name); Assert.AreEqual("New Client1 player", applicationClient2.Players[applicationClient1.Player.ID].Name); // Check Client2 player name Assert.AreEqual("Client2 player", applicationServer.Players[applicationClient2.Player.ID].Name); Assert.AreEqual("Client2 player", applicationClient1.Players[applicationClient2.Player.ID].Name); Assert.AreEqual("Client2 player", applicationClient2.Player.Name); #endregion //WM.Logger.Enabled = true; /* #region Test player state synchronisation * * var playerServerHeadPosition = new Vector3(1, 2, 3); * var playerClient1HeadPosition = new Vector3(4, 5, 6); * var playerClient2HeadPosition = new Vector3(7, 8, 9); * * // WHEN player state is updated * applicationServer.m_centerEyeAnchor.transform.position = playerServerHeadPosition; * applicationClient1.m_centerEyeAnchor.transform.position = playerClient1HeadPosition; * applicationClient2.m_centerEyeAnchor.transform.position = playerClient2HeadPosition; * * UpdateApplications(); * * WM.Logger.Enabled = false; * * foreach (var application in applications) * { * if (application != applicationServer) * Assert.AreEqual(playerServerHeadPosition, application.Players[applicationServer.Player.ID].Avatar.Head.transform.position); * * if (application != applicationClient1) * Assert.AreEqual(playerClient1HeadPosition, application.Players[applicationClient1.Player.ID].Avatar.Head.transform.position); * * if (application != applicationClient2) * Assert.AreEqual(playerClient2HeadPosition, application.Players[applicationClient2.Player.ID].Avatar.Head.transform.position); * } * #endregion Test player state synchronisation */ #region Disconnect Client2 applicationClient2.Logger.Header("Disconnect Client2"); // Make client1 application initialize network mode from 'Client' to 'Standalone'. Assert.AreEqual(NetworkMode.Client, applicationClient2.NetworkMode); applicationClient2.QueueCommand(new InitNetworkCommand(NetworkMode.Standalone)); Assert.AreEqual(NetworkMode.Client, applicationClient2.NetworkMode); UpdateApplications(); // Make queued commands execute. // Remote Client 1 should be disconnected. Assert.AreEqual(NetworkMode.Standalone, applicationClient2.NetworkMode); Assert.AreEqual(false, applicationClient2.Client.Connected); // Server should have 1 client connected (it's own). Assert.AreEqual(2, applicationServer.Server.NumClients); // Server and Client1 application are connected to the Server, and introduced their own Player. Assert.AreEqual(2, applicationServer.Players.Count); Assert.AreEqual(2, applicationClient1.Players.Count); Assert.AreEqual(0, applicationClient2.Players.Count); #endregion #region Disconnect Client1 applicationClient1.Logger.Header("Disconnect Client1"); // Make client1 application initialize network mode from 'Client' to 'Standalone'. Assert.AreEqual(NetworkMode.Client, applicationClient1.NetworkMode); applicationClient1.QueueCommand(new InitNetworkCommand(NetworkMode.Standalone)); Assert.AreEqual(NetworkMode.Client, applicationClient1.NetworkMode); UpdateApplications(); // Make queued commands execute. // Remote Client 1 should be disconnected. Assert.AreEqual(NetworkMode.Standalone, applicationClient1.NetworkMode); Assert.AreEqual(false, applicationClient1.Client.Connected); // Server should have 1 client connected (it's own). Assert.AreEqual(1, applicationServer.Server.NumClients); // Server application is connected to the Server, and introduced its own Player. Assert.AreEqual(1, applicationServer.Players.Count); Assert.AreEqual(0, applicationClient1.Players.Count); Assert.AreEqual(0, applicationClient2.Players.Count); #endregion StopServer(); }