diff options
author | Justin Clark-Casey (justincc) | 2012-05-01 23:14:12 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-05-01 23:14:12 +0100 |
commit | 9d2e1c67a8969e4769006c7347505b58a7827b3f (patch) | |
tree | 1fb6d412e2d8a753e1b59af46f6ada0a45556e75 /OpenSim/Tests | |
parent | Move max teleport distance check down into etm.DoTeleport() since this should... (diff) | |
download | opensim-SC_OLD-9d2e1c67a8969e4769006c7347505b58a7827b3f.zip opensim-SC_OLD-9d2e1c67a8969e4769006c7347505b58a7827b3f.tar.gz opensim-SC_OLD-9d2e1c67a8969e4769006c7347505b58a7827b3f.tar.bz2 opensim-SC_OLD-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')
-rw-r--r-- | OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 72 | ||||
-rw-r--r-- | OpenSim/Tests/Common/Mock/TestClient.cs | 39 | ||||
-rw-r--r-- | OpenSim/Tests/Common/TestHelpers.cs | 9 |
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) |