From 038d1bf742ba4f95ca8a83b27f6fefb755485524 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 17:44:37 +0000 Subject: [PATCH 1/5] Add a regression test to compile and start a script. Remove Path.GetDirectoryName when getting assembly loading path in Compiler.CompileFromDotNetText(). The Path.GetDirectoryName call in Compiler.CompileFromDotNetText is unnecessary since AppDomain.CurrentDomain.BaseDirectory is always a directory. Later path concatenation is already done by Path.Combine() which handles any trailing slash. Removing Path.GetDirectoryName() will not affect the runtime but allows NUnit to work since it doesn't add a trailing slash to AppDomain.CurrentDomain.BaseDirectory. --- .../Scenes/SceneObjectPartInventory.cs | 12 +-- .../ScriptEngine/Shared/AssemblyResolver.cs | 4 +- .../Shared/CodeTools/CSCodeGenerator.cs | 6 ++ .../ScriptEngine/Shared/CodeTools/Compiler.cs | 10 +- .../ScriptEngine/XEngine/Tests/XEngineTest.cs | 96 +++++++++++++++---- .../Region/ScriptEngine/XEngine/XEngine.cs | 23 ++++- OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 23 ++++- 7 files changed, 137 insertions(+), 37 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 0c36dcd686..f2d19156f1 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -267,10 +267,8 @@ namespace OpenSim.Region.Framework.Scenes /// public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource) { - // m_log.InfoFormat( - // "[PRIM INVENTORY]: " + - // "Starting script {0}, {1} in prim {2}, {3}", - // item.Name, item.ItemID, Name, UUID); +// m_log.DebugFormat("[PRIM INVENTORY]: Starting script {0} {1} in prim {2} {3} in {4}", +// item.Name, item.ItemID, m_part.Name, m_part.UUID, m_part.ParentGroup.Scene.RegionInfo.RegionName); if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) return; @@ -299,8 +297,7 @@ namespace OpenSim.Region.Framework.Scenes if (null == asset) { m_log.ErrorFormat( - "[PRIM INVENTORY]: " + - "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", + "[PRIM INVENTORY]: Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", item.Name, item.ItemID, m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID); } @@ -400,8 +397,7 @@ namespace OpenSim.Region.Framework.Scenes CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); else m_log.ErrorFormat( - "[PRIM INVENTORY]: " + - "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", + "[PRIM INVENTORY]: Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", itemId, m_part.Name, m_part.UUID, m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); } diff --git a/OpenSim/Region/ScriptEngine/Shared/AssemblyResolver.cs b/OpenSim/Region/ScriptEngine/Shared/AssemblyResolver.cs index 130e197841..e35f79fd71 100644 --- a/OpenSim/Region/ScriptEngine/Shared/AssemblyResolver.cs +++ b/OpenSim/Region/ScriptEngine/Shared/AssemblyResolver.cs @@ -44,7 +44,7 @@ namespace OpenSim.Region.ScriptEngine.Shared string dirName = myDomain.FriendlyName; string ScriptEnginesPath = myDomain.SetupInformation.PrivateBinPath; - string[] pathList = new string[] {"bin", ScriptEnginesPath, + string[] pathList = new string[] {"", "bin", ScriptEnginesPath, Path.Combine(ScriptEnginesPath, dirName)}; string assemblyName = args.Name; @@ -56,6 +56,8 @@ namespace OpenSim.Region.ScriptEngine.Shared string path = Path.Combine(Directory.GetCurrentDirectory(), Path.Combine(s, assemblyName))+".dll"; +// Console.WriteLine("Trying to resolve {0}", path); + if (File.Exists(path)) return Assembly.LoadFrom(path); } diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs index b1fb6c2810..8b88588391 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs @@ -28,12 +28,16 @@ using System; using System.IO; using System.Collections.Generic; +using System.Reflection; +using log4net; using Tools; namespace OpenSim.Region.ScriptEngine.Shared.CodeTools { public class CSCodeGenerator : ICodeConverter { +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private SYMBOL m_astRoot = null; private Dictionary, KeyValuePair> m_positionMap; private int m_indentWidth = 4; // for indentation @@ -87,6 +91,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// String containing the generated C# code. public string Convert(string script) { +// m_log.DebugFormat("[CS CODE GENERATOR]: Converting to C#\n{0}", script); + m_warnings.Clear(); ResetCounters(); Parser p = new LSLSyntax(new yyLSLSyntax(), new ErrorHandler(true)); diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs index 734d4d5beb..c10143b9a1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs @@ -291,6 +291,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools public void PerformScriptCompile(string Script, string asset, UUID ownerUUID, out string assembly, out Dictionary, KeyValuePair> linemap) { +// m_log.DebugFormat("[Compiler]: Compiling script\n{0}", Script); + linemap = null; m_warnings.Clear(); @@ -357,6 +359,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools if (Script.StartsWith("//yp", true, CultureInfo.InvariantCulture)) language = enumCompileType.yp; +// m_log.DebugFormat("[Compiler]: Compile language is {0}", language); + if (!AllowedCompilers.ContainsKey(language.ToString())) { // Not allowed to compile to this language! @@ -417,7 +421,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools } assembly = CompileFromDotNetText(compileScript, language, asset, assembly); - return; } public string[] GetWarnings() @@ -491,6 +494,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Filename to .dll assembly internal string CompileFromDotNetText(string Script, enumCompileType lang, string asset, string assembly) { +// m_log.DebugFormat("[Compiler]: Compiling to assembly\n{0}", Script); + string ext = "." + lang.ToString(); // Output assembly name @@ -531,8 +536,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools parameters.IncludeDebugInformation = true; - string rootPath = - Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory); + string rootPath = AppDomain.CurrentDomain.BaseDirectory; parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Shared.dll")); diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs index b635d5c604..7d7bd82778 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs @@ -27,44 +27,100 @@ using System; using System.Collections.Generic; +using System.Threading; using Nini.Config; using NUnit.Framework; -using OpenSim.Tests.Common.Mock; -using OpenSim.Region.Framework.Scenes; using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.CoreModules.Scripting.WorldComm; +using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Interfaces; +using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; namespace OpenSim.Region.ScriptEngine.XEngine.Tests { /// - /// Scene presence tests + /// XEngine tests. /// - /// Commented out XEngineTests that don't do anything - /* [TestFixture] public class XEngineTest { - public Scene scene; - - public static Random random; - public TestClient testclient; - //TestCommunicationsManager cm; + private TestScene m_scene; + private XEngine m_xEngine; + private AutoResetEvent m_chatEvent = new AutoResetEvent(false); + private OSChatMessage m_osChatMessageReceived; [TestFixtureSetUp] public void Init() { - TestCommunicationsManager cm = new TestCommunicationsManager(); - scene = SceneSetupHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, cm); - random = new Random(); + //AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory + "/bin"); +// Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); + m_xEngine = new XEngine(); + + // Necessary to stop serialization complaining + WorldCommModule wcModule = new WorldCommModule(); + + IniConfigSource configSource = new IniConfigSource(); + + IConfig startupConfig = configSource.AddConfig("Startup"); + startupConfig.Set("DefaultScriptEngine", "XEngine"); + + IConfig xEngineConfig = configSource.AddConfig("XEngine"); + xEngineConfig.Set("Enabled", "true"); + + // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call + // to AssemblyResolver.OnAssemblyResolve fails. + xEngineConfig.Set("AppDomainLoading", "false"); + + m_scene = SceneHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, null, configSource); + SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); + m_scene.StartScripts(); } - + + /// + /// Test compilation and starting of a script. + /// + /// + /// This is a less than ideal regression test since it involves an asynchronous operation (in this case, + /// compilation of the script). + /// [Test] - public void T001_XStart() + public void TestCompileAndStartScript() { - INonSharedRegionModule xengine = new XEngine(); - SceneSetupHelpers.SetupSceneModules(scene, new IniConfigSource(), xengine); - xengine.RegionLoaded(scene); + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + UUID userId = TestHelpers.ParseTail(0x1); +// UUID objectId = TestHelpers.ParseTail(0x2); +// UUID itemId = TestHelpers.ParseTail(0x3); + string itemName = "TestStartScript() Item"; + + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, "TestStartScriptPart_", 0x100); + m_scene.AddNewSceneObject(so, true); + + InventoryItemBase itemTemplate = new InventoryItemBase(); +// itemTemplate.ID = itemId; + itemTemplate.Name = itemName; + itemTemplate.Folder = so.UUID; + itemTemplate.InvType = (int)InventoryType.LSL; + + m_scene.EventManager.OnChatFromWorld += OnChatFromWorld; + + m_scene.RezNewScript(userId, itemTemplate); + + m_chatEvent.WaitOne(60000); + + Assert.That(m_osChatMessageReceived, Is.Not.Null, "No chat message received in TestStartScript()"); + Assert.That(m_osChatMessageReceived.Message, Is.EqualTo("Script running")); + } + + private void OnChatFromWorld(object sender, OSChatMessage oscm) + { +// Console.WriteLine("Got chat [{0}]", oscm.Message); + + m_osChatMessageReceived = oscm; + m_chatEvent.Set(); } } - */ -} +} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index f11987eede..c68f03ff87 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -680,6 +680,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource) { +// m_log.DebugFormat( +// "[XEngine]: OnRezScript event triggered for script {0}, startParam {1}, postOnRez {2}, engine {3}, stateSource {4}, script\n{5}", +// itemID, startParam, postOnRez, engine, stateSource, script); + if (script.StartsWith("//MRM:")) return; @@ -761,6 +765,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_CompileDict[itemID] = 0; } +// m_log.DebugFormat("[XEngine]: Added script {0} to compile queue", itemID); + if (m_CurrentCompile == null) { // NOTE: Although we use a lockless queue, the lock here @@ -822,6 +828,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine bool postOnRez = (bool)p[4]; StateSource stateSource = (StateSource)p[5]; +// m_log.DebugFormat("[XEngine]: DoOnRezScript called for script {0}", itemID); + lock (m_CompileDict) { if (!m_CompileDict.ContainsKey(itemID)) @@ -870,7 +878,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine { try { - lock (m_AddingAssemblies) + lock (m_AddingAssemblies) { m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, out assembly, out linemap); if (!m_AddingAssemblies.ContainsKey(assembly)) { @@ -922,6 +930,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine } catch (Exception e) { +// m_log.ErrorFormat("[XEngine]: Exception when rezzing script {0}{1}", e.Message, e.StackTrace); + // try // { if (!m_ScriptErrors.ContainsKey(itemID)) @@ -1132,7 +1142,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine handlerObjectRemoved(part.UUID); } - ScriptRemoved handlerScriptRemoved = OnScriptRemoved; if (handlerScriptRemoved != null) handlerScriptRemoved(itemID); @@ -1381,6 +1390,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine string path = Path.Combine(Directory.GetCurrentDirectory(), Path.Combine(s, assemblyName))+".dll"; +// Console.WriteLine("[XEngine]: Trying to resolve {0}", path); + if (File.Exists(path)) return Assembly.LoadFrom(path); } @@ -1863,16 +1874,24 @@ namespace OpenSim.Region.ScriptEngine.XEngine public void SuspendScript(UUID itemID) { +// m_log.DebugFormat("[XEngine]: Received request to suspend script with ID {0}", itemID); + IScriptInstance instance = GetInstance(itemID); if (instance != null) instance.Suspend(); +// else +// m_log.DebugFormat("[XEngine]: Could not find script with ID {0} to resume", itemID); } public void ResumeScript(UUID itemID) { +// m_log.DebugFormat("[XEngine]: Received request to resume script with ID {0}", itemID); + IScriptInstance instance = GetInstance(itemID); if (instance != null) instance.Resume(); +// else +// m_log.DebugFormat("[XEngine]: Could not find script with ID {0} to resume", itemID); } } } \ No newline at end of file diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index a25eb66751..aa904aad9c 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -88,9 +88,27 @@ namespace OpenSim.Tests.Common /// ID of the region /// X co-ordinate of the region /// Y co-ordinate of the region - /// This should be the same if simulating two scenes within a standalone + /// /// - public static TestScene SetupScene(string name, UUID id, uint x, uint y, CoreAssetCache cache) + public static TestScene SetupScene( + string name, UUID id, uint x, uint y, CoreAssetCache cache) + { + return SetupScene(name, id, x, y, cache, new IniConfigSource()); + } + + /// + /// Set up a scene. If it's more then one scene, use the same CommunicationsManager to link regions + /// or a different, to get a brand new scene with new shared region modules. + /// + /// Name of the region + /// ID of the region + /// X co-ordinate of the region + /// Y co-ordinate of the region + /// + /// + /// + public static TestScene SetupScene( + string name, UUID id, uint x, uint y, CoreAssetCache cache, IConfigSource configSource) { Console.WriteLine("Setting up test scene {0}", name); @@ -106,7 +124,6 @@ namespace OpenSim.Tests.Common ISimulationDataService simDataService = OpenSim.Server.Base.ServerUtils.LoadPlugin("OpenSim.Tests.Common.dll", null); IEstateDataService estateDataService = null; - IConfigSource configSource = new IniConfigSource(); TestScene testScene = new TestScene( regInfo, acm, scs, simDataService, estateDataService, null, false, configSource, null); From c22970448f00cdd88c1e81fc4f1a095f7d3d42e6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 19:42:32 +0000 Subject: [PATCH 2/5] Add TestCompileAndStart100Scripts() torture test. --- OpenSim/Tests/Torture/ObjectTortureTests.cs | 2 +- OpenSim/Tests/Torture/ScriptTortureTests.cs | 157 ++++++++++++++++++++ prebuild.xml | 2 + 3 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 OpenSim/Tests/Torture/ScriptTortureTests.cs diff --git a/OpenSim/Tests/Torture/ObjectTortureTests.cs b/OpenSim/Tests/Torture/ObjectTortureTests.cs index b9764d767d..444b7ecf35 100644 --- a/OpenSim/Tests/Torture/ObjectTortureTests.cs +++ b/OpenSim/Tests/Torture/ObjectTortureTests.cs @@ -118,7 +118,7 @@ namespace OpenSim.Tests.Torture TestScene scene = SceneHelpers.SetupScene(); - Process process = Process.GetCurrentProcess(); +// Process process = Process.GetCurrentProcess(); // long startProcessMemory = process.PrivateMemorySize64; long startGcMemory = GC.GetTotalMemory(true); DateTime start = DateTime.Now; diff --git a/OpenSim/Tests/Torture/ScriptTortureTests.cs b/OpenSim/Tests/Torture/ScriptTortureTests.cs new file mode 100644 index 0000000000..c0239ba5b6 --- /dev/null +++ b/OpenSim/Tests/Torture/ScriptTortureTests.cs @@ -0,0 +1,157 @@ +/* + * 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.Diagnostics; +using System.Reflection; +using System.Threading; +using log4net; +using Nini.Config; +using NUnit.Framework; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.CoreModules.Scripting.WorldComm; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.ScriptEngine.XEngine; +using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; + +namespace OpenSim.Tests.Torture +{ + /// + /// Script torture tests + /// + /// + /// Don't rely on the numbers given by these tests - they will vary a lot depending on what is already cached, + /// how much memory is free, etc. In some cases, later larger tests will apparently take less time than smaller + /// earlier tests. + /// + [TestFixture] + public class ScriptTortureTests + { + private TestScene m_scene; + private XEngine m_xEngine; + private AutoResetEvent m_chatEvent = new AutoResetEvent(false); + + private int m_expectedChatMessages; + private List m_osChatMessagesReceived = new List(); + + [SetUp] + public void Init() + { + //AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory + "/bin"); +// Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); + m_xEngine = new XEngine(); + + // Necessary to stop serialization complaining + WorldCommModule wcModule = new WorldCommModule(); + + IniConfigSource configSource = new IniConfigSource(); + + IConfig startupConfig = configSource.AddConfig("Startup"); + startupConfig.Set("DefaultScriptEngine", "XEngine"); + + IConfig xEngineConfig = configSource.AddConfig("XEngine"); + xEngineConfig.Set("Enabled", "true"); + + // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call + // to AssemblyResolver.OnAssemblyResolve fails. + xEngineConfig.Set("AppDomainLoading", "false"); + + m_scene = SceneHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, null, configSource); + SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); + + m_scene.EventManager.OnChatFromWorld += OnChatFromWorld; + m_scene.StartScripts(); + } + + [Test] + public void TestCompileAndStart100Scripts() + { + TestHelpers.InMethod(); + log4net.Config.XmlConfigurator.Configure(); + + TestCompileAndStartScripts(100); + } + + private void TestCompileAndStartScripts(int scriptsToCreate) + { + UUID userId = TestHelpers.ParseTail(0x1); + + m_expectedChatMessages = scriptsToCreate; + int startingObjectIdTail = 0x100; + + for (int idTail = startingObjectIdTail;idTail < startingObjectIdTail + scriptsToCreate; idTail++) + { + AddObjectAndScript(idTail, userId); + } + + m_chatEvent.WaitOne(40000 + scriptsToCreate * 1000); + + Assert.That(m_osChatMessagesReceived.Count, Is.EqualTo(m_expectedChatMessages)); + + foreach (OSChatMessage msg in m_osChatMessagesReceived) + Assert.That( + msg.Message, + Is.EqualTo("Script running"), + string.Format( + "Message from {0} was {1} rather than {2}", msg.SenderUUID, msg.Message, "Script running")); + } + + private void AddObjectAndScript(int objectIdTail, UUID userId) + { +// UUID itemId = TestHelpers.ParseTail(0x3); + string itemName = string.Format("AddObjectAndScript() Item for object {0}", objectIdTail); + + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, "AddObjectAndScriptPart_", objectIdTail); + m_scene.AddNewSceneObject(so, true); + + InventoryItemBase itemTemplate = new InventoryItemBase(); +// itemTemplate.ID = itemId; + itemTemplate.Name = itemName; + itemTemplate.Folder = so.UUID; + itemTemplate.InvType = (int)InventoryType.LSL; + + m_scene.RezNewScript(userId, itemTemplate); + } + + private void OnChatFromWorld(object sender, OSChatMessage oscm) + { +// Console.WriteLine("Got chat [{0}]", oscm.Message); + + lock (m_osChatMessagesReceived) + { + m_osChatMessagesReceived.Add(oscm); + + if (m_osChatMessagesReceived.Count == m_expectedChatMessages) + m_chatEvent.Set(); + } + } + } +} \ No newline at end of file diff --git a/prebuild.xml b/prebuild.xml index 94d86d1292..23a5a3b40c 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -3286,7 +3286,9 @@ + + From 7583768b9e40e1033cc417047226d8ab80b36294 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 20:26:26 +0000 Subject: [PATCH 3/5] Remove debug logging if physics actor is null in SOP.ApplyPhysics() This is not valid in the case of BasicPhysics which can return a null PhysicsActor (though I think it should really return a do-nothing PhysicsActor). --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 0e899ca168..4c339d9c8b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1501,7 +1501,7 @@ namespace OpenSim.Region.Framework.Scenes PhysActor = null; } - // Basic Physics returns null.. joy joy joy. + // Basic Physics can also return null as well as an exception catch. if (PhysActor != null) { PhysActor.SOPName = this.Name; // save object into the PhysActor so ODE internals know the joint/body info @@ -1509,10 +1509,6 @@ namespace OpenSim.Region.Framework.Scenes DoPhysicsPropertyUpdate(RigidBody, true); PhysActor.SetVolumeDetect(VolumeDetectActive ? 1 : 0); } - else - { - m_log.DebugFormat("[SOP]: physics actor is null for {0} with parent {1}", UUID, this.ParentGroup.UUID); - } } } } From 773994723a9240b128f5054bd48e4e09b9045e63 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 20:35:04 +0000 Subject: [PATCH 4/5] Add warning about only uncommenting EstateConnectionString if you know what you're doing to GridCommon.ini.example (was already in StandaloneCommon.ini.example) --- bin/config-include/GridCommon.ini.example | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/config-include/GridCommon.ini.example b/bin/config-include/GridCommon.ini.example index 4195bcee50..712481d299 100644 --- a/bin/config-include/GridCommon.ini.example +++ b/bin/config-include/GridCommon.ini.example @@ -14,6 +14,8 @@ ;StorageProvider = "OpenSim.Data.MySQL.dll" ;ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;Old Guids=true;" ; Uncomment this line if you are using MySQL and want to use a different database for estates + ; The usual application for this is to allow estates to be spread out across multiple simulators by share the same database. + ; Most people won't need to do this so only uncomment if you know what you're doing. ;EstateConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;Old Guids=true;" ; MSSQL From bd928218dd0845bb0aef46749e8a393d0a9e4fbc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 21:00:47 +0000 Subject: [PATCH 5/5] Add TestAddTaskInventoryItem() --- .../Scenes/Tests/TaskInventoryTests.cs | 26 ++++++++++++++++++- .../Common/Helpers/TaskInventoryHelpers.cs | 12 ++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs index 1abef8d846..e4b607daaf 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs @@ -52,6 +52,30 @@ namespace OpenSim.Region.Framework.Tests [TestFixture] public class TaskInventoryTests { + [Test] + public void TestAddTaskInventoryItem() + { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + Scene scene = SceneHelpers.SetupScene(); + UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); + SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); + SceneObjectPart sop1 = sog1.RootPart; + + // Create an object embedded inside the first + UUID taskSceneObjectItemId = UUID.Parse("00000000-0000-0000-0000-100000000000"); + TaskInventoryItem taskSceneObjectItem + = TaskInventoryHelpers.AddSceneObject(scene, sop1, "tso", taskSceneObjectItemId, user1.PrincipalID); + + TaskInventoryItem addedItem = sop1.Inventory.GetInventoryItem(taskSceneObjectItemId); + Assert.That(addedItem.ItemID, Is.EqualTo(taskSceneObjectItemId)); + Assert.That(addedItem.OwnerID, Is.EqualTo(user1.PrincipalID)); + Assert.That(addedItem.ParentID, Is.EqualTo(sop1.UUID)); + Assert.That(addedItem.InvType, Is.EqualTo((int)InventoryType.Object)); + Assert.That(addedItem.Type, Is.EqualTo((int)AssetType.Object)); + } + [Test] public void TestRezObjectFromInventoryItem() { @@ -66,7 +90,7 @@ namespace OpenSim.Region.Framework.Tests // Create an object embedded inside the first UUID taskSceneObjectItemId = UUID.Parse("00000000-0000-0000-0000-100000000000"); TaskInventoryItem taskSceneObjectItem - = TaskInventoryHelpers.AddSceneObject(scene, sop1, "tso", taskSceneObjectItemId); + = TaskInventoryHelpers.AddSceneObject(scene, sop1, "tso", taskSceneObjectItemId, user1.PrincipalID); scene.AddSceneObject(sog1); diff --git a/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs b/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs index a8f0d59849..7058d1e568 100644 --- a/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs @@ -72,15 +72,21 @@ namespace OpenSim.Tests.Common /// /// /// - public static TaskInventoryItem AddSceneObject(Scene scene, SceneObjectPart sop, string itemName, UUID id) + /// + public static TaskInventoryItem AddSceneObject( + Scene scene, SceneObjectPart sop, string itemName, UUID id, UUID userId) { SceneObjectGroup taskSceneObject = SceneHelpers.CreateSceneObject(1, UUID.Zero); AssetBase taskSceneObjectAsset = AssetHelpers.CreateAsset(0x10, taskSceneObject); scene.AssetService.Store(taskSceneObjectAsset); TaskInventoryItem taskSceneObjectItem = new TaskInventoryItem - { Name = itemName, AssetID = taskSceneObjectAsset.FullID, ItemID = id, - Type = (int)AssetType.Object, InvType = (int)InventoryType.Object }; + { Name = itemName, + AssetID = taskSceneObjectAsset.FullID, + ItemID = id, + OwnerID = userId, + Type = (int)AssetType.Object, + InvType = (int)InventoryType.Object }; sop.Inventory.AddInventoryItem(taskSceneObjectItem, true); return taskSceneObjectItem;