Quellcode durchsuchen

Added the beginning of a new test framework for robust connectors and services. For now, just Grid and Presence. This framework starts a robust server (as a thread) listening on a port in localhost, then the tests are client code.

Diva Canto vor 9 Jahren
Ursprung
Commit
c2cf22ea4f

+ 8 - 2
OpenSim/Server/Base/ServicesServerBase.cs

@@ -82,7 +82,9 @@ namespace OpenSim.Server.Base
             argvConfig.AddSwitch("Startup", "logconfig", "g");
 
             // Automagically create the ini file name
-            string fileName = Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().Location);
+            string fileName = "";
+            if (Assembly.GetEntryAssembly() != null)
+                fileName = Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().Location);
             string iniFile = fileName + ".ini";
             string logConfig = null;
 
@@ -158,7 +160,11 @@ namespace OpenSim.Server.Base
                 MainConsole.Instance = new RemoteConsole(prompt);
                 ((RemoteConsole)MainConsole.Instance).ReadConfig(Config);
             }
-            else
+            else if (consoleType == "mock")
+            {
+                MainConsole.Instance = new MockConsole();
+            }
+            else if (consoleType == "local")
             {
                 MainConsole.Instance = new LocalConsole(prompt, startupConfig);
             }

+ 133 - 0
OpenSim/Tests/Robust/Clients/Grid/GridClient.cs

