From 134f86e8d5c414409631b25b8c6f0ee45fbd8631 Mon Sep 17 00:00:00 2001
From: David Walter Seikel
Date: Thu, 3 Nov 2016 21:44:39 +1000
Subject: Initial update to OpenSim 0.8.2.1 source code.
---
.../Linden/Caps/EventQueue/EventQueueGetModule.cs | 207 +++++++++++----------
.../Linden/Caps/EventQueue/EventQueueHelper.cs | 56 ++++--
.../Caps/EventQueue/Tests/EventQueueTests.cs | 103 +++++++++-
3 files changed, 253 insertions(+), 113 deletions(-)
(limited to 'OpenSim/Region/ClientStack/Linden/Caps/EventQueue')
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs
index 4d2c0f2..9b9f6a7 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs
@@ -59,12 +59,20 @@ namespace OpenSim.Region.ClientStack.Linden
public class EventQueueGetModule : IEventQueue, INonSharedRegionModule
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ private static string LogHeader = "[EVENT QUEUE GET MODULE]";
///
/// Debug level.
///
public int DebugLevel { get; set; }
+ // Viewer post requests timeout in 60 secs
+ // https://bitbucket.org/lindenlab/viewer-release/src/421c20423df93d650cc305dc115922bb30040999/indra/llmessage/llhttpclient.cpp?at=default#cl-44
+ //
+ private const int VIEWER_TIMEOUT = 60 * 1000;
+ // Just to be safe, we work on a 10 sec shorter cycle
+ private const int SERVER_EQ_TIME_NO_EVENTS = VIEWER_TIMEOUT - (10 * 1000);
+
protected Scene m_scene;
private Dictionary m_ids = new Dictionary();
@@ -84,7 +92,6 @@ namespace OpenSim.Region.ClientStack.Linden
scene.RegisterModuleInterface(this);
scene.EventManager.OnClientClosed += ClientClosed;
- scene.EventManager.OnMakeChildAgent += MakeChildAgent;
scene.EventManager.OnRegisterCaps += OnRegisterCaps;
MainConsole.Instance.Commands.AddCommand(
@@ -94,9 +101,17 @@ namespace OpenSim.Region.ClientStack.Linden
"debug eq [0|1|2]",
"Turn on event queue debugging\n"
+ " <= 0 - turns off all event queue logging\n"
- + " >= 1 - turns on outgoing event logging\n"
+ + " >= 1 - turns on event queue setup and outgoing event logging\n"
+ " >= 2 - turns on poll notification",
HandleDebugEq);
+
+ MainConsole.Instance.Commands.AddCommand(
+ "Debug",
+ false,
+ "show eq",
+ "show eq",
+ "Show contents of event queues for logged in avatars. Used for debugging.",
+ HandleShowEq);
}
public void RemoveRegion(Scene scene)
@@ -105,7 +120,6 @@ namespace OpenSim.Region.ClientStack.Linden
return;
scene.EventManager.OnClientClosed -= ClientClosed;
- scene.EventManager.OnMakeChildAgent -= MakeChildAgent;
scene.EventManager.OnRegisterCaps -= OnRegisterCaps;
scene.UnregisterModuleInterface(this);
@@ -138,7 +152,7 @@ namespace OpenSim.Region.ClientStack.Linden
if (!(args.Length == 3 && int.TryParse(args[2], out debugLevel)))
{
- MainConsole.Instance.OutputFormat("Usage: debug eq [0|1]");
+ MainConsole.Instance.OutputFormat("Usage: debug eq [0|1|2]");
}
else
{
@@ -148,6 +162,21 @@ namespace OpenSim.Region.ClientStack.Linden
}
}
+ protected void HandleShowEq(string module, string[] args)
+ {
+ MainConsole.Instance.OutputFormat("For scene {0}", m_scene.Name);
+
+ lock (queues)
+ {
+ foreach (KeyValuePair> kvp in queues)
+ {
+ MainConsole.Instance.OutputFormat(
+ "For agent {0} there are {1} messages queued for send.",
+ kvp.Key, kvp.Value.Count);
+ }
+ }
+ }
+
///
/// Always returns a valid queue
///
@@ -159,14 +188,14 @@ namespace OpenSim.Region.ClientStack.Linden
{
if (!queues.ContainsKey(agentId))
{
- /*
- m_log.DebugFormat(
- "[EVENTQUEUE]: Adding new queue for agent {0} in region {1}",
- agentId, m_scene.RegionInfo.RegionName);
- */
+ if (DebugLevel > 0)
+ m_log.DebugFormat(
+ "[EVENTQUEUE]: Adding new queue for agent {0} in region {1}",
+ agentId, m_scene.RegionInfo.RegionName);
+
queues[agentId] = new Queue();
}
-
+
return queues[agentId];
}
}
@@ -198,8 +227,23 @@ namespace OpenSim.Region.ClientStack.Linden
{
Queue queue = GetQueue(avatarID);
if (queue != null)
+ {
lock (queue)
queue.Enqueue(ev);
+ }
+ else if (DebugLevel > 0)
+ {
+ ScenePresence sp = m_scene.GetScenePresence(avatarID);
+
+ // This assumes that an NPC should never have a queue.
+ if (sp != null && sp.PresenceType != PresenceType.Npc)
+ {
+ OSDMap evMap = (OSDMap)ev;
+ m_log.WarnFormat(
+ "[EVENTQUEUE]: (Enqueue) No queue found for agent {0} {1} when placing message {2} in region {3}",
+ sp.Name, sp.UUID, evMap["message"], m_scene.Name);
+ }
+ }
}
catch (NullReferenceException e)
{
@@ -214,44 +258,14 @@ namespace OpenSim.Region.ClientStack.Linden
private void ClientClosed(UUID agentID, Scene scene)
{
-// m_log.DebugFormat("[EVENTQUEUE]: Closed client {0} in region {1}", agentID, m_scene.RegionInfo.RegionName);
-
- int count = 0;
- while (queues.ContainsKey(agentID) && queues[agentID].Count > 0 && count++ < 5)
- {
- Thread.Sleep(1000);
- }
+ //m_log.DebugFormat("[EVENTQUEUE]: Closed client {0} in region {1}", agentID, m_scene.RegionInfo.RegionName);
lock (queues)
- {
queues.Remove(agentID);
- }
List removeitems = new List();
lock (m_AvatarQueueUUIDMapping)
- {
- foreach (UUID ky in m_AvatarQueueUUIDMapping.Keys)
- {
-// m_log.DebugFormat("[EVENTQUEUE]: Found key {0} in m_AvatarQueueUUIDMapping while looking for {1}", ky, AgentID);
- if (ky == agentID)
- {
- removeitems.Add(ky);
- }
- }
-
- foreach (UUID ky in removeitems)
- {
- UUID eventQueueGetUuid = m_AvatarQueueUUIDMapping[ky];
- m_AvatarQueueUUIDMapping.Remove(ky);
-
- string eqgPath = GenerateEqgCapPath(eventQueueGetUuid);
- MainServer.Instance.RemovePollServiceHTTPHandler("", eqgPath);
-
-// m_log.DebugFormat(
-// "[EVENT QUEUE GET MODULE]: Removed EQG handler {0} for {1} in {2}",
-// eqgPath, agentID, m_scene.RegionInfo.RegionName);
- }
- }
+ m_AvatarQueueUUIDMapping.Remove(agentID);
UUID searchval = UUID.Zero;
@@ -272,19 +286,9 @@ namespace OpenSim.Region.ClientStack.Linden
foreach (UUID ky in removeitems)
m_QueueUUIDAvatarMapping.Remove(ky);
}
- }
- private void MakeChildAgent(ScenePresence avatar)
- {
- //m_log.DebugFormat("[EVENTQUEUE]: Make Child agent {0} in region {1}.", avatar.UUID, m_scene.RegionInfo.RegionName);
- //lock (m_ids)
- // {
- //if (m_ids.ContainsKey(avatar.UUID))
- //{
- // close the event queue.
- //m_ids[avatar.UUID] = -1;
- //}
- //}
+ // m_log.DebugFormat("[EVENTQUEUE]: Deleted queues for {0} in region {1}", agentID, m_scene.RegionInfo.RegionName);
+
}
///
@@ -300,9 +304,10 @@ namespace OpenSim.Region.ClientStack.Linden
{
// Register an event queue for the client
- //m_log.DebugFormat(
- // "[EVENTQUEUE]: OnRegisterCaps: agentID {0} caps {1} region {2}",
- // agentID, caps, m_scene.RegionInfo.RegionName);
+ if (DebugLevel > 0)
+ m_log.DebugFormat(
+ "[EVENTQUEUE]: OnRegisterCaps: agentID {0} caps {1} region {2}",
+ agentID, caps, m_scene.RegionInfo.RegionName);
// Let's instantiate a Queue for this agent right now
TryGetQueue(agentID);
@@ -336,28 +341,9 @@ namespace OpenSim.Region.ClientStack.Linden
m_AvatarQueueUUIDMapping.Add(agentID, eventQueueGetUUID);
}
- string eventQueueGetPath = GenerateEqgCapPath(eventQueueGetUUID);
-
- // Register this as a caps handler
- // FIXME: Confusingly, we need to register separate as a capability so that the client is told about
- // EventQueueGet when it receive capability information, but then we replace the rest handler immediately
- // afterwards with the poll service. So for now, we'll pass a null instead to simplify code reading, but
- // really it should be possible to directly register the poll handler as a capability.
- caps.RegisterHandler("EventQueueGet", new RestHTTPHandler("POST", eventQueueGetPath, null));
-// delegate(Hashtable m_dhttpMethod)
-// {
-// return ProcessQueue(m_dhttpMethod, agentID, caps);
-// }));
-
- // This will persist this beyond the expiry of the caps handlers
- // TODO: Add EventQueueGet name/description for diagnostics
- MainServer.Instance.AddPollServiceHTTPHandler(
- eventQueueGetPath,
- new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID));
-
-// m_log.DebugFormat(
-// "[EVENT QUEUE GET MODULE]: Registered EQG handler {0} for {1} in {2}",
-// eventQueueGetPath, agentID, m_scene.RegionInfo.RegionName);
+ caps.RegisterPollHandler(
+ "EventQueueGet",
+ new PollServiceEventArgs(null, GenerateEqgCapPath(eventQueueGetUUID), HasEvents, GetEvents, NoEvents, agentID, SERVER_EQ_TIME_NO_EVENTS));
Random rnd = new Random(Environment.TickCount);
lock (m_ids)
@@ -375,7 +361,10 @@ namespace OpenSim.Region.ClientStack.Linden
Queue queue = GetQueue(agentID);
if (queue != null)
lock (queue)
+ {
+ //m_log.WarnFormat("POLLED FOR EVENTS BY {0} in {1} -- {2}", agentID, m_scene.RegionInfo.RegionName, queue.Count);
return queue.Count > 0;
+ }
return false;
}
@@ -391,16 +380,21 @@ namespace OpenSim.Region.ClientStack.Linden
OSDMap ev = (OSDMap)element;
m_log.DebugFormat(
"Eq OUT {0,-30} to {1,-20} {2,-20}",
- ev["message"], m_scene.GetScenePresence(agentId).Name, m_scene.RegionInfo.RegionName);
+ ev["message"], m_scene.GetScenePresence(agentId).Name, m_scene.Name);
}
}
- public Hashtable GetEvents(UUID requestID, UUID pAgentId, string request)
+ public Hashtable GetEvents(UUID requestID, UUID pAgentId)
{
if (DebugLevel >= 2)
- m_log.DebugFormat("POLLED FOR EQ MESSAGES BY {0} in {1}", pAgentId, m_scene.RegionInfo.RegionName);
+ m_log.WarnFormat("POLLED FOR EQ MESSAGES BY {0} in {1}", pAgentId, m_scene.Name);
+
+ Queue queue = GetQueue(pAgentId);
+ if (queue == null)
+ {
+ return NoEvents(requestID, pAgentId);
+ }
- Queue queue = TryGetQueue(pAgentId);
OSD element;
lock (queue)
{
@@ -727,34 +721,51 @@ namespace OpenSim.Region.ClientStack.Linden
Enqueue(item, avatarID);
}
- public virtual void EnableSimulator(ulong handle, IPEndPoint endPoint, UUID avatarID)
+ public virtual void EnableSimulator(ulong handle, IPEndPoint endPoint, UUID avatarID, int regionSizeX, int regionSizeY)
{
- OSD item = EventQueueHelper.EnableSimulator(handle, endPoint);
+ if (DebugLevel > 0)
+ m_log.DebugFormat("{0} EnableSimulator. handle={1}, endPoint={2}, avatarID={3}",
+ LogHeader, handle, endPoint, avatarID, regionSizeX, regionSizeY);
+
+ OSD item = EventQueueHelper.EnableSimulator(handle, endPoint, regionSizeX, regionSizeY);
Enqueue(item, avatarID);
}
- public virtual void EstablishAgentCommunication(UUID avatarID, IPEndPoint endPoint, string capsPath)
+ public virtual void EstablishAgentCommunication(UUID avatarID, IPEndPoint endPoint, string capsPath,
+ ulong regionHandle, int regionSizeX, int regionSizeY)
{
- OSD item = EventQueueHelper.EstablishAgentCommunication(avatarID, endPoint.ToString(), capsPath);
+ if (DebugLevel > 0)
+ m_log.DebugFormat("{0} EstablishAgentCommunication. handle={1}, endPoint={2}, avatarID={3}",
+ LogHeader, regionHandle, endPoint, avatarID, regionSizeX, regionSizeY);
+
+ OSD item = EventQueueHelper.EstablishAgentCommunication(avatarID, endPoint.ToString(), capsPath, regionHandle, regionSizeX, regionSizeY);
Enqueue(item, avatarID);
}
public virtual void TeleportFinishEvent(ulong regionHandle, byte simAccess,
IPEndPoint regionExternalEndPoint,
uint locationID, uint flags, string capsURL,
- UUID avatarID)
+ UUID avatarID, int regionSizeX, int regionSizeY)
{
+ if (DebugLevel > 0)
+ m_log.DebugFormat("{0} TeleportFinishEvent. handle={1}, endPoint={2}, avatarID={3}",
+ LogHeader, regionHandle, regionExternalEndPoint, avatarID, regionSizeX, regionSizeY);
+
OSD item = EventQueueHelper.TeleportFinishEvent(regionHandle, simAccess, regionExternalEndPoint,
- locationID, flags, capsURL, avatarID);
+ locationID, flags, capsURL, avatarID, regionSizeX, regionSizeY);
Enqueue(item, avatarID);
}
public virtual void CrossRegion(ulong handle, Vector3 pos, Vector3 lookAt,
IPEndPoint newRegionExternalEndPoint,
- string capsURL, UUID avatarID, UUID sessionID)
+ string capsURL, UUID avatarID, UUID sessionID, int regionSizeX, int regionSizeY)
{
+ if (DebugLevel > 0)
+ m_log.DebugFormat("{0} CrossRegion. handle={1}, avatarID={2}, regionSize={3},{4}>",
+ LogHeader, handle, avatarID, regionSizeX, regionSizeY);
+
OSD item = EventQueueHelper.CrossRegion(handle, pos, lookAt, newRegionExternalEndPoint,
- capsURL, avatarID, sessionID);
+ capsURL, avatarID, sessionID, regionSizeX, regionSizeY);
Enqueue(item, avatarID);
}
@@ -771,12 +782,12 @@ namespace OpenSim.Region.ClientStack.Linden
}
- public void ChatterBoxSessionAgentListUpdates(UUID sessionID, UUID fromAgent, UUID toAgent, bool canVoiceChat,
+ public void ChatterBoxSessionAgentListUpdates(UUID sessionID, UUID fromAgent, UUID anotherAgent, bool canVoiceChat,
bool isModerator, bool textMute)
{
OSD item = EventQueueHelper.ChatterBoxSessionAgentListUpdates(sessionID, fromAgent, canVoiceChat,
isModerator, textMute);
- Enqueue(item, toAgent);
+ Enqueue(item, fromAgent);
//m_log.InfoFormat("########### eq ChatterBoxSessionAgentListUpdates #############\n{0}", item);
}
@@ -807,5 +818,13 @@ namespace OpenSim.Region.ClientStack.Linden
{
return EventQueueHelper.BuildEvent(eventName, eventBody);
}
+
+ public void partPhysicsProperties(uint localID, byte physhapetype,
+ float density, float friction, float bounce, float gravmod,UUID avatarID)
+ {
+ OSD item = EventQueueHelper.partPhysicsProperties(localID, physhapetype,
+ density, friction, bounce, gravmod);
+ Enqueue(item, avatarID);
+ }
}
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs
index 3f49aba..384af74 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs
@@ -70,13 +70,15 @@ namespace OpenSim.Region.ClientStack.Linden
return llsdEvent;
}
- public static OSD EnableSimulator(ulong handle, IPEndPoint endPoint)
+ public static OSD EnableSimulator(ulong handle, IPEndPoint endPoint, int regionSizeX, int regionSizeY)
{
- OSDMap llsdSimInfo = new OSDMap(3);
+ OSDMap llsdSimInfo = new OSDMap(5);
llsdSimInfo.Add("Handle", new OSDBinary(ulongToByteArray(handle)));
llsdSimInfo.Add("IP", new OSDBinary(endPoint.Address.GetAddressBytes()));
llsdSimInfo.Add("Port", new OSDInteger(endPoint.Port));
+ llsdSimInfo.Add("RegionSizeX", OSD.FromUInteger((uint) regionSizeX));
+ llsdSimInfo.Add("RegionSizeY", OSD.FromUInteger((uint) regionSizeY));
OSDArray arr = new OSDArray(1);
arr.Add(llsdSimInfo);
@@ -104,7 +106,8 @@ namespace OpenSim.Region.ClientStack.Linden
public static OSD CrossRegion(ulong handle, Vector3 pos, Vector3 lookAt,
IPEndPoint newRegionExternalEndPoint,
- string capsURL, UUID agentID, UUID sessionID)
+ string capsURL, UUID agentID, UUID sessionID,
+ int regionSizeX, int regionSizeY)
{
OSDArray lookAtArr = new OSDArray(3);
lookAtArr.Add(OSD.FromReal(lookAt.X));
@@ -130,11 +133,13 @@ namespace OpenSim.Region.ClientStack.Linden
OSDArray agentDataArr = new OSDArray(1);
agentDataArr.Add(agentDataMap);
- OSDMap regionDataMap = new OSDMap(4);
+ OSDMap regionDataMap = new OSDMap(6);
regionDataMap.Add("RegionHandle", OSD.FromBinary(ulongToByteArray(handle)));
regionDataMap.Add("SeedCapability", OSD.FromString(capsURL));
regionDataMap.Add("SimIP", OSD.FromBinary(newRegionExternalEndPoint.Address.GetAddressBytes()));
regionDataMap.Add("SimPort", OSD.FromInteger(newRegionExternalEndPoint.Port));
+ regionDataMap.Add("RegionSizeX", OSD.FromUInteger((uint)regionSizeX));
+ regionDataMap.Add("RegionSizeY", OSD.FromUInteger((uint)regionSizeY));
OSDArray regionDataArr = new OSDArray(1);
regionDataArr.Add(regionDataMap);
@@ -148,8 +153,9 @@ namespace OpenSim.Region.ClientStack.Linden
}
public static OSD TeleportFinishEvent(
- ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint,
- uint locationID, uint flags, string capsURL, UUID agentID)
+ ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint,
+ uint locationID, uint flags, string capsURL, UUID agentID,
+ int regionSizeX, int regionSizeY)
{
OSDMap info = new OSDMap();
info.Add("AgentID", OSD.FromUUID(agentID));
@@ -160,6 +166,8 @@ namespace OpenSim.Region.ClientStack.Linden
info.Add("SimIP", OSD.FromBinary(regionExternalEndPoint.Address.GetAddressBytes()));
info.Add("SimPort", OSD.FromInteger(regionExternalEndPoint.Port));
info.Add("TeleportFlags", OSD.FromULong(1L << 4)); // AgentManager.TeleportFlags.ViaLocation
+ info.Add("RegionSizeX", OSD.FromUInteger((uint)regionSizeX));
+ info.Add("RegionSizeY", OSD.FromUInteger((uint)regionSizeY));
OSDArray infoArr = new OSDArray();
infoArr.Add(info);
@@ -187,12 +195,18 @@ namespace OpenSim.Region.ClientStack.Linden
return BuildEvent("ScriptRunningReply", body);
}
- public static OSD EstablishAgentCommunication(UUID agentID, string simIpAndPort, string seedcap)
+ public static OSD EstablishAgentCommunication(UUID agentID, string simIpAndPort, string seedcap,
+ ulong regionHandle, int regionSizeX, int regionSizeY)
{
- OSDMap body = new OSDMap(3);
- body.Add("agent-id", new OSDUUID(agentID));
- body.Add("sim-ip-and-port", new OSDString(simIpAndPort));
- body.Add("seed-capability", new OSDString(seedcap));
+ OSDMap body = new OSDMap(6)
+ {
+ {"agent-id", new OSDUUID(agentID)},
+ {"sim-ip-and-port", new OSDString(simIpAndPort)},
+ {"seed-capability", new OSDString(seedcap)},
+ {"region-handle", OSD.FromULong(regionHandle)},
+ {"region-size-x", OSD.FromInteger(regionSizeX)},
+ {"region-size-y", OSD.FromInteger(regionSizeY)}
+ };
return BuildEvent("EstablishAgentCommunication", body);
}
@@ -395,5 +409,25 @@ namespace OpenSim.Region.ClientStack.Linden
return message;
}
+ public static OSD partPhysicsProperties(uint localID, byte physhapetype,
+ float density, float friction, float bounce, float gravmod)
+ {
+
+ OSDMap physinfo = new OSDMap(6);
+ physinfo["LocalID"] = localID;
+ physinfo["Density"] = density;
+ physinfo["Friction"] = friction;
+ physinfo["GravityMultiplier"] = gravmod;
+ physinfo["Restitution"] = bounce;
+ physinfo["PhysicsShapeType"] = (int)physhapetype;
+
+ OSDArray array = new OSDArray(1);
+ array.Add(physinfo);
+
+ OSDMap llsdBody = new OSDMap(1);
+ llsdBody.Add("ObjectData", array);
+
+ return BuildEvent("ObjectPhysicsProperties", llsdBody);
+ }
}
}
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs
index ed8ec16..16a902d 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs
@@ -26,6 +26,7 @@
*/
using System;
+using System.Collections;
using System.Collections.Generic;
using System.Net;
using log4net.Config;
@@ -33,13 +34,15 @@ using Nini.Config;
using NUnit.Framework;
using OpenMetaverse;
using OpenMetaverse.Packets;
+using OpenMetaverse.StructuredData;
using OpenSim.Framework;
using OpenSim.Framework.Servers;
using OpenSim.Framework.Servers.HttpServer;
using OpenSim.Region.ClientStack.Linden;
using OpenSim.Region.CoreModules.Framework;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Region.OptionalModules.World.NPC;
using OpenSim.Tests.Common;
-using OpenSim.Tests.Common.Mock;
namespace OpenSim.Region.ClientStack.Linden.Tests
{
@@ -47,10 +50,14 @@ namespace OpenSim.Region.ClientStack.Linden.Tests
public class EventQueueTests : OpenSimTestCase
{
private TestScene m_scene;
+ private EventQueueGetModule m_eqgMod;
+ private NPCModule m_npcMod;
[SetUp]
- public void SetUp()
+ public override void SetUp()
{
+ base.SetUp();
+
uint port = 9999;
uint sslPort = 9998;
@@ -67,14 +74,19 @@ namespace OpenSim.Region.ClientStack.Linden.Tests
config.Configs["Startup"].Set("EventQueue", "true");
CapabilitiesModule capsModule = new CapabilitiesModule();
- EventQueueGetModule eqgModule = new EventQueueGetModule();
+ m_eqgMod = new EventQueueGetModule();
+
+ // For NPC test support
+ config.AddConfig("NPC");
+ config.Configs["NPC"].Set("Enabled", "true");
+ m_npcMod = new NPCModule();
m_scene = new SceneHelpers().SetupScene();
- SceneHelpers.SetupSceneModules(m_scene, config, capsModule, eqgModule);
+ SceneHelpers.SetupSceneModules(m_scene, config, capsModule, m_eqgMod, m_npcMod);
}
[Test]
- public void AddForClient()
+ public void TestAddForClient()
{
TestHelpers.InMethod();
// log4net.Config.XmlConfigurator.Configure();
@@ -86,18 +98,93 @@ namespace OpenSim.Region.ClientStack.Linden.Tests
}
[Test]
- public void RemoveForClient()
+ public void TestRemoveForClient()
{
TestHelpers.InMethod();
-// log4net.Config.XmlConfigurator.Configure();
+// TestHelpers.EnableLogging();
UUID spId = TestHelpers.ParseTail(0x1);
SceneHelpers.AddScenePresence(m_scene, spId);
- m_scene.IncomingCloseAgent(spId, false);
+ m_scene.CloseAgent(spId, false);
// TODO: Add more assertions for the other aspects of event queues
Assert.That(MainServer.Instance.GetPollServiceHandlerKeys().Count, Is.EqualTo(0));
}
+
+ [Test]
+ public void TestEnqueueMessage()
+ {
+ TestHelpers.InMethod();
+// log4net.Config.XmlConfigurator.Configure();
+
+ ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
+
+ string messageName = "TestMessage";
+
+ m_eqgMod.Enqueue(m_eqgMod.BuildEvent(messageName, new OSDMap()), sp.UUID);
+
+ Hashtable eventsResponse = m_eqgMod.GetEvents(UUID.Zero, sp.UUID);
+
+ Assert.That((int)eventsResponse["int_response_code"], Is.EqualTo((int)HttpStatusCode.OK));
+
+// Console.WriteLine("Response [{0}]", (string)eventsResponse["str_response_string"]);
+
+ OSDMap rawOsd = (OSDMap)OSDParser.DeserializeLLSDXml((string)eventsResponse["str_response_string"]);
+ OSDArray eventsOsd = (OSDArray)rawOsd["events"];
+
+ bool foundUpdate = false;
+ foreach (OSD osd in eventsOsd)
+ {
+ OSDMap eventOsd = (OSDMap)osd;
+
+ if (eventOsd["message"] == messageName)
+ foundUpdate = true;
+ }
+
+ Assert.That(foundUpdate, Is.True, string.Format("Did not find {0} in response", messageName));
+ }
+
+ ///
+ /// Test an attempt to put a message on the queue of a user that is not in the region.
+ ///
+ [Test]
+ public void TestEnqueueMessageNoUser()
+ {
+ TestHelpers.InMethod();
+ TestHelpers.EnableLogging();
+
+ string messageName = "TestMessage";
+
+ m_eqgMod.Enqueue(m_eqgMod.BuildEvent(messageName, new OSDMap()), TestHelpers.ParseTail(0x1));
+
+ Hashtable eventsResponse = m_eqgMod.GetEvents(UUID.Zero, TestHelpers.ParseTail(0x1));
+
+ Assert.That((int)eventsResponse["int_response_code"], Is.EqualTo((int)HttpStatusCode.BadGateway));
+ }
+
+ ///
+ /// NPCs do not currently have an event queue but a caller may try to send a message anyway, so check behaviour.
+ ///
+ [Test]
+ public void TestEnqueueMessageToNpc()
+ {
+ TestHelpers.InMethod();
+// TestHelpers.EnableLogging();
+
+ UUID npcId
+ = m_npcMod.CreateNPC(
+ "John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, m_scene, new AvatarAppearance());
+
+ ScenePresence npc = m_scene.GetScenePresence(npcId);
+
+ string messageName = "TestMessage";
+
+ m_eqgMod.Enqueue(m_eqgMod.BuildEvent(messageName, new OSDMap()), npc.UUID);
+
+ Hashtable eventsResponse = m_eqgMod.GetEvents(UUID.Zero, npc.UUID);
+
+ Assert.That((int)eventsResponse["int_response_code"], Is.EqualTo((int)HttpStatusCode.BadGateway));
+ }
}
}
\ No newline at end of file
--
cgit v1.1