From 7a4f11b94da2ba2fbe24393ce2804214e199bce7 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Fri, 12 Dec 2008 18:33:16 +0000 Subject: * Deleted old EntiyList tests, added new EntityManager tests * Edited EntityManager to treat Exceptions From: Arthur Rodrigo S Valadares --- .../Environment/Scenes/Tests/EntityManagerTests.cs | 178 +++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 OpenSim/Region/Environment/Scenes/Tests/EntityManagerTests.cs (limited to 'OpenSim/Region/Environment/Scenes/Tests/EntityManagerTests.cs') diff --git a/OpenSim/Region/Environment/Scenes/Tests/EntityManagerTests.cs b/OpenSim/Region/Environment/Scenes/Tests/EntityManagerTests.cs new file mode 100644 index 0000000..5923a2c --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/Tests/EntityManagerTests.cs @@ -0,0 +1,178 @@ +/* + * 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 OpenSim 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 NUnit.Framework.SyntaxHelpers; +using System; +using System.Threading; +using System.Text; +using System.Collections.Generic; +using Nini.Config; +using NUnit.Framework; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Region.Environment.Scenes; +using OpenMetaverse; + +namespace OpenSim.Region.Environment.Scenes.Tests +{ + /// + /// Scene oriented tests + /// + [TestFixture] + public class EntityManagerTests + { + static public Random random; + SceneObjectGroup found; + Scene scene = SceneTestUtils.SetupScene(); + + [Test] + public void T010_AddObjects() + { + random = new Random(); + SceneObjectGroup found; + EntityManager entman = new EntityManager(); + SceneObjectGroup sog = NewSOG(); + UUID obj1 = sog.UUID; + uint li1 = sog.LocalId; + entman.Add(sog); + sog = NewSOG(); + UUID obj2 = sog.UUID; + uint li2 = sog.LocalId; + entman.Add(sog); + + found = (SceneObjectGroup)entman[obj1]; + Assert.That(found.UUID ,Is.EqualTo(obj1) ); + found = (SceneObjectGroup)entman[li1]; + Assert.That(found.UUID ,Is.EqualTo(obj1) ); + found = (SceneObjectGroup)entman[obj2]; + Assert.That(found.UUID ,Is.EqualTo(obj2) ); + found = (SceneObjectGroup)entman[li2]; + Assert.That(found.UUID ,Is.EqualTo(obj2) ); + + entman.Remove(obj1); + entman.Remove(li2); + + Assert.That(entman.ContainsKey(obj1), Is.False); + Assert.That(entman.ContainsKey(li1), Is.False); + Assert.That(entman.ContainsKey(obj2), Is.False); + Assert.That(entman.ContainsKey(li2), Is.False); + } + + [Test] + public void T011_ThreadAddRemoveTest() + { + // This test adds and removes with mutiple threads, attempting to break the + // uuid and localid dictionary coherence. + EntityManager entman = new EntityManager(); + SceneObjectGroup sog = NewSOG(); + for (int j=0; j<20; j++) + { + List trdlist = new List(); + + for (int i=0; i<4; i++) + { + // Adds scene object + NewTestThreads test = new NewTestThreads(entman,sog); + Thread start = new Thread(new ThreadStart(test.TestAddSceneObject)); + start.Start(); + trdlist.Add(start); + + // Removes it + test = new NewTestThreads(entman,sog); + start = new Thread(new ThreadStart(test.TestRemoveSceneObject)); + start.Start(); + trdlist.Add(start); + } + foreach (Thread thread in trdlist) + { + thread.Join(); + } + if (entman.ContainsKey(sog.UUID) || entman.ContainsKey(sog.LocalId)) { + found = (SceneObjectGroup)entman[sog.UUID]; + Assert.That(found.UUID,Is.EqualTo(sog.UUID)); + found = (SceneObjectGroup)entman[sog.LocalId]; + Assert.That(found.UUID,Is.EqualTo(sog.UUID)); + } + } + } + + private SceneObjectGroup NewSOG() + { + SceneObjectGroup sog = new SceneObjectGroup(); + SceneObjectPart sop = new SceneObjectPart(UUID.Random(), PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero); + sop.Name = RandomName(); + sop.Description = sop.Name; + sop.Text = RandomName(); + sop.SitName = RandomName(); + sop.TouchName = RandomName(); + sop.ObjectFlags |= (uint)PrimFlags.Phantom; + + sog.SetRootPart(sop); + + scene.AddNewSceneObject(sog, false); + + return sog; + } + + private static string RandomName() + { + StringBuilder name = new StringBuilder(); + int size = random.Next(40,80); + char ch ; + for (int i=0; i