Exemplo n.º 1
0
        public void SendToAllTest()
        {
            // message handlers
            NetworkServer.RegisterHandler <ConnectMessage>((conn, msg) => {}, false);
            NetworkServer.RegisterHandler <DisconnectMessage>((conn, msg) => {}, false);
            NetworkServer.RegisterHandler <ErrorMessage>((conn, msg) => {}, false);

            // listen
            NetworkServer.Listen(1);
            Assert.That(NetworkServer.connections.Count, Is.EqualTo(0));

            // add connection
            ULocalConnectionToClient connection = new ULocalConnectionToClient();

            connection.connectionToServer = new ULocalConnectionToServer();
            // set a client handler
            int called = 0;

            connection.connectionToServer.SetHandlers(new Dictionary <int, NetworkMessageDelegate>()
            {
                { MessagePacker.GetId <TestMessage>(), ((conn, reader, channelId) => ++ called) }
            });
            NetworkServer.AddConnection(connection);

            // create a message
            TestMessage message = new TestMessage {
                IntValue = 1, DoubleValue = 2, StringValue = "3"
            };

            // send it to all
            bool result = NetworkServer.SendToAll(message);

            Assert.That(result, Is.True);

            // update local connection once so that the incoming queue is processed
            connection.connectionToServer.Update();

            // was it send to and handled by the connection?
            Assert.That(called, Is.EqualTo(1));

            // clean up
            NetworkServer.Shutdown();
        }
Exemplo n.º 2
0
        public void SpawnMessageTest()
        {
            DoTest(0);
            DoTest(42);

            void DoTest(ulong testSceneId)
            {
                // try setting value with constructor
                SpawnMessage message = new SpawnMessage
                {
                    netId         = 42,
                    isLocalPlayer = true,
                    isOwner       = true,
                    sceneId       = testSceneId,
                    assetId       = Guid.NewGuid(),
                    position      = UnityEngine.Vector3.one,
                    rotation      = UnityEngine.Quaternion.identity,
                    scale         = UnityEngine.Vector3.one,
                    payload       = new ArraySegment <byte>(new byte[] { 0x01, 0x02 })
                };

                byte[]       arr   = MessagePacker.Pack(message);
                SpawnMessage fresh = MessagePacker.Unpack <SpawnMessage>(arr);

                Assert.That(fresh.netId, Is.EqualTo(message.netId));
                Assert.That(fresh.isLocalPlayer, Is.EqualTo(message.isLocalPlayer));
                Assert.That(fresh.isOwner, Is.EqualTo(message.isOwner));
                Assert.That(fresh.sceneId, Is.EqualTo(message.sceneId));
                if (fresh.sceneId == 0)
                {
                    Assert.That(fresh.assetId, Is.EqualTo(message.assetId));
                }
                Assert.That(fresh.position, Is.EqualTo(message.position));
                Assert.That(fresh.rotation, Is.EqualTo(message.rotation));
                Assert.That(fresh.scale, Is.EqualTo(message.scale));
                Assert.That(fresh.payload.Count, Is.EqualTo(message.payload.Count));
                for (int i = 0; i < fresh.payload.Count; ++i)
                {
                    Assert.That(fresh.payload.Array[fresh.payload.Offset + i],
                                Is.EqualTo(message.payload.Array[message.payload.Offset + i]));
                }
            }
        }
Exemplo n.º 3
0
        public void UpdateVarsMessageTest()
        {
            // try setting value with constructor
            var message = new UpdateVarsMessage
            {
                netId   = 42,
                payload = new ArraySegment <byte>(new byte[] { 0x01, 0x02 })
            };
            var arr   = MessagePacker.Pack(message);
            var fresh = MessagePacker.Unpack <UpdateVarsMessage>(arr);

            Assert.That(fresh.netId, Is.EqualTo(message.netId));
            Assert.That(fresh.payload.Count, Is.EqualTo(message.payload.Count));
            for (var i = 0; i < fresh.payload.Count; ++i)
            {
                Assert.That(fresh.payload.Array[fresh.payload.Offset + i],
                            Is.EqualTo(message.payload.Array[message.payload.Offset + i]));
            }
        }
