aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Tests/Performance/ScriptPerformanceTests.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Tests/Performance/ScriptPerformanceTests.cs')
-rw-r--r--OpenSim/Tests/Performance/ScriptPerformanceTests.cs167
1 files changed, 167 insertions, 0 deletions
diff --git a/OpenSim/Tests/Performance/ScriptPerformanceTests.cs b/OpenSim/Tests/Performance/ScriptPerformanceTests.cs
new file mode 100644
index 0000000..028f4b0
--- /dev/null
+++ b/OpenSim/Tests/Performance/ScriptPerformanceTests.cs
@@ -0,0 +1,167 @@
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 System.Collections.Generic;
30using System.Diagnostics;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using Nini.Config;
35using NUnit.Framework;
36using OpenMetaverse;
37using OpenSim.Framework;
38using OpenSim.Region.CoreModules.Scripting.WorldComm;
39using OpenSim.Region.Framework.Interfaces;
40using OpenSim.Region.Framework.Scenes;
41using OpenSim.Region.ScriptEngine.XEngine;
42using OpenSim.Tests.Common;
43
44namespace OpenSim.Tests.Performance
45{
46 /// <summary>
47 /// Script performance tests
48 /// </summary>
49 /// <remarks>
50 /// Don't rely on the numbers given by these tests - they will vary a lot depending on what is already cached,
51 /// how much memory is free, etc. In some cases, later larger tests will apparently take less time than smaller
52 /// earlier tests.
53 /// </remarks>
54 [TestFixture]
55 public class ScriptPerformanceTests : OpenSimTestCase
56 {
57 private TestScene m_scene;
58 private XEngine m_xEngine;
59 private AutoResetEvent m_chatEvent = new AutoResetEvent(false);
60
61 private int m_expectedChatMessages;
62 private List<OSChatMessage> m_osChatMessagesReceived = new List<OSChatMessage>();
63
64 [SetUp]
65 public void Init()
66 {
67 //AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory + "/bin");
68// Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
69 m_xEngine = new XEngine();
70
71 // Necessary to stop serialization complaining
72 WorldCommModule wcModule = new WorldCommModule();
73
74 IniConfigSource configSource = new IniConfigSource();
75
76 IConfig startupConfig = configSource.AddConfig("Startup");
77 startupConfig.Set("DefaultScriptEngine", "XEngine");
78
79 IConfig xEngineConfig = configSource.AddConfig("XEngine");
80 xEngineConfig.Set("Enabled", "true");
81
82 // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call
83 // to AssemblyResolver.OnAssemblyResolve fails.
84 xEngineConfig.Set("AppDomainLoading", "false");
85
86 m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource);
87 SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule);
88
89 m_scene.EventManager.OnChatFromWorld += OnChatFromWorld;
90 m_scene.StartScripts();
91 }
92
93 [TearDown]
94 public void TearDown()
95 {
96 m_scene.Close();
97 m_scene = null;
98 GC.Collect();
99 GC.WaitForPendingFinalizers();
100 }
101
102 [Test]
103 public void TestCompileAndStart100Scripts()
104 {
105 TestHelpers.InMethod();
106 log4net.Config.XmlConfigurator.Configure();
107
108 TestCompileAndStartScripts(100);
109 }
110
111 private void TestCompileAndStartScripts(int scriptsToCreate)
112 {
113 UUID userId = TestHelpers.ParseTail(0x1);
114
115 m_expectedChatMessages = scriptsToCreate;
116 int startingObjectIdTail = 0x100;
117
118 GC.Collect();
119
120 for (int idTail = startingObjectIdTail;idTail < startingObjectIdTail + scriptsToCreate; idTail++)
121 {
122 AddObjectAndScript(idTail, userId);
123 }
124
125 m_chatEvent.WaitOne(40000 + scriptsToCreate * 1000);
126
127 Assert.That(m_osChatMessagesReceived.Count, Is.EqualTo(m_expectedChatMessages));
128
129 foreach (OSChatMessage msg in m_osChatMessagesReceived)
130 Assert.That(
131 msg.Message,
132 Is.EqualTo("Script running"),
133 string.Format(
134 "Message from {0} was {1} rather than {2}", msg.SenderUUID, msg.Message, "Script running"));
135 }
136
137 private void AddObjectAndScript(int objectIdTail, UUID userId)
138 {
139// UUID itemId = TestHelpers.ParseTail(0x3);
140 string itemName = string.Format("AddObjectAndScript() Item for object {0}", objectIdTail);
141
142 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, "AddObjectAndScriptPart_", objectIdTail);
143 m_scene.AddNewSceneObject(so, true);
144
145 InventoryItemBase itemTemplate = new InventoryItemBase();
146// itemTemplate.ID = itemId;
147 itemTemplate.Name = itemName;
148 itemTemplate.Folder = so.UUID;
149 itemTemplate.InvType = (int)InventoryType.LSL;
150
151 m_scene.RezNewScript(userId, itemTemplate);
152 }
153
154 private void OnChatFromWorld(object sender, OSChatMessage oscm)
155 {
156// Console.WriteLine("Got chat [{0}]", oscm.Message);
157
158 lock (m_osChatMessagesReceived)
159 {
160 m_osChatMessagesReceived.Add(oscm);
161
162 if (m_osChatMessagesReceived.Count == m_expectedChatMessages)
163 m_chatEvent.Set();
164 }
165 }
166 }
167} \ No newline at end of file