From 5feaff8524845d3475c02d1ba96465925e65e34a Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Thu, 30 Oct 2008 22:32:23 +0000 Subject: [PATCH] test: Extend malformed packet test to actually check that a valid packet can get through after the malformed ones have been sent --- OpenSim/Framework/ClientManager.cs | 2 + .../ClientStack/LindenUDP/LLClientView.cs | 4 +- .../LindenUDP/Tests/BasicCircuitTests.cs | 47 +++++++++--- .../ClientStack/LindenUDP/Tests/MockScene.cs | 21 +++++- .../LindenUDP/Tests/TestLLPacketServer.cs | 74 +++++++++++++++++++ .../LindenUDP/Tests/TestLLUDPServer.cs | 5 +- OpenSim/Region/Environment/Scenes/Scene.cs | 5 -- .../Region/Environment/Scenes/SceneBase.cs | 5 +- 8 files changed, 140 insertions(+), 23 deletions(-) create mode 100644 OpenSim/Region/ClientStack/LindenUDP/Tests/TestLLPacketServer.cs diff --git a/OpenSim/Framework/ClientManager.cs b/OpenSim/Framework/ClientManager.cs index 4ac9b3ccb3..3f83f5cf1b 100644 --- a/OpenSim/Framework/ClientManager.cs +++ b/OpenSim/Framework/ClientManager.cs @@ -97,8 +97,10 @@ namespace OpenSim.Framework { IClientAPI client; bool tryGetRet = false; + lock (m_clients) tryGetRet = m_clients.TryGetValue(circuitCode, out client); + if (tryGetRet) { client.InPacket(packet); diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 848d31c7a7..07af65d7cc 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -4804,10 +4804,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP break; case PacketType.ObjectName: ObjectNamePacket objName = (ObjectNamePacket)Pack; - + handlerObjectName = null; for (int i = 0; i < objName.ObjectData.Length; i++) - { + { handlerObjectName = OnObjectName; if (handlerObjectName != null) { diff --git a/OpenSim/Region/ClientStack/LindenUDP/Tests/BasicCircuitTests.cs b/OpenSim/Region/ClientStack/LindenUDP/Tests/BasicCircuitTests.cs index c75a5b3392..352f697660 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/Tests/BasicCircuitTests.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/Tests/BasicCircuitTests.cs @@ -26,9 +26,9 @@ */ using System.Net; -//using System.Threading; using log4net; using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; using OpenMetaverse; using OpenMetaverse.Packets; using OpenSim.Framework; @@ -60,9 +60,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests /// /// Add a client for testing /// + /// /// + /// /// Agent circuit manager used in setting up the stack - protected void SetupStack(out TestLLUDPServer testLLUDPServer, out AgentCircuitManager acm) + protected void SetupStack( + IScene scene, out TestLLUDPServer testLLUDPServer, out TestLLPacketServer testPacketServer, + out AgentCircuitManager acm) { ClientStackUserSettings userSettings = new ClientStackUserSettings(); testLLUDPServer = new TestLLUDPServer(); @@ -70,8 +74,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests uint port = 666; testLLUDPServer.Initialise(null, ref port, 0, false, userSettings, null, acm); - new LLPacketServer(testLLUDPServer, userSettings); - testLLUDPServer.LocalScene = new MockScene(); + testPacketServer = new TestLLPacketServer(testLLUDPServer, userSettings); + testLLUDPServer.LocalScene = scene; } /// @@ -117,8 +121,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests UUID mySessionUuid = UUID.Parse("00000000-0000-0000-0000-000000000002"); TestLLUDPServer testLLUDPServer; + TestLLPacketServer testLLPacketServer; AgentCircuitManager acm; - SetupStack(out testLLUDPServer, out acm); + SetupStack(new MockScene(), out testLLUDPServer, out testLLPacketServer, out acm); AgentCircuitData acd = new AgentCircuitData(); acd.AgentID = myAgentUuid; @@ -160,8 +165,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests uint myCircuitCode = 123457; TestLLUDPServer testLLUDPServer; + TestLLPacketServer testLLPacketServer; AgentCircuitManager acm; - SetupStack(out testLLUDPServer, out acm); + SetupStack(new MockScene(), out testLLUDPServer, out testLLPacketServer, out acm); AddClient(myCircuitCode, new IPEndPoint(IPAddress.Loopback, 1000), testLLUDPServer, acm); testLLUDPServer.RemoveClientCircuit(myCircuitCode); @@ -179,20 +185,41 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests public void TestMalformedPacketSend() { uint myCircuitCode = 123458; - EndPoint testEp = new IPEndPoint(IPAddress.Loopback, 1001); + EndPoint testEp = new IPEndPoint(IPAddress.Loopback, 1001); + MockScene scene = new MockScene(); TestLLUDPServer testLLUDPServer; + TestLLPacketServer testLLPacketServer; AgentCircuitManager acm; - SetupStack(out testLLUDPServer, out acm); + SetupStack(scene, out testLLUDPServer, out testLLPacketServer, out acm); AddClient(myCircuitCode, testEp, testLLUDPServer, acm); - + byte[] data = new byte[] { 0x01, 0x02, 0x03, 0x04 }; - + + // Send two garbled 'packets' in succession + testLLUDPServer.LoadReceive(data, testEp); testLLUDPServer.LoadReceive(data, testEp); testLLUDPServer.ReceiveData(null); // Check that we are still here Assert.IsTrue(testLLUDPServer.HasCircuit(myCircuitCode)); + Assert.That(testLLPacketServer.GetTotalPacketsReceived(), Is.EqualTo(0)); + + // Check that sending a valid packet to same circuit still succeeds + Assert.That(scene.ObjectNameCallsReceived, Is.EqualTo(0)); + + ObjectNamePacket onp = new ObjectNamePacket(); + ObjectNamePacket.ObjectDataBlock odb = new ObjectNamePacket.ObjectDataBlock(); + odb.LocalID = 1; + odb.Name = Utils.StringToBytes("helloooo"); + onp.ObjectData = new ObjectNamePacket.ObjectDataBlock[] { odb }; + onp.Header.Zerocoded = false; + + testLLUDPServer.LoadReceive(onp, testEp); + testLLUDPServer.ReceiveData(null); + + Assert.That(testLLPacketServer.GetTotalPacketsReceived(), Is.EqualTo(1)); + Assert.That(testLLPacketServer.GetPacketsReceivedFor(PacketType.ObjectName), Is.EqualTo(1)); } } } diff --git a/OpenSim/Region/ClientStack/LindenUDP/Tests/MockScene.cs b/OpenSim/Region/ClientStack/LindenUDP/Tests/MockScene.cs index 4981a1dfb8..4c8ee9cb43 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/Tests/MockScene.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/Tests/MockScene.cs @@ -36,6 +36,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests /// public class MockScene : SceneBase { + public int ObjectNameCallsReceived + { + get { return m_objectNameCallsReceived; } + } + protected int m_objectNameCallsReceived; + public MockScene() { m_regInfo = new RegionInfo(1000, 1000, null, null); @@ -44,9 +50,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests public override void Update() {} public override void LoadWorldMap() {} - public override void AddNewClient(IClientAPI client, bool child) {} + + public override void AddNewClient(IClientAPI client, bool child) + { + client.OnObjectName += RecordObjectNameCall; + } + public override void RemoveClient(UUID agentID) {} public override void CloseAllAgents(uint circuitcode) {} public override bool OtherRegionUp(RegionInfo thisRegion) { return false; } + + /// + /// Doesn't really matter what the call is - we're using this to test that a packet has actually been received + /// + protected void RecordObjectNameCall(IClientAPI remoteClient, uint localID, string message) + { + m_objectNameCallsReceived++; + } } } diff --git a/OpenSim/Region/ClientStack/LindenUDP/Tests/TestLLPacketServer.cs b/OpenSim/Region/ClientStack/LindenUDP/Tests/TestLLPacketServer.cs new file mode 100644 index 0000000000..507fe8234f --- /dev/null +++ b/OpenSim/Region/ClientStack/LindenUDP/Tests/TestLLPacketServer.cs @@ -0,0 +1,74 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System.Collections.Generic; +using OpenMetaverse; +using OpenMetaverse.Packets; +using OpenSim.Region.ClientStack.LindenUDP; + +namespace OpenSim.Region.ClientStack.LindenUDP.Tests +{ + public class TestLLPacketServer : LLPacketServer + { + /// + /// Record counts of packets received + /// + protected Dictionary m_packetsReceived = new Dictionary(); + + public TestLLPacketServer(ILLClientStackNetworkHandler networkHandler, ClientStackUserSettings userSettings) + : base(networkHandler, userSettings) + {} + + public override void InPacket(uint circuitCode, Packet packet) + { + base.InPacket(circuitCode, packet); + + if (m_packetsReceived.ContainsKey(packet.Type)) + m_packetsReceived[packet.Type]++; + else + m_packetsReceived[packet.Type] = 1; + } + + public int GetTotalPacketsReceived() + { + int totalCount = 0; + + foreach (int count in m_packetsReceived.Values) + totalCount += count; + + return totalCount; + } + + public int GetPacketsReceivedFor(PacketType packetType) + { + if (m_packetsReceived.ContainsKey(packetType)) + return m_packetsReceived[packetType]; + else + return 0; + } + } +} diff --git a/OpenSim/Region/ClientStack/LindenUDP/Tests/TestLLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/Tests/TestLLUDPServer.cs index 95ee516349..dd7afd3565 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/Tests/TestLLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/Tests/TestLLUDPServer.cs @@ -91,12 +91,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests } /// - /// Calls the protected asynchronous result method + /// Calls the protected asynchronous result method. This fires out all data chunks currently queued for send /// /// public void ReceiveData(IAsyncResult result) { - OnReceivedData(result); + while (m_chunksToLoad.Count > 0) + OnReceivedData(result); } /// diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 77afc43c71..0dd89aee03 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -2185,11 +2185,6 @@ namespace OpenSim.Region.Environment.Scenes #region Add/Remove Avatar Methods - /// - /// Register the new client with the scene - /// - /// public override void AddNewClient(IClientAPI client, bool child) { SubscribeToClientEvents(client); diff --git a/OpenSim/Region/Environment/Scenes/SceneBase.cs b/OpenSim/Region/Environment/Scenes/SceneBase.cs index 7a3e58f8ff..a1d8f67918 100644 --- a/OpenSim/Region/Environment/Scenes/SceneBase.cs +++ b/OpenSim/Region/Environment/Scenes/SceneBase.cs @@ -130,10 +130,9 @@ namespace OpenSim.Region.Environment.Scenes #region Add/Remove Agent/Avatar /// - /// + /// Register the new client with the scene /// - /// - /// + /// public abstract void AddNewClient(IClientAPI client, bool child);