From 1d2a332b96794e2011b0527cf590c3ceedcd8af4 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Wed, 30 Dec 2009 14:17:18 -0800
Subject: Unit tests for presence. They helped fix a couple of wrongnesses.
---
OpenSim/Data/IPresenceData.cs | 2 +-
OpenSim/Data/Null/NullPresenceData.cs | 223 +++++++++++++++++++++
.../Presence/LocalPresenceServiceConnector.cs | 13 +-
.../Presence/Tests/PresenceConnectorsTests.cs | 104 ++++++++++
.../Services/PresenceService/PresenceService.cs | 32 ++-
prebuild.xml | 1 +
6 files changed, 363 insertions(+), 12 deletions(-)
create mode 100644 OpenSim/Data/Null/NullPresenceData.cs
create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/Tests/PresenceConnectorsTests.cs
diff --git a/OpenSim/Data/IPresenceData.cs b/OpenSim/Data/IPresenceData.cs
index 20eb7f6..71d0e31 100644
--- a/OpenSim/Data/IPresenceData.cs
+++ b/OpenSim/Data/IPresenceData.cs
@@ -42,7 +42,7 @@ namespace OpenSim.Data
}
///
- /// An interface for connecting to the authentication datastore
+ /// An interface for connecting to the presence datastore
///
public interface IPresenceData
{
diff --git a/OpenSim/Data/Null/NullPresenceData.cs b/OpenSim/Data/Null/NullPresenceData.cs
new file mode 100644
index 0000000..52fdc6f
--- /dev/null
+++ b/OpenSim/Data/Null/NullPresenceData.cs
@@ -0,0 +1,223 @@
+/*
+ * 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;
+using System.Collections.Generic;
+using OpenMetaverse;
+using OpenSim.Framework;
+using OpenSim.Data;
+
+namespace OpenSim.Data.Null
+{
+ public class NullPresenceData : IPresenceData
+ {
+ Dictionary m_presenceData = new Dictionary();
+
+ public NullPresenceData(string connectionString, string realm)
+ {
+ //Console.WriteLine("[XXX] NullRegionData constructor");
+ // Let's stick in a test presence
+ PresenceData p = new PresenceData();
+ p.SessionID = UUID.Zero;
+ p.UserID = UUID.Zero.ToString();
+ p.Data = new Dictionary();
+ p.Data["Online"] = "true";
+ m_presenceData.Add(UUID.Zero, p);
+ }
+
+ public bool Store(PresenceData data)
+ {
+ m_presenceData[data.SessionID] = data;
+ return true;
+ }
+
+ public PresenceData Get(UUID sessionID)
+ {
+ if (m_presenceData.ContainsKey(sessionID))
+ return m_presenceData[sessionID];
+
+ return null;
+ }
+
+ public void LogoutRegionAgents(UUID regionID)
+ {
+ List toBeDeleted = new List();
+ foreach (KeyValuePair kvp in m_presenceData)
+ if (kvp.Value.RegionID == regionID)
+ toBeDeleted.Add(kvp.Key);
+
+ foreach (UUID u in toBeDeleted)
+ m_presenceData.Remove(u);
+ }
+
+ public bool ReportAgent(UUID sessionID, UUID regionID, string position, string lookAt)
+ {
+ if (m_presenceData.ContainsKey(sessionID))
+ {
+ m_presenceData[sessionID].RegionID = regionID;
+ m_presenceData[sessionID].Data["Position"] = position;
+ m_presenceData[sessionID].Data["LookAt"] = lookAt;
+ return true;
+ }
+
+ return false;
+ }
+
+ public bool SetHomeLocation(string userID, UUID regionID, Vector3 position, Vector3 lookAt)
+ {
+ bool foundone = false;
+ foreach (PresenceData p in m_presenceData.Values)
+ {
+ if (p.UserID == userID)
+ {
+ p.Data["HomeRegionID"] = regionID.ToString();
+ p.Data["HomePosition"] = position.ToString();
+ p.Data["HomeLookAt"] = lookAt.ToString();
+ foundone = true;
+ }
+ }
+
+ return foundone;
+ }
+
+ public PresenceData[] Get(string field, string data)
+ {
+ List presences = new List();
+ if (field == "UserID")
+ {
+ foreach (PresenceData p in m_presenceData.Values)
+ if (p.UserID == data)
+ presences.Add(p);
+ return presences.ToArray();
+ }
+ else if (field == "SessionID")
+ {
+ UUID session = UUID.Zero;
+ if (!UUID.TryParse(data, out session))
+ return presences.ToArray();
+
+ if (m_presenceData.ContainsKey(session))
+ {
+ presences.Add(m_presenceData[session]);
+ return presences.ToArray();
+ }
+ }
+ else if (field == "RegionID")
+ {
+ UUID region = UUID.Zero;
+ if (!UUID.TryParse(data, out region))
+ return presences.ToArray();
+ foreach (PresenceData p in m_presenceData.Values)
+ if (p.RegionID == region)
+ presences.Add(p);
+ return presences.ToArray();
+ }
+ else
+ {
+ foreach (PresenceData p in m_presenceData.Values)
+ {
+ if (p.Data.ContainsKey(field) && p.Data[field] == data)
+ presences.Add(p);
+ }
+ return presences.ToArray();
+ }
+
+ return presences.ToArray();
+ }
+
+ public void Prune(string userID)
+ {
+ List deleteSessions = new List();
+ int online = 0;
+
+ foreach (KeyValuePair kvp in m_presenceData)
+ {
+ bool on = false;
+ if (bool.TryParse(kvp.Value.Data["Online"], out on) && on)
+ online++;
+ else
+ deleteSessions.Add(kvp.Key);
+ }
+ if (online == 0 && deleteSessions.Count > 0)
+ deleteSessions.RemoveAt(0);
+
+ foreach (UUID s in deleteSessions)
+ m_presenceData.Remove(s);
+
+ }
+
+ public bool Delete(string field, string data)
+ {
+ List presences = new List();
+ if (field == "UserID")
+ {
+ foreach (KeyValuePair p in m_presenceData)
+ if (p.Value.UserID == data)
+ presences.Add(p.Key);
+ }
+ else if (field == "SessionID")
+ {
+ UUID session = UUID.Zero;
+ if (UUID.TryParse(data, out session))
+ {
+ if (m_presenceData.ContainsKey(session))
+ {
+ presences.Add(session);
+ }
+ }
+ }
+ else if (field == "RegionID")
+ {
+ UUID region = UUID.Zero;
+ if (UUID.TryParse(data, out region))
+ {
+ foreach (KeyValuePair p in m_presenceData)
+ if (p.Value.RegionID == region)
+ presences.Add(p.Key);
+ }
+ }
+ else
+ {
+ foreach (KeyValuePair p in m_presenceData)
+ {
+ if (p.Value.Data.ContainsKey(field) && p.Value.Data[field] == data)
+ presences.Add(p.Key);
+ }
+ }
+
+ foreach (UUID u in presences)
+ m_presenceData.Remove(u);
+
+ if (presences.Count == 0)
+ return false;
+
+ return true;
+ }
+
+ }
+}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/LocalPresenceServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/LocalPresenceServiceConnector.cs
index 644d755..2cb18c7 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/LocalPresenceServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/LocalPresenceServiceConnector.cs
@@ -44,13 +44,22 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- #region ISharedRegionModule
-
private bool m_Enabled = false;
private PresenceDetector m_PresenceDetector;
private IPresenceService m_PresenceService;
+ public LocalPresenceServicesConnector()
+ {
+ }
+
+ public LocalPresenceServicesConnector(IConfigSource source)
+ {
+ Initialise(source);
+ }
+
+ #region ISharedRegionModule
+
public Type ReplaceableInterface
{
get { return null; }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/Tests/PresenceConnectorsTests.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/Tests/PresenceConnectorsTests.cs
new file mode 100644
index 0000000..ebb2c3e
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/Tests/PresenceConnectorsTests.cs
@@ -0,0 +1,104 @@
+/*
+ * 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 System.IO;
+using System.Reflection;
+using System.Threading;
+using log4net.Config;
+using NUnit.Framework;
+using NUnit.Framework.SyntaxHelpers;
+using OpenMetaverse;
+using OpenSim.Framework;
+using Nini.Config;
+
+using OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence;
+using OpenSim.Region.Framework.Scenes;
+using PresenceInfo = OpenSim.Services.Interfaces.PresenceInfo;
+using OpenSim.Tests.Common;
+using OpenSim.Tests.Common.Setup;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence.Tests
+{
+ [TestFixture]
+ public class PresenceConnectorsTests
+ {
+ LocalPresenceServicesConnector m_LocalConnector;
+ private void SetUp()
+ {
+ IConfigSource config = new IniConfigSource();
+ config.AddConfig("Modules");
+ config.AddConfig("PresenceService");
+ config.Configs["Modules"].Set("PresenceServices", "LocalPresenceServicesConnector");
+ config.Configs["PresenceService"].Set("LocalServiceModule", "OpenSim.Services.PresenceService.dll:PresenceService");
+ config.Configs["PresenceService"].Set("StorageProvider", "OpenSim.Data.Null.dll:NullPresenceData");
+
+ m_LocalConnector = new LocalPresenceServicesConnector(config);
+ }
+
+ ///
+ /// Test OpenSim Presence.
+ ///
+ [Test]
+ public void TestPresenceV0_1()
+ {
+ SetUp();
+
+ string user1 = UUID.Zero.ToString();
+ UUID session1 = UUID.Zero;
+
+ // this is not implemented by this connector
+ //m_LocalConnector.LoginAgent(user1, session1, UUID.Zero);
+ PresenceInfo result = m_LocalConnector.GetAgent(session1);
+ Assert.IsNotNull(result, "Retrieved GetAgent is null");
+ Assert.That(result.UserID, Is.EqualTo(user1), "Retrieved userID does not match");
+ Assert.IsTrue(result.Online, "Agent just logged in but is offline");
+
+ UUID region1 = UUID.Random();
+ bool r = m_LocalConnector.ReportAgent(session1, region1, Vector3.Zero, Vector3.Zero);
+ Assert.IsTrue(r, "First ReportAgent returned false");
+ result = m_LocalConnector.GetAgent(session1);
+ Assert.That(result.RegionID, Is.EqualTo(region1), "Agent is not in the right region (region1)");
+
+ UUID region2 = UUID.Random();
+ r = m_LocalConnector.ReportAgent(session1, region2, Vector3.Zero, Vector3.Zero);
+ Assert.IsTrue(r, "Second ReportAgent returned false");
+ result = m_LocalConnector.GetAgent(session1);
+ Assert.That(result.RegionID, Is.EqualTo(region2), "Agent is not in the right region (region2)");
+
+ r = m_LocalConnector.LogoutAgent(session1);
+ Assert.IsTrue(r, "LogoutAgent returned false");
+ result = m_LocalConnector.GetAgent(session1);
+ Assert.IsNotNull(result, "Agent session disappeared from storage after logout");
+ Assert.IsFalse(result.Online, "Agent is reported to be Online after logout");
+
+ r = m_LocalConnector.ReportAgent(session1, region1, Vector3.Zero, Vector3.Zero);
+ Assert.IsFalse(r, "ReportAgent of non-logged in user returned true");
+ }
+ }
+}
diff --git a/OpenSim/Services/PresenceService/PresenceService.cs b/OpenSim/Services/PresenceService/PresenceService.cs
index b3d8194..fc6a6e1 100644
--- a/OpenSim/Services/PresenceService/PresenceService.cs
+++ b/OpenSim/Services/PresenceService/PresenceService.cs
@@ -64,6 +64,7 @@ namespace OpenSim.Services.PresenceService
data.RegionID = UUID.Zero;
data.SessionID = sessionID;
data.Data["SecureSessionID"] = secureSessionID.ToString();
+ data.Data["Online"] = "true";
data.Data["Login"] = Util.UnixTimeSinceEpoch().ToString();
if (d.Length > 0)
{
@@ -88,7 +89,6 @@ namespace OpenSim.Services.PresenceService
if (d.Length > 1)
{
m_Database.Delete("SessionID", sessionID.ToString());
- return true;
}
data.Data["Online"] = "false";
@@ -110,6 +110,12 @@ namespace OpenSim.Services.PresenceService
public bool ReportAgent(UUID sessionID, UUID regionID, Vector3 position, Vector3 lookAt)
{
m_log.DebugFormat("[PRESENCE SERVICE]: ReportAgent with session {0} in region {1}", sessionID, regionID);
+ PresenceData pdata = m_Database.Get(sessionID);
+ if (pdata == null)
+ return false;
+ if (pdata.Data["Online"] == "false")
+ return false;
+
return m_Database.ReportAgent(sessionID, regionID,
position.ToString(), lookAt.ToString());
}
@@ -124,14 +130,22 @@ namespace OpenSim.Services.PresenceService
ret.UserID = data.UserID;
ret.RegionID = data.RegionID;
- ret.Online = bool.Parse(data.Data["Online"]);
- ret.Login = Util.ToDateTime(Convert.ToInt32(data.Data["Login"]));
- ret.Logout = Util.ToDateTime(Convert.ToInt32(data.Data["Logout"]));
- ret.Position = Vector3.Parse(data.Data["Position"]);
- ret.LookAt = Vector3.Parse(data.Data["LookAt"]);
- ret.HomeRegionID = new UUID(data.Data["HomeRegionID"]);
- ret.HomePosition = Vector3.Parse(data.Data["HomePosition"]);
- ret.HomeLookAt = Vector3.Parse(data.Data["HomeLookAt"]);
+ if (data.Data.ContainsKey("Online"))
+ ret.Online = bool.Parse(data.Data["Online"]);
+ if (data.Data.ContainsKey("Login"))
+ ret.Login = Util.ToDateTime(Convert.ToInt32(data.Data["Login"]));
+ if (data.Data.ContainsKey("Logout"))
+ ret.Logout = Util.ToDateTime(Convert.ToInt32(data.Data["Logout"]));
+ if (data.Data.ContainsKey("Position"))
+ ret.Position = Vector3.Parse(data.Data["Position"]);
+ if (data.Data.ContainsKey("LookAt"))
+ ret.LookAt = Vector3.Parse(data.Data["LookAt"]);
+ if (data.Data.ContainsKey("HomeRegionID"))
+ ret.HomeRegionID = new UUID(data.Data["HomeRegionID"]);
+ if (data.Data.ContainsKey("HomePosition"))
+ ret.HomePosition = Vector3.Parse(data.Data["HomePosition"]);
+ if (data.Data.ContainsKey("HomeLookAt"))
+ ret.HomeLookAt = Vector3.Parse(data.Data["HomeLookAt"]);
return ret;
}
diff --git a/prebuild.xml b/prebuild.xml
index 863064a..7e7ce28 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -3274,6 +3274,7 @@
+
--
cgit v1.1