From 038d1bf742ba4f95ca8a83b27f6fefb755485524 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Tue, 7 Feb 2012 17:44:37 +0000 Subject: 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. --- .../Framework/Scenes/SceneObjectPartInventory.cs | 12 +-- .../Region/ScriptEngine/Shared/AssemblyResolver.cs | 4 +- .../Shared/CodeTools/CSCodeGenerator.cs | 6 ++ .../ScriptEngine/Shared/CodeTools/Compiler.cs | 10 ++- .../ScriptEngine/XEngine/Tests/XEngineTest.cs | 96 +++++++++++++++++----- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 23 +++++- 6 files changed, 117 insertions(+), 34 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 0c36dcd..f2d1915 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 130e197..e35f79f 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 b1fb6c2..8b88588 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 734d4d5..c10143b 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 b635d5c..7d7bd82 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 f11987e..c68f03f 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 -- cgit v1.1