Add TestRejectGivenFolder() and TestAcceptGivenFolder() regression tests

user_profiles
Justin Clark-Casey (justincc) 2013-04-29 22:14:13 +01:00
parent 0beccf23c0
commit 67789201c3
4 changed files with 262 additions and 10 deletions

View File

@ -175,9 +175,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
{ {
UUID folderID = new UUID(im.binaryBucket, 1); UUID folderID = new UUID(im.binaryBucket, 1);
m_log.DebugFormat("[INVENTORY TRANSFER]: Inserting original folder {0} "+ m_log.DebugFormat(
"into agent {1}'s inventory", "[INVENTORY TRANSFER]: Inserting original folder {0} into agent {1}'s inventory",
folderID, new UUID(im.toAgentID)); folderID, new UUID(im.toAgentID));
InventoryFolderBase folderCopy InventoryFolderBase folderCopy
= scene.GiveInventoryFolder(receipientID, client.AgentId, folderID, UUID.Zero); = scene.GiveInventoryFolder(receipientID, client.AgentId, folderID, UUID.Zero);
@ -200,7 +200,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
user.ControllingClient.SendBulkUpdateInventory(folderCopy); user.ControllingClient.SendBulkUpdateInventory(folderCopy);
// HACK!! // HACK!!
// Insert the ID of the copied item into the IM so that we know which item to move to trash if it // Insert the ID of the copied folder into the IM so that we know which item to move to trash if it
// is rejected. // is rejected.
// XXX: This is probably a misuse of the session ID slot. // XXX: This is probably a misuse of the session ID slot.
im.imSessionID = copyID.Guid; im.imSessionID = copyID.Guid;

View File

@ -252,5 +252,198 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer.Tests
Assert.That(originalItemAfterDelete, Is.Not.Null); Assert.That(originalItemAfterDelete, Is.Not.Null);
} }
[Test]
public void TestAcceptGivenFolder()
{
TestHelpers.InMethod();
// TestHelpers.EnableLogging();
UUID initialSessionId = TestHelpers.ParseTail(0x10);
UUID folderId = TestHelpers.ParseTail(0x100);
UserAccount ua1
= UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw");
UserAccount ua2
= UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw");
ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1);
TestClient giverClient = (TestClient)giverSp.ControllingClient;
ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2);
TestClient receiverClient = (TestClient)receiverSp.ControllingClient;
InventoryFolderBase originalFolder
= UserInventoryHelpers.CreateInventoryFolder(
m_scene.InventoryService, giverSp.UUID, folderId, "f1", true);
byte[] giveImBinaryBucket = new byte[17];
giveImBinaryBucket[0] = (byte)AssetType.Folder;
byte[] itemIdBytes = folderId.GetBytes();
Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length);
GridInstantMessage giveIm
= new GridInstantMessage(
m_scene,
giverSp.UUID,
giverSp.Name,
receiverSp.UUID,
(byte)InstantMessageDialog.InventoryOffered,
false,
"inventory offered msg",
initialSessionId,
false,
Vector3.Zero,
giveImBinaryBucket,
true);
giverClient.HandleImprovedInstantMessage(giveIm);
// These details might not all be correct.
GridInstantMessage acceptIm
= new GridInstantMessage(
m_scene,
receiverSp.UUID,
receiverSp.Name,
giverSp.UUID,
(byte)InstantMessageDialog.InventoryAccepted,
false,
"inventory accepted msg",
initialSessionId,
false,
Vector3.Zero,
null,
true);
receiverClient.HandleImprovedInstantMessage(acceptIm);
// Test for item remaining in the giver's inventory (here we assume a copy item)
// TODO: Test no-copy items.
InventoryFolderBase originalFolderAfterGive
= UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1");
Assert.That(originalFolderAfterGive, Is.Not.Null);
Assert.That(originalFolderAfterGive.ID, Is.EqualTo(originalFolder.ID));
// Test for item successfully making it into the receiver's inventory
InventoryFolderBase receivedFolder
= UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, receiverSp.UUID, "f1");
Assert.That(receivedFolder, Is.Not.Null);
Assert.That(receivedFolder.ID, Is.Not.EqualTo(originalFolder.ID));
// Test that on a delete, item still exists and is accessible for the giver.
m_scene.InventoryService.DeleteFolders(receiverSp.UUID, new List<UUID>() { receivedFolder.ID });
InventoryFolderBase originalFolderAfterDelete
= UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1");
Assert.That(originalFolderAfterDelete, Is.Not.Null);
// TODO: Test scenario where giver deletes their item first.
}
/// <summary>
/// Test user rejection of a given item.
/// </summary>
/// <remarks>
/// A rejected item still ends up in the user's trash folder.
/// </remarks>
[Test]
public void TestRejectGivenFolder()
{
TestHelpers.InMethod();
// TestHelpers.EnableLogging();
UUID initialSessionId = TestHelpers.ParseTail(0x10);
UUID folderId = TestHelpers.ParseTail(0x100);
UserAccount ua1
= UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw");
UserAccount ua2
= UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw");
ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1);
TestClient giverClient = (TestClient)giverSp.ControllingClient;
ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2);
TestClient receiverClient = (TestClient)receiverSp.ControllingClient;
// Create the folder to test give
InventoryFolderBase originalFolder
= UserInventoryHelpers.CreateInventoryFolder(
m_scene.InventoryService, giverSp.UUID, folderId, "f1", true);
GridInstantMessage receivedIm = null;
receiverClient.OnReceivedInstantMessage += im => receivedIm = im;
byte[] giveImBinaryBucket = new byte[17];
giveImBinaryBucket[0] = (byte)AssetType.Folder;
byte[] itemIdBytes = folderId.GetBytes();
Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length);
GridInstantMessage giveIm
= new GridInstantMessage(
m_scene,
giverSp.UUID,
giverSp.Name,
receiverSp.UUID,
(byte)InstantMessageDialog.InventoryOffered,
false,
"inventory offered msg",
initialSessionId,
false,
Vector3.Zero,
giveImBinaryBucket,
true);
giverClient.HandleImprovedInstantMessage(giveIm);
// These details might not all be correct.
// Session ID is now the created item ID (!)
GridInstantMessage rejectIm
= new GridInstantMessage(
m_scene,
receiverSp.UUID,
receiverSp.Name,
giverSp.UUID,
(byte)InstantMessageDialog.InventoryDeclined,
false,
"inventory declined msg",
new UUID(receivedIm.imSessionID),
false,
Vector3.Zero,
null,
true);
receiverClient.HandleImprovedInstantMessage(rejectIm);
// Test for item remaining in the giver's inventory (here we assume a copy item)
// TODO: Test no-copy items.
InventoryFolderBase originalFolderAfterGive
= UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1");
Assert.That(originalFolderAfterGive, Is.Not.Null);
Assert.That(originalFolderAfterGive.ID, Is.EqualTo(originalFolder.ID));
// Test for folder successfully making it into the receiver's inventory
InventoryFolderBase receivedFolder
= UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, receiverSp.UUID, "Trash/f1");
InventoryFolderBase trashFolder
= m_scene.InventoryService.GetFolderForType(receiverSp.UUID, AssetType.TrashFolder);
Assert.That(receivedFolder, Is.Not.Null);
Assert.That(receivedFolder.ID, Is.Not.EqualTo(originalFolder.ID));
Assert.That(receivedFolder.ParentID, Is.EqualTo(trashFolder.ID));
// Test that on a delete, item still exists and is accessible for the giver.
m_scene.InventoryService.PurgeFolder(trashFolder);
InventoryFolderBase originalFolderAfterDelete
= UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1");
Assert.That(originalFolderAfterDelete, Is.Not.Null);
}
} }
} }

