diff options
author | Justin Clark-Casey (justincc) | 2015-03-13 20:09:29 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2015-03-13 20:09:29 +0000 |
commit | 0aeea89258af7adef04337f3cb3cb74aeb8619d5 (patch) | |
tree | 0d1e37ef73ae6fab2c92e68ecb85bf75e1e36a38 | |
parent | Move state change in progress in ScriptInstance.PostEvent() to the top of the... (diff) | |
download | opensim-SC-0aeea89258af7adef04337f3cb3cb74aeb8619d5.zip opensim-SC-0aeea89258af7adef04337f3cb3cb74aeb8619d5.tar.gz opensim-SC-0aeea89258af7adef04337f3cb3cb74aeb8619d5.tar.bz2 opensim-SC-0aeea89258af7adef04337f3cb3cb74aeb8619d5.tar.xz |
Fix script state not being preserved in objects sent via Hypergrid.
This was because attributes were not being included in the transformation, hence losing the script state identity.
Symptoms are messages like "[SCENE OBJECT GROUP]: SavedScriptState element had no UUID in object test box"
Regression since the conference code merge. Regression test extended for this case.
Relates to http://opensimulator.org/mantis/view.php?id=7439
-rw-r--r-- | OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs | 11 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/HGAssetMapperTests.cs | 77 |
2 files changed, 79 insertions, 9 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs index 8b09b3e..75f0774 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs | |||
@@ -199,11 +199,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
199 | 199 | ||
200 | while (reader.Read()) | 200 | while (reader.Read()) |
201 | { | 201 | { |
202 | //Console.WriteLine("Depth: {0}", reader.Depth); | 202 | // Console.WriteLine("Depth: {0}, name {1}", reader.Depth, reader.Name); |
203 | 203 | ||
204 | switch (reader.NodeType) | 204 | switch (reader.NodeType) |
205 | { | 205 | { |
206 | case XmlNodeType.Attribute: | 206 | case XmlNodeType.Attribute: |
207 | // Console.WriteLine("FOUND ATTRIBUTE {0}", reader.Name); | ||
207 | writer.WriteAttributeString(reader.Prefix, reader.Name, reader.NamespaceURI, reader.Value); | 208 | writer.WriteAttributeString(reader.Prefix, reader.Name, reader.NamespaceURI, reader.Value); |
208 | break; | 209 | break; |
209 | 210 | ||
@@ -224,6 +225,14 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
224 | 225 | ||
225 | writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI); | 226 | writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI); |
226 | 227 | ||
228 | if (reader.HasAttributes) | ||
229 | { | ||
230 | while (reader.MoveToNextAttribute()) | ||
231 | writer.WriteAttributeString(reader.Prefix, reader.Name, reader.NamespaceURI, reader.Value); | ||
232 | |||
233 | reader.MoveToElement(); | ||
234 | } | ||
235 | |||
227 | if (reader.LocalName == "SceneObjectPart") | 236 | if (reader.LocalName == "SceneObjectPart") |
228 | { | 237 | { |
229 | if (sopDepth < 0) | 238 | if (sopDepth < 0) |
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/HGAssetMapperTests.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/HGAssetMapperTests.cs index 779da43..007ff63 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/HGAssetMapperTests.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/HGAssetMapperTests.cs | |||
@@ -26,12 +26,15 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Threading; | ||
29 | using System.Xml; | 30 | using System.Xml; |
31 | using Nini.Config; | ||
30 | using NUnit.Framework; | 32 | using NUnit.Framework; |
31 | using OpenMetaverse; | 33 | using OpenMetaverse; |
32 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
33 | using OpenSim.Region.CoreModules.Framework.InventoryAccess; | 35 | using OpenSim.Region.CoreModules.Framework.InventoryAccess; |
34 | using OpenSim.Region.Framework.Scenes; | 36 | using OpenSim.Region.Framework.Scenes; |
37 | using OpenSim.Region.ScriptEngine.XEngine; | ||
35 | using OpenSim.Services.Interfaces; | 38 | using OpenSim.Services.Interfaces; |
36 | using OpenSim.Tests.Common; | 39 | using OpenSim.Tests.Common; |
37 | 40 | ||
@@ -46,30 +49,54 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess.Tests | |||
46 | TestHelpers.InMethod(); | 49 | TestHelpers.InMethod(); |
47 | // TestHelpers.EnableLogging(); | 50 | // TestHelpers.EnableLogging(); |
48 | 51 | ||
52 | XEngine xengine = new OpenSim.Region.ScriptEngine.XEngine.XEngine(); | ||
53 | xengine.DebugLevel = 1; | ||
54 | |||
55 | IniConfigSource configSource = new IniConfigSource(); | ||
56 | |||
57 | IConfig startupConfig = configSource.AddConfig("Startup"); | ||
58 | startupConfig.Set("DefaultScriptEngine", "XEngine"); | ||
59 | |||
60 | IConfig xEngineConfig = configSource.AddConfig("XEngine"); | ||
61 | xEngineConfig.Set("Enabled", "true"); | ||
62 | xEngineConfig.Set("StartDelay", "0"); | ||
63 | xEngineConfig.Set("AppDomainLoading", "false"); | ||
64 | |||
49 | string homeUrl = "http://hg.HomeTestPostAssetRewriteGrid.com"; | 65 | string homeUrl = "http://hg.HomeTestPostAssetRewriteGrid.com"; |
50 | string foreignUrl = "http://hg.ForeignTestPostAssetRewriteGrid.com"; | 66 | string foreignUrl = "http://hg.ForeignTestPostAssetRewriteGrid.com"; |
51 | UUID assetId = TestHelpers.ParseTail(0x1); | 67 | int soIdTail = 0x1; |
52 | UUID userId = TestHelpers.ParseTail(0x10); | 68 | UUID assetId = TestHelpers.ParseTail(0x10); |
69 | UUID userId = TestHelpers.ParseTail(0x100); | ||
70 | UUID sceneId = TestHelpers.ParseTail(0x1000); | ||
53 | string userFirstName = "TestPostAsset"; | 71 | string userFirstName = "TestPostAsset"; |
54 | string userLastName = "Rewrite"; | 72 | string userLastName = "Rewrite"; |
55 | int soPartsCount = 3; | 73 | int soPartsCount = 3; |
56 | 74 | ||
57 | Scene scene = new SceneHelpers().SetupScene(); | 75 | Scene scene = new SceneHelpers().SetupScene("TestPostAssetRewriteScene", sceneId, 1000, 1000, configSource); |
76 | SceneHelpers.SetupSceneModules(scene, configSource, xengine); | ||
77 | scene.StartScripts(); | ||
78 | |||
58 | HGAssetMapper hgam = new HGAssetMapper(scene, homeUrl); | 79 | HGAssetMapper hgam = new HGAssetMapper(scene, homeUrl); |
59 | UserAccount ua | 80 | UserAccount ua |
60 | = UserAccountHelpers.CreateUserWithInventory(scene, userFirstName, userLastName, userId, "password"); | 81 | = UserAccountHelpers.CreateUserWithInventory(scene, userFirstName, userLastName, userId, "password"); |
61 | 82 | ||
62 | //AssetBase ncAssetSet = AssetHelpers.CreateNotecardAsset(assetId, "TestPostAssetRewriteNotecard"); | 83 | SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, soPartsCount, ua.PrincipalID, "part", soIdTail); |
63 | SceneObjectGroup so = SceneHelpers.CreateSceneObject(soPartsCount, ua.PrincipalID); | 84 | RezScript( |
64 | AssetBase ncAssetSet = AssetHelpers.CreateAsset(assetId, so); | 85 | scene, so.UUID, "default { state_entry() { llSay(0, \"Hello World\"); } }", "item1", ua.PrincipalID); |
65 | ncAssetSet.CreatorID = foreignUrl; | ||
66 | hgam.PostAsset(foreignUrl, ncAssetSet); | ||
67 | 86 | ||
87 | AssetBase asset = AssetHelpers.CreateAsset(assetId, so); | ||
88 | asset.CreatorID = foreignUrl; | ||
89 | hgam.PostAsset(foreignUrl, asset); | ||
90 | |||
91 | // Check transformed asset. | ||
68 | AssetBase ncAssetGet = scene.AssetService.Get(assetId.ToString()); | 92 | AssetBase ncAssetGet = scene.AssetService.Get(assetId.ToString()); |
69 | Assert.AreEqual(foreignUrl, ncAssetGet.CreatorID); | 93 | Assert.AreEqual(foreignUrl, ncAssetGet.CreatorID); |
70 | string xmlData = Utils.BytesToString(ncAssetGet.Data); | 94 | string xmlData = Utils.BytesToString(ncAssetGet.Data); |
71 | XmlDocument ncAssetGetXmlDoc = new XmlDocument(); | 95 | XmlDocument ncAssetGetXmlDoc = new XmlDocument(); |
72 | ncAssetGetXmlDoc.LoadXml(xmlData); | 96 | ncAssetGetXmlDoc.LoadXml(xmlData); |
97 | |||
98 | // Console.WriteLine(ncAssetGetXmlDoc.OuterXml); | ||
99 | |||
73 | XmlNodeList creatorDataNodes = ncAssetGetXmlDoc.GetElementsByTagName("CreatorData"); | 100 | XmlNodeList creatorDataNodes = ncAssetGetXmlDoc.GetElementsByTagName("CreatorData"); |
74 | 101 | ||
75 | Assert.AreEqual(soPartsCount, creatorDataNodes.Count); | 102 | Assert.AreEqual(soPartsCount, creatorDataNodes.Count); |
@@ -80,6 +107,40 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess.Tests | |||
80 | Assert.AreEqual( | 107 | Assert.AreEqual( |
81 | string.Format("{0};{1} {2}", homeUrl, ua.FirstName, ua.LastName), creatorDataNode.InnerText); | 108 | string.Format("{0};{1} {2}", homeUrl, ua.FirstName, ua.LastName), creatorDataNode.InnerText); |
82 | } | 109 | } |
110 | |||
111 | // Check that saved script nodes have attributes | ||
112 | XmlNodeList savedScriptStateNodes = ncAssetGetXmlDoc.GetElementsByTagName("SavedScriptState"); | ||
113 | |||
114 | Assert.AreEqual(1, savedScriptStateNodes.Count); | ||
115 | Assert.AreEqual(1, savedScriptStateNodes[0].Attributes.Count); | ||
116 | XmlNode uuidAttribute = savedScriptStateNodes[0].Attributes.GetNamedItem("UUID"); | ||
117 | Assert.NotNull(uuidAttribute); | ||
118 | // XXX: To check the actual UUID attribute we would have to do some work to retreive the UUID of the task | ||
119 | // item created earlier. | ||
120 | } | ||
121 | |||
122 | private void RezScript(Scene scene, UUID soId, string script, string itemName, UUID userId) | ||
123 | { | ||
124 | InventoryItemBase itemTemplate = new InventoryItemBase(); | ||
125 | // itemTemplate.ID = itemId; | ||
126 | itemTemplate.Name = itemName; | ||
127 | itemTemplate.Folder = soId; | ||
128 | itemTemplate.InvType = (int)InventoryType.LSL; | ||
129 | |||
130 | // XXX: Ultimately it would be better to be able to directly manipulate the script engine to rez a script | ||
131 | // immediately for tests rather than chunter through it's threaded mechanisms. | ||
132 | AutoResetEvent chatEvent = new AutoResetEvent(false); | ||
133 | |||
134 | scene.EventManager.OnChatFromWorld += (s, c) => | ||
135 | { | ||
136 | // Console.WriteLine("Got chat [{0}]", c.Message); | ||
137 | chatEvent.Set(); | ||
138 | }; | ||
139 | |||
140 | scene.RezNewScript(userId, itemTemplate, script); | ||
141 | |||
142 | // Console.WriteLine("HERE"); | ||
143 | Assert.IsTrue(chatEvent.WaitOne(60000), "Chat event in HGAssetMapperTests.RezScript not received"); | ||
83 | } | 144 | } |
84 | } | 145 | } |
85 | } \ No newline at end of file | 146 | } \ No newline at end of file |