Exemplo n.º 4
0
        public void OnDataReceivedInvalidConnectionIdTest()
        {
            // message handlers
            NetworkServer.RegisterHandler <ConnectMessage>((conn, msg) => { }, false);
            NetworkServer.RegisterHandler <DisconnectMessage>((conn, msg) => { }, false);
            NetworkServer.RegisterHandler <ErrorMessage>((conn, msg) => { }, false);

            // add one custom message handler
            bool wasReceived = false;
            NetworkConnection connectionReceived = null;
            TestMessage       messageReceived    = new TestMessage();

            NetworkServer.RegisterHandler <TestMessage>((conn, msg) =>
            {
                wasReceived        = true;
                connectionReceived = conn;
                messageReceived    = msg;
            }, false);

            // listen
            NetworkServer.Listen(1);
            Assert.That(NetworkServer.connections.Count, Is.EqualTo(0));

            // serialize a test message into an arraysegment
            TestMessage testMessage = new TestMessage {
                IntValue = 13, DoubleValue = 14, StringValue = "15"
            };
            NetworkWriter writer = new NetworkWriter();

            MessagePacker.Pack(testMessage, writer);
            ArraySegment <byte> segment = writer.ToArraySegment();

            // call transport.OnDataReceived with an invalid connectionId
            // an error log is expected.
            LogAssert.ignoreFailingMessages = true;
            Transport.activeTransport.OnServerDataReceived.Invoke(42, segment, 0);
            LogAssert.ignoreFailingMessages = false;

            // message handler should never be called
            Assert.That(wasReceived, Is.False);
            Assert.That(connectionReceived, Is.Null);
        }
        /// <summary>
        /// Does not supress errors invloving clients that already have visibility of this Network Behaviour.
        /// Server only.
        /// </summary>
        /// <param name="clientIDs"></param>
        public void NetworkShow(List <ulong> clientIDs, Stream spawnPayload = null)
        {
            //A faster message send bypassing MessageSender completely

            if (clientIDs == null)
            {
                throw new ArgumentNullException(nameof(clientIDs));
            }

            using (PooledBitStream baseStream = PooledBitStream.Get())
            {
                DoVisibleShowWrite(baseStream, spawnPayload);
                baseStream.PadStream();
                if (clientIDs.Count == 0)
                {
                    return;                      //No one to send to.
                }
                using (BitStream stream = MessagePacker.WrapMessage(networkBehaviourManager.spawnMessageType, 0, baseStream, SecuritySendFlags.None))
                {
                    for (int i = 0; i < clientIDs.Count; i++)
                    {
                        if (clientIDs[i] == NetworkManager.Get().serverID)
                        {
                            continue;
                        }
                        if (m_PendingObservers.Contains(clientIDs[i]))
                        {
                            Debug.LogError("This Network Behaviour is already pending visibility to client '" + clientIDs[i] + "'. Watch for a call to NetworkStart for when it successfully connects.", this);
                            continue;
                        }
                        if (m_Observers.Contains(clientIDs[i]))
                        {
                            Debug.LogError("This Network Behaviour is already pending visibility to client '" + clientIDs[i] + "'. Watch for a call to NetworkStart for when it successfully connects.", this);
                            continue;
                        }
                        m_PendingObservers.Add(clientIDs[i]);

                        NetworkManager.Get().transport.Send(clientIDs[i], new ArraySegment <byte>(stream.GetBuffer(), 0, (int)stream.Length), networkManager.networkInternalChannel);
                    }
                }
            }
        }
Exemplo n.º 6
0
        static public void SendToAll(byte messageType, byte channel, BitStream messageStream)
        {
            messageStream.PadStream();

            using (BitStream stream = MessagePacker.WrapMessage(messageType, 0, messageStream, SecuritySendFlags.None))
            {
                using (List <ulong> .Enumerator clients = NetworkManager.Get().clients)
                {
                    while (clients.MoveNext())
                    {
                        if (NetworkManager.Get().isServer&& clients.Current == NetworkManager.Get().serverID)
                        {
                            continue;
                        }

                        NetworkManager.Get().transport.Send(clients.Current, new ArraySegment <byte>(stream.GetBuffer(), 0, (int)stream.Length), channel);
                    }
                }
            }
        }
Exemplo n.º 7
0
        public void MessageInheirtanceWorksWithMultipleLayers()
        {
            const int     value1     = 10;
            const int     value2     = 13;
            const int     value3     = 15;
            Layer3Message intMessage = new Layer3Message
            {
                value1 = value1,
                value2 = value2,
                value3 = value3
            };

            byte[] data = MessagePacker.Pack(intMessage);

            Layer3Message unpacked = MessagePacker.Unpack <Layer3Message>(data);

            Assert.That(unpacked.value1, Is.EqualTo(value1));
            Assert.That(unpacked.value2, Is.EqualTo(value2));
            Assert.That(unpacked.value3, Is.EqualTo(value3));
        }