View File

@ -217,13 +217,38 @@ namespace OpenSim.Tests.Common
/// </returns> /// </returns>
public static InventoryFolderBase CreateInventoryFolder( public static InventoryFolderBase CreateInventoryFolder(
IInventoryService inventoryService, UUID userId, string path, bool useExistingFolders) IInventoryService inventoryService, UUID userId, string path, bool useExistingFolders)
{
return CreateInventoryFolder(inventoryService, userId, UUID.Random(), path, useExistingFolders);
}
/// <summary>
/// Create inventory folders starting from the user's root folder.
/// </summary>
/// <param name="inventoryService"></param>
/// <param name="userId"></param>
/// <param name="folderId"></param>
/// <param name="path">
/// The folders to create. Multiple folders can be specified on a path delimited by the PATH_DELIMITER
/// </param>
/// <param name="useExistingFolders">
/// If true, then folders in the path which already the same name are
/// used. This applies to the terminal folder as well.
/// If false, then all folders in the path are created, even if there is already a folder at a particular
/// level with the same name.
/// </param>
/// <returns>
/// The folder created. If the path contains multiple folders then the last one created is returned.
/// Will return null if the root folder could not be found.
/// </returns>
public static InventoryFolderBase CreateInventoryFolder(
IInventoryService inventoryService, UUID userId, UUID folderId, string path, bool useExistingFolders)
{ {
InventoryFolderBase rootFolder = inventoryService.GetRootFolder(userId); InventoryFolderBase rootFolder = inventoryService.GetRootFolder(userId);
if (null == rootFolder) if (null == rootFolder)
return null; return null;
return CreateInventoryFolder(inventoryService, rootFolder, path, useExistingFolders); return CreateInventoryFolder(inventoryService, folderId, rootFolder, path, useExistingFolders);
} }
/// <summary> /// <summary>
@ -235,6 +260,7 @@ namespace OpenSim.Tests.Common
/// TODO: May need to make it an option to create duplicate folders. /// TODO: May need to make it an option to create duplicate folders.
/// </remarks> /// </remarks>
/// <param name="inventoryService"></param> /// <param name="inventoryService"></param>
/// <param name="folderId">ID of the folder to create</param>
/// <param name="parentFolder"></param> /// <param name="parentFolder"></param>
/// <param name="path"> /// <param name="path">
/// The folder to create. /// The folder to create.
@ -249,7 +275,7 @@ namespace OpenSim.Tests.Common
/// The folder created. If the path contains multiple folders then the last one created is returned. /// The folder created. If the path contains multiple folders then the last one created is returned.
/// </returns> /// </returns>
public static InventoryFolderBase CreateInventoryFolder( public static InventoryFolderBase CreateInventoryFolder(
IInventoryService inventoryService, InventoryFolderBase parentFolder, string path, bool useExistingFolders) IInventoryService inventoryService, UUID folderId, InventoryFolderBase parentFolder, string path, bool useExistingFolders)
{ {
string[] components = path.Split(new string[] { PATH_DELIMITER }, 2, StringSplitOptions.None); string[] components = path.Split(new string[] { PATH_DELIMITER }, 2, StringSplitOptions.None);
@ -262,9 +288,16 @@ namespace OpenSim.Tests.Common
{ {
// Console.WriteLine("Creating folder {0} at {1}", components[0], parentFolder.Name); // Console.WriteLine("Creating folder {0} at {1}", components[0], parentFolder.Name);
UUID folderIdForCreate;
if (components.Length > 1)
folderIdForCreate = UUID.Random();
else
folderIdForCreate = folderId;
folder folder
= new InventoryFolderBase( = new InventoryFolderBase(
UUID.Random(), components[0], parentFolder.Owner, (short)AssetType.Unknown, parentFolder.ID, 0); folderIdForCreate, components[0], parentFolder.Owner, (short)AssetType.Unknown, parentFolder.ID, 0);
inventoryService.AddFolder(folder); inventoryService.AddFolder(folder);
} }
@ -274,7 +307,7 @@ namespace OpenSim.Tests.Common
// } // }
if (components.Length > 1) if (components.Length > 1)
return CreateInventoryFolder(inventoryService, folder, components[1], useExistingFolders); return CreateInventoryFolder(inventoryService, folderId, folder, components[1], useExistingFolders);
else else
return folder; return folder;
} }

