Add regression test for in-range chat between neighbouring regions from east to west.
parent
b7c7293c7a
commit
1b156b7fe8
|
@ -0,0 +1,158 @@
|
|||
/*
|
||||
* 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 OpenSimulator 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;
|
||||
using System.Collections.Generic;
|
||||
using log4net.Config;
|
||||
using Nini.Config;
|
||||
using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Servers;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Region.CoreModules.Avatar.Chat;
|
||||
using OpenSim.Region.CoreModules.Framework;
|
||||
using OpenSim.Region.CoreModules.Framework.EntityTransfer;
|
||||
using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using OpenSim.Tests.Common;
|
||||
using OpenSim.Tests.Common.Mock;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Avatar.Chat.Tests
|
||||
{
|
||||
[TestFixture]
|
||||
public class ChatModuleTests : OpenSimTestCase
|
||||
{
|
||||
[TestFixtureSetUp]
|
||||
public void FixtureInit()
|
||||
{
|
||||
// Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
|
||||
// We must do this here so that child agent positions are updated in a predictable manner.
|
||||
Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest;
|
||||
}
|
||||
|
||||
[TestFixtureTearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
// We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
|
||||
// threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression
|
||||
// tests really shouldn't).
|
||||
Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tests chat between neighbour regions on the east-west axis
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Really, this is a combination of a child agent position update test and a chat range test. These need
|
||||
/// to be separated later on.
|
||||
/// </remarks>
|
||||
[Test]
|
||||
public void TestInterRegionChatDistanceEastWest()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
// TestHelpers.EnableLogging();
|
||||
|
||||
UUID sp1Uuid = TestHelpers.ParseTail(0x11);
|
||||
UUID sp2Uuid = TestHelpers.ParseTail(0x12);
|
||||
|
||||
Vector3 sp1Position = new Vector3(6, 128, 20);
|
||||
Vector3 sp2Position = new Vector3(250, 128, 20);
|
||||
|
||||
// XXX: HTTP server is not (and should not be) necessary for this test, though it's absence makes the
|
||||
// CapabilitiesModule complain when it can't set up HTTP endpoints.
|
||||
// BaseHttpServer httpServer = new BaseHttpServer(99999);
|
||||
// MainServer.AddHttpServer(httpServer);
|
||||
// MainServer.Instance = httpServer;
|
||||
|
||||
// We need entity transfer modules so that when sp2 logs into the east region, the region calls
|
||||
// EntityTransferModuleto set up a child agent on the west region.
|
||||
// XXX: However, this is not an entity transfer so is misleading.
|
||||
EntityTransferModule etmA = new EntityTransferModule();
|
||||
EntityTransferModule etmB = new EntityTransferModule();
|
||||
LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
|
||||
|
||||
IConfigSource config = new IniConfigSource();
|
||||
config.AddConfig("Chat");
|
||||
IConfig modulesConfig = config.AddConfig("Modules");
|
||||
modulesConfig.Set("EntityTransferModule", etmA.Name);
|
||||
modulesConfig.Set("SimulationServices", lscm.Name);
|
||||
|
||||
SceneHelpers sh = new SceneHelpers();
|
||||
|
||||
TestScene sceneWest = sh.SetupScene("sceneWest", TestHelpers.ParseTail(0x1), 1000, 1000);
|
||||
TestScene sceneEast = sh.SetupScene("sceneEast", TestHelpers.ParseTail(0x2), 1001, 1000);
|
||||
SceneHelpers.SetupSceneModules(new Scene[] { sceneWest, sceneEast }, config, lscm);
|
||||
|
||||
SceneHelpers.SetupSceneModules(sceneWest, config, new CapabilitiesModule(), etmA, new ChatModule());
|
||||
SceneHelpers.SetupSceneModules(sceneEast, config, new CapabilitiesModule(), etmB, new ChatModule());
|
||||
|
||||
ScenePresence sp1 = SceneHelpers.AddScenePresence(sceneEast, sp1Uuid);
|
||||
TestClient sp1Client = (TestClient)sp1.ControllingClient;
|
||||
|
||||
// If we don't set agents to flying, test will go wrong as they instantly fall to z = 0.
|
||||
// TODO: May need to create special complete no-op test physics module rather than basic physics, since
|
||||
// physics is irrelevant to this test.
|
||||
sp1.Flying = true;
|
||||
sp1.AbsolutePosition = sp1Position;
|
||||
|
||||
AgentCircuitData acd = SceneHelpers.GenerateAgentData(sp2Uuid);
|
||||
TestClient tc = new TestClient(acd, sceneEast);
|
||||
List<TestClient> destinationTestClients = new List<TestClient>();
|
||||
EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients);
|
||||
|
||||
ScenePresence sp2 = SceneHelpers.AddScenePresence(sceneWest, tc, acd);
|
||||
TestClient sp2Client = (TestClient)sp2.ControllingClient;
|
||||
|
||||
sp2.Flying = true;
|
||||
sp2.AbsolutePosition = sp2Position;
|
||||
|
||||
TestClient sp2ChildClient = destinationTestClients[0];
|
||||
|
||||
// We must update the scene in order to make the new root agent sp2 in sceneWest trigger a position update to its
|
||||
// child in sceneEast.
|
||||
sceneWest.Update(1);
|
||||
|
||||
// Check child position is correct.
|
||||
Assert.AreEqual(
|
||||
new Vector3(sp2Position.X - sceneWest.RegionInfo.RegionSizeX, sp2Position.Y, sp2Position.Z),
|
||||
sp2ChildClient.SceneAgent.AbsolutePosition);
|
||||
|
||||
// Check chat received
|
||||
string receivedChatMessage = "";
|
||||
|
||||
sp2ChildClient.OnReceivedChatMessage
|
||||
+= (message, type, fromPos, fromName, fromAgentID, ownerID, source, audible) => receivedChatMessage = message;
|
||||
|
||||
string testMessage = "'ello darling";
|
||||
sp1Client.Chat(0, ChatTypeEnum.Say, testMessage);
|
||||
|
||||
Assert.AreEqual(testMessage, receivedChatMessage);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -4133,7 +4133,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <returns>true if we handled it.</returns>
|
||||
public virtual bool IncomingUpdateChildAgent(AgentPosition cAgentData)
|
||||
{
|
||||
//m_log.Debug(" XXX Scene IncomingChildAgentDataUpdate POSITION in " + RegionInfo.RegionName);
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE PRESENCE]: IncomingChildAgentDataUpdate POSITION for {0} in {1}, position {2}",
|
||||
// cAgentData.AgentID, Name, cAgentData.Position);
|
||||
|
||||
ScenePresence childAgentUpdate = GetScenePresence(cAgentData.AgentID);
|
||||
if (childAgentUpdate != null)
|
||||
{
|
||||
|
|
|
@ -147,6 +147,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
|
|||
terrainHeight = _heightMap[(int)actor.Position.Y * (int)m_regionExtent.Y + (int)actor.Position.X];
|
||||
|
||||
float height = terrainHeight + actor.Size.Z;
|
||||
// Console.WriteLine("height {0}, actorPosition {1}", height, actorPosition);
|
||||
|
||||
if (actor.Flying)
|
||||
{
|
||||
|
|
|
@ -62,14 +62,23 @@ namespace OpenSim.Tests.Common.Mock
|
|||
public event Action<RegionInfo, Vector3, Vector3> OnReceivedMoveAgentIntoRegion;
|
||||
public event Action<ulong, IPEndPoint> OnTestClientInformClientOfNeighbour;
|
||||
public event TestClientOnSendRegionTeleportDelegate OnTestClientSendRegionTeleport;
|
||||
|
||||
public event Action<ISceneEntity, PrimUpdateFlags> OnReceivedEntityUpdate;
|
||||
|
||||
public event OnReceivedChatMessageDelegate OnReceivedChatMessage;
|
||||
public event Action<GridInstantMessage> OnReceivedInstantMessage;
|
||||
|
||||
public event Action<UUID> OnReceivedSendRebakeAvatarTextures;
|
||||
|
||||
public delegate void TestClientOnSendRegionTeleportDelegate(
|
||||
ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint,
|
||||
uint locationID, uint flags, string capsURL);
|
||||
|
||||
public delegate void OnReceivedChatMessageDelegate(
|
||||
string message, byte type, Vector3 fromPos, string fromName,
|
||||
UUID fromAgentID, UUID ownerID, byte source, byte audible);
|
||||
|
||||
|
||||
// disable warning: public events, part of the public API
|
||||
#pragma warning disable 67
|
||||
|
||||
|
@ -466,6 +475,34 @@ namespace OpenSim.Tests.Common.Mock
|
|||
SentImageNotInDatabasePackets = new List<ImageNotInDatabasePacket>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Trigger chat coming from this connection.
|
||||
/// </summary>
|
||||
/// <param name="channel"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="message"></param>
|
||||
public bool Chat(int channel, ChatTypeEnum type, string message)
|
||||
{
|
||||
ChatMessage handlerChatFromClient = OnChatFromClient;
|
||||
|
||||
if (handlerChatFromClient != null)
|
||||
{
|
||||
OSChatMessage args = new OSChatMessage();
|
||||
args.Channel = channel;
|
||||
args.From = Name;
|
||||
args.Message = message;
|
||||
args.Type = type;
|
||||
|
||||
args.Scene = Scene;
|
||||
args.Sender = this;
|
||||
args.SenderUUID = AgentId;
|
||||
|
||||
handlerChatFromClient(this, args);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Attempt a teleport to the given region.
|
||||
/// </summary>
|
||||
|
@ -550,6 +587,9 @@ namespace OpenSim.Tests.Common.Mock
|
|||
string message, byte type, Vector3 fromPos, string fromName,
|
||||
UUID fromAgentID, UUID ownerID, byte source, byte audible)
|
||||
{
|
||||
// Console.WriteLine("mmm {0} {1} {2}", message, Name, AgentId);
|
||||
if (OnReceivedChatMessage != null)
|
||||
OnReceivedChatMessage(message, type, fromPos, fromName, fromAgentID, ownerID, source, audible);
|
||||
}
|
||||
|
||||
public void SendInstantMessage(GridInstantMessage im)
|
||||
|
|
|
@ -3081,6 +3081,7 @@
|
|||
<Match path="Asset/Tests" pattern="*.cs" recurse="true"/>
|
||||
<Match path="Avatar/Attachments/Tests" pattern="*.cs" recurse="true"/>
|
||||
<Match path="Avatar/AvatarFactory/Tests" pattern="*.cs" recurse="true"/>
|
||||
<Match path="Avatar/Chat/Tests" pattern="*.cs" recurse="true"/>
|
||||
<Match path="Avatar/Friends/Tests" pattern="*.cs" recurse="true"/>
|
||||
<Match path="Avatar/Inventory/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
||||
<Match path="Avatar/Inventory/Transfer/Tests" pattern="*.cs" recurse="true"/>
|
||||
|
|
Loading…
Reference in New Issue