Exemplo n.º 8
0
        internal static void Send(byte messageType, string channelName, BitStream messageStream, SecuritySendFlags flags, NetworkedObject targetObject)
        {
            bool encrypted     = ((flags & SecuritySendFlags.Encrypted) == SecuritySendFlags.Encrypted) && NetworkingManager.Singleton.NetworkConfig.EnableEncryption;
            bool authenticated = ((flags & SecuritySendFlags.Authenticated) == SecuritySendFlags.Authenticated) && NetworkingManager.Singleton.NetworkConfig.EnableEncryption;

            if (authenticated || encrypted)
            {
                for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++)
                {
                    Send(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, messageType, channelName, messageStream, flags, targetObject);
                }
            }
            else
            {
                messageStream.PadStream();

                using (BitStream stream = MessagePacker.WrapMessage(messageType, 0, messageStream, flags))
                {
                    NetworkProfiler.StartEvent(TickType.Send, (uint)stream.Length, channelName, MLAPIConstants.MESSAGE_NAMES[messageType]);
                    for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++)
                    {
                        if (NetworkingManager.Singleton.IsServer && NetworkingManager.Singleton.ConnectedClientsList[i].ClientId == NetworkingManager.Singleton.ServerClientId)
                        {
                            continue;
                        }

                        if (targetObject != null && !targetObject.observers.Contains(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId))
                        {
                            if (NetworkLog.CurrentLogLevel <= LogLevel.Developer)
                            {
                                NetworkLog.LogWarning("Silently suppressed send(all) call because it was directed to an object without visibility");
                            }
                            continue;
                        }

                        NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ArraySegment <byte>(stream.GetBuffer(), 0, (int)stream.Length), channelName);
                    }
                    NetworkProfiler.EndEvent();
                }
            }
        }
Exemplo n.º 9
0
        public void HideForConnection()
        {
            // listen
            NetworkServer.Listen(1);
            Assert.That(NetworkServer.connections.Count, Is.EqualTo(0));

            // add connection
            ULocalConnectionToClient connection = new ULocalConnectionToClient();

            // required for ShowForConnection
            connection.isReady            = true;
            connection.connectionToServer = new ULocalConnectionToServer();
            // set a client handler
            int called = 0;

            connection.connectionToServer.SetHandlers(new Dictionary <int, NetworkMessageDelegate>()
            {
                { MessagePacker.GetId <ObjectHideMessage>(), ((conn, reader, channelId) => ++ called) }
            });
            NetworkServer.AddConnection(connection);

            // create a gameobject and networkidentity
            NetworkIdentity identity = new GameObject().AddComponent <NetworkIdentity>();

            identity.connectionToClient = connection;

            // call HideForConnection
            NetworkServer.HideForConnection(identity, connection);

            // update local connection once so that the incoming queue is processed
            connection.connectionToServer.Update();

            // was it sent to and handled by the connection?
            Assert.That(called, Is.EqualTo(1));

            // clean up
            NetworkServer.Shutdown();
            // destroy GO after shutdown, otherwise isServer is true in OnDestroy and it tries to call
            // GameObject.Destroy (but we need DestroyImmediate in Editor)
            GameObject.DestroyImmediate(identity.gameObject);
        }
Exemplo n.º 10
0
        public void TestUnpackIdMismatch()
        {
            // Unpack<T> has a id != msgType case that throws a FormatException.
            // let's try to trigger it.

            SceneMessage message = new SceneMessage()
            {
                sceneName      = "Hello world",
                sceneOperation = SceneOperation.LoadAdditive
            };

            byte[] data = MessagePacker.Pack(message);

            // overwrite the id
            data[0] = 0x01;
            data[1] = 0x02;

            Assert.Throws <FormatException>(() => {
                SceneMessage unpacked = MessagePacker.Unpack <SceneMessage>(data);
            });
        }
Exemplo n.º 11
0
        private void HandleIncomingData(ulong sendingClientID, byte channel, ArraySegment <byte> data, float receiveTime)
        {
            if (enableLogging)
            {
                Debug.Log("Unwrapping Data Header");
            }

            inputStreamWrapper.SetTarget(data.Array);
            inputStreamWrapper.SetLength(data.Count + data.Offset);
            inputStreamWrapper.Position = data.Offset;

            using (BitStream messageStream = MessagePacker.UnwrapMessage(inputStreamWrapper, sendingClientID, out byte messageType, out SecuritySendFlags security))
            {
                if (messageStream == null)
                {
                    Debug.LogError("Message unwrap could not be completed. Was the header corrupt? Crypto error?");
                    return;
                }
                else if (messageType == (byte)MessageType.INVALID)
                {
                    Debug.LogError("Message unwrap read an invalid messageType");
                    return;
                }

                uint headerByteSize = (uint)Arithmetic.VarIntSize(messageType);

                //if(enableLogging)
                //Debug.Log("Data Header: messageType=" + m_MessageHandler.GetMessageName(messageType) + "(" + messageType + ")");

                // Client tried to send a network message that was not the connection request before they were accepted
                if (m_PendingClientsDictionary.ContainsKey(sendingClientID) && m_PendingClientsDictionary[sendingClientID].connectionState == PendingClient.State.PendingConnection && messageType != (byte)MessageType.NETWORK_CONNECTION_REQUEST)
                {
                    Debug.LogWarning("Message received from clientID " + sendingClientID + " before it has been accepted. Message type: (" + messageType.ToString() + ") " + m_MessageHandler.GetMessageName(messageType));
                    return;
                }

                //Handle Message
                m_MessageHandler.HandleMessage(sendingClientID, messageType, messageStream, receiveTime);
            }
        }
