From 226c082ed417f4a5f2295595e45eca2fcb1e42c9 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 11 Aug 2009 16:45:16 +0100
Subject: Establish CachedUserInfo.OnInventoryReceived event so that
region/test inventory code can be written with the async inventory fetch
---
.../Communications/Cache/CachedUserInfo.cs | 19 ++++-
.../Tests/Cache/UserProfileCacheServiceTests.cs | 96 ++++++++++++----------
.../Archiver/Tests/InventoryArchiverTests.cs | 46 ++++++++---
OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs | 42 ++++++++--
4 files changed, 140 insertions(+), 63 deletions(-)
(limited to 'OpenSim')
diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
index 10aff42..8ee1b1a 100644
--- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
+++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
@@ -49,16 +49,24 @@ namespace OpenSim.Framework.Communications.Cache
IClientAPI client, UUID folderID, bool fetchFolders, bool fetchItems);
public delegate void OnItemReceivedDelegate(UUID itemID);
+ public delegate void OnInventoryReceivedDelegate(UUID userID);
///
/// Stores user profile and inventory data received from backend services for a particular user.
///
public class CachedUserInfo
- {
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ ////
+ /// Fired when a particular item has been received from the inventory service
+ ///
public event OnItemReceivedDelegate OnItemReceived;
- private static readonly ILog m_log
- = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ ///
+ /// Fired once the entire inventory has been received for the user
+ ///
+ public event OnInventoryReceivedDelegate OnInventoryReceived;
///
/// The comms manager holds references to services (user, grid, inventory, etc.)
@@ -133,7 +141,9 @@ namespace OpenSim.Framework.Communications.Cache
UUID parentFolderId = folder.ParentID;
if (dictionary.ContainsKey(parentFolderId))
+ {
dictionary[parentFolderId].Add(folder);
+ }
else
{
IList folders = new List();
@@ -299,6 +309,9 @@ namespace OpenSim.Framework.Communications.Cache
request.Execute();
}
}
+
+ if (OnInventoryReceived != null)
+ OnInventoryReceived(UserProfile.ID);
}
///
diff --git a/OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs b/OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs
index 0402883..fe88cf5 100644
--- a/OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs
+++ b/OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs
@@ -43,6 +43,18 @@ namespace OpenSim.Framework.Communications.Tests
[TestFixture]
public class UserProfileCacheServiceTests
{
+ /// Used by tests to indicate whether an async operation timed out
+ private bool timedOut;
+
+ private void InventoryReceived(UUID userId)
+ {
+ lock (this)
+ {
+ timedOut = false;
+ Monitor.PulseAll(this);
+ }
+ }
+
[Test]
public void TestGetUserDetails()
{
@@ -118,14 +130,15 @@ namespace OpenSim.Framework.Communications.Tests
TestHelper.InMethod();
Scene myScene = SceneSetupHelpers.SetupScene("inventory");
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager);
- for (int i = 0 ; i < 50 ; i++)
- {
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
- }
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
+
+ timedOut = true;
+ lock (this)
+ {
+ UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
+ }
+
+ Assert.That(timedOut, Is.False, "Timed out");
}
[Test]
@@ -134,14 +147,13 @@ namespace OpenSim.Framework.Communications.Tests
TestHelper.InMethod();
Scene myScene = SceneSetupHelpers.SetupScene("inventory");
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager);
- for (int i = 0 ; i < 50 ; i++)
- {
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
}
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
UUID folderId = UUID.Parse("00000000-0000-0000-0000-000000000011");
Assert.That(userInfo.RootFolder.GetChildFolder(folderId), Is.Null);
@@ -156,14 +168,13 @@ namespace OpenSim.Framework.Communications.Tests
TestHelper.InMethod();
Scene myScene = SceneSetupHelpers.SetupScene("inventory");
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager);
- for (int i = 0 ; i < 50 ; i++)
- {
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
}
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
UUID folderId = UUID.Parse("00000000-0000-0000-0000-000000000010");
Assert.That(userInfo.RootFolder.ContainsChildFolder(folderId), Is.False);
@@ -192,14 +203,13 @@ namespace OpenSim.Framework.Communications.Tests
TestHelper.InMethod();
Scene myScene = SceneSetupHelpers.SetupScene("inventory");
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager);
- for (int i = 0 ; i < 50 ; i++)
- {
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
}
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
UUID folder1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
InventoryFolderImpl rootFolder = userInfo.RootFolder;
@@ -258,14 +268,13 @@ namespace OpenSim.Framework.Communications.Tests
TestHelper.InMethod();
Scene myScene = SceneSetupHelpers.SetupScene("inventory");
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager);
- for (int i = 0 ; i < 50 ; i++)
- {
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
}
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
UUID folder1Id = UUID.Parse("00000000-0000-0000-0000-000000000020");
UUID folder2Id = UUID.Parse("00000000-0000-0000-0000-000000000021");
@@ -299,14 +308,13 @@ namespace OpenSim.Framework.Communications.Tests
//log4net.Config.XmlConfigurator.Configure();
Scene myScene = SceneSetupHelpers.SetupScene("inventory");
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager);
- for (int i = 0 ; i < 50 ; i++)
- {
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
}
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
UUID folder1Id = UUID.Parse("00000000-0000-0000-0000-000000000070");
InventoryFolderImpl rootFolder = userInfo.RootFolder;
@@ -323,4 +331,4 @@ namespace OpenSim.Framework.Communications.Tests
Assert.That(myScene.InventoryService.QueryFolder(myFolder), Is.Null);
}
}
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs
index 1480512..8ac9b1f 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs
@@ -54,6 +54,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
[TestFixture]
public class InventoryArchiverTests
{
+ private void InventoryReceived(UUID userId)
+ {
+ lock (this)
+ {
+ Monitor.PulseAll(this);
+ }
+ }
+
private void SaveCompleted(
bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException)
{
@@ -61,7 +69,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
{
Monitor.PulseAll(this);
}
- }
+ }
///
/// Test saving a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet).
@@ -82,8 +90,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
string userFirstName = "Jock";
string userLastName = "Stirrup";
UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo
+ = UserProfileTestUtils.CreateUserWithInventory(
+ cm, userFirstName, userLastName, userId, InventoryReceived);
+ Monitor.Wait(this, 60000);
+ }
+
+ /*
cm.UserAdminService.AddUser(userFirstName, userLastName, string.Empty, string.Empty, 1000, 1000, userId);
- CachedUserInfo userInfo = cm.UserProfileCacheService.GetUserDetails(userId);
+ CachedUserInfo userInfo = cm.UserProfileCacheService.GetUserDetails(userId, InventoryReceived);
userInfo.FetchInventory();
for (int i = 0 ; i < 50 ; i++)
{
@@ -92,6 +111,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
Thread.Sleep(200);
}
Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
+ */
// Create asset
SceneObjectGroup object1;
@@ -337,15 +357,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
Assert.That(user2Profile.SurName == user2LastName);
CachedUserInfo userInfo
- = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName);
- userInfo.FetchInventory();
- for (int i = 0 ; i < 50 ; i++)
+ = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName);
+ userInfo.OnInventoryReceived += InventoryReceived;
+
+ lock (this)
{
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
+ userInfo.FetchInventory();
+ Monitor.Wait(this, 60000);
}
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
+
InventoryItemBase foundItem = userInfo.RootFolder.FindItemByPath(itemName);
Assert.That(foundItem.CreatorId, Is.EqualTo(item1.CreatorId));
@@ -365,8 +385,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
TestHelper.InMethod();
Scene scene = SceneSetupHelpers.SetupScene("");
CommunicationsManager commsManager = scene.CommsManager;
+ CachedUserInfo userInfo;
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(commsManager);
+ lock (this)
+ {
+ userInfo = UserProfileTestUtils.CreateUserWithInventory(commsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
+ }
+
//userInfo.FetchInventory();
/*
for (int i = 0 ; i < 50 ; i++)
diff --git a/OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs b/OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs
index fc41166..f146a15 100644
--- a/OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs
+++ b/OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs
@@ -41,28 +41,58 @@ namespace OpenSim.Tests.Common.Setup
/// Create a test user with a standard inventory
///
///
+ ///
+ /// Callback to invoke when inventory has been loaded. This is required because
+ /// loading may be asynchronous, even on standalone
+ ///
///
- public static CachedUserInfo CreateUserWithInventory(CommunicationsManager commsManager)
+ public static CachedUserInfo CreateUserWithInventory(
+ CommunicationsManager commsManager, OnInventoryReceivedDelegate callback)
{
UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000099");
- return CreateUserWithInventory(commsManager, userId);
+ return CreateUserWithInventory(commsManager, userId, callback);
}
///
/// Create a test user with a standard inventory
///
///
- /// Explicit user id to use for user creation
+ /// User ID
+ ///
+ /// Callback to invoke when inventory has been loaded. This is required because
+ /// loading may be asynchronous, even on standalone
+ ///
///
- public static CachedUserInfo CreateUserWithInventory(CommunicationsManager commsManager, UUID userId)
+ public static CachedUserInfo CreateUserWithInventory(
+ CommunicationsManager commsManager, UUID userId, OnInventoryReceivedDelegate callback)
+ {
+ return CreateUserWithInventory(commsManager, "Bill", "Bailey", userId, callback);
+ }
+
+ ///
+ /// Create a test user with a standard inventory
+ ///
+ ///
+ /// First name of user
+ /// Last name of user
+ /// User ID
+ ///
+ /// Callback to invoke when inventory has been loaded. This is required because
+ /// loading may be asynchronous, even on standalone
+ ///
+ ///
+ public static CachedUserInfo CreateUserWithInventory(
+ CommunicationsManager commsManager, string firstName, string lastName,
+ UUID userId, OnInventoryReceivedDelegate callback)
{
LocalUserServices lus = (LocalUserServices)commsManager.UserService;
- lus.AddUser("Bill", "Bailey", "troll", "bill@bailey.com", 1000, 1000, userId);
+ lus.AddUser(firstName, lastName, "troll", "bill@bailey.com", 1000, 1000, userId);
CachedUserInfo userInfo = commsManager.UserProfileCacheService.GetUserDetails(userId);
+ userInfo.OnInventoryReceived += callback;
userInfo.FetchInventory();
return userInfo;
- }
+ }
}
}
--
cgit v1.1