OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
ScriptPerformanceTests.cs
Go to the documentation of this file.
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 
28 using System;
29 using System.Collections.Generic;
30 using System.Diagnostics;
31 using System.Reflection;
32 using System.Threading;
33 using log4net;
34 using Nini.Config;
35 using NUnit.Framework;
36 using OpenMetaverse;
37 using OpenSim.Framework;
38 using OpenSim.Region.CoreModules.Scripting.WorldComm;
39 using OpenSim.Region.Framework.Interfaces;
40 using OpenSim.Region.Framework.Scenes;
41 using OpenSim.Region.ScriptEngine.XEngine;
42 using OpenSim.Tests.Common;
43 
44 namespace OpenSim.Tests.Performance
45 {
54  [TestFixture]
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]
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 }
A scene object group is conceptually an object in the scene. The object is constituted of SceneObject...
string Message
The message sent by the user
ChatFromViewer Arguments
Inventory Item - contains all the properties associated with an individual inventory piece...
Helpers for setting up scenes.
Definition: SceneHelpers.cs:60