Exemplo n.º 12
0
        public void SendsData()
        {
            Message message = new Message
            {
                collection = new string[]
                {
                    "Some", "String", "Value"
                }
            };

            byte[] data = MessagePackerTest.PackToByteArray(message);

            Message unpacked = MessagePacker.Unpack <Message>(data);

            string[] unpackedCollection = unpacked.collection;

            Assert.IsNotNull(unpackedCollection);
            Assert.IsNotEmpty(unpackedCollection);
            Assert.That(unpackedCollection[0], Is.EqualTo("Some"));
            Assert.That(unpackedCollection[1], Is.EqualTo("String"));
            Assert.That(unpackedCollection[2], Is.EqualTo("Value"));
        }
Exemplo n.º 13
0
        public void SendsData()
        {
            Message message = new Message
            {
                collection = new Vector3[]
                {
                    new Vector3(1, 2, 3), new Vector3(4, 5, 6), new Vector3(7, 8, 9)
                }
            };

            byte[] data = MessagePackerTest.PackToByteArray(message);

            Message unpacked = MessagePacker.Unpack <Message>(data);

            Vector3[] unpackedCollection = unpacked.collection;

            Assert.IsNotNull(unpackedCollection);
            Assert.IsNotEmpty(unpackedCollection);
            Assert.That(unpackedCollection[0], Is.EqualTo(new Vector3(1, 2, 3)));
            Assert.That(unpackedCollection[1], Is.EqualTo(new Vector3(4, 5, 6)));
            Assert.That(unpackedCollection[2], Is.EqualTo(new Vector3(7, 8, 9)));
        }
Exemplo n.º 14
0
        public void TestUnpackIdMismatch()
        {
            // Unpack<T> has a id != msgType case that throws a FormatException.
            // let's try to trigger it.

            var message = new SceneMessage
            {
                MainActivateScene = "Hello world",
                SceneOperation    = SceneOperation.LoadAdditive
            };

            var data = MessagePacker.Pack(message);

            // overwrite the id
            data[0] = 0x01;
            data[1] = 0x02;

            Assert.Throws <FormatException>(delegate
            {
                _ = MessagePacker.Unpack <SceneMessage>(data);
            });
        }
Exemplo n.º 15
0
        public void SendsData()
        {
            Message message = new Message
            {
                collection = new int[]
                {
                    3, 4, 5
                }
            };

            byte[] data = MessagePackerTest.PackToByteArray(message);

            Message unpacked = MessagePacker.Unpack <Message>(data);

            int[] unpackedCollection = unpacked.collection;

            Assert.IsNotNull(unpackedCollection);
            Assert.IsNotEmpty(unpackedCollection);
            Assert.That(unpackedCollection[0], Is.EqualTo(3));
            Assert.That(unpackedCollection[1], Is.EqualTo(4));
            Assert.That(unpackedCollection[2], Is.EqualTo(5));
        }
Exemplo n.º 16
0
        internal static void Send(ulong clientId, byte messageType, NetworkChannel networkChannel, NetworkBuffer messageBuffer)
        {
            messageBuffer.PadBuffer();

            if (NetworkManager.Singleton.IsServer && clientId == NetworkManager.Singleton.ServerClientId)
            {
                return;
            }

            using (var buffer = MessagePacker.WrapMessage(messageType, messageBuffer))
            {
                NetworkProfiler.StartEvent(TickType.Send, (uint)buffer.Length, networkChannel, NetworkConstants.MESSAGE_NAMES[messageType]);

                NetworkManager.Singleton.NetworkConfig.NetworkTransport.Send(clientId, new ArraySegment <byte>(buffer.GetBuffer(), 0, (int)buffer.Length), networkChannel);
                ProfilerStatManager.BytesSent.Record((int)buffer.Length);
                PerformanceDataManager.Increment(ProfilerConstants.ByteSent, (int)buffer.Length);

#if !UNITY_2020_2_OR_NEWER
                NetworkProfiler.EndEvent();
#endif
            }
        }