@@ -0,0 +1,133 @@
+/*
+ * 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.Text;
+using System.Reflection;
+
+using OpenMetaverse;
+using NUnit.Framework;
+
+using OpenSim.Framework;
+using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
+using OpenSim.Services.Connectors;
+
+namespace Robust.Tests
+{
+    [TestFixture]
+    public class GridClient
+    {
+//        private static readonly ILog m_log =
+//                LogManager.GetLogger(
+//                MethodBase.GetCurrentMethod().DeclaringType);
+
+        [Test]
+        public void Grid_001()
+        {
+            GridServicesConnector m_Connector = new GridServicesConnector(DemonServer.Address);
+
+            GridRegion r1 = CreateRegion("Test Region 1", 1000, 1000);
+            GridRegion r2 = CreateRegion("Test Region 2", 1001, 1000);
+            GridRegion r3 = CreateRegion("Test Region 3", 1005, 1000);
+
+            string msg = m_Connector.RegisterRegion(UUID.Zero, r1);
+            Assert.AreEqual(msg, string.Empty, "Region 1 failed to register");
+
+            msg = m_Connector.RegisterRegion(UUID.Zero, r2);
+            Assert.AreEqual(msg, string.Empty, "Region 2 failed to register");
+
+            msg = m_Connector.RegisterRegion(UUID.Zero, r3);
+            Assert.AreEqual(msg, string.Empty, "Region 3 failed to register");
+
+            bool success;
+            success = m_Connector.DeregisterRegion(r3.RegionID);
+            Assert.AreEqual(success, true, "Region 3 failed to deregister");
+
+            msg = m_Connector.RegisterRegion(UUID.Zero, r3);
+            Assert.AreEqual(msg, string.Empty, "Region 3 failed to re-register");
+
+            List<GridRegion> regions = m_Connector.GetNeighbours(UUID.Zero, r1.RegionID);
+            Assert.AreNotEqual(regions, null, "GetNeighbours of region 1 failed");
+            Assert.AreEqual(regions.Count, 1, "Region 1 should have 1 neighbor");
+            Assert.AreEqual(regions[0].RegionName, "Test Region 2", "Region 1 has the wrong neighbor");
+
+            GridRegion region = m_Connector.GetRegionByUUID(UUID.Zero, r2.RegionID);
+            Assert.AreNotEqual(region, null, "GetRegionByUUID for region 2 failed");
+            Assert.AreEqual(region.RegionName, "Test Region 2", "GetRegionByUUID of region 2 returned wrong region");
+
+            region = m_Connector.GetRegionByUUID(UUID.Zero, UUID.Random());
+            Assert.AreEqual(region, null, "Region with randon id should not exist");
+
+            region = m_Connector.GetRegionByName(UUID.Zero, r3.RegionName);
+            Assert.AreNotEqual(region, null, "GetRegionByUUID for region 3 failed");
+            Assert.AreEqual(region.RegionName, "Test Region 3", "GetRegionByUUID of region 3 returned wrong region");
+
+            region = m_Connector.GetRegionByName(UUID.Zero, "Foo");
+            Assert.AreEqual(region, null, "Region Foo should not exist");
+
+            regions = m_Connector.GetRegionsByName(UUID.Zero, "Test", 10);
+            Assert.AreNotEqual(regions, null, "GetRegionsByName failed");
+            Assert.AreEqual(regions.Count, 3, "GetRegionsByName should return 3");
+
+            regions = m_Connector.GetRegionRange(UUID.Zero, 
+                (int)Util.RegionToWorldLoc(900), (int)Util.RegionToWorldLoc(1002),
+                (int)Util.RegionToWorldLoc(900), (int)Util.RegionToWorldLoc(1002) );
+            Assert.AreNotEqual(regions, null, "GetRegionRange failed");
+            Assert.AreEqual(regions.Count, 2, "GetRegionRange should return 2");
+
+            regions = m_Connector.GetRegionRange(UUID.Zero,
+                (int)Util.RegionToWorldLoc(900), (int)Util.RegionToWorldLoc(950),
+                (int)Util.RegionToWorldLoc(900), (int)Util.RegionToWorldLoc(950) );
+            Assert.AreNotEqual(regions, null, "GetRegionRange (bis) failed");
+            Assert.AreEqual(regions.Count, 0, "GetRegionRange (bis) should return 0");
+
+            // Deregister them all
+            success = m_Connector.DeregisterRegion(r1.RegionID);
+            Assert.AreEqual(success, true, "Region 1 failed to deregister");
+
+            success = m_Connector.DeregisterRegion(r2.RegionID);
+            Assert.AreEqual(success, true, "Region 2 failed to deregister");
+
+            success = m_Connector.DeregisterRegion(r3.RegionID);
+            Assert.AreEqual(success, true, "Region 3 failed to deregister");
+        }
+
+        private static GridRegion CreateRegion(string name, uint xcell, uint ycell)
+        {
+            GridRegion region = new GridRegion(xcell, ycell);
+            region.RegionName = name;
+            region.RegionID = UUID.Random();
+            region.ExternalHostName = "127.0.0.1";
+            region.HttpPort = 9000;
+            region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 9000);
+          
+            return region;
+        }
+    }
+}

+ 81 - 0
OpenSim/Tests/Robust/Clients/Presence/PresenceClient.cs

@@ -0,0 +1,81 @@
+/*
+ * 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.Text;
+using System.Reflection;
+
+using OpenMetaverse;
+using NUnit.Framework;
+
+using OpenSim.Framework;
+using OpenSim.Services.Interfaces;
+using OpenSim.Services.Connectors;
+
+namespace Robust.Tests
+{
+    [TestFixture]
+    public class PresenceClient
+    {
+        [Test]
+        public void Presence_001()
+        {
+            PresenceServicesConnector m_Connector = new PresenceServicesConnector(DemonServer.Address);
+
+            UUID user1 = UUID.Random();
+            UUID session1 = UUID.Random();
+            UUID region1 = UUID.Random();
+
+            bool success = m_Connector.LoginAgent(user1.ToString(), session1, UUID.Zero);
+            Assert.AreEqual(success, true, "Failed to add user session");
+
+            PresenceInfo pinfo = m_Connector.GetAgent(session1);
+            Assert.AreNotEqual(pinfo, null, "Unable to retrieve session");
+            Assert.AreEqual(pinfo.UserID, user1.ToString(), "Retrieved session does not match expected userID");
+            Assert.AreNotEqual(pinfo.RegionID, region1, "Retrieved session is unexpectedly in region");
+
+            success = m_Connector.ReportAgent(session1, region1);
+            Assert.AreEqual(success, true, "Failed to report session in region 1");
+
+            pinfo = m_Connector.GetAgent(session1);
+            Assert.AreNotEqual(pinfo, null, "Unable to session presence");
+            Assert.AreEqual(pinfo.UserID, user1.ToString(), "Retrieved session does not match expected userID");
+            Assert.AreEqual(pinfo.RegionID, region1, "Retrieved session is not in expected region");
+
+            success = m_Connector.LogoutAgent(session1);
+            Assert.AreEqual(success, true, "Failed to remove session");
+
+            pinfo = m_Connector.GetAgent(session1);
+            Assert.AreEqual(pinfo, null, "Session is still there, even though it shouldn't");
+
+            success = m_Connector.ReportAgent(session1, UUID.Random());
+            Assert.AreEqual(success, false, "Remove non-existing session should fail");
+        }
+
+    }
+}

+ 67 - 0
OpenSim/Tests/Robust/Server/DemonServer.cs

@@ -0,0 +1,67 @@
+/*
+ * 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.IO;
+using System.Threading;
+
+using Nini.Config;
+using log4net;
+using NUnit.Framework;
+
+using OpenSim.Server;
+
+namespace Robust.Tests
+{
+    [SetUpFixture]
+    public class DemonServer : OpenSimServer
+    {
+        private Thread m_demon;
+
+        public static string Address = "http://localhost:8888";
+
+        [SetUp]
+        public void StartDemon()
+        {
+            if (File.Exists("Robust.Tests.log"))
+                File.Delete("Robust.Tests.log");
+
+            Console.WriteLine("**** Starting demon Robust server ****");
+            m_demon = new Thread( () => Main(new string[] {"-inifile=Robust.Tests.ini"}));
+            m_demon.Start();
+            Console.WriteLine("**** Setup Finished ****");
+        }
+
+        [TearDown]
+        public void StopDemon()
+        {
+            Console.WriteLine("**** Killing demon Robust Server ****");
+            m_Server.Shutdown();
+        }
+    }
+}

+ 43 - 0
bin/Robust.Tests.dll.config

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+  <configSections>
+    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
+  </configSections>
+  <runtime>
+    <loadFromRemoteSources enabled="true" />
+    <gcConcurrent enabled="true" />
+	<gcServer enabled="true" />
+  </runtime>
+  <appSettings>
+  </appSettings>
+  <log4net>
+    <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
+      <filter type="log4net.Filter.LoggerMatchFilter">
+        <loggerToMatch value="special"/>
+        <acceptOnMatch value="false"/>
+      </filter>
+      <layout type="log4net.Layout.PatternLayout">
+        <conversionPattern value="%date{HH:mm:ss} - %message" />
+      </layout>
+    </appender>
+
+    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
+      <file value="Robust.Tests.log" />
+      <appendToFile value="true" />
+      <filter type="log4net.Filter.LoggerMatchFilter">
+        <loggerToMatch value="special"/>
+        <acceptOnMatch value="false"/>
+      </filter>
+      <layout type="log4net.Layout.PatternLayout">
+        <conversionPattern value="%date %-5level - %logger %message%newline" />
+      </layout>
+    </appender>
+
+    <root>
+      <level value="DEBUG" />
+      <appender-ref ref="Console" />
+      <appender-ref ref="LogFileAppender" />
+    </root>
+
+  </log4net>
+</configuration>

+ 495 - 0
bin/Robust.Tests.ini

@@ -0,0 +1,495 @@
+; * FOR TESTS ONLY -- DO NOT USE THIS FILE
+[Const]
+
+    ; The URL of the Robust server
+    BaseURL = "http://127.0.0.1"
+    
+    ; The public port of the Robust server
+    PublicPort = "8888"
+
+    ; The private port of the Robust server, same for testing
+    PrivatePort = "8888"
+
+
+; * The startup section lists all the connectors to start up in this server
+; * instance. This may be only one, or it may be the entire server suite.
+; * Multiple connectors should be separated by commas.
+; *
+; * These are the IN connectors the server uses, the in connectors
+; * read this config file and load the needed service and database connectors
+; *
+; *  The full syntax of a connector string is:
+; * [[<ConfigName>@]<port>/]<dll name>[:<class name>]
+; *
+[Startup]
+    ; Place to create a PID file
+    ; If no path if specified then a PID file is not created.
+    ; PIDFile = "/tmp/Robust.exe.pid"
+
+    ; Plugin Registry Location
+    ; Set path to directory for plugin registry. Information
+    ; about the registered repositories and installed plugins
+    ; will be stored here
+    ; The Robust.exe process must have R/W access to the location 
+    RegistryLocation = "."
+
+    ; Modular configurations
+    ; Set path to directory for modular ini files...
+    ; The Robust.exe process must have R/W access to the location 
+    ConfigDirectory = "."
+    
+	console = "rest"
+
+    ; Console commands can be saved to a file, so the command history persists after a restart. (default is true)
+    ConsoleHistoryFileEnabled = false
+
+    ; The history file can be just a filename (relative to OpenSim's bin/ directory
+    ; or it can be a full path to somewhere else. (default is OpenSimConsoleHistory.txt in bin/)
+    ConsoleHistoryFile = "RobustConsoleHistory.txt"
+
+    ; How many lines of command history should we keep? (default is 100)
+    ConsoleHistoryFileLines = 100
+  
+[ServiceList]
+    GridServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:GridServiceConnector"
+    PresenceServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:PresenceServiceConnector"
+
+    ;InventoryInConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:XInventoryInConnector"
+    ;UserAccountServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:UserAccountServiceConnector"
+
+	;; Uncomment as more tests are added
+    ;AssetServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:AssetServiceConnector"
+    ;GridInfoServerInConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:GridInfoServerInConnector"
+    ;AuthenticationServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:AuthenticationServiceConnector"
+    ;OpenIdServerConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:OpenIdServerConnector"
+    ;AvatarServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:AvatarServiceConnector"
+    ;LLLoginServiceInConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:LLLoginServiceInConnector"
+    ;GridUserServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:GridUserServiceConnector"
+    ;FriendsServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:FriendsServiceConnector"
+    ;MapAddServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:MapAddServiceConnector"
+    ;MapGetServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:MapGetServiceConnector"
+    ;OfflineIMServiceConnector = "${Const|PrivatePort}/OpenSim.Addons.OfflineIM.dll:OfflineIMServiceRobustConnector"
+    ;GroupsServiceConnector = "${Const|PrivatePort}/OpenSim.Addons.Groups.dll:GroupsServiceRobustConnector"
+	;BakedTextureService = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:XBakesConnector"
+    ;UserProfilesServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserProfilesConnector"
+    ;EstateDataService = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:EstateDataRobustConnector"
+
+; * This is common for all services, it's the network setup for the entire
+; * server instance, if none is specified above
+; *
+[Network]
+    port = ${Const|PrivatePort}
+
+    ;; The follow 3 variables are for HTTP Basic Authentication for the Robust services.
+    ;; Use this if your central services in port ${Const|PrivatePort} need to be accessible on the Internet
+    ;; but you want to protect them from unauthorized access.
+    ; AuthType = "BasicHttpAuthentication"
+    ; HttpAuthUsername = "some_username"
+    ; HttpAuthPassword = "some_password"
+    ;;
+    ;; AuthType above can be overriden in any of the service sections below by
+    ; AuthType = "None"
+    ;; This is useful in cases where you want to protect most of the services,
+    ;; but unprotect individual services. Username and Password can also be
+    ;; overriden if you want to use different credentials for the different services.
+    
+    ;; By default, scripts are not allowed to call private services via llHttpRequest()
+    ;; Such calls are detected by the X-SecondLife-Shared HTTP header
+    ;; If you allow such calls you must be sure that they are restricted to very trusted scripters
+    ;; (remember scripts can also be in visiting avatar attachments).
+    ;; This can be overriden in individual private service sections if necessary
+    AllowllHTTPRequestIn = false
+
+    ; * The following are for the remote console
+    ; * They have no effect for the local or basic console types
+    ; * Leave commented to diable logins to the console
+    ;ConsoleUser = Test
+    ;ConsolePass = secret
+    ;ConsolePort = 0
+
+
+[DatabaseService]
+    ; PGSQL
+    ; Uncomment these lines if you want to use PGSQL storage
+    ; Change the connection string to your db details
+    ;StorageProvider = "OpenSim.Data.PGSQL.dll"
+    ;ConnectionString = "Server=localhost;Database=opensim;User Id=opensim; password=***;"
+
+    ; Null
+    ; Uncomment these lines if you want to use MySQL storage
+    ; Change the connection string to your db details
+    StorageProvider = "OpenSim.Data.Null.dll"
+    ConnectionString = ""
+
+
+; * As an example, the below configuration precisely mimicks the legacy
+; * asset server. It is read by the asset IN connector (defined above)
+; * and it then loads the OUT connector (a local database module). That,
+; * in turn, reads the asset loader and database connection information
+; *
+[AssetService]
+    LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"
+    DefaultAssetLoader = ""
+
+    ; Allow maptile assets to remotely deleted by remote calls to the asset service.
+    ; There is no harm in having this as false - it just means that historical maptile assets are not deleted.
+    ; This only applies to maptiles served via the version 1 viewer mechanisms
+    ; Default is false
+    AllowRemoteDelete = false
+
+    ; Allow all assets to be remotely deleted.
+    ; Only set this to true if you are operating a grid where you control all calls to the asset service
+    ; (where a necessary condition is that you control all simulators) and you need this for admin purposes.
+    ; If set to true, AllowRemoteDelete = true is required as well.
+    ; Default is false.
+    AllowRemoteDeleteAllTypes = false
+
+
+; * This configuration loads the inventory server modules. It duplicates
+; * the function of the legacy inventory server
+; *
+[InventoryService]
+    LocalServiceModule = "OpenSim.Services.InventoryService.dll:XInventoryService"
+
+    ; Will calls to purge folders (empty trash) and immediately delete/update items or folders (not move to trash first) succeed?
+    ; If this is set to false then some other arrangement must be made to perform these operations if necessary.
+    AllowDelete = true
+
+
+; * This is the new style grid service.
+; * "Realm" is the table that is used for user lookup.
+; * It defaults to "regions", which uses the legacy tables
+; *
+[GridService]
+    LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
+    ; Realm = "regions"
+    ; AllowDuplicateNames = "True"
+
+    ;; Next, we can specify properties of regions, including default and fallback regions
+    ;; The syntax is: Region_<RegionName> = "<flags>"
+    ;; or:            Region_<RegionID> = "<flags>"
+    ;; where <flags> can be DefaultRegion, DefaultHGRegion, FallbackRegion, NoDirectLogin, Persistent, LockedOut, Reservation, NoMove, Authenticate
+    ;;
+    ;; DefaultRegion    If a local login cannot be placed in the required region (e.g. home region does not exist, avatar is not allowed entry, etc.)
+    ;;                  then this region becomes the destination.  Only the first online default region will be used.  If no DefaultHGRegion
+    ;;                  is specified then this will also be used as the region for hypergrid connections that require it (commonly because they have not specified
+    ;;                  an explicit region.
+    ;;
+    ;; DefaultHGRegion  If an avatar connecting via the hypergrid does not specify a region, then they are placed here.  Only the first online
+    ;;                  region will be used.
+    ;;
+    ;; FallbackRegion   If the DefaultRegion is not available for a local login, then any FallbackRegions are tried instead.  These are tried in the 
+    ;;                  order specified.  This only applies to local logins at this time, not Hypergrid connections.
+    ;;
+    ;; NoDirectLogin    A hypergrid user cannot directly connect to this region.  This does not apply to local logins.
+    ;;
+    ;; Persistent       When the simulator is shutdown, the region is signalled as offline but left registered on the grid.
+    ;;
+    ;; Example specification:
+    ; Region_Welcome_Area = "DefaultRegion, FallbackRegion"
+    ; (replace spaces with underscore)
+
+    ;; Allow supporting viewers to export content
+    ;; Set to false to prevent export
+    ExportSupported = true
+
+
+; * This is the configuration for the freeswitch server in grid mode
+[FreeswitchService]
+    LocalServiceModule = "OpenSim.Services.FreeswitchService.dll:FreeswitchService"
+
+    ;; The IP address of your FreeSWITCH server.
+    ;; This address must be reachable by viewers.
+    ; ServerAddress = 127.0.0.1
+
+    ;; The following configuration parameters are optional
+
+    ;; By default, this is the same as the ServerAddress
+    ; Realm = 127.0.0.1
+
+    ;; By default, this is the same as the ServerAddress on port 5060
+    ; SIPProxy = 127.0.0.1:5060
+
+    ;; Default is 5000ms
+    ; DefaultTimeout = 5000
+
+    ;; The dial plan context.  Default is "default"
+    ; Context = default
+
+    ;; Currently unused
+    ; UserName = freeswitch
+
+    ;; Currently unused
+    ; Password = password
+
+    ;; The following parameters are for STUN = Simple Traversal of UDP through NATs
+    ;; See http://wiki.freeswitch.org/wiki/NAT_Traversal
+    ;; stun.freeswitch.org is not guaranteed to be running so use it in
+    ;; production at your own risk    
+    ; EchoServer = 127.0.0.1
+    ; EchoPort = 50505
+    ; AttemptSTUN = false
+
+
+; * This is the new style authentication service. Currently, only MySQL
+; * is implemented. 
+; *
+[AuthenticationService]
+    ; for the server connector
+    LocalServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"
+
+    ;; Allow the service to process HTTP getauthinfo calls.
+    ;; Default is false.
+    ; AllowGetAuthInfo = false
+
+    ;; Allow the service to process HTTP setauthinfo calls.
+    ;; Default is false.
+    ; AllowSetAuthInfo = false
+
+    ;; Allow the service to process HTTP setpassword calls.
+    ;; Default is false.
+    ; AllowSetPassword = false
+
+
+[OpenIdService]
+    ; for the server connector
+    AuthenticationServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"
+    UserAccountServiceModule = "OpenSim.Services.UserAccountService.dll:UserAccountService"
+
+
+; * This is the new style authentication service. Currently, only MySQL
+; * is implemented. "Realm" is the table that is used for user lookup.
+; * It defaults to "useraccounts", which uses the new style.
+; * Realm = "users" will use the legacy tables as an authentication source
+; *
+[UserAccountService]
+    ; for the server connector
+    LocalServiceModule = "OpenSim.Services.UserAccountService.dll:UserAccountService"
+    ; Realm = "useraccounts"
+
+    ; These are for creating new accounts by the service
+    AuthenticationService = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"
+    PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService"
+    GridService = "OpenSim.Services.GridService.dll:GridService"
+    InventoryService = "OpenSim.Services.InventoryService.dll:XInventoryService"
+    AvatarService = "OpenSim.Services.AvatarService.dll:AvatarService"
+    GridUserService = "OpenSim.Services.UserAccountService.dll:GridUserService"
+
+    ;; This switch creates the minimum set of body parts and avatar entries for a viewer 2 
+    ;; to show a default "Ruth" avatar rather than a cloud for a newly created user.
+    ;; Default is false
+    CreateDefaultAvatarEntries = true
+
+    ;; Allow the service to process HTTP createuser calls.
+    ;; Default is false.
+    ; AllowCreateUser = false
+
+    ;; Allow the service to process HTTP setaccount calls.
+    ;; Default is false.
+    ; AllowSetAccount = false
+
+
+[GridUserService]
+    ; for the server connector
+    LocalServiceModule = "OpenSim.Services.UserAccountService.dll:GridUserService"
+
+
+[PresenceService]
+    ; for the server connector
+    LocalServiceModule = "OpenSim.Services.PresenceService.dll:PresenceService"
+    ; Set this to true to allow the use of advanced web services and multiple
+    ; bots using one account
+    AllowDuplicatePresences = false;
+
+
+[AvatarService]
+    ; for the server connector
+    LocalServiceModule = "OpenSim.Services.AvatarService.dll:AvatarService"
+
+
+[FriendsService]
+    ; for the server connector
+    LocalServiceModule = "OpenSim.Services.FriendsService.dll:FriendsService"
+
+[EstateService]
+    LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
+
+[LibraryService]
+    LibraryName = "OpenSim Library"
+    DefaultLibrary = "./inventory/Libraries.xml"
+
+
+[LoginService]
+    ; for the server connector
+    LocalServiceModule = "OpenSim.Services.LLLoginService.dll:LLLoginService"
+    ; for the service
+    UserAccountService = "OpenSim.Services.UserAccountService.dll:UserAccountService"
+    GridUserService = "OpenSim.Services.UserAccountService.dll:GridUserService"
+    AuthenticationService = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"
+    InventoryService = "OpenSim.Services.InventoryService.dll:XInventoryService"
+    AvatarService = "OpenSim.Services.AvatarService.dll:AvatarService"
+    PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService"
+    GridService = "OpenSim.Services.GridService.dll:GridService"
+    SimulationService ="OpenSim.Services.Connectors.dll:SimulationServiceConnector"
+    LibraryService = "OpenSim.Services.InventoryService.dll:LibraryService"
+    FriendsService = "OpenSim.Services.FriendsService.dll:FriendsService"
+
+    ; The minimum user level required for a user to be able to login.  0 by default
+    ; If you disable a particular user's account then you can set their login level below this number.
+    ; You can also change this level from the console though these changes will not be persisted.
+    ; MinLoginLevel = 0
+
+    ; Ask co-operative viewers to use a different currency name
+    ;Currency = ""
+
+    ;; Set minimum fee to publish classified
+    ; ClassifiedFee = 0
+
+    WelcomeMessage = "Welcome, Avatar!"
+    AllowRemoteSetLoginLevel = "false"
+
+    ; For V2 map
+    MapTileURL = "${Const|BaseURL}:${Const|PublicPort}/";
+
+    ; Url to search service
+    ; SearchURL = "${Const|BaseURL}:${Const|PublicPort}/";
+
+    ; For V3 destination guide
+    ; DestinationGuide = "${Const|BaseURL}/guide"
+
+    ; For V3 avatar picker (( work in progress ))
+    ; AvatarPicker = "${Const|BaseURL}/avatars"
+
+    ; If you run this login server behind a proxy, set this to true
+    ; HasProxy = false
+
+    ;; Regular expressions for controlling which client versions are accepted/denied.
+    ;; An empty string means nothing is checked.
+    ;;
+    ;; Example 1: allow only these 3 types of clients (any version of them)
+    ;; AllowedClients = "Imprudence|Hippo|Second Life"
+    ;;
+    ;; Example 2: allow all clients except these
+    ;; DeniedClients = "Twisted|Crawler|Cryolife|FuckLife|StreetLife|GreenLife|AntiLife|KORE-Phaze|Synlyfe|Purple Second Life|SecondLi |Emerald"
+    ;;
+    ;; Note that these are regular expressions, so every character counts.
+    ;; Also note that this is very weak security and should not be trusted as a reliable means
+    ;; for keeping bad clients out; modified clients can fake their identifiers.
+    ;;
+    ;;
+    ;AllowedClients = ""
+    ;DeniedClients = ""
+
+    ;# {DSTZone} {} {Override Daylight Saving Time rules} {* none local} "America/Los_Angeles;Pacific Standard Time"
+    ;; Viewers do not listen to timezone sent by the server. They use Pacific Standard Time instead,
+    ;; but rely on the server to calculate Daylight Saving Time. Sending another DST than US Pacific
+    ;; would result in time inconsistencies between grids (during summer and around DST transition period)
+    ;;   default    let OpenSim calculate US Pacific DST
+    ;;   "none"     disable DST (equivallent to "local" with system set to GMT)
+    ;;   "local"    force legacy behaviour (using local system time to calculate DST)
+    ; DSTZone = "America/Los_Angeles;Pacific Standard Time"
+
+    ;# {DSTZone} {} {Override Daylight Saving Time rules} {* none local} "America/Los_Angeles;Pacific Standard Time"
+    ;; Viewers do not receive timezone information from the server - almost all (?) default to Pacific Standard Time
+    ;; However, they do rely on the server to tell them whether it's Daylight Saving Time or not.
+    ;; Hence, calculating DST based on a different timezone can result in a misleading viewer display and inconsistencies between grids.
+    ;; By default, this setting uses various timezone names to calculate DST with regards to the viewer's standard PST.
+    ;; Options are
+    ;;   "none"     no DST 
+    ;;   "local"    use the server's only timezone to calculate DST.  This is previous OpenSimulator behaviour.
+    ;;   "America/Los_Angeles;Pacific Standard Time" use these timezone names to look up Daylight savings.
+    ;;      'America/Los_Angeles' is used on Linux/Mac systems whilst 'Pacific Standard Time' is used on Windows
+    DSTZone = "America/Los_Angeles;Pacific Standard Time"
+
+    ;Basic Login Service Dos Protection Tweaks
+    ;;
+    ;; Some Grids/Users use a transparent proxy that makes use of the X-Forwarded-For HTTP Header, If you do, set this to true
+    ;; If you set this to true and you don't have a transparent proxy, it may allow attackers to put random things in the X-Forwarded-For header to
+    ;;     get around this basic DOS protection.
+    ;DOSAllowXForwardedForHeader = false
+    ;;
+    ;; The protector adds up requests during this rolling period of time, default 10 seconds
+    ;DOSRequestTimeFrameMS = 10000
+    ;;
+    ;; The amount of requests in the above timeframe from the same endpoint that triggers protection
+    ;DOSMaxRequestsInTimeFrame = 5
+    ;;
+    ;; The amount of time that a specific endpoint is blocked.    Default 2 minutes.
+    ;DOSForgiveClientAfterMS = 120000
+    ;; 
+    ;; To turn off basic dos protection, set the DOSMaxRequestsInTimeFrame to 0.
+
+
+[MapImageService]
+    LocalServiceModule = "OpenSim.Services.MapImageService.dll:MapImageService"
+
+    ; Set this if you want to change the default
+    ; TilesStoragePath = "maptiles"
+    ;
+    ; If for some reason you have the AddMapTile service outside the firewall (e.g. ${Const|PublicPort}),
+    ; you may want to set this. Otherwise, don't set it, because it's already protected.
+    ; GridService = "OpenSim.Services.GridService.dll:GridService"
+    ;
+    ; Additionally, if you run this server behind a proxy, set this to true
+    ; HasProxy = false
+
+
+[Messaging]
+    ; OfflineIM
+    OfflineIMService = "OpenSim.Addons.OfflineIM.dll:OfflineIMService"
+
+
+[GridInfoService]
+    ; These settings are used to return information on a get_grid_info call.
+    ; Client launcher scripts and third-party clients make use of this to
+    ; autoconfigure the client and to provide a nice user experience. If you
+    ; want to facilitate that, you should configure the settings here according
+    ; to your grid or standalone setup.
+    ;
+    ; See http://opensimulator.org/wiki/GridInfo
+
+    ; login uri: for grid this is the login server URI
+    login = ${Const|BaseURL}:${Const|PublicPort}/
+
+    ; long grid name: the long name of your grid
+    gridname = "the lost continent of hippo"
+
+    ; short grid name: the short name of your grid
+    gridnick = "hippogrid"
+
+    ; login page: optional: if it exists it will be used to tell the client to use
+    ;                       this as splash page
+    ;welcome = ${Const|BaseURL}/welcome
+
+    ; helper uri: optional: if it exists if will be used to tell the client to use
+    ;                       this for all economy related things
+    ;economy = ${Const|BaseURL}:${Const|PublicPort}/
+
+    ; web page of grid: optional: page providing further information about your grid
+    ;about = ${Const|BaseURL}/about/
+
+    ; account creation: optional: page providing further information about obtaining
+    ;                             a user account on your grid
+    ;register = ${Const|BaseURL}/register
+
+    ; help: optional: page providing further assistance for users of your grid
+    ;help = ${Const|BaseURL}/help
+
+    ; password help: optional: page providing password assistance for users of your grid
+    ;password = ${Const|BaseURL}/password
+
+
+[UserProfilesService]
+    LocalServiceModule = "OpenSim.Services.UserProfilesService.dll:UserProfilesService"
+    Enabled = false
+    ;; Configure this for separate profiles database
+    ;; ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;Old Guids=true;"
+    ;; Realm = UserProfiles
+    UserAccountService = OpenSim.Services.UserAccountService.dll:UserAccountService
+    AuthenticationServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"
+
+
+[BakedTextureService]
+    LocalServiceModule = "OpenSim.Server.Handlers.dll:XBakes"
+    ;; This directory must be writable by the user ROBUST runs as. It will be created automatically.
+    BaseDirectory = "./bakes"

+ 35 - 0
prebuild.xml

@@ -2661,6 +2661,41 @@
     </Project>
 
     <!-- Test Clients -->
+    <Project frameworkVersion="v4_0" name="Robust.Tests" path="OpenSim/Tests/Robust" type="Library">
+      <Configuration name="Debug">
+        <Options>
+          <OutputPath>../../../bin/</OutputPath>
+        </Options>
+      </Configuration>
+      <Configuration name="Release">
+        <Options>
+          <OutputPath>../../../bin/</OutputPath>
+        </Options>
+      </Configuration>
+
+      <ReferencePath>../../../bin/</ReferencePath>
+      <Reference name="System"/>
+      <Reference name="OpenMetaverseTypes" path="../../../bin/"/>
+      <Reference name="OpenMetaverse" path="../../../bin/"/>
+      <Reference name="OpenSim.Framework"/>
+      <Reference name="OpenSim.Framework.Servers"/>
+      <Reference name="OpenSim.Framework.Servers.HttpServer"/>
+      <Reference name="OpenSim.Framework"/>
+      <Reference name="OpenSim.Server.Base"/>
+      <Reference name="OpenSim.Server.Handlers"/>
+      <Reference name="OpenSim.Services.Interfaces"/>
+      <Reference name="OpenSim.Services.Connectors"/>
+      <Reference name="Robust"/>
+      <Reference name="Nini" path="../../../bin/"/>
+      <Reference name="log4net" path="../../../bin/"/>
+      <Reference name="nunit.framework" path="../../../bin/"/>
+
+      <Files>
+        <Match pattern="*.cs" recurse="true"/>
+      </Files>
+    </Project>
+
+
     <Project frameworkVersion="v4_0" name="OpenSim.Tests.Clients.AssetClient" path="OpenSim/Tests/Clients/Assets" type="Exe">
       <Configuration name="Debug">
         <Options>