diff options
author | Oren Hurvitz | 2012-08-27 12:47:04 +0300 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-09-14 20:32:25 +0100 |
commit | 5dd2569bf7d50217d1786c3268a537745b2e9fd3 (patch) | |
tree | fb5dfb30ef7a8eb9de8574d5a8c6b522f6659e06 /OpenSim/Region | |
parent | Rename ArchiveWriteRequestPreparatio nto ArchiveWriteRequest since after the ... (diff) | |
download | opensim-SC_OLD-5dd2569bf7d50217d1786c3268a537745b2e9fd3.zip opensim-SC_OLD-5dd2569bf7d50217d1786c3268a537745b2e9fd3.tar.gz opensim-SC_OLD-5dd2569bf7d50217d1786c3268a537745b2e9fd3.tar.bz2 opensim-SC_OLD-5dd2569bf7d50217d1786c3268a537745b2e9fd3.tar.xz |
Added unit tests for multi-region OARs
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/ClientStack/RegionApplicationBase.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs | 384 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneManager.cs | 6 |
3 files changed, 332 insertions, 60 deletions
diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index 4672f8a..853b72d 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs | |||
@@ -76,7 +76,7 @@ namespace OpenSim.Region.ClientStack | |||
76 | 76 | ||
77 | protected override void StartupSpecific() | 77 | protected override void StartupSpecific() |
78 | { | 78 | { |
79 | SceneManager = new SceneManager(); | 79 | SceneManager = SceneManager.Instance; |
80 | m_clientStackManager = CreateClientStackManager(); | 80 | m_clientStackManager = CreateClientStackManager(); |
81 | 81 | ||
82 | Initialize(); | 82 | Initialize(); |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index abbaf41..0a30905 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs | |||
@@ -57,23 +57,25 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
57 | private Guid m_lastRequestId; | 57 | private Guid m_lastRequestId; |
58 | private string m_lastErrorMessage; | 58 | private string m_lastErrorMessage; |
59 | 59 | ||
60 | protected SceneHelpers m_sceneHelpers; | ||
60 | protected TestScene m_scene; | 61 | protected TestScene m_scene; |
61 | protected ArchiverModule m_archiverModule; | 62 | protected ArchiverModule m_archiverModule; |
63 | protected SerialiserModule m_serialiserModule; | ||
62 | 64 | ||
63 | protected TaskInventoryItem m_soundItem; | 65 | protected TaskInventoryItem m_soundItem; |
64 | 66 | ||
65 | [SetUp] | 67 | [SetUp] |
66 | public void SetUp() | 68 | public void SetUp() |
67 | { | 69 | { |
70 | new SceneManager(); | ||
71 | |||
68 | m_archiverModule = new ArchiverModule(); | 72 | m_archiverModule = new ArchiverModule(); |
69 | SerialiserModule serialiserModule = new SerialiserModule(); | 73 | m_serialiserModule = new SerialiserModule(); |
70 | TerrainModule terrainModule = new TerrainModule(); | 74 | TerrainModule terrainModule = new TerrainModule(); |
71 | 75 | ||
72 | m_scene = new SceneHelpers().SetupScene(); | 76 | m_sceneHelpers = new SceneHelpers(); |
73 | SceneHelpers.SetupSceneModules(m_scene, m_archiverModule, serialiserModule, terrainModule); | 77 | m_scene = m_sceneHelpers.SetupScene(); |
74 | 78 | SceneHelpers.SetupSceneModules(m_scene, m_archiverModule, m_serialiserModule, terrainModule); | |
75 | new SceneManager(); | ||
76 | SceneManager.Instance.Add(m_scene); | ||
77 | } | 79 | } |
78 | 80 | ||
79 | private void LoadCompleted(Guid requestId, List<UUID> loadedScenes, string errorMessage) | 81 | private void LoadCompleted(Guid requestId, List<UUID> loadedScenes, string errorMessage) |
@@ -132,26 +134,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
132 | TestHelpers.InMethod(); | 134 | TestHelpers.InMethod(); |
133 | // log4net.Config.XmlConfigurator.Configure(); | 135 | // log4net.Config.XmlConfigurator.Configure(); |
134 | 136 | ||
135 | SceneObjectPart part1 = CreateSceneObjectPart1(); | 137 | SceneObjectGroup sog1; |
136 | SceneObjectGroup sog1 = new SceneObjectGroup(part1); | 138 | SceneObjectGroup sog2; |
137 | m_scene.AddNewSceneObject(sog1, false); | 139 | UUID ncAssetUuid; |
138 | 140 | CreateTestObjects(m_scene, out sog1, out sog2, out ncAssetUuid); | |
139 | SceneObjectPart part2 = CreateSceneObjectPart2(); | ||
140 | |||
141 | AssetNotecard nc = new AssetNotecard(); | ||
142 | nc.BodyText = "Hello World!"; | ||
143 | nc.Encode(); | ||
144 | UUID ncAssetUuid = new UUID("00000000-0000-0000-1000-000000000000"); | ||
145 | UUID ncItemUuid = new UUID("00000000-0000-0000-1100-000000000000"); | ||
146 | AssetBase ncAsset | ||
147 | = AssetHelpers.CreateAsset(ncAssetUuid, AssetType.Notecard, nc.AssetData, UUID.Zero); | ||
148 | m_scene.AssetService.Store(ncAsset); | ||
149 | SceneObjectGroup sog2 = new SceneObjectGroup(part2); | ||
150 | TaskInventoryItem ncItem | ||
151 | = new TaskInventoryItem { Name = "ncItem", AssetID = ncAssetUuid, ItemID = ncItemUuid }; | ||
152 | part2.Inventory.AddInventoryItem(ncItem, true); | ||
153 | |||
154 | m_scene.AddNewSceneObject(sog2, false); | ||
155 | 141 | ||
156 | MemoryStream archiveWriteStream = new MemoryStream(); | 142 | MemoryStream archiveWriteStream = new MemoryStream(); |
157 | m_scene.EventManager.OnOarFileSaved += SaveCompleted; | 143 | m_scene.EventManager.OnOarFileSaved += SaveCompleted; |
@@ -215,6 +201,30 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
215 | // TODO: Test presence of more files and contents of files. | 201 | // TODO: Test presence of more files and contents of files. |
216 | } | 202 | } |
217 | 203 | ||
204 | private void CreateTestObjects(Scene scene, out SceneObjectGroup sog1, out SceneObjectGroup sog2, out UUID ncAssetUuid) | ||
205 | { | ||
206 | SceneObjectPart part1 = CreateSceneObjectPart1(); | ||
207 | sog1 = new SceneObjectGroup(part1); | ||
208 | scene.AddNewSceneObject(sog1, false); | ||
209 | |||
210 | AssetNotecard nc = new AssetNotecard(); | ||
211 | nc.BodyText = "Hello World!"; | ||
212 | nc.Encode(); | ||
213 | ncAssetUuid = UUID.Random(); | ||
214 | UUID ncItemUuid = UUID.Random(); | ||
215 | AssetBase ncAsset | ||
216 | = AssetHelpers.CreateAsset(ncAssetUuid, AssetType.Notecard, nc.AssetData, UUID.Zero); | ||
217 | m_scene.AssetService.Store(ncAsset); | ||
218 | |||
219 | TaskInventoryItem ncItem | ||
220 | = new TaskInventoryItem { Name = "ncItem", AssetID = ncAssetUuid, ItemID = ncItemUuid }; | ||
221 | SceneObjectPart part2 = CreateSceneObjectPart2(); | ||
222 | sog2 = new SceneObjectGroup(part2); | ||
223 | part2.Inventory.AddInventoryItem(ncItem, true); | ||
224 | |||
225 | scene.AddNewSceneObject(sog2, false); | ||
226 | } | ||
227 | |||
218 | /// <summary> | 228 | /// <summary> |
219 | /// Test saving an OpenSim Region Archive with the no assets option | 229 | /// Test saving an OpenSim Region Archive with the no assets option |
220 | /// </summary> | 230 | /// </summary> |
@@ -392,31 +402,12 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
392 | Assert.That(soundDataResourceName, Is.Not.Null); | 402 | Assert.That(soundDataResourceName, Is.Not.Null); |
393 | 403 | ||
394 | byte[] soundData; | 404 | byte[] soundData; |
395 | Console.WriteLine("Loading " + soundDataResourceName); | 405 | UUID soundUuid; |
396 | using (Stream resource = assembly.GetManifestResourceStream(soundDataResourceName)) | 406 | CreateSoundAsset(tar, assembly, soundDataResourceName, out soundData, out soundUuid); |
397 | { | 407 | |
398 | using (BinaryReader br = new BinaryReader(resource)) | 408 | TaskInventoryItem item1 |
399 | { | 409 | = new TaskInventoryItem { AssetID = soundUuid, ItemID = soundItemUuid, Name = soundItemName }; |
400 | // FIXME: Use the inspector instead | 410 | part1.Inventory.AddInventoryItem(item1, true); |
401 | soundData = br.ReadBytes(99999999); | ||
402 | UUID soundUuid = UUID.Parse("00000000-0000-0000-0000-000000000001"); | ||
403 | string soundAssetFileName | ||
404 | = ArchiveConstants.ASSETS_PATH + soundUuid | ||
405 | + ArchiveConstants.ASSET_TYPE_TO_EXTENSION[(sbyte)AssetType.SoundWAV]; | ||
406 | tar.WriteFile(soundAssetFileName, soundData); | ||
407 | |||
408 | /* | ||
409 | AssetBase soundAsset = AssetHelpers.CreateAsset(soundUuid, soundData); | ||
410 | scene.AssetService.Store(soundAsset); | ||
411 | asset1FileName = ArchiveConstants.ASSETS_PATH + soundUuid + ".wav"; | ||
412 | */ | ||
413 | |||
414 | TaskInventoryItem item1 | ||
415 | = new TaskInventoryItem { AssetID = soundUuid, ItemID = soundItemUuid, Name = soundItemName }; | ||
416 | part1.Inventory.AddInventoryItem(item1, true); | ||
417 | } | ||
418 | } | ||
419 | |||
420 | m_scene.AddNewSceneObject(object1, false); | 411 | m_scene.AddNewSceneObject(object1, false); |
421 | 412 | ||
422 | string object1FileName = string.Format( | 413 | string object1FileName = string.Format( |
@@ -438,6 +429,34 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
438 | 429 | ||
439 | Assert.That(m_lastErrorMessage, Is.Null); | 430 | Assert.That(m_lastErrorMessage, Is.Null); |
440 | 431 | ||
432 | TestLoadedRegion(part1, soundItemName, soundData); | ||
433 | } | ||
434 | |||
435 | private static void CreateSoundAsset(TarArchiveWriter tar, Assembly assembly, string soundDataResourceName, out byte[] soundData, out UUID soundUuid) | ||
436 | { | ||
437 | using (Stream resource = assembly.GetManifestResourceStream(soundDataResourceName)) | ||
438 | { | ||
439 | using (BinaryReader br = new BinaryReader(resource)) | ||
440 | { | ||
441 | // FIXME: Use the inspector instead | ||
442 | soundData = br.ReadBytes(99999999); | ||
443 | soundUuid = UUID.Parse("00000000-0000-0000-0000-000000000001"); | ||
444 | string soundAssetFileName | ||
445 | = ArchiveConstants.ASSETS_PATH + soundUuid | ||
446 | + ArchiveConstants.ASSET_TYPE_TO_EXTENSION[(sbyte)AssetType.SoundWAV]; | ||
447 | tar.WriteFile(soundAssetFileName, soundData); | ||
448 | |||
449 | /* | ||
450 | AssetBase soundAsset = AssetHelpers.CreateAsset(soundUuid, soundData); | ||
451 | scene.AssetService.Store(soundAsset); | ||
452 | asset1FileName = ArchiveConstants.ASSETS_PATH + soundUuid + ".wav"; | ||
453 | */ | ||
454 | } | ||
455 | } | ||
456 | } | ||
457 | |||
458 | private void TestLoadedRegion(SceneObjectPart part1, string soundItemName, byte[] soundData) | ||
459 | { | ||
441 | SceneObjectPart object1PartLoaded = m_scene.GetSceneObjectPart(part1.Name); | 460 | SceneObjectPart object1PartLoaded = m_scene.GetSceneObjectPart(part1.Name); |
442 | 461 | ||
443 | Assert.That(object1PartLoaded, Is.Not.Null, "object1 was not loaded"); | 462 | Assert.That(object1PartLoaded, Is.Not.Null, "object1 was not loaded"); |
@@ -457,9 +476,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
457 | Assert.That(loadedSoundAsset.Data, Is.EqualTo(soundData), "saved and loaded sound data do not match"); | 476 | Assert.That(loadedSoundAsset.Data, Is.EqualTo(soundData), "saved and loaded sound data do not match"); |
458 | 477 | ||
459 | Assert.Greater(m_scene.LandChannel.AllParcels().Count, 0, "incorrect number of parcels"); | 478 | Assert.Greater(m_scene.LandChannel.AllParcels().Count, 0, "incorrect number of parcels"); |
460 | |||
461 | // Temporary | ||
462 | Console.WriteLine("Successfully completed {0}", MethodBase.GetCurrentMethod()); | ||
463 | } | 479 | } |
464 | 480 | ||
465 | /// <summary> | 481 | /// <summary> |
@@ -519,11 +535,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
519 | SerialiserModule serialiserModule = new SerialiserModule(); | 535 | SerialiserModule serialiserModule = new SerialiserModule(); |
520 | TerrainModule terrainModule = new TerrainModule(); | 536 | TerrainModule terrainModule = new TerrainModule(); |
521 | 537 | ||
522 | TestScene scene2 = new SceneHelpers().SetupScene(); | 538 | m_sceneHelpers = new SceneHelpers(); |
539 | TestScene scene2 = m_sceneHelpers.SetupScene(); | ||
523 | SceneHelpers.SetupSceneModules(scene2, archiverModule, serialiserModule, terrainModule); | 540 | SceneHelpers.SetupSceneModules(scene2, archiverModule, serialiserModule, terrainModule); |
524 | 541 | ||
525 | SceneManager.Instance.Add(scene2); | ||
526 | |||
527 | // Make sure there's a valid owner for the owner we saved (this should have been wiped if the code is | 542 | // Make sure there's a valid owner for the owner we saved (this should have been wiped if the code is |
528 | // behaving correctly | 543 | // behaving correctly |
529 | UserAccountHelpers.CreateUserWithInventory(scene2, objectOwner); | 544 | UserAccountHelpers.CreateUserWithInventory(scene2, objectOwner); |
@@ -669,7 +684,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
669 | SerialiserModule serialiserModule = new SerialiserModule(); | 684 | SerialiserModule serialiserModule = new SerialiserModule(); |
670 | TerrainModule terrainModule = new TerrainModule(); | 685 | TerrainModule terrainModule = new TerrainModule(); |
671 | 686 | ||
672 | Scene scene = new SceneHelpers().SetupScene(); | 687 | Scene scene = m_sceneHelpers.SetupScene(); |
673 | SceneHelpers.SetupSceneModules(scene, archiverModule, serialiserModule, terrainModule); | 688 | SceneHelpers.SetupSceneModules(scene, archiverModule, serialiserModule, terrainModule); |
674 | 689 | ||
675 | m_scene.AddNewSceneObject(new SceneObjectGroup(part2), false); | 690 | m_scene.AddNewSceneObject(new SceneObjectGroup(part2), false); |
@@ -705,5 +720,258 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
705 | Assert.That(object2PartMerged.GroupPosition, Is.EqualTo(part2.GroupPosition), "object2 group position not equal after merge"); | 720 | Assert.That(object2PartMerged.GroupPosition, Is.EqualTo(part2.GroupPosition), "object2 group position not equal after merge"); |
706 | } | 721 | } |
707 | } | 722 | } |
723 | |||
724 | /// <summary> | ||
725 | /// Test saving a multi-region OAR. | ||
726 | /// </summary> | ||
727 | [Test] | ||
728 | public void TestSaveMultiRegionOar() | ||
729 | { | ||
730 | TestHelpers.InMethod(); | ||
731 | |||
732 | // Create test regions | ||
733 | |||
734 | int WIDTH = 2; | ||
735 | int HEIGHT = 2; | ||
736 | |||
737 | List<Scene> scenes = new List<Scene>(); | ||
738 | |||
739 | // Maps (Directory in OAR file -> scene) | ||
740 | Dictionary<string, Scene> regionPaths = new Dictionary<string, Scene>(); | ||
741 | |||
742 | // Maps (Scene -> expected object paths) | ||
743 | Dictionary<UUID, List<string>> expectedPaths = new Dictionary<UUID, List<string>>(); | ||
744 | |||
745 | // List of expected assets | ||
746 | List<UUID> expectedAssets = new List<UUID>(); | ||
747 | |||
748 | for (uint y = 0; y < HEIGHT; y++) | ||
749 | { | ||
750 | for (uint x = 0; x < WIDTH; x++) | ||
751 | { | ||
752 | Scene scene; | ||
753 | if (x == 0 && y == 0) | ||
754 | { | ||
755 | scene = m_scene; // this scene was already created in SetUp() | ||
756 | } | ||
757 | else | ||
758 | { | ||
759 | scene = m_sceneHelpers.SetupScene(string.Format("Unit test region {0}", (y * WIDTH) + x + 1), UUID.Random(), 1000 + x, 1000 + y); | ||
760 | SceneHelpers.SetupSceneModules(scene, new ArchiverModule(), m_serialiserModule, new TerrainModule()); | ||
761 | } | ||
762 | scenes.Add(scene); | ||
763 | |||
764 | string dir = String.Format("{0}_{1}_{2}", x + 1, y + 1, scene.RegionInfo.RegionName.Replace(" ", "_")); | ||
765 | regionPaths[dir] = scene; | ||
766 | |||
767 | SceneObjectGroup sog1; | ||
768 | SceneObjectGroup sog2; | ||
769 | UUID ncAssetUuid; | ||
770 | |||
771 | CreateTestObjects(scene, out sog1, out sog2, out ncAssetUuid); | ||
772 | |||
773 | expectedPaths[scene.RegionInfo.RegionID] = new List<string>(); | ||
774 | expectedPaths[scene.RegionInfo.RegionID].Add(ArchiveHelpers.CreateObjectPath(sog1)); | ||
775 | expectedPaths[scene.RegionInfo.RegionID].Add(ArchiveHelpers.CreateObjectPath(sog2)); | ||
776 | |||
777 | expectedAssets.Add(ncAssetUuid); | ||
778 | } | ||
779 | } | ||
780 | |||
781 | |||
782 | // Save OAR | ||
783 | |||
784 | MemoryStream archiveWriteStream = new MemoryStream(); | ||
785 | m_scene.EventManager.OnOarFileSaved += SaveCompleted; | ||
786 | |||
787 | Guid requestId = new Guid("00000000-0000-0000-0000-808080808080"); | ||
788 | |||
789 | Dictionary<string, Object> options = new Dictionary<string, Object>(); | ||
790 | options.Add("all", true); | ||
791 | |||
792 | lock (this) | ||
793 | { | ||
794 | m_archiverModule.ArchiveRegion(archiveWriteStream, requestId, options); | ||
795 | Monitor.Wait(this, 60000); | ||
796 | } | ||
797 | |||
798 | |||
799 | // Check that the OAR contains the expected data | ||
800 | |||
801 | Assert.That(m_lastRequestId, Is.EqualTo(requestId)); | ||
802 | |||
803 | byte[] archive = archiveWriteStream.ToArray(); | ||
804 | MemoryStream archiveReadStream = new MemoryStream(archive); | ||
805 | TarArchiveReader tar = new TarArchiveReader(archiveReadStream); | ||
806 | |||
807 | Dictionary<UUID, List<string>> foundPaths = new Dictionary<UUID, List<string>>(); | ||
808 | List<UUID> foundAssets = new List<UUID>(); | ||
809 | |||
810 | foreach (Scene scene in scenes) | ||
811 | { | ||
812 | foundPaths[scene.RegionInfo.RegionID] = new List<string>(); | ||
813 | } | ||
814 | |||
815 | string filePath; | ||
816 | TarArchiveReader.TarEntryType tarEntryType; | ||
817 | |||
818 | byte[] data = tar.ReadEntry(out filePath, out tarEntryType); | ||
819 | Assert.That(filePath, Is.EqualTo(ArchiveConstants.CONTROL_FILE_PATH)); | ||
820 | |||
821 | ArchiveReadRequest arr = new ArchiveReadRequest(m_scene, (Stream)null, false, false, Guid.Empty); | ||
822 | arr.LoadControlFile(filePath, data, new DearchiveScenesInfo()); | ||
823 | |||
824 | Assert.That(arr.ControlFileLoaded, Is.True); | ||
825 | |||
826 | while (tar.ReadEntry(out filePath, out tarEntryType) != null) | ||
827 | { | ||
828 | if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) | ||
829 | { | ||
830 | // Assets are shared, so this file doesn't belong to any specific region. | ||
831 | string fileName = filePath.Remove(0, ArchiveConstants.ASSETS_PATH.Length); | ||
832 | if (fileName.EndsWith("_notecard.txt")) | ||
833 | foundAssets.Add(UUID.Parse(fileName.Substring(0, fileName.Length - "_notecard.txt".Length))); | ||
834 | } | ||
835 | else | ||
836 | { | ||
837 | // This file belongs to one of the regions. Find out which one. | ||
838 | Assert.IsTrue(filePath.StartsWith(ArchiveConstants.REGIONS_PATH)); | ||
839 | string[] parts = filePath.Split(new Char[] { '/' }, 3); | ||
840 | Assert.AreEqual(3, parts.Length); | ||
841 | string regionDirectory = parts[1]; | ||
842 | string relativePath = parts[2]; | ||
843 | Scene scene = regionPaths[regionDirectory]; | ||
844 | |||
845 | if (relativePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) | ||
846 | { | ||
847 | foundPaths[scene.RegionInfo.RegionID].Add(relativePath); | ||
848 | } | ||
849 | } | ||
850 | } | ||
851 | |||
852 | Assert.AreEqual(scenes.Count, foundPaths.Count); | ||
853 | foreach (Scene scene in scenes) | ||
854 | { | ||
855 | Assert.That(foundPaths[scene.RegionInfo.RegionID], Is.EquivalentTo(expectedPaths[scene.RegionInfo.RegionID])); | ||
856 | } | ||
857 | |||
858 | Assert.That(foundAssets, Is.EquivalentTo(expectedAssets)); | ||
859 | } | ||
860 | |||
861 | /// <summary> | ||
862 | /// Test loading a multi-region OAR. | ||
863 | /// </summary> | ||
864 | [Test] | ||
865 | public void TestLoadMultiRegionOar() | ||
866 | { | ||
867 | TestHelpers.InMethod(); | ||
868 | |||
869 | // Create an ArchiveScenesGroup with the regions in the OAR. This is needed to generate the control file. | ||
870 | |||
871 | int WIDTH = 2; | ||
872 | int HEIGHT = 2; | ||
873 | |||
874 | for (uint y = 0; y < HEIGHT; y++) | ||
875 | { | ||
876 | for (uint x = 0; x < WIDTH; x++) | ||
877 | { | ||
878 | Scene scene; | ||
879 | if (x == 0 && y == 0) | ||
880 | { | ||
881 | scene = m_scene; // this scene was already created in SetUp() | ||
882 | } | ||
883 | else | ||
884 | { | ||
885 | scene = m_sceneHelpers.SetupScene(string.Format("Unit test region {0}", (y * WIDTH) + x + 1), UUID.Random(), 1000 + x, 1000 + y); | ||
886 | SceneHelpers.SetupSceneModules(scene, new ArchiverModule(), m_serialiserModule, new TerrainModule()); | ||
887 | } | ||
888 | } | ||
889 | } | ||
890 | |||
891 | ArchiveScenesGroup scenesGroup = new ArchiveScenesGroup(); | ||
892 | SceneManager.Instance.ForEachScene(delegate(Scene scene) | ||
893 | { | ||
894 | scenesGroup.AddScene(scene); | ||
895 | }); | ||
896 | scenesGroup.CalcSceneLocations(); | ||
897 | |||
898 | // Generate the OAR file | ||
899 | |||
900 | MemoryStream archiveWriteStream = new MemoryStream(); | ||
901 | TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream); | ||
902 | |||
903 | ArchiveWriteRequest writeRequest = new ArchiveWriteRequest(m_scene, (Stream)null, Guid.Empty); | ||
904 | writeRequest.MultiRegionFormat = true; | ||
905 | tar.WriteFile( | ||
906 | ArchiveConstants.CONTROL_FILE_PATH, writeRequest.CreateControlFile(scenesGroup)); | ||
907 | |||
908 | SceneObjectPart part1 = CreateSceneObjectPart1(); | ||
909 | part1.SitTargetOrientation = new Quaternion(0.2f, 0.3f, 0.4f, 0.5f); | ||
910 | part1.SitTargetPosition = new Vector3(1, 2, 3); | ||
911 | |||
912 | SceneObjectGroup object1 = new SceneObjectGroup(part1); | ||
913 | |||
914 | // Let's put some inventory items into our object | ||
915 | string soundItemName = "sound-item1"; | ||
916 | UUID soundItemUuid = UUID.Parse("00000000-0000-0000-0000-000000000002"); | ||
917 | Type type = GetType(); | ||
918 | Assembly assembly = type.Assembly; | ||
919 | string soundDataResourceName = null; | ||
920 | string[] names = assembly.GetManifestResourceNames(); | ||
921 | foreach (string name in names) | ||
922 | { | ||
923 | if (name.EndsWith(".Resources.test-sound.wav")) | ||
924 | soundDataResourceName = name; | ||
925 | } | ||
926 | Assert.That(soundDataResourceName, Is.Not.Null); | ||
927 | |||
928 | byte[] soundData; | ||
929 | UUID soundUuid; | ||
930 | CreateSoundAsset(tar, assembly, soundDataResourceName, out soundData, out soundUuid); | ||
931 | |||
932 | TaskInventoryItem item1 | ||
933 | = new TaskInventoryItem { AssetID = soundUuid, ItemID = soundItemUuid, Name = soundItemName }; | ||
934 | part1.Inventory.AddInventoryItem(item1, true); | ||
935 | m_scene.AddNewSceneObject(object1, false); | ||
936 | |||
937 | string object1FileName = string.Format( | ||
938 | "{0}_{1:000}-{2:000}-{3:000}__{4}.xml", | ||
939 | part1.Name, | ||
940 | Math.Round(part1.GroupPosition.X), Math.Round(part1.GroupPosition.Y), Math.Round(part1.GroupPosition.Z), | ||
941 | part1.UUID); | ||
942 | string path = "regions/1_1_Unit_test_region/" + ArchiveConstants.OBJECTS_PATH + object1FileName; | ||
943 | tar.WriteFile(path, SceneObjectSerializer.ToXml2Format(object1)); | ||
944 | |||
945 | tar.Close(); | ||
946 | |||
947 | |||
948 | // Delete the current objects, to test that they're loaded from the OAR and didn't | ||
949 | // just remain in the scene. | ||
950 | SceneManager.Instance.ForEachScene(delegate(Scene scene) | ||
951 | { | ||
952 | scene.DeleteAllSceneObjects(); | ||
953 | }); | ||
954 | |||
955 | // Create a "hole", to test that that the corresponding region isn't loaded from the OAR | ||
956 | SceneManager.Instance.CloseScene(SceneManager.Instance.Scenes[1]); | ||
957 | |||
958 | |||
959 | // Check thay the OAR file contains the expected data | ||
960 | |||
961 | MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); | ||
962 | |||
963 | lock (this) | ||
964 | { | ||
965 | m_scene.EventManager.OnOarFileLoaded += LoadCompleted; | ||
966 | m_archiverModule.DearchiveRegion(archiveReadStream); | ||
967 | } | ||
968 | |||
969 | Assert.That(m_lastErrorMessage, Is.Null); | ||
970 | |||
971 | Assert.AreEqual(3, SceneManager.Instance.Scenes.Count); | ||
972 | |||
973 | TestLoadedRegion(part1, soundItemName, soundData); | ||
974 | } | ||
975 | |||
708 | } | 976 | } |
709 | } | 977 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs index c81b55d..cb5b2ba 100644 --- a/OpenSim/Region/Framework/Scenes/SceneManager.cs +++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs | |||
@@ -92,7 +92,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
92 | private static SceneManager m_instance = null; | 92 | private static SceneManager m_instance = null; |
93 | public static SceneManager Instance | 93 | public static SceneManager Instance |
94 | { | 94 | { |
95 | get { return m_instance; } | 95 | get { |
96 | if (m_instance == null) | ||
97 | m_instance = new SceneManager(); | ||
98 | return m_instance; | ||
99 | } | ||
96 | } | 100 | } |
97 | 101 | ||
98 | private readonly List<Scene> m_localScenes = new List<Scene>(); | 102 | private readonly List<Scene> m_localScenes = new List<Scene>(); |