Exemplo n.º 17
0
        public void RpcMessageTest()
        {
            // try setting value with constructor
            var message = new RpcMessage
            {
                netId          = 42,
                componentIndex = 4,
                functionIndex  = 3,
                payload        = new ArraySegment <byte>(new byte[] { 0x01, 0x02 })
            };
            var arr   = MessagePacker.Pack(message);
            var fresh = MessagePacker.Unpack <RpcMessage>(arr);

            Assert.That(fresh.netId, Is.EqualTo(message.netId));
            Assert.That(fresh.componentIndex, Is.EqualTo(message.componentIndex));
            Assert.That(fresh.functionIndex, Is.EqualTo(message.functionIndex));
            Assert.That(fresh.payload.Count, Is.EqualTo(message.payload.Count));
            for (var i = 0; i < fresh.payload.Count; ++i)
            {
                Assert.That(fresh.payload.Array[fresh.payload.Offset + i],
                            Is.EqualTo(message.payload.Array[message.payload.Offset + i]));
            }
        }
        /// <summary>
        /// Hides an object from a specific clients.
        /// Server only.
        /// </summary>
        /// <param name="clientIDs">The clients to hide the object from.</param>
        public void NetworkHide(List <ulong> clientIDs)
        {
            //A faster message send bypassing MessageSender completely

            if (clientIDs == null)
            {
                throw new ArgumentNullException(nameof(clientIDs));
            }

            using (PooledBitStream baseStream = PooledBitStream.Get())
            {
                DoVisibleHideWrite(baseStream);
                baseStream.PadStream();
                if (clientIDs.Count == 0)
                {
                    return;                      //No one to send to.
                }
                using (BitStream stream = MessagePacker.WrapMessage(networkBehaviourManager.unspawnMessageType, 0, baseStream, SecuritySendFlags.None))
                {
                    for (int i = 0; i < clientIDs.Count; i++)
                    {
                        if (clientIDs[i] == networkManager.serverID)
                        {
                            continue;
                        }
                        if (!m_PendingObservers.Remove(clientIDs[i]) && !m_Observers.Remove(clientIDs[i]))
                        {
                            Debug.LogError("This Network Behaviour is already not visible to client '" + clientIDs[i] + "'.", this);
                            continue;
                        }

                        networkManager.transport.Send(clientIDs[i], new ArraySegment <byte>(stream.GetBuffer(), 0, (int)stream.Length), networkManager.networkInternalChannel);
                    }
                }
            }
        }
Exemplo n.º 19
0
        public void SyncEventMessageTest()
        {
            // try setting value with constructor
            SyncEventMessage message = new SyncEventMessage
            {
                netId          = 42,
                componentIndex = 4,
                functionHash   = 0xABCDEF,
                payload        = new ArraySegment <byte>(new byte[] { 0x01, 0x02 })
            };

            byte[]           arr   = MessagePacker.Pack(message);
            SyncEventMessage fresh = MessagePacker.Unpack <SyncEventMessage>(arr);

            Assert.That(fresh.netId, Is.EqualTo(message.netId));
            Assert.That(fresh.componentIndex, Is.EqualTo(message.componentIndex));
            Assert.That(fresh.functionHash, Is.EqualTo(message.functionHash));
            Assert.That(fresh.payload.Count, Is.EqualTo(message.payload.Count));
            for (int i = 0; i < fresh.payload.Count; ++i)
            {
                Assert.That(fresh.payload.Array[fresh.payload.Offset + i],
                            Is.EqualTo(message.payload.Array[message.payload.Offset + i]));
            }
        }
        public void TestUnpackMessageNonGeneric()
        {
            // try a regular message
            SceneMessage message = new SceneMessage()
            {
                sceneName      = "Hello world",
                sceneOperation = SceneOperation.LoadAdditive
            };

            byte[]        data   = MessagePacker.Pack(message);
            NetworkReader reader = new NetworkReader(data);

            bool result = MessagePacker.UnpackMessage(reader, out int msgType);

            Assert.That(result, Is.EqualTo(true));
            Assert.That(msgType, Is.EqualTo(BitConverter.ToUInt16(data, 0)));

            // try an invalid message
            NetworkReader reader2 = new NetworkReader(new byte[0]);
            bool          result2 = MessagePacker.UnpackMessage(reader2, out int msgType2);

            Assert.That(result2, Is.EqualTo(false));
            Assert.That(msgType2, Is.EqualTo(0));
        }