View File

@ -53,6 +53,9 @@ namespace OpenSim.Tests.Common.Mock
public XInventoryFolder[] GetFolders(string[] fields, string[] vals) public XInventoryFolder[] GetFolders(string[] fields, string[] vals)
{ {
// Console.WriteLine(
// "Requesting folders, fields {0}, vals {1}", string.Join(",", fields), string.Join(",", vals));
List<XInventoryFolder> origFolders List<XInventoryFolder> origFolders
= Get<XInventoryFolder>(fields, vals, m_allFolders.Values.ToList()); = Get<XInventoryFolder>(fields, vals, m_allFolders.Values.ToList());
@ -104,7 +107,30 @@ namespace OpenSim.Tests.Common.Mock
} }
public bool MoveItem(string id, string newParent) { throw new NotImplementedException(); } public bool MoveItem(string id, string newParent) { throw new NotImplementedException(); }
public bool MoveFolder(string id, string newParent) { throw new NotImplementedException(); }
public bool MoveFolder(string id, string newParent)
{
// Don't use GetFolders() here - it takes a clone!
XInventoryFolder folder = m_allFolders[new UUID(id)];
if (folder == null)
return false;
folder.parentFolderID = new UUID(newParent);
XInventoryFolder[] newParentFolders
= GetFolders(new string[] { "folderID" }, new string[] { folder.parentFolderID.ToString() });
// Console.WriteLine(
// "Moved folder {0} {1}, to {2} {3}",
// folder.folderName, folder.folderID, newParentFolders[0].folderName, folder.parentFolderID);
// TODO: Really need to implement folder version incrementing, though this should be common code anyway,
// not reimplemented in each db plugin.
return true;
}
public XInventoryItem[] GetActiveGestures(UUID principalID) { throw new NotImplementedException(); } public XInventoryItem[] GetActiveGestures(UUID principalID) { throw new NotImplementedException(); }
public int GetAssetPermissions(UUID principalID, UUID assetID) { throw new NotImplementedException(); } public int GetAssetPermissions(UUID principalID, UUID assetID) { throw new NotImplementedException(); }
} }