aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2014-04-02 00:58:33 +0100
committerJustin Clark-Casey (justincc)2014-04-02 00:58:33 +0100
commit0af8886400e56cfbc2efc0d6a8ab01eb289b4e52 (patch)
treeedd6ccc86d800964d27f7a034e8381f5cb03abd9 /OpenSim
parentMerge branch 'master' of /home/opensim/src/opensim (diff)
downloadopensim-SC-0af8886400e56cfbc2efc0d6a8ab01eb289b4e52.zip
opensim-SC-0af8886400e56cfbc2efc0d6a8ab01eb289b4e52.tar.gz
opensim-SC-0af8886400e56cfbc2efc0d6a8ab01eb289b4e52.tar.bz2
opensim-SC-0af8886400e56cfbc2efc0d6a8ab01eb289b4e52.tar.xz
Fix problem where moving an object to another region on the same simulator was failing, with the object returning to its original position.
Root cause was that PrimLimitsModule was not properly handling the case where the parcel it was asked to check was outside the current region's bounds. If this is the case, we can abort the check since the receiving region will perform it. Added a regression test for this case.
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs19
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneObjectCrossingTests.cs161
-rw-r--r--OpenSim/Region/OptionalModules/PrimLimitsModule/PrimLimitsModule.cs7
-rw-r--r--OpenSim/Tests/Common/Helpers/SceneHelpers.cs26
4 files changed, 207 insertions, 6 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 1aecce5..558f108 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1326,12 +1326,23 @@ namespace OpenSim.Region.Framework.Scenes
1326 /// <summary> 1326 /// <summary>
1327 /// Update the position of the given group. 1327 /// Update the position of the given group.
1328 /// </summary> 1328 /// </summary>
1329 /// <param name="localID"></param> 1329 /// <param name="localId"></param>
1330 /// <param name="pos"></param> 1330 /// <param name="pos"></param>
1331 /// <param name="remoteClient"></param> 1331 /// <param name="remoteClient"></param>
1332 public void UpdatePrimGroupPosition(uint localID, Vector3 pos, IClientAPI remoteClient) 1332 public void UpdatePrimGroupPosition(uint localId, Vector3 pos, IClientAPI remoteClient)
1333 { 1333 {
1334 SceneObjectGroup group = GetGroupByPrim(localID); 1334 UpdatePrimGroupPosition(localId, pos, remoteClient.AgentId);
1335 }
1336
1337 /// <summary>
1338 /// Update the position of the given group.
1339 /// </summary>
1340 /// <param name="localId"></param>
1341 /// <param name="pos"></param>
1342 /// <param name="updatingAgentId"></param>
1343 public void UpdatePrimGroupPosition(uint localId, Vector3 pos, UUID updatingAgentId)
1344 {
1345 SceneObjectGroup group = GetGroupByPrim(localId);
1335 1346
1336 if (group != null) 1347 if (group != null)
1337 { 1348 {
@@ -1342,7 +1353,7 @@ namespace OpenSim.Region.Framework.Scenes
1342 } 1353 }
1343 else 1354 else
1344 { 1355 {
1345 if (m_parentScene.Permissions.CanMoveObject(group.UUID, remoteClient.AgentId) 1356 if (m_parentScene.Permissions.CanMoveObject(group.UUID, updatingAgentId)
1346 && m_parentScene.Permissions.CanObjectEntry(group.UUID, false, pos)) 1357 && m_parentScene.Permissions.CanObjectEntry(group.UUID, false, pos))
1347 { 1358 {
1348 group.UpdateGroupPosition(pos); 1359 group.UpdateGroupPosition(pos);
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectCrossingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectCrossingTests.cs
new file mode 100644
index 0000000..43ac558
--- /dev/null
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectCrossingTests.cs
@@ -0,0 +1,161 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using Nini.Config;
30using NUnit.Framework;
31using OpenMetaverse;
32using OpenSim.Framework;
33using OpenSim.Region.CoreModules.Framework.EntityTransfer;
34using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
35using OpenSim.Region.CoreModules.World.Land;
36using OpenSim.Region.OptionalModules;
37using OpenSim.Tests.Common;
38using OpenSim.Tests.Common.Mock;
39
40namespace OpenSim.Region.Framework.Scenes.Tests
41{
42 public class SceneObjectCrossingTests : OpenSimTestCase
43 {
44 [TestFixtureSetUp]
45 public void FixtureInit()
46 {
47 // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
48 Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest;
49 }
50
51 [TestFixtureTearDown]
52 public void TearDown()
53 {
54 // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
55 // threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression
56 // tests really shouldn't).
57 Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
58 }
59
60 /// <summary>
61 /// Test cross with no prim limit module.
62 /// </summary>
63 [Test]
64 public void TestCrossOnSameSimulator()
65 {
66 TestHelpers.InMethod();
67 TestHelpers.EnableLogging();
68
69 UUID userId = TestHelpers.ParseTail(0x1);
70 int sceneObjectIdTail = 0x2;
71
72 EntityTransferModule etmA = new EntityTransferModule();
73 EntityTransferModule etmB = new EntityTransferModule();
74 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
75
76 IConfigSource config = new IniConfigSource();
77 IConfig modulesConfig = config.AddConfig("Modules");
78 modulesConfig.Set("EntityTransferModule", etmA.Name);
79 modulesConfig.Set("SimulationServices", lscm.Name);
80// IConfig entityTransferConfig = config.AddConfig("EntityTransfer");
81
82 SceneHelpers sh = new SceneHelpers();
83 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
84 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1000, 999);
85
86 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
87 SceneHelpers.SetupSceneModules(sceneA, config, etmA);
88 SceneHelpers.SetupSceneModules(sceneB, config, etmB);
89
90 SceneObjectGroup so1 = SceneHelpers.AddSceneObject(sceneA, 1, userId, "", sceneObjectIdTail);
91 UUID so1Id = so1.UUID;
92 so1.AbsolutePosition = new Vector3(128, 10, 20);
93
94 // Cross with a negative value
95 so1.AbsolutePosition = new Vector3(128, -10, 20);
96
97 Assert.IsNull(sceneA.GetSceneObjectGroup(so1Id));
98 Assert.NotNull(sceneB.GetSceneObjectGroup(so1Id));
99 }
100
101 /// <summary>
102 /// Test cross with no prim limit module.
103 /// </summary>
104 /// <remarks>
105 /// XXX: This test may be better off in a specific PrimLimitsModuleTest class in optional module tests in the
106 /// future (though it is configured as active by default, so not really optional).
107 /// </remarks>
108 [Test]
109 public void TestCrossOnSameSimulatorPrimLimitsOkay()
110 {
111 TestHelpers.InMethod();
112 TestHelpers.EnableLogging();
113
114 UUID userId = TestHelpers.ParseTail(0x1);
115 int sceneObjectIdTail = 0x2;
116
117 EntityTransferModule etmA = new EntityTransferModule();
118 EntityTransferModule etmB = new EntityTransferModule();
119 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
120 LandManagementModule lmmA = new LandManagementModule();
121 LandManagementModule lmmB = new LandManagementModule();
122
123 IConfigSource config = new IniConfigSource();
124 IConfig modulesConfig = config.AddConfig("Modules");
125 modulesConfig.Set("EntityTransferModule", etmA.Name);
126 modulesConfig.Set("SimulationServices", lscm.Name);
127
128 // Remove?
129// IConfig entityTransferConfig = config.AddConfig("EntityTransfer");
130
131 IConfig permissionsConfig = config.AddConfig("Permissions");
132 permissionsConfig.Set("permissionmodules", "PrimLimitsModule");
133
134 SceneHelpers sh = new SceneHelpers();
135 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
136 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1000, 999);
137
138 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
139 SceneHelpers.SetupSceneModules(
140 sceneA, config, etmA, lmmA, new PrimLimitsModule(), new PrimCountModule());
141 SceneHelpers.SetupSceneModules(
142 sceneB, config, etmB, lmmB, new PrimLimitsModule(), new PrimCountModule());
143
144 // We must set up the parcel for this to work. Normally this is taken care of by OpenSimulator startup
145 // code which is not yet easily invoked by tests.
146 lmmA.EventManagerOnNoLandDataFromStorage();
147 lmmB.EventManagerOnNoLandDataFromStorage();
148
149 SceneObjectGroup so1 = SceneHelpers.AddSceneObject(sceneA, 1, userId, "", sceneObjectIdTail);
150 UUID so1Id = so1.UUID;
151 so1.AbsolutePosition = new Vector3(128, 10, 20);
152
153 // Cross with a negative value. We must make this call rather than setting AbsolutePosition directly
154 // because only this will execute permission checks in the source region.
155 sceneA.SceneGraph.UpdatePrimGroupPosition(so1.LocalId, new Vector3(128, -10, 20), userId);
156
157 Assert.IsNull(sceneA.GetSceneObjectGroup(so1Id));
158 Assert.NotNull(sceneB.GetSceneObjectGroup(so1Id));
159 }
160 }
161} \ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/PrimLimitsModule/PrimLimitsModule.cs b/OpenSim/Region/OptionalModules/PrimLimitsModule/PrimLimitsModule.cs
index 8b4d231..18cec6c 100644
--- a/OpenSim/Region/OptionalModules/PrimLimitsModule/PrimLimitsModule.cs
+++ b/OpenSim/Region/OptionalModules/PrimLimitsModule/PrimLimitsModule.cs
@@ -58,8 +58,6 @@ namespace OpenSim.Region.OptionalModules
58 58
59 public void Initialise(IConfigSource config) 59 public void Initialise(IConfigSource config)
60 { 60 {
61 //IConfig myConfig = config.Configs["Startup"];
62
63 string permissionModules = Util.GetConfigVarFromSections<string>(config, "permissionmodules", 61 string permissionModules = Util.GetConfigVarFromSections<string>(config, "permissionmodules",
64 new string[] { "Startup", "Permissions" }, "DefaultPermissionsModule"); 62 new string[] { "Startup", "Permissions" }, "DefaultPermissionsModule");
65 63
@@ -129,6 +127,11 @@ namespace OpenSim.Region.OptionalModules
129 ILandObject oldParcel = scene.LandChannel.GetLandObject(oldPoint.X, oldPoint.Y); 127 ILandObject oldParcel = scene.LandChannel.GetLandObject(oldPoint.X, oldPoint.Y);
130 ILandObject newParcel = scene.LandChannel.GetLandObject(newPoint.X, newPoint.Y); 128 ILandObject newParcel = scene.LandChannel.GetLandObject(newPoint.X, newPoint.Y);
131 129
130 // newParcel will be null only if it outside of our current region. If this is the case, then the
131 // receiving permissions will perform the check.
132 if (newParcel == null)
133 return true;
134
132 int usedPrims = newParcel.PrimCounts.Total; 135 int usedPrims = newParcel.PrimCounts.Total;
133 int simulatorCapacity = newParcel.GetSimulatorMaxPrimCount(); 136 int simulatorCapacity = newParcel.GetSimulatorMaxPrimCount();
134 137
diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
index 584ca17..345ca8a 100644
--- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
+++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
@@ -595,6 +595,32 @@ namespace OpenSim.Tests.Common
595 595
596 return so; 596 return so;
597 } 597 }
598
599 /// <summary>
600 /// Add a test object
601 /// </summary>
602 /// <param name="scene"></param>
603 /// <param name="parts">
604 /// The number of parts that should be in the scene object
605 /// </param>
606 /// <param name="ownerId"></param>
607 /// <param name="partNamePrefix">
608 /// The prefix to be given to part names. This will be suffixed with "Part<part no>"
609 /// (e.g. mynamePart1 for the root part)
610 /// </param>
611 /// <param name="uuidTail">
612 /// The hexadecimal last part of the UUID for parts created. A UUID of the form "00000000-0000-0000-0000-{0:XD12}"
613 /// will be given to the root part, and incremented for each part thereafter.
614 /// </param>
615 /// <returns></returns>
616 public static SceneObjectGroup AddSceneObject(Scene scene, int parts, UUID ownerId, string partNamePrefix, int uuidTail)
617 {
618 SceneObjectGroup so = CreateSceneObject(parts, ownerId, partNamePrefix, uuidTail);
619
620 scene.AddNewSceneObject(so, false);
621
622 return so;
623 }
598 624
599 /// <summary> 625 /// <summary>
600 /// Create a scene object part. 626 /// Create a scene object part.