From eca6442bae4093019bd221e87413c74c77c4ff5d Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Fri, 16 Jan 2009 21:56:13 +0000 Subject: [PATCH] * Rig up enough infrastructure to actually perform a successful 'standalone' teleport unit test with checks that the scene presence disappeared from sceneA and appeared in sceneB * However, I'm not convinced that the actual process in the test completely reflects reality, and a lot of stuff had to be rigged up (which should get resolved over time) --- OpenSim/Framework/ConfigurationMember.cs | 2 +- OpenSim/Framework/IClientAPI.cs | 7 +- .../ClientStack/LindenUDP/LLClientView.cs | 4 - .../LindenUDP/Tests/PacketHandlerTests.cs | 5 +- .../TextureSender/Tests/TextureSenderTests.cs | 2 +- .../Local/LocalInterregionComms.cs | 9 +- OpenSim/Region/Environment/Scenes/Scene.cs | 11 ++- .../Scenes/SceneCommunicationService.cs | 4 +- .../Environment/Scenes/ScenePresence.cs | 6 +- .../Scenes/Tests/ScenePresenceTests.cs | 2 +- .../Scenes/Tests/SceneTestUtils.cs | 2 +- .../Scenes/Tests/StandaloneTeleportTests.cs | 10 ++- OpenSim/Tests/Common/Mock/TestClient.cs | 83 ++++++++++++++----- prebuild.xml | 1 + 14 files changed, 106 insertions(+), 42 deletions(-) diff --git a/OpenSim/Framework/ConfigurationMember.cs b/OpenSim/Framework/ConfigurationMember.cs index 7a5e6b2225..b54aafb518 100644 --- a/OpenSim/Framework/ConfigurationMember.cs +++ b/OpenSim/Framework/ConfigurationMember.cs @@ -179,7 +179,7 @@ namespace OpenSim.Framework return; } - m_log.Info("[CONFIG]: Calling Configuration Load Function..."); + //m_log.Debug("[CONFIG]: Calling Configuration Load Function..."); loadFunction(); if (configurationOptions.Count <= 0) diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 0d44abdf4a..63c09febf7 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -814,7 +814,12 @@ namespace OpenSim.Framework void SendWindData(Vector2[] windSpeeds); void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look); - void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourExternalEndPoint); + void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourExternalEndPoint); + + /// + /// Return circuit information for this client. + /// + /// AgentCircuitData RequestClientInfo(); void CrossRegion(ulong newRegionHandle, Vector3 pos, Vector3 lookAt, IPEndPoint newRegionExternalEndPoint, diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 30f6f0fad5..146bc63e24 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -1366,10 +1366,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP OutPacket(enablesimpacket, ThrottleOutPacketType.Task); } - /// - /// - /// - /// public AgentCircuitData RequestClientInfo() { AgentCircuitData agentData = new AgentCircuitData(); diff --git a/OpenSim/Region/ClientStack/LindenUDP/Tests/PacketHandlerTests.cs b/OpenSim/Region/ClientStack/LindenUDP/Tests/PacketHandlerTests.cs index 62e6e960de..d421f82c50 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/Tests/PacketHandlerTests.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/Tests/PacketHandlerTests.cs @@ -64,9 +64,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests TestLLUDPServer testLLUDPServer; TestLLPacketServer testLLPacketServer; AgentCircuitManager acm; - SetupStack(new MockScene(), out testLLUDPServer, out testLLPacketServer, out acm); + IScene scene = new MockScene(); + SetupStack(scene, out testLLUDPServer, out testLLPacketServer, out acm); - TestClient testClient = new TestClient(agent); + TestClient testClient = new TestClient(agent, scene); ILLPacketHandler packetHandler = new LLPacketHandler(testClient, testLLPacketServer, new ClientStackUserSettings()); diff --git a/OpenSim/Region/Environment/Modules/Agent/TextureSender/Tests/TextureSenderTests.cs b/OpenSim/Region/Environment/Modules/Agent/TextureSender/Tests/TextureSenderTests.cs index 42a4e91e20..cfac86855e 100644 --- a/OpenSim/Region/Environment/Modules/Agent/TextureSender/Tests/TextureSenderTests.cs +++ b/OpenSim/Region/Environment/Modules/Agent/TextureSender/Tests/TextureSenderTests.cs @@ -61,7 +61,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureSender agent.InventoryFolder = UUID.Zero; agent.startpos = Vector3.Zero; agent.CapsPath = "http://wibble.com"; - client = new TestClient(agent); + client = new TestClient(agent, null); ts = new TextureSender(client, 0, 0); testsize = random.Next(5000,15000); npackets = CalculateNumPackets(testsize); diff --git a/OpenSim/Region/Environment/Modules/Communications/Local/LocalInterregionComms.cs b/OpenSim/Region/Environment/Modules/Communications/Local/LocalInterregionComms.cs index 5fcb4bc1aa..62f6df075d 100644 --- a/OpenSim/Region/Environment/Modules/Communications/Local/LocalInterregionComms.cs +++ b/OpenSim/Region/Environment/Modules/Communications/Local/LocalInterregionComms.cs @@ -128,6 +128,7 @@ namespace OpenSim.Region.Environment.Modules.Communications.Local return true; } } + // m_log.DebugFormat("[LOCAL COMMS]: Did not find region {0} for SendCreateChildAgent", regionHandle); return false; } @@ -138,12 +139,16 @@ namespace OpenSim.Region.Environment.Modules.Communications.Local { if (s.RegionInfo.RegionHandle == regionHandle) { - //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate"); + //m_log.DebugFormat( + // "[LOCAL COMMS]: Found region {0} {1} to send ChildAgentUpdate", + // s.RegionInfo.RegionName, regionHandle); + s.IncomingChildAgentDataUpdate(cAgentData); return true; } } - //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate"); + +// m_log.DebugFormat("[LOCAL COMMS]: Did not find region {0} for ChildAgentUpdate", regionHandle); return false; } diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 9c3aa96efa..8a9d2955a4 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -2777,7 +2777,7 @@ namespace OpenSim.Region.Environment.Scenes // Don't disable this log message - it's too helpful m_log.DebugFormat( - "[CONNECTION BEGIN]: Scene {0} told of incoming client {1} {2} {3} (circuit code {4})", + "[CONNECTION BEGIN]: Region {0} told of incoming client {1} {2} {3} (circuit code {4})", RegionInfo.RegionName, agent.firstname, agent.lastname, agent.AgentID, agent.circuitcode); if (m_regInfo.EstateSettings.IsBanned(agent.AgentID)) @@ -2977,13 +2977,16 @@ namespace OpenSim.Region.Environment.Scenes public virtual bool IncomingChildAgentDataUpdate(AgentData cAgentData) { - //Console.WriteLine(" XXX Scene IncomingChildAgentDataUpdate FULL in " + RegionInfo.RegionName); +// m_log.DebugFormat( +// "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName); + ScenePresence childAgentUpdate = GetScenePresence(cAgentData.AgentID); if (childAgentUpdate != null) { childAgentUpdate.ChildAgentDataUpdate(cAgentData); return true; } + return false; } @@ -3030,6 +3033,8 @@ namespace OpenSim.Region.Environment.Scenes /// public bool IncomingCloseAgent(UUID agentID) { + //m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID); + ScenePresence presence = m_sceneGraph.GetScenePresence(agentID); if (presence != null) { @@ -3056,9 +3061,11 @@ namespace OpenSim.Region.Environment.Scenes else presence.ControllingClient.SendShutdownConnectionNotice(); } + presence.ControllingClient.Close(true); return true; } + // Agent not here return false; } diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs index 65e62efe9c..a46fa0bee2 100644 --- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs @@ -758,6 +758,7 @@ namespace OpenSim.Region.Environment.Scenes // both regions if (avatar.ParentID != (uint)0) avatar.StandUp(); + if (!avatar.ValidateAttachments()) { avatar.ControllingClient.SendTeleportFailed("Inconsistent attachment state"); @@ -772,13 +773,13 @@ namespace OpenSim.Region.Environment.Scenes // once we reach here... //avatar.Scene.RemoveCapsHandler(avatar.UUID); - string capsPath = String.Empty; AgentCircuitData agentCircuit = avatar.ControllingClient.RequestClientInfo(); agentCircuit.BaseFolder = UUID.Zero; agentCircuit.InventoryFolder = UUID.Zero; agentCircuit.startpos = position; agentCircuit.child = true; + if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) { // brand new agent, let's create a new caps seed @@ -871,7 +872,6 @@ namespace OpenSim.Region.Environment.Scenes teleportFlags, capsPath); } - // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation // that the client contacted the destination before we send the attachments and close things here. diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index bdb0836dc7..77d5b933ce 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -1017,9 +1017,12 @@ namespace OpenSim.Region.Environment.Scenes if ((m_callbackURI != null) && !m_callbackURI.Equals("")) { + //m_log.DebugFormat("Found callback URI {0}", m_callbackURI); Scene.SendReleaseAgent(m_rootRegionHandle, UUID, m_callbackURI); m_callbackURI = null; } + + //m_log.DebugFormat("Completed movement"); } } @@ -2594,7 +2597,6 @@ namespace OpenSim.Region.Environment.Scenes /// public void ChildAgentDataUpdate(AgentPosition cAgentData, uint tRegionX, uint tRegionY, uint rRegionX, uint rRegionY) { - // if (!IsChildAgent) return; @@ -2615,7 +2617,6 @@ namespace OpenSim.Region.Environment.Scenes if ((cAgentData.Throttles != null) && cAgentData.Throttles.Length > 0) ControllingClient.SetChildAgentThrottle(cAgentData.Throttles); - // Sends out the objects in the user's draw distance if m_sendTasksToChild is true. if (m_scene.m_seeIntoRegionFromNeighbor) m_pendingObjects = null; @@ -2662,7 +2663,6 @@ namespace OpenSim.Region.Environment.Scenes cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; } - cAgent.GodLevel = (byte)m_godlevel; cAgent.AlwaysRun = m_setAlwaysRun; diff --git a/OpenSim/Region/Environment/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Environment/Scenes/Tests/ScenePresenceTests.cs index 548fea9e32..5ce78a33da 100644 --- a/OpenSim/Region/Environment/Scenes/Tests/ScenePresenceTests.cs +++ b/OpenSim/Region/Environment/Scenes/Tests/ScenePresenceTests.cs @@ -63,7 +63,7 @@ namespace OpenSim.Region.Environment.Scenes.Tests agent.CapsPath = "http://wibble.com"; scene.NewUserConnection(agent); - scene.AddNewClient(new TestClient(agent)); + scene.AddNewClient(new TestClient(agent, scene)); ScenePresence presence = scene.GetScenePresence(agentId); diff --git a/OpenSim/Region/Environment/Scenes/Tests/SceneTestUtils.cs b/OpenSim/Region/Environment/Scenes/Tests/SceneTestUtils.cs index 3c4049dd1c..5fa897c373 100644 --- a/OpenSim/Region/Environment/Scenes/Tests/SceneTestUtils.cs +++ b/OpenSim/Region/Environment/Scenes/Tests/SceneTestUtils.cs @@ -118,7 +118,7 @@ namespace OpenSim.Region.Environment.Scenes.Tests scene.NewUserConnection(agent); // Stage 2: add the new client as a child agent to the scene - TestClient client = new TestClient(agent); + TestClient client = new TestClient(agent, scene); scene.AddNewClient(client); // Stage 3: Invoke agent crossing, which converts the child agent into a root agent (with appearance, diff --git a/OpenSim/Region/Environment/Scenes/Tests/StandaloneTeleportTests.cs b/OpenSim/Region/Environment/Scenes/Tests/StandaloneTeleportTests.cs index a3d116d442..d7342de683 100644 --- a/OpenSim/Region/Environment/Scenes/Tests/StandaloneTeleportTests.cs +++ b/OpenSim/Region/Environment/Scenes/Tests/StandaloneTeleportTests.cs @@ -27,6 +27,7 @@ using Nini.Config; using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; using OpenMetaverse; using OpenSim.Framework; using OpenSim.Framework.Communications; @@ -77,9 +78,14 @@ namespace OpenSim.Region.Environment.Scenes.Tests TestClient client = SceneTestUtils.AddRootAgent(sceneA, agentId); - client.Teleport(sceneB.RegionInfo.RegionHandle, new Vector3(100, 100, 100), new Vector3(40, 40, 40)); + // FIXME: This is a hack to get the test working - really the normal OpenSim mechanisms should be used. + client.TeleportTargetScene = sceneB; - // TODO: Check that everything is as it should be + client.Teleport(sceneB.RegionInfo.RegionHandle, new Vector3(100, 100, 100), new Vector3(40, 40, 40)); + Assert.That(sceneB.GetScenePresence(agentId), Is.Not.Null, "Client does not have an agent in sceneB"); + Assert.That(sceneA.GetScenePresence(agentId), Is.Null, "Client still had an agent in sceneA"); + + // TODO: Check that more of everything is as it should be // TODO: test what happens if we try to teleport to a region that doesn't exist } diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 5b3b27bffb..6254272b45 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs @@ -28,6 +28,8 @@ using System; using System.Collections.Generic; using System.Net; +using System.Reflection; +using log4net; using OpenMetaverse; using OpenMetaverse.Packets; using OpenSim.Framework; @@ -37,11 +39,18 @@ namespace OpenSim.Tests.Common.Mock { public class TestClient : IClientAPI { - private Scene m_scene; - + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + // Mock testing variables public List sentdatapkt = new List(); public List sentpktpkt = new List(); + + // TODO: This is a really nasty (and temporary) means of telling the test client which scene to invoke setup + // methods on when a teleport is requested + public Scene TeleportTargetScene; + private TestClient TeleportSceneClient; + + private IScene m_scene; // disable warning: public events, part of the public API #pragma warning disable 67 @@ -259,7 +268,7 @@ namespace OpenSim.Tests.Common.Mock /// /// This agent's UUID /// - private UUID myID; + private UUID m_agentId; private Vector3 startPos = new Vector3(128, 128, 2); @@ -271,7 +280,7 @@ namespace OpenSim.Tests.Common.Mock public virtual UUID AgentId { - get { return myID; } + get { return m_agentId; } } public UUID SessionId @@ -359,11 +368,14 @@ namespace OpenSim.Tests.Common.Mock /// Constructor /// /// - public TestClient(AgentCircuitData agentData) + /// + public TestClient(AgentCircuitData agentData, IScene scene) { - myID = agentData.AgentID; + m_agentId = agentData.AgentID; m_firstName = agentData.firstname; m_lastName = agentData.lastname; + m_circuitCode = agentData.circuitcode; + m_scene = scene; } /// @@ -376,6 +388,11 @@ namespace OpenSim.Tests.Common.Mock { OnTeleportLocationRequest(this, regionHandle, position, lookAt, 16); } + + public void CompleteMovement() + { + OnCompleteMovementToRegion(); + } public virtual void ActivateGesture(UUID assetId, UUID gestureId) { @@ -465,14 +482,48 @@ namespace OpenSim.Tests.Common.Mock { } - public virtual void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourExternalEndPoint) - { - } - public virtual AgentCircuitData RequestClientInfo() { - return new AgentCircuitData(); + AgentCircuitData agentData = new AgentCircuitData(); + agentData.AgentID = AgentId; + agentData.SessionID = UUID.Zero; + agentData.SecureSessionID = UUID.Zero; + agentData.circuitcode = m_circuitCode; + agentData.child = false; + agentData.firstname = m_firstName; + agentData.lastname = m_lastName; + agentData.CapsPath = m_scene.GetCapsPath(m_agentId); + agentData.ChildrenCapSeeds = new Dictionary(m_scene.GetChildrenSeeds(m_agentId)); + + return agentData; } + + public virtual void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourExternalEndPoint) + { + m_log.DebugFormat("[TEST CLIENT]: Processing inform client of neighbour"); + + // In response to this message, we are going to make a teleport to the scene we've previous been told + // about by test code (this needs to be improved). + AgentCircuitData newAgent = RequestClientInfo(); + + // Stage 2: add the new client as a child agent to the scene + TeleportSceneClient = new TestClient(newAgent, TeleportTargetScene); + TeleportTargetScene.AddNewClient(TeleportSceneClient); + } + + public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, + uint locationID, uint flags, string capsURL) + { + m_log.DebugFormat("[TEST CLIENT]: Received SendRegionTeleport"); + + TeleportSceneClient.CompleteMovement(); + //TeleportTargetScene.AgentCrossing(newAgent.AgentID, new Vector3(90, 90, 90), false); + } + + public virtual void SendTeleportFailed(string reason) + { + m_log.DebugFormat("[TEST CLIENT]: Teleport failed with reason {0}", reason); + } public virtual void CrossRegion(ulong newRegionHandle, Vector3 pos, Vector3 lookAt, IPEndPoint newRegionExternalEndPoint, string capsURL) @@ -487,15 +538,6 @@ namespace OpenSim.Tests.Common.Mock { } - public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, - uint locationID, uint flags, string capsURL) - { - } - - public virtual void SendTeleportFailed(string reason) - { - } - public virtual void SendTeleportLocationStart() { } @@ -788,6 +830,7 @@ namespace OpenSim.Tests.Common.Mock public void Close(bool ShutdownCircuit) { + m_scene.RemoveClient(AgentId); } public void Start() diff --git a/prebuild.xml b/prebuild.xml index 71898e40cc..895bb71ff1 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -2461,6 +2461,7 @@ +