aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Tests/Common
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2012-05-01 23:14:12 +0100
committerJustin Clark-Casey (justincc)2012-05-01 23:14:12 +0100
commit9d2e1c67a8969e4769006c7347505b58a7827b3f (patch)
tree1fb6d412e2d8a753e1b59af46f6ada0a45556e75 /OpenSim/Tests/Common
parentMove max teleport distance check down into etm.DoTeleport() since this should... (diff)
downloadopensim-SC-9d2e1c67a8969e4769006c7347505b58a7827b3f.zip
opensim-SC-9d2e1c67a8969e4769006c7347505b58a7827b3f.tar.gz
opensim-SC-9d2e1c67a8969e4769006c7347505b58a7827b3f.tar.bz2
opensim-SC-9d2e1c67a8969e4769006c7347505b58a7827b3f.tar.xz
Add regression test for teleporting between neighbouring regions on the same simulator
This adds a non-advertised wait_for_callback option in [EntityTransfer]. Default is always true. Teleport tests disable the wait for callback from the destination region in order to run within a single thread.
Diffstat (limited to 'OpenSim/Tests/Common')
-rw-r--r--OpenSim/Tests/Common/Helpers/SceneHelpers.cs72
-rw-r--r--OpenSim/Tests/Common/Mock/TestClient.cs39
-rw-r--r--OpenSim/Tests/Common/TestHelpers.cs9
3 files changed, 106 insertions, 14 deletions
diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
index 8e54707..dc24418 100644
--- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
+++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
@@ -58,6 +58,11 @@ namespace OpenSim.Tests.Common
58 /// </summary> 58 /// </summary>
59 public class SceneHelpers 59 public class SceneHelpers
60 { 60 {
61 /// <summary>
62 /// We need a scene manager so that test clients can retrieve a scene when performing teleport tests.
63 /// </summary>
64 public SceneManager SceneManager { get; private set; }
65
61 private AgentCircuitManager m_acm = new AgentCircuitManager(); 66 private AgentCircuitManager m_acm = new AgentCircuitManager();
62 private ISimulationDataService m_simDataService 67 private ISimulationDataService m_simDataService
63 = OpenSim.Server.Base.ServerUtils.LoadPlugin<ISimulationDataService>("OpenSim.Tests.Common.dll", null); 68 = OpenSim.Server.Base.ServerUtils.LoadPlugin<ISimulationDataService>("OpenSim.Tests.Common.dll", null);
@@ -76,6 +81,8 @@ namespace OpenSim.Tests.Common
76 81
77 public SceneHelpers(CoreAssetCache cache) 82 public SceneHelpers(CoreAssetCache cache)
78 { 83 {
84 SceneManager = new SceneManager();
85
79 m_assetService = StartAssetService(cache); 86 m_assetService = StartAssetService(cache);
80 m_authenticationService = StartAuthenticationService(); 87 m_authenticationService = StartAuthenticationService();
81 m_inventoryService = StartInventoryService(); 88 m_inventoryService = StartInventoryService();
@@ -186,6 +193,8 @@ namespace OpenSim.Tests.Common
186 testScene.LoginsDisabled = false; 193 testScene.LoginsDisabled = false;
187 testScene.RegisterRegionWithGrid(); 194 testScene.RegisterRegionWithGrid();
188 195
196 SceneManager.Add(testScene);
197
189 return testScene; 198 return testScene;
190 } 199 }
191 200
@@ -350,6 +359,7 @@ namespace OpenSim.Tests.Common
350 List<IRegionModuleBase> newModules = new List<IRegionModuleBase>(); 359 List<IRegionModuleBase> newModules = new List<IRegionModuleBase>();
351 foreach (object module in modules) 360 foreach (object module in modules)
352 { 361 {
362// Console.WriteLine("MODULE RAW {0}", module);
353 if (module is IRegionModule) 363 if (module is IRegionModule)
354 { 364 {
355 IRegionModule m = (IRegionModule)module; 365 IRegionModule m = (IRegionModule)module;
@@ -367,6 +377,7 @@ namespace OpenSim.Tests.Common
367 // for the new system, everything has to be initialised first, 377 // for the new system, everything has to be initialised first,
368 // shared modules have to be post-initialised, then all get an AddRegion with the scene 378 // shared modules have to be post-initialised, then all get an AddRegion with the scene
369 IRegionModuleBase m = (IRegionModuleBase)module; 379 IRegionModuleBase m = (IRegionModuleBase)module;
380// Console.WriteLine("MODULE {0}", m.Name);
370 m.Initialise(config); 381 m.Initialise(config);
371 newModules.Add(m); 382 newModules.Add(m);
372 } 383 }
@@ -426,6 +437,10 @@ namespace OpenSim.Tests.Common
426 /// <summary> 437 /// <summary>
427 /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test 438 /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test
428 /// </summary> 439 /// </summary>
440 /// <remarks>
441 /// This can be used for tests where there is only one region or where there are multiple non-neighbour regions
442 /// and teleport doesn't take place.
443 /// </remarks>
429 /// <param name="scene"></param> 444 /// <param name="scene"></param>
430 /// <param name="agentId"></param> 445 /// <param name="agentId"></param>
431 /// <returns></returns> 446 /// <returns></returns>
@@ -435,6 +450,18 @@ namespace OpenSim.Tests.Common
435 } 450 }
436 451
437 /// <summary> 452 /// <summary>
453 /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test
454 /// </summary>
455 /// <param name="scene"></param>
456 /// <param name="agentId"></param>
457 /// <param name="sceneManager"></param>
458 /// <returns></returns>
459 public static ScenePresence AddScenePresence(Scene scene, UUID agentId, SceneManager sceneManager)
460 {
461 return AddScenePresence(scene, GenerateAgentData(agentId), sceneManager);
462 }
463
464 /// <summary>
438 /// Add a root agent. 465 /// Add a root agent.
439 /// </summary> 466 /// </summary>
440 /// <remarks> 467 /// <remarks>
@@ -454,6 +481,30 @@ namespace OpenSim.Tests.Common
454 /// <returns></returns> 481 /// <returns></returns>
455 public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData) 482 public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData)
456 { 483 {
484 return AddScenePresence(scene, agentData, null);
485 }
486
487 /// <summary>
488 /// Add a root agent.
489 /// </summary>
490 /// <remarks>
491 /// This function
492 ///
493 /// 1) Tells the scene that an agent is coming. Normally, the login service (local if standalone, from the
494 /// userserver if grid) would give initial login data back to the client and separately tell the scene that the
495 /// agent was coming.
496 ///
497 /// 2) Connects the agent with the scene
498 ///
499 /// This function performs actions equivalent with notifying the scene that an agent is
500 /// coming and then actually connecting the agent to the scene. The one step missed out is the very first
501 /// </remarks>
502 /// <param name="scene"></param>
503 /// <param name="agentData"></param>
504 /// <param name="sceneManager"></param>
505 /// <returns></returns>
506 public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData, SceneManager sceneManager)
507 {
457 // We emulate the proper login sequence here by doing things in four stages 508 // We emulate the proper login sequence here by doing things in four stages
458 509
459 // Stage 0: login 510 // Stage 0: login
@@ -463,7 +514,7 @@ namespace OpenSim.Tests.Common
463 lpsc.m_PresenceService.LoginAgent(agentData.AgentID.ToString(), agentData.SessionID, agentData.SecureSessionID); 514 lpsc.m_PresenceService.LoginAgent(agentData.AgentID.ToString(), agentData.SessionID, agentData.SecureSessionID);
464 515
465 // Stages 1 & 2 516 // Stages 1 & 2
466 ScenePresence sp = IntroduceClientToScene(scene, agentData, TeleportFlags.ViaLogin); 517 ScenePresence sp = IntroduceClientToScene(scene, sceneManager, agentData, TeleportFlags.ViaLogin);
467 518
468 // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent. 519 // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent.
469 sp.CompleteMovement(sp.ControllingClient, true); 520 sp.CompleteMovement(sp.ControllingClient, true);
@@ -471,7 +522,20 @@ namespace OpenSim.Tests.Common
471 return sp; 522 return sp;
472 } 523 }
473 524
474 private static ScenePresence IntroduceClientToScene(Scene scene, AgentCircuitData agentData, TeleportFlags tf) 525 /// <summary>
526 /// Introduce an agent into the scene by adding a new client.
527 /// </summary>
528 /// <returns>The scene presence added</returns>
529 /// <param name='sceneManager'>
530 /// Scene manager. Can be null if there is only one region in the test or multiple regions that are not
531 /// neighbours and where no teleporting takes place.
532 /// </param>
533 /// <param name='scene'></param>
534 /// <param name='sceneManager></param>
535 /// <param name='agentData'></param>
536 /// <param name='tf'></param>
537 private static ScenePresence IntroduceClientToScene(
538 Scene scene, SceneManager sceneManager, AgentCircuitData agentData, TeleportFlags tf)
475 { 539 {
476 string reason; 540 string reason;
477 541
@@ -480,7 +544,7 @@ namespace OpenSim.Tests.Common
480 Console.WriteLine("NewUserConnection failed: " + reason); 544 Console.WriteLine("NewUserConnection failed: " + reason);
481 545
482 // Stage 2: add the new client as a child agent to the scene 546 // Stage 2: add the new client as a child agent to the scene
483 TestClient client = new TestClient(agentData, scene); 547 TestClient client = new TestClient(agentData, scene, sceneManager);
484 scene.AddNewClient(client, PresenceType.User); 548 scene.AddNewClient(client, PresenceType.User);
485 549
486 return scene.GetScenePresence(agentData.AgentID); 550 return scene.GetScenePresence(agentData.AgentID);
@@ -492,7 +556,7 @@ namespace OpenSim.Tests.Common
492 acd.child = true; 556 acd.child = true;
493 557
494 // XXX: ViaLogin may not be correct for child agents 558 // XXX: ViaLogin may not be correct for child agents
495 return IntroduceClientToScene(scene, acd, TeleportFlags.ViaLogin); 559 return IntroduceClientToScene(scene, null, acd, TeleportFlags.ViaLogin);
496 } 560 }
497 561
498 /// <summary> 562 /// <summary>
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index cb9840e..36049a1 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -46,12 +46,10 @@ namespace OpenSim.Tests.Common.Mock
46 46
47 EventWaitHandle wh = new EventWaitHandle (false, EventResetMode.AutoReset, "Crossing"); 47 EventWaitHandle wh = new EventWaitHandle (false, EventResetMode.AutoReset, "Crossing");
48 48
49 // TODO: This is a really nasty (and temporary) means of telling the test client which scene to invoke setup
50 // methods on when a teleport is requested
51 public Scene TeleportTargetScene;
52 private TestClient TeleportSceneClient; 49 private TestClient TeleportSceneClient;
53 50
54 private Scene m_scene; 51 private Scene m_scene;
52 private SceneManager m_sceneManager;
55 53
56 // Properties so that we can get at received data for test purposes 54 // Properties so that we can get at received data for test purposes
57 public List<UUID> ReceivedOfflineNotifications { get; private set; } 55 public List<UUID> ReceivedOfflineNotifications { get; private set; }
@@ -432,15 +430,29 @@ namespace OpenSim.Tests.Common.Mock
432 /// <summary> 430 /// <summary>
433 /// Constructor 431 /// Constructor
434 /// </summary> 432 /// </summary>
433 /// <remarks>
434 /// Can be used for a test where there is only one region or where there are multiple regions that are not
435 /// neighbours and where no teleporting takes place. In other situations, the constructor that takes in a
436 /// scene manager should be used.
437 /// </remarks>
435 /// <param name="agentData"></param> 438 /// <param name="agentData"></param>
436 /// <param name="scene"></param> 439 /// <param name="scene"></param>
437 public TestClient(AgentCircuitData agentData, Scene scene) 440 public TestClient(AgentCircuitData agentData, Scene scene) : this(agentData, scene, null) {}
441
442 /// <summary>
443 /// Constructor
444 /// </summary>
445 /// <param name="agentData"></param>
446 /// <param name="scene"></param>
447 /// <param name="sceneManager"></param>
448 public TestClient(AgentCircuitData agentData, Scene scene, SceneManager sceneManager)
438 { 449 {
439 m_agentId = agentData.AgentID; 450 m_agentId = agentData.AgentID;
440 m_firstName = agentData.firstname; 451 m_firstName = agentData.firstname;
441 m_lastName = agentData.lastname; 452 m_lastName = agentData.lastname;
442 m_circuitCode = agentData.circuitcode; 453 m_circuitCode = agentData.circuitcode;
443 m_scene = scene; 454 m_scene = scene;
455 m_sceneManager = sceneManager;
444 SessionId = agentData.SessionID; 456 SessionId = agentData.SessionID;
445 SecureSessionId = agentData.SecureSessionID; 457 SecureSessionId = agentData.SecureSessionID;
446 CapsSeedUrl = agentData.CapsPath; 458 CapsSeedUrl = agentData.CapsPath;
@@ -590,8 +602,16 @@ namespace OpenSim.Tests.Common.Mock
590 AgentCircuitData newAgent = RequestClientInfo(); 602 AgentCircuitData newAgent = RequestClientInfo();
591 603
592 // Stage 2: add the new client as a child agent to the scene 604 // Stage 2: add the new client as a child agent to the scene
593 TeleportSceneClient = new TestClient(newAgent, TeleportTargetScene); 605 uint x, y;
594 TeleportTargetScene.AddNewClient(TeleportSceneClient, PresenceType.User); 606 Utils.LongToUInts(neighbourHandle, out x, out y);
607 x /= Constants.RegionSize;
608 y /= Constants.RegionSize;
609
610 Scene neighbourScene;
611 m_sceneManager.TryGetScene(x, y, out neighbourScene);
612
613 TeleportSceneClient = new TestClient(newAgent, neighbourScene, m_sceneManager);
614 neighbourScene.AddNewClient(TeleportSceneClient, PresenceType.User);
595 } 615 }
596 616
597 public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, 617 public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint,
@@ -601,6 +621,13 @@ namespace OpenSim.Tests.Common.Mock
601 621
602 CapsSeedUrl = capsURL; 622 CapsSeedUrl = capsURL;
603 623
624 // We don't do this here so that the source region can complete processing first in a single-threaded
625 // regression test scenario. The test itself will have to call CompleteTeleportClientSide() after a teleport
626 // CompleteTeleportClientSide();
627 }
628
629 public void CompleteTeleportClientSide()
630 {
604 TeleportSceneClient.CompleteMovement(); 631 TeleportSceneClient.CompleteMovement();
605 //TeleportTargetScene.AgentCrossing(newAgent.AgentID, new Vector3(90, 90, 90), false); 632 //TeleportTargetScene.AgentCrossing(newAgent.AgentID, new Vector3(90, 90, 90), false);
606 } 633 }
diff --git a/OpenSim/Tests/Common/TestHelpers.cs b/OpenSim/Tests/Common/TestHelpers.cs
index 5030d4b..6744fca 100644
--- a/OpenSim/Tests/Common/TestHelpers.cs
+++ b/OpenSim/Tests/Common/TestHelpers.cs
@@ -46,7 +46,8 @@ namespace OpenSim.Tests.Common
46 <!-- A1 uses PatternLayout --> 46 <!-- A1 uses PatternLayout -->
47 <layout type=""log4net.Layout.PatternLayout""> 47 <layout type=""log4net.Layout.PatternLayout"">
48 <!-- Print the date in ISO 8601 format --> 48 <!-- Print the date in ISO 8601 format -->
49 <conversionPattern value=""%date [%thread] %-5level %logger %ndc - %message%newline"" /> 49 <!-- <conversionPattern value=""%date [%thread] %-5level %logger %ndc - %message%newline"" /> -->
50 <conversionPattern value=""%date %message%newline"" />
50 </layout> 51 </layout>
51 </appender> 52 </appender>
52 53
@@ -62,9 +63,9 @@ namespace OpenSim.Tests.Common
62 Encoding.UTF8.GetBytes( 63 Encoding.UTF8.GetBytes(
63 // "<?xml version=\"1.0\" encoding=\"utf-8\" ?><configuration><log4net><root><level value=\"OFF\"/><appender-ref ref=\"A1\"/></root></log4net></configuration>"))); 64 // "<?xml version=\"1.0\" encoding=\"utf-8\" ?><configuration><log4net><root><level value=\"OFF\"/><appender-ref ref=\"A1\"/></root></log4net></configuration>")));
64 //"<?xml version=\"1.0\" encoding=\"utf-8\" ?><configuration><log4net><root><level value=\"OFF\"/></root></log4net></configuration>"))); 65 //"<?xml version=\"1.0\" encoding=\"utf-8\" ?><configuration><log4net><root><level value=\"OFF\"/></root></log4net></configuration>")));
65 //"<configuration><log4net><root><level value=\"OFF\"/></root></log4net></configuration>"))); 66// "<configuration><log4net><root><level value=\"OFF\"/></root></log4net></configuration>"));
66 //"<configuration><log4net><root></root></log4net></configuration>"))); 67// "<configuration><log4net><root></root></log4net></configuration>")));
67 //"<configuration><log4net><root/></log4net></configuration>"))); 68// "<configuration><log4net><root/></log4net></configuration>"));
68 "<log4net><root/></log4net>")); 69 "<log4net><root/></log4net>"));
69 70
70 public static bool AssertThisDelegateCausesArgumentException(TestDelegate d) 71 public static bool AssertThisDelegateCausesArgumentException(TestDelegate d)