Exemplo n.º 21
0
        /// <summary>
        /// Changes the owner of the object. Can only be called from the server or the owner of this Network Behaviour.
        /// </summary>
        /// <param name="targetClientID">The new owner clientId</param>
        public void SetOwner(ulong targetClientID)
        {
            if (!networkManager.isRunning)
            {
                Debug.LogError("Cannot set ownership. The network is not running.");
                return;
            }

            if (!isServer)
            {
                if (isOwner && targetClientID == networkManager.serverID)
                {
                    RemoveOwnership();
                    return;
                }
                throw new NotServerException("Only the server can call NetworkBehaviour.SetOwner to target anything but the server.");
            }

            if (!isNetworkSpawned)
            {
                throw new NetworkException("Cannot change ownership. This Network Behaviour is not spawned.");
            }

            if (!IsNetworkVisibleTo(targetClientID))
            {
                throw new NetworkException("Cannot change ownership to a client that does not have visibility of this Network Behaviour.");
            }

            //Owner does not change
            if (targetClientID == ownerID)
            {
                return;
            }

            if (targetClientID == networkManager.serverID)
            {
                RemoveOwnership();
                return;
            }

            if (isOwner)
            {
                m_OwnerClientID = targetClientID;
                OnLostOwnership();
            }
            else //This may seem redundant but we want ownership changes to be set before the OnLostOwnership call
            {
                m_OwnerClientID = targetClientID;
            }

            //Send to all (not pending)observers
            using (PooledBitStream baseStream = PooledBitStream.Get())
            {
                DoOwnershipWrite(baseStream, targetClientID);
                baseStream.PadStream();

                using (BitStream stream = MessagePacker.WrapMessage(networkBehaviourManager.ownerChangeMessageType, 0, baseStream, SecuritySendFlags.None))
                {
                    using (HashSet <ulong> .Enumerator observers = GetObservers())
                    {
                        while (observers.MoveNext())
                        {
                            if (observers.Current == NetworkManager.Get().serverID)
                            {
                                continue;
                            }

                            NetworkManager.Get().transport.Send(observers.Current, new ArraySegment <byte>(stream.GetBuffer(), 0, (int)stream.Length), networkManager.networkInternalChannel);
                        }
                    }
                }
            }
        }
Exemplo n.º 22
0
        public void CommandMessageCallsCommandTest()
        {
            // listen
            NetworkServer.Listen(1);
            Assert.That(NetworkServer.connections.Count, Is.EqualTo(0));

            // add connection
            ULocalConnectionToClient connection = new ULocalConnectionToClient();

            connection.connectionToServer = new ULocalConnectionToServer();
            NetworkServer.AddConnection(connection);

            // set as authenticated, otherwise removeplayer is rejected
            connection.isAuthenticated = true;

            // add an identity with two networkbehaviour components
            GameObject      go       = new GameObject();
            NetworkIdentity identity = go.AddComponent <NetworkIdentity>();

            identity.netId = 42;
            // for authority check
            identity.connectionToClient = connection;
            CommandTestNetworkBehaviour comp0 = go.AddComponent <CommandTestNetworkBehaviour>();

            Assert.That(comp0.called, Is.EqualTo(0));
            CommandTestNetworkBehaviour comp1 = go.AddComponent <CommandTestNetworkBehaviour>();

            Assert.That(comp1.called, Is.EqualTo(0));
            connection.identity = identity;

            // register the command delegate, otherwise it's not found
            NetworkBehaviour.RegisterCommandDelegate(typeof(CommandTestNetworkBehaviour), nameof(CommandTestNetworkBehaviour.CommandGenerated), CommandTestNetworkBehaviour.CommandGenerated);

            // identity needs to be in spawned dict, otherwise command handler
            // won't find it
            NetworkIdentity.spawned[identity.netId] = identity;

            // serialize a removeplayer message into an arraysegment
            CommandMessage message = new CommandMessage
            {
                componentIndex = 0,
                functionHash   = NetworkBehaviour.GetMethodHash(typeof(CommandTestNetworkBehaviour), nameof(CommandTestNetworkBehaviour.CommandGenerated)),
                netId          = identity.netId,
                payload        = new ArraySegment <byte>(new byte[0])
            };
            NetworkWriter writer = new NetworkWriter();

            MessagePacker.Pack(message, writer);
            ArraySegment <byte> segment = writer.ToArraySegment();

            // call transport.OnDataReceived with the message
            // -> calls NetworkServer.OnRemovePlayerMessage
            //    -> destroys conn.identity and sets it to null
            Transport.activeTransport.OnServerDataReceived.Invoke(0, segment, 0);

            // was the command called in the first component, not in the second one?
            Assert.That(comp0.called, Is.EqualTo(1));
            Assert.That(comp1.called, Is.EqualTo(0));

            //  send another command for the second component
            comp0.called           = 0;
            message.componentIndex = 1;
            writer = new NetworkWriter();
            MessagePacker.Pack(message, writer);
            segment = writer.ToArraySegment();
            Transport.activeTransport.OnServerDataReceived.Invoke(0, segment, 0);

            // was the command called in the second component, not in the first one?
            Assert.That(comp0.called, Is.EqualTo(0));
            Assert.That(comp1.called, Is.EqualTo(1));

            // sending a command without authority should fail
            // (= if connectionToClient is not what we received the data on)
            // set wrong authority
            identity.connectionToClient = new ULocalConnectionToClient();
            comp0.called = 0;
            comp1.called = 0;
            Transport.activeTransport.OnServerDataReceived.Invoke(0, segment, 0);
            Assert.That(comp0.called, Is.EqualTo(0));
            Assert.That(comp1.called, Is.EqualTo(0));
            // restore authority
            identity.connectionToClient = connection;

            // sending a component with wrong netId should fail
            // wrong netid
            message.netId += 1;
            writer         = new NetworkWriter();
            // need to serialize the message again with wrong netid
            MessagePacker.Pack(message, writer);
            ArraySegment <byte> segmentWrongNetId = writer.ToArraySegment();

            comp0.called = 0;
            comp1.called = 0;
            Transport.activeTransport.OnServerDataReceived.Invoke(0, segmentWrongNetId, 0);
            Assert.That(comp0.called, Is.EqualTo(0));
            Assert.That(comp1.called, Is.EqualTo(0));

            // clean up
            NetworkBehaviour.ClearDelegates();
            NetworkIdentity.spawned.Clear();
            NetworkBehaviour.ClearDelegates();
            NetworkServer.Shutdown();
            // destroy the test gameobject AFTER server was stopped.
            // otherwise isServer is true in OnDestroy, which means it would try
            // to call Destroy(go). but we need to use DestroyImmediate in
            // Editor
            GameObject.DestroyImmediate(go);
        }
