2009-01-16 18:31:07 +00:00
|
|
|
/*
|
|
|
|
* 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.
|
2009-06-01 06:37:14 +00:00
|
|
|
* * Neither the name of the OpenSimulator Project nor the
|
2009-01-16 18:31:07 +00:00
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
2009-02-12 18:59:45 +00:00
|
|
|
using System;
|
|
|
|
using System.IO;
|
2009-03-12 18:13:51 +00:00
|
|
|
using System.Reflection;
|
2009-02-12 18:59:45 +00:00
|
|
|
using System.Threading;
|
|
|
|
using log4net.Config;
|
|
|
|
using NUnit.Framework;
|
|
|
|
using NUnit.Framework.SyntaxHelpers;
|
|
|
|
using OpenMetaverse;
|
|
|
|
using OpenSim.Framework;
|
2009-04-14 18:49:45 +00:00
|
|
|
using OpenSim.Framework.Communications.Cache;
|
2009-03-16 00:12:25 +00:00
|
|
|
using OpenSim.Framework.Serialization;
|
2009-02-12 18:59:45 +00:00
|
|
|
using OpenSim.Region.CoreModules.World.Serialiser;
|
|
|
|
using OpenSim.Region.CoreModules.World.Terrain;
|
|
|
|
using OpenSim.Region.Framework.Scenes;
|
2009-05-14 16:33:04 +00:00
|
|
|
using OpenSim.Region.Framework.Scenes.Serialization;
|
2009-04-09 20:06:27 +00:00
|
|
|
using OpenSim.Tests.Common;
|
2009-02-12 18:59:45 +00:00
|
|
|
using OpenSim.Tests.Common.Setup;
|
|
|
|
|
2009-02-10 13:10:57 +00:00
|
|
|
namespace OpenSim.Region.CoreModules.World.Archiver.Tests
|
2009-01-16 18:31:07 +00:00
|
|
|
{
|
2009-04-23 20:15:05 +00:00
|
|
|
[TestFixture]
|
2009-01-16 18:31:07 +00:00
|
|
|
public class ArchiverTests
|
|
|
|
{
|
2009-04-15 19:12:37 +00:00
|
|
|
private Guid m_lastRequestId;
|
2009-04-28 19:40:02 +00:00
|
|
|
private string m_lastErrorMessage;
|
|
|
|
|
|
|
|
private void LoadCompleted(Guid requestId, string errorMessage)
|
|
|
|
{
|
|
|
|
lock (this)
|
|
|
|
{
|
|
|
|
m_lastRequestId = requestId;
|
|
|
|
m_lastErrorMessage = errorMessage;
|
|
|
|
Console.WriteLine("About to pulse ArchiverTests on LoadCompleted");
|
|
|
|
|
2009-09-30 16:00:09 +00:00
|
|
|
Monitor.PulseAll(this);
|
2009-04-28 19:40:02 +00:00
|
|
|
}
|
|
|
|
}
|
2009-04-15 19:12:37 +00:00
|
|
|
|
|
|
|
private void SaveCompleted(Guid requestId, string errorMessage)
|
2009-02-02 20:59:12 +00:00
|
|
|
{
|
2009-02-17 16:51:09 +00:00
|
|
|
lock (this)
|
2009-03-16 00:12:25 +00:00
|
|
|
{
|
2009-04-15 19:12:37 +00:00
|
|
|
m_lastRequestId = requestId;
|
2009-04-28 19:40:02 +00:00
|
|
|
m_lastErrorMessage = errorMessage;
|
|
|
|
Console.WriteLine("About to pulse ArchiverTests on SaveCompleted");
|
2009-03-16 00:12:25 +00:00
|
|
|
Monitor.PulseAll(this);
|
|
|
|
}
|
2009-02-02 20:59:12 +00:00
|
|
|
}
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-05-18 17:46:14 +00:00
|
|
|
/// <summary>
|
|
|
|
/// Test saving a V0.2 OpenSim Region Archive.
|
|
|
|
/// </summary>
|
|
|
|
[Test]
|
2009-05-18 18:22:15 +00:00
|
|
|
public void TestSaveOarV0_2()
|
2009-05-18 17:46:14 +00:00
|
|
|
{
|
|
|
|
TestHelper.InMethod();
|
2009-05-18 18:22:15 +00:00
|
|
|
//log4net.Config.XmlConfigurator.Configure();
|
2009-05-18 17:46:14 +00:00
|
|
|
|
|
|
|
ArchiverModule archiverModule = new ArchiverModule();
|
|
|
|
SerialiserModule serialiserModule = new SerialiserModule();
|
|
|
|
TerrainModule terrainModule = new TerrainModule();
|
|
|
|
|
* Improves SceneSetupHelper to allow the tester to choose a real or mock, inventory and asset, service modules. The boolean startServices was replaced with realServices string. If the string contains the word asset, it will start a real asset module, if it contains inventory, it starts a real inventory. Otherwise, it use mock (NullPlugin-like) objects, for tests that don't really need functionality.
* SetupScene is now actually sharing the asset and inventory modules if the tester wishes to have multiple regions connected. To link regions, just start SetupScene with the same CommunicationManager for all scenes. SceneSetupHelper will hold a static reference to the modules and won't initialize them again, just run the scenes through the modules AddRegion, RegionLoaded and PostInitialize.
* With the recent changes, both asset and inventory (and in the future, user) services should always be asked from the scene, not instantiated alone. The tests should reflect this new behavior and always start a scene.
2009-08-11 15:07:54 +00:00
|
|
|
Scene scene = SceneSetupHelpers.SetupScene("asset");
|
2009-05-18 17:46:14 +00:00
|
|
|
SceneSetupHelpers.SetupSceneModules(scene, archiverModule, serialiserModule, terrainModule);
|
|
|
|
|
|
|
|
SceneObjectPart part1;
|
|
|
|
|
|
|
|
// Create and add prim 1
|
|
|
|
{
|
|
|
|
string partName = "My Little Pony";
|
|
|
|
UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000015");
|
|
|
|
PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere();
|
|
|
|
Vector3 groupPosition = new Vector3(10, 20, 30);
|
|
|
|
Quaternion rotationOffset = new Quaternion(20, 30, 40, 50);
|
|
|
|
Vector3 offsetPosition = new Vector3(5, 10, 15);
|
|
|
|
|
|
|
|
part1
|
|
|
|
= new SceneObjectPart(
|
|
|
|
ownerId, shape, groupPosition, rotationOffset, offsetPosition);
|
|
|
|
part1.Name = partName;
|
|
|
|
|
|
|
|
scene.AddNewSceneObject(new SceneObjectGroup(part1), false);
|
|
|
|
}
|
|
|
|
|
|
|
|
SceneObjectPart part2;
|
|
|
|
|
|
|
|
// Create and add prim 2
|
|
|
|
{
|
|
|
|
string partName = "Action Man";
|
|
|
|
UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000016");
|
|
|
|
PrimitiveBaseShape shape = PrimitiveBaseShape.CreateCylinder();
|
|
|
|
Vector3 groupPosition = new Vector3(90, 80, 70);
|
|
|
|
Quaternion rotationOffset = new Quaternion(60, 70, 80, 90);
|
|
|
|
Vector3 offsetPosition = new Vector3(20, 25, 30);
|
|
|
|
|
|
|
|
part2
|
|
|
|
= new SceneObjectPart(
|
|
|
|
ownerId, shape, groupPosition, rotationOffset, offsetPosition);
|
|
|
|
part2.Name = partName;
|
|
|
|
|
|
|
|
scene.AddNewSceneObject(new SceneObjectGroup(part2), false);
|
|
|
|
}
|
|
|
|
|
|
|
|
MemoryStream archiveWriteStream = new MemoryStream();
|
|
|
|
scene.EventManager.OnOarFileSaved += SaveCompleted;
|
|
|
|
|
|
|
|
Guid requestId = new Guid("00000000-0000-0000-0000-808080808080");
|
2009-04-15 19:12:37 +00:00
|
|
|
|
2009-05-18 17:46:14 +00:00
|
|
|
lock (this)
|
|
|
|
{
|
|
|
|
archiverModule.ArchiveRegion(archiveWriteStream, requestId);
|
|
|
|
//AssetServerBase assetServer = (AssetServerBase)scene.CommsManager.AssetCache.AssetServer;
|
|
|
|
//while (assetServer.HasWaitingRequests())
|
2009-09-30 16:00:09 +00:00
|
|
|
// assetServer.ProcessNextRequest();
|
2009-04-14 18:49:45 +00:00
|
|
|
|
2009-05-18 17:46:14 +00:00
|
|
|
Monitor.Wait(this, 60000);
|
|
|
|
}
|
2009-04-15 19:12:37 +00:00
|
|
|
|
2009-05-18 17:46:14 +00:00
|
|
|
Assert.That(m_lastRequestId, Is.EqualTo(requestId));
|
|
|
|
|
|
|
|
byte[] archive = archiveWriteStream.ToArray();
|
|
|
|
MemoryStream archiveReadStream = new MemoryStream(archive);
|
|
|
|
TarArchiveReader tar = new TarArchiveReader(archiveReadStream);
|
|
|
|
|
|
|
|
bool gotControlFile = false;
|
|
|
|
bool gotObject1File = false;
|
|
|
|
bool gotObject2File = false;
|
|
|
|
string expectedObject1FileName = string.Format(
|
|
|
|
"{0}_{1:000}-{2:000}-{3:000}__{4}.xml",
|
|
|
|
part1.Name,
|
|
|
|
Math.Round(part1.GroupPosition.X), Math.Round(part1.GroupPosition.Y), Math.Round(part1.GroupPosition.Z),
|
|
|
|
part1.UUID);
|
|
|
|
string expectedObject2FileName = string.Format(
|
|
|
|
"{0}_{1:000}-{2:000}-{3:000}__{4}.xml",
|
|
|
|
part2.Name,
|
|
|
|
Math.Round(part2.GroupPosition.X), Math.Round(part2.GroupPosition.Y), Math.Round(part2.GroupPosition.Z),
|
|
|
|
part2.UUID);
|
|
|
|
|
|
|
|
string filePath;
|
|
|
|
TarArchiveReader.TarEntryType tarEntryType;
|
|
|
|
|
|
|
|
while (tar.ReadEntry(out filePath, out tarEntryType) != null)
|
|
|
|
{
|
|
|
|
if (ArchiveConstants.CONTROL_FILE_PATH == filePath)
|
|
|
|
{
|
|
|
|
gotControlFile = true;
|
|
|
|
}
|
|
|
|
else if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH))
|
|
|
|
{
|
|
|
|
string fileName = filePath.Remove(0, ArchiveConstants.OBJECTS_PATH.Length);
|
|
|
|
|
|
|
|
if (fileName.StartsWith(part1.Name))
|
|
|
|
{
|
|
|
|
Assert.That(fileName, Is.EqualTo(expectedObject1FileName));
|
|
|
|
gotObject1File = true;
|
|
|
|
}
|
|
|
|
else if (fileName.StartsWith(part2.Name))
|
|
|
|
{
|
|
|
|
Assert.That(fileName, Is.EqualTo(expectedObject2FileName));
|
|
|
|
gotObject2File = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Assert.That(gotControlFile, Is.True, "No control file in archive");
|
|
|
|
Assert.That(gotObject1File, Is.True, "No object1 file in archive");
|
|
|
|
Assert.That(gotObject2File, Is.True, "No object2 file in archive");
|
|
|
|
|
|
|
|
// TODO: Test presence of more files and contents of files.
|
|
|
|
}
|
2009-01-23 20:38:44 +00:00
|
|
|
|
|
|
|
/// <summary>
|
2009-02-10 16:56:35 +00:00
|
|
|
/// Test loading a V0.2 OpenSim Region Archive.
|
2009-03-16 00:12:25 +00:00
|
|
|
/// </summary>
|
2009-01-23 20:38:44 +00:00
|
|
|
[Test]
|
2009-05-18 18:22:15 +00:00
|
|
|
public void TestLoadOarV0_2()
|
2009-01-23 20:38:44 +00:00
|
|
|
{
|
2009-05-07 19:07:08 +00:00
|
|
|
TestHelper.InMethod();
|
2009-04-28 19:54:57 +00:00
|
|
|
//log4net.Config.XmlConfigurator.Configure();
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-01-23 20:38:44 +00:00
|
|
|
MemoryStream archiveWriteStream = new MemoryStream();
|
2009-03-06 20:12:08 +00:00
|
|
|
TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream);
|
2009-04-28 19:40:02 +00:00
|
|
|
|
|
|
|
// Put in a random blank directory to check that this doesn't upset the load process
|
|
|
|
tar.WriteDir("ignoreme");
|
|
|
|
|
|
|
|
// Also check that direct entries which will also have a file entry containing that directory doesn't
|
|
|
|
// upset load
|
2009-09-30 16:00:09 +00:00
|
|
|
tar.WriteDir(ArchiveConstants.TERRAINS_PATH);
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-03-06 20:12:08 +00:00
|
|
|
tar.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, ArchiveWriteRequestExecution.Create0p2ControlFile());
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 16:56:35 +00:00
|
|
|
string part1Name = "object1";
|
|
|
|
PrimitiveBaseShape shape = PrimitiveBaseShape.CreateCylinder();
|
|
|
|
Vector3 groupPosition = new Vector3(90, 80, 70);
|
|
|
|
Quaternion rotationOffset = new Quaternion(60, 70, 80, 90);
|
|
|
|
Vector3 offsetPosition = new Vector3(20, 25, 30);
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-04-22 18:09:55 +00:00
|
|
|
SerialiserModule serialiserModule = new SerialiserModule();
|
|
|
|
ArchiverModule archiverModule = new ArchiverModule();
|
|
|
|
|
|
|
|
Scene scene = SceneSetupHelpers.SetupScene();
|
|
|
|
SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
|
|
|
|
|
2009-02-10 16:56:35 +00:00
|
|
|
SceneObjectPart part1
|
|
|
|
= new SceneObjectPart(
|
|
|
|
UUID.Zero, shape, groupPosition, rotationOffset, offsetPosition);
|
|
|
|
part1.Name = part1Name;
|
|
|
|
SceneObjectGroup object1 = new SceneObjectGroup(part1);
|
2009-04-22 18:09:55 +00:00
|
|
|
scene.AddNewSceneObject(object1, false);
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 16:56:35 +00:00
|
|
|
string object1FileName = string.Format(
|
|
|
|
"{0}_{1:000}-{2:000}-{3:000}__{4}.xml",
|
|
|
|
part1Name,
|
|
|
|
Math.Round(groupPosition.X), Math.Round(groupPosition.Y), Math.Round(groupPosition.Z),
|
2009-03-16 00:12:25 +00:00
|
|
|
part1.UUID);
|
2009-05-14 16:33:04 +00:00
|
|
|
tar.WriteFile(ArchiveConstants.OBJECTS_PATH + object1FileName, SceneObjectSerializer.ToXml2Format(object1));
|
2009-04-28 19:40:02 +00:00
|
|
|
|
2009-03-06 20:12:08 +00:00
|
|
|
tar.Close();
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-01-23 20:38:44 +00:00
|
|
|
MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray());
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-04-28 19:40:02 +00:00
|
|
|
lock (this)
|
|
|
|
{
|
|
|
|
scene.EventManager.OnOarFileLoaded += LoadCompleted;
|
|
|
|
archiverModule.DearchiveRegion(archiveReadStream);
|
2009-09-30 16:00:09 +00:00
|
|
|
}
|
2009-04-28 19:40:02 +00:00
|
|
|
|
|
|
|
Assert.That(m_lastErrorMessage, Is.Null);
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 16:56:35 +00:00
|
|
|
SceneObjectPart object1PartLoaded = scene.GetSceneObjectPart(part1Name);
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 16:56:35 +00:00
|
|
|
Assert.That(object1PartLoaded, Is.Not.Null, "object1 was not loaded");
|
2009-03-16 00:12:25 +00:00
|
|
|
Assert.That(object1PartLoaded.Name, Is.EqualTo(part1Name), "object1 names not identical");
|
2009-02-10 16:56:35 +00:00
|
|
|
Assert.That(object1PartLoaded.GroupPosition, Is.EqualTo(groupPosition), "object1 group position not equal");
|
|
|
|
Assert.That(
|
|
|
|
object1PartLoaded.RotationOffset, Is.EqualTo(rotationOffset), "object1 rotation offset not equal");
|
|
|
|
Assert.That(
|
|
|
|
object1PartLoaded.OffsetPosition, Is.EqualTo(offsetPosition), "object1 offset position not equal");
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-03-13 20:46:53 +00:00
|
|
|
// Temporary
|
2009-03-16 00:12:25 +00:00
|
|
|
Console.WriteLine("Successfully completed {0}", MethodBase.GetCurrentMethod());
|
2009-01-23 20:38:44 +00:00
|
|
|
}
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
/// <summary>
|
|
|
|
/// Test merging a V0.2 OpenSim Region Archive into an existing scene
|
2009-09-30 16:00:09 +00:00
|
|
|
/// </summary>
|
2009-04-24 19:43:54 +00:00
|
|
|
//[Test]
|
2009-05-18 18:22:15 +00:00
|
|
|
public void TestMergeOarV0_2()
|
2009-02-10 18:43:36 +00:00
|
|
|
{
|
2009-05-07 19:07:08 +00:00
|
|
|
TestHelper.InMethod();
|
2009-02-13 20:12:11 +00:00
|
|
|
//XmlConfigurator.Configure();
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
MemoryStream archiveWriteStream = new MemoryStream();
|
|
|
|
|
|
|
|
string part2Name = "objectMerge";
|
|
|
|
PrimitiveBaseShape part2Shape = PrimitiveBaseShape.CreateCylinder();
|
|
|
|
Vector3 part2GroupPosition = new Vector3(90, 80, 70);
|
|
|
|
Quaternion part2RotationOffset = new Quaternion(60, 70, 80, 90);
|
2009-03-16 00:12:25 +00:00
|
|
|
Vector3 part2OffsetPosition = new Vector3(20, 25, 30);
|
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
// Create an oar file that we can use for the merge
|
|
|
|
{
|
|
|
|
ArchiverModule archiverModule = new ArchiverModule();
|
|
|
|
SerialiserModule serialiserModule = new SerialiserModule();
|
|
|
|
TerrainModule terrainModule = new TerrainModule();
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
Scene scene = SceneSetupHelpers.SetupScene();
|
|
|
|
SceneSetupHelpers.SetupSceneModules(scene, archiverModule, serialiserModule, terrainModule);
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
SceneObjectPart part2
|
|
|
|
= new SceneObjectPart(
|
|
|
|
UUID.Zero, part2Shape, part2GroupPosition, part2RotationOffset, part2OffsetPosition);
|
|
|
|
part2.Name = part2Name;
|
|
|
|
SceneObjectGroup object2 = new SceneObjectGroup(part2);
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
scene.AddNewSceneObject(object2, false);
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
// Write out this scene
|
|
|
|
scene.EventManager.OnOarFileSaved += SaveCompleted;
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-17 16:51:09 +00:00
|
|
|
lock (this)
|
|
|
|
{
|
2009-03-16 00:12:25 +00:00
|
|
|
archiverModule.ArchiveRegion(archiveWriteStream);
|
2009-02-17 16:51:09 +00:00
|
|
|
Monitor.Wait(this, 60000);
|
|
|
|
}
|
2009-02-10 18:43:36 +00:00
|
|
|
}
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
{
|
|
|
|
ArchiverModule archiverModule = new ArchiverModule();
|
|
|
|
SerialiserModule serialiserModule = new SerialiserModule();
|
|
|
|
TerrainModule terrainModule = new TerrainModule();
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
Scene scene = SceneSetupHelpers.SetupScene();
|
|
|
|
SceneSetupHelpers.SetupSceneModules(scene, archiverModule, serialiserModule, terrainModule);
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
string part1Name = "objectExisting";
|
|
|
|
PrimitiveBaseShape part1Shape = PrimitiveBaseShape.CreateCylinder();
|
|
|
|
Vector3 part1GroupPosition = new Vector3(80, 70, 60);
|
|
|
|
Quaternion part1RotationOffset = new Quaternion(50, 60, 70, 80);
|
|
|
|
Vector3 part1OffsetPosition = new Vector3(15, 20, 25);
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
SceneObjectPart part1
|
|
|
|
= new SceneObjectPart(
|
|
|
|
UUID.Zero, part1Shape, part1GroupPosition, part1RotationOffset, part1OffsetPosition);
|
|
|
|
part1.Name = part1Name;
|
2009-03-16 00:12:25 +00:00
|
|
|
SceneObjectGroup object1 = new SceneObjectGroup(part1);
|
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
scene.AddNewSceneObject(object1, false);
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
// Merge in the archive we created earlier
|
2009-03-16 00:12:25 +00:00
|
|
|
byte[] archive = archiveWriteStream.ToArray();
|
|
|
|
MemoryStream archiveReadStream = new MemoryStream(archive);
|
|
|
|
|
2009-04-15 19:12:37 +00:00
|
|
|
archiverModule.DearchiveRegion(archiveReadStream, true, Guid.Empty);
|
2009-03-16 00:12:25 +00:00
|
|
|
|
|
|
|
SceneObjectPart object1Existing = scene.GetSceneObjectPart(part1Name);
|
2009-02-10 18:43:36 +00:00
|
|
|
Assert.That(object1Existing, Is.Not.Null, "object1 was not present after merge");
|
2009-03-16 00:12:25 +00:00
|
|
|
Assert.That(object1Existing.Name, Is.EqualTo(part1Name), "object1 names not identical after merge");
|
2009-02-10 18:43:36 +00:00
|
|
|
Assert.That(object1Existing.GroupPosition, Is.EqualTo(part1GroupPosition), "object1 group position not equal after merge");
|
2009-03-16 00:12:25 +00:00
|
|
|
|
2009-02-10 18:43:36 +00:00
|
|
|
SceneObjectPart object2PartMerged = scene.GetSceneObjectPart(part2Name);
|
|
|
|
Assert.That(object2PartMerged, Is.Not.Null, "object2 was not present after merge");
|
2009-03-16 00:12:25 +00:00
|
|
|
Assert.That(object2PartMerged.Name, Is.EqualTo(part2Name), "object2 names not identical after merge");
|
2009-02-10 18:43:36 +00:00
|
|
|
Assert.That(object2PartMerged.GroupPosition, Is.EqualTo(part2GroupPosition), "object2 group position not equal after merge");
|
2009-03-16 00:12:25 +00:00
|
|
|
}
|
2009-02-10 18:43:36 +00:00
|
|
|
}
|
2009-01-16 18:31:07 +00:00
|
|
|
}
|
2009-03-12 06:03:59 +00:00
|
|
|
}
|