Exemplo n.º 23
0
 void Send(long sid, MsgBase msg)
 {
     byte[] data = MessagePacker.Pack(msg);
     server.Send(sid, data);
 }
 public void Initialize()
 {
     _packer = new MessagePacker("test");
 }
 public void Initialize()
 {
     _packer = new MessagePacker("test");
 }
        public void MessageHandlerReceivedMessageServerClient()
        {
            // Init
            var gameObject     = new GameObject(nameof(MessageHandlerReceivedMessageServerClient));
            var networkManager = gameObject.AddComponent <NetworkManager>();
            var transport      = gameObject.AddComponent <DummyTransport>();

            // MLAPI sets this in validate
            networkManager.NetworkConfig = new NetworkConfig()
            {
                // Set the current scene to prevent unexpected log messages which would trigger a failure
                RegisteredScenes = new List <string>()
                {
                    SceneManager.GetActiveScene().name
                }
            };

            // Set dummy transport that does nothing
            networkManager.NetworkConfig.NetworkTransport = transport;

            // Replace the real message handler with a dummy one that just prints a result
            networkManager.MessageHandler = new DummyMessageHandler();

            using (var inputBuffer = new NetworkBuffer())
            {
                // Start server since pre-message-handler passes IsServer & IsClient checks
                networkManager.StartServer();

                // Disable batching to make the RPCs come straight through
                // This has to be done post start
                networkManager.RpcQueueContainer.EnableBatchedRpcs(false);

                // Should cause log (server only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleConnectionRequest));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CONNECTION_REQUEST, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should not cause log (client only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CONNECTION_APPROVED, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should not cause log (client only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.ADD_OBJECT, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should not cause log (client only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.DESTROY_OBJECT, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should not cause log (client only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.SWITCH_SCENE, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should not cause log (client only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CHANGE_OWNER, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should not cause log (client only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.ADD_OBJECTS, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should not cause log (client only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.DESTROY_OBJECTS, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should not cause log (client only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.TIME_SYNC, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (server and client)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNetworkVariableDelta));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.NETWORK_VARIABLE_DELTA, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (server and client)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNetworkVariableUpdate));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.NETWORK_VARIABLE_UPDATE, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (server and client)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleUnnamedMessage));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.UNNAMED_MESSAGE, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (server and client)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNamedMessage));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.NAMED_MESSAGE, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (server only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleClientSwitchSceneCompleted));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CLIENT_SWITCH_SCENE_COMPLETED, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (server only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNetworkLog));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.SERVER_LOG, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (server only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.RpcReceiveQueueItem));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.SERVER_RPC, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should not cause log (client only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CLIENT_RPC, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Stop server to trigger full shutdown
                networkManager.StopServer();

                // Replace the real message handler with a dummy one that just prints a result
                networkManager.MessageHandler = new DummyMessageHandler();

                // Start client since pre-message-handler passes IsServer & IsClient checks
                networkManager.StartClient();

                // Disable batching to make the RPCs come straight through
                // This has to be done post start (and post restart since the queue container is reset)
                networkManager.RpcQueueContainer.EnableBatchedRpcs(false);

                // Should not cause log (server only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CONNECTION_REQUEST, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (client only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleConnectionApproved));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CONNECTION_APPROVED, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (client only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleAddObject));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.ADD_OBJECT, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (client only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleDestroyObject));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.DESTROY_OBJECT, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (client only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleSwitchScene));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.SWITCH_SCENE, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (client only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleChangeOwner));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CHANGE_OWNER, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (client only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleAddObjects));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.ADD_OBJECTS, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (client only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleDestroyObjects));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.DESTROY_OBJECTS, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (client only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleTimeSync));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.TIME_SYNC, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (server and client)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNetworkVariableDelta));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.NETWORK_VARIABLE_DELTA, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (server and client)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNetworkVariableUpdate));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.NETWORK_VARIABLE_UPDATE, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (server and client)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleUnnamedMessage));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.UNNAMED_MESSAGE, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (server and client)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNamedMessage));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.NAMED_MESSAGE, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should not cause log (server only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CLIENT_SWITCH_SCENE_COMPLETED, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should not cause log (server only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.SERVER_LOG, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should not cause log (server only)
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.SERVER_RPC, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Should cause log (client only)
                LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.RpcReceiveQueueItem));
                using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CLIENT_RPC, inputBuffer))
                {
                    networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment <byte>(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true);
                }

                // Full cleanup
                networkManager.StopClient();
            }

            // Ensure no missmatches with expectations
            LogAssert.NoUnexpectedReceived();

            // Cleanup
            Object.DestroyImmediate(gameObject);
        }
Exemplo n.º 27
0
        public void RegisterUnregisterClearHandlerTest()
        {
            // message handlers that are needed for the test
            NetworkServer.RegisterHandler <ConnectMessage>((conn, msg) => { }, false);
            NetworkServer.RegisterHandler <DisconnectMessage>((conn, msg) => { }, false);
            NetworkServer.RegisterHandler <ErrorMessage>((conn, msg) => { }, false);


            // RegisterHandler(conn, msg) variant
            int variant1Called = 0;

            NetworkServer.RegisterHandler <TestMessage>((conn, msg) => { ++variant1Called; }, false);

            // RegisterHandler(msg) variant
            int variant2Called = 0;

            NetworkServer.RegisterHandler <WovenTestMessage>(msg => { ++variant2Called; }, false);

            // listen
            NetworkServer.Listen(1);
            Assert.That(NetworkServer.connections.Count, Is.EqualTo(0));

            // add a connection
            NetworkConnectionToClient connection = new NetworkConnectionToClient(42);

            NetworkServer.AddConnection(connection);
            Assert.That(NetworkServer.connections.Count, Is.EqualTo(1));

            // serialize first message, send it to server, check if it was handled
            NetworkWriter writer = new NetworkWriter();

            MessagePacker.Pack(new TestMessage(), writer);
            Transport.activeTransport.OnServerDataReceived.Invoke(42, writer.ToArraySegment(), 0);
            Assert.That(variant1Called, Is.EqualTo(1));

            // serialize second message, send it to server, check if it was handled
            writer = new NetworkWriter();
            MessagePacker.Pack(new WovenTestMessage(), writer);
            Transport.activeTransport.OnServerDataReceived.Invoke(42, writer.ToArraySegment(), 0);
            Assert.That(variant2Called, Is.EqualTo(1));

            // unregister first handler, send, should fail
            NetworkServer.UnregisterHandler <TestMessage>();
            writer = new NetworkWriter();
            MessagePacker.Pack(new TestMessage(), writer);
            // log error messages are expected
            LogAssert.ignoreFailingMessages = true;
            Transport.activeTransport.OnServerDataReceived.Invoke(42, writer.ToArraySegment(), 0);
            LogAssert.ignoreFailingMessages = false;
            // still 1, not 2
            Assert.That(variant1Called, Is.EqualTo(1));

            // unregister second handler via ClearHandlers to test that one too. send, should fail
            NetworkServer.ClearHandlers();
            // (only add this one to avoid disconnect error)
            NetworkServer.RegisterHandler <DisconnectMessage>((conn, msg) => { }, false);
            writer = new NetworkWriter();
            MessagePacker.Pack(new TestMessage(), writer);
            // log error messages are expected
            LogAssert.ignoreFailingMessages = true;
            Transport.activeTransport.OnServerDataReceived.Invoke(42, writer.ToArraySegment(), 0);
            LogAssert.ignoreFailingMessages = false;
            // still 1, not 2
            Assert.That(variant2Called, Is.EqualTo(1));

            // clean up
            NetworkServer.Shutdown();
        }
Exemplo n.º 28
0
 public TcpClient()
 {
     packetPool    = new PacketPool();
     messagePacker = new MessagePacker();
     isConnected   = 0;
 }