aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2009-08-11 16:45:16 +0100
committerJustin Clark-Casey (justincc)2009-08-11 16:45:16 +0100
commit226c082ed417f4a5f2295595e45eca2fcb1e42c9 (patch)
tree4bbe2f59176589e497a2f4fd16b3adfe3989c5cd
parentAdded some needed comments to SceneSetupHelper (actually just retriggering pa... (diff)
downloadopensim-SC-226c082ed417f4a5f2295595e45eca2fcb1e42c9.zip
opensim-SC-226c082ed417f4a5f2295595e45eca2fcb1e42c9.tar.gz
opensim-SC-226c082ed417f4a5f2295595e45eca2fcb1e42c9.tar.bz2
opensim-SC-226c082ed417f4a5f2295595e45eca2fcb1e42c9.tar.xz
Establish CachedUserInfo.OnInventoryReceived event so that region/test inventory code can be written with the async inventory fetch
-rw-r--r--OpenSim/Framework/Communications/Cache/CachedUserInfo.cs19
-rw-r--r--OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs96
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs46
-rw-r--r--OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs42
4 files changed, 140 insertions, 63 deletions
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
49 IClientAPI client, UUID folderID, bool fetchFolders, bool fetchItems); 49 IClientAPI client, UUID folderID, bool fetchFolders, bool fetchItems);
50 50
51 public delegate void OnItemReceivedDelegate(UUID itemID); 51 public delegate void OnItemReceivedDelegate(UUID itemID);
52 public delegate void OnInventoryReceivedDelegate(UUID userID);
52 53
53 /// <summary> 54 /// <summary>
54 /// Stores user profile and inventory data received from backend services for a particular user. 55 /// Stores user profile and inventory data received from backend services for a particular user.
55 /// </summary> 56 /// </summary>
56 public class CachedUserInfo 57 public class CachedUserInfo
57 { 58 {
59 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
60
61 //// <value>
62 /// Fired when a particular item has been received from the inventory service
63 /// </value>
58 public event OnItemReceivedDelegate OnItemReceived; 64 public event OnItemReceivedDelegate OnItemReceived;
59 65
60 private static readonly ILog m_log 66 /// <value>
61 = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 67 /// Fired once the entire inventory has been received for the user
68 /// </value>
69 public event OnInventoryReceivedDelegate OnInventoryReceived;
62 70
63 /// <summary> 71 /// <summary>
64 /// The comms manager holds references to services (user, grid, inventory, etc.) 72 /// The comms manager holds references to services (user, grid, inventory, etc.)
@@ -133,7 +141,9 @@ namespace OpenSim.Framework.Communications.Cache
133 UUID parentFolderId = folder.ParentID; 141 UUID parentFolderId = folder.ParentID;
134 142
135 if (dictionary.ContainsKey(parentFolderId)) 143 if (dictionary.ContainsKey(parentFolderId))
144 {
136 dictionary[parentFolderId].Add(folder); 145 dictionary[parentFolderId].Add(folder);
146 }
137 else 147 else
138 { 148 {
139 IList<InventoryFolderImpl> folders = new List<InventoryFolderImpl>(); 149 IList<InventoryFolderImpl> folders = new List<InventoryFolderImpl>();
@@ -299,6 +309,9 @@ namespace OpenSim.Framework.Communications.Cache
299 request.Execute(); 309 request.Execute();
300 } 310 }
301 } 311 }
312
313 if (OnInventoryReceived != null)
314 OnInventoryReceived(UserProfile.ID);
302 } 315 }
303 316
304 /// <summary> 317 /// <summary>
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
43 [TestFixture] 43 [TestFixture]
44 public class UserProfileCacheServiceTests 44 public class UserProfileCacheServiceTests
45 { 45 {
46 /// <value>Used by tests to indicate whether an async operation timed out</value>
47 private bool timedOut;
48
49 private void InventoryReceived(UUID userId)
50 {
51 lock (this)
52 {
53 timedOut = false;
54 Monitor.PulseAll(this);
55 }
56 }
57
46 [Test] 58 [Test]
47 public void TestGetUserDetails() 59 public void TestGetUserDetails()
48 { 60 {
@@ -118,14 +130,15 @@ namespace OpenSim.Framework.Communications.Tests
118 TestHelper.InMethod(); 130 TestHelper.InMethod();
119 131
120 Scene myScene = SceneSetupHelpers.SetupScene("inventory"); 132 Scene myScene = SceneSetupHelpers.SetupScene("inventory");
121 CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager); 133
122 for (int i = 0 ; i < 50 ; i++) 134 timedOut = true;
123 { 135 lock (this)
124 if (userInfo.HasReceivedInventory == true) 136 {
125 break; 137 UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
126 Thread.Sleep(200); 138 Monitor.Wait(this, 60000);
127 } 139 }
128 Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)"); 140
141 Assert.That(timedOut, Is.False, "Timed out");
129 } 142 }
130 143
131 [Test] 144 [Test]
@@ -134,14 +147,13 @@ namespace OpenSim.Framework.Communications.Tests
134 TestHelper.InMethod(); 147 TestHelper.InMethod();
135 148
136 Scene myScene = SceneSetupHelpers.SetupScene("inventory"); 149 Scene myScene = SceneSetupHelpers.SetupScene("inventory");
137 CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager); 150 CachedUserInfo userInfo;
138 for (int i = 0 ; i < 50 ; i++) 151
139 { 152 lock (this)
140 if (userInfo.HasReceivedInventory == true) 153 {
141 break; 154 userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
142 Thread.Sleep(200); 155 Monitor.Wait(this, 60000);
143 } 156 }
144 Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
145 157
146 UUID folderId = UUID.Parse("00000000-0000-0000-0000-000000000011"); 158 UUID folderId = UUID.Parse("00000000-0000-0000-0000-000000000011");
147 Assert.That(userInfo.RootFolder.GetChildFolder(folderId), Is.Null); 159 Assert.That(userInfo.RootFolder.GetChildFolder(folderId), Is.Null);
@@ -156,14 +168,13 @@ namespace OpenSim.Framework.Communications.Tests
156 TestHelper.InMethod(); 168 TestHelper.InMethod();
157 169
158 Scene myScene = SceneSetupHelpers.SetupScene("inventory"); 170 Scene myScene = SceneSetupHelpers.SetupScene("inventory");
159 CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager); 171 CachedUserInfo userInfo;
160 for (int i = 0 ; i < 50 ; i++) 172
161 { 173 lock (this)
162 if (userInfo.HasReceivedInventory == true) 174 {
163 break; 175 userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
164 Thread.Sleep(200); 176 Monitor.Wait(this, 60000);
165 } 177 }
166 Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
167 178
168 UUID folderId = UUID.Parse("00000000-0000-0000-0000-000000000010"); 179 UUID folderId = UUID.Parse("00000000-0000-0000-0000-000000000010");
169 Assert.That(userInfo.RootFolder.ContainsChildFolder(folderId), Is.False); 180 Assert.That(userInfo.RootFolder.ContainsChildFolder(folderId), Is.False);
@@ -192,14 +203,13 @@ namespace OpenSim.Framework.Communications.Tests
192 TestHelper.InMethod(); 203 TestHelper.InMethod();
193 204
194 Scene myScene = SceneSetupHelpers.SetupScene("inventory"); 205 Scene myScene = SceneSetupHelpers.SetupScene("inventory");
195 CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager); 206 CachedUserInfo userInfo;
196 for (int i = 0 ; i < 50 ; i++) 207
197 { 208 lock (this)
198 if (userInfo.HasReceivedInventory == true) 209 {
199 break; 210 userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
200 Thread.Sleep(200); 211 Monitor.Wait(this, 60000);
201 } 212 }
202 Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
203 213
204 UUID folder1Id = UUID.Parse("00000000-0000-0000-0000-000000000060"); 214 UUID folder1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
205 InventoryFolderImpl rootFolder = userInfo.RootFolder; 215 InventoryFolderImpl rootFolder = userInfo.RootFolder;
@@ -258,14 +268,13 @@ namespace OpenSim.Framework.Communications.Tests
258 TestHelper.InMethod(); 268 TestHelper.InMethod();
259 269
260 Scene myScene = SceneSetupHelpers.SetupScene("inventory"); 270 Scene myScene = SceneSetupHelpers.SetupScene("inventory");
261 CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager); 271 CachedUserInfo userInfo;
262 for (int i = 0 ; i < 50 ; i++) 272
263 { 273 lock (this)
264 if (userInfo.HasReceivedInventory == true) 274 {
265 break; 275 userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
266 Thread.Sleep(200); 276 Monitor.Wait(this, 60000);
267 } 277 }
268 Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
269 278
270 UUID folder1Id = UUID.Parse("00000000-0000-0000-0000-000000000020"); 279 UUID folder1Id = UUID.Parse("00000000-0000-0000-0000-000000000020");
271 UUID folder2Id = UUID.Parse("00000000-0000-0000-0000-000000000021"); 280 UUID folder2Id = UUID.Parse("00000000-0000-0000-0000-000000000021");
@@ -299,14 +308,13 @@ namespace OpenSim.Framework.Communications.Tests
299 //log4net.Config.XmlConfigurator.Configure(); 308 //log4net.Config.XmlConfigurator.Configure();
300 309
301 Scene myScene = SceneSetupHelpers.SetupScene("inventory"); 310 Scene myScene = SceneSetupHelpers.SetupScene("inventory");
302 CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager); 311 CachedUserInfo userInfo;
303 for (int i = 0 ; i < 50 ; i++) 312
304 { 313 lock (this)
305 if (userInfo.HasReceivedInventory == true) 314 {
306 break; 315 userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
307 Thread.Sleep(200); 316 Monitor.Wait(this, 60000);
308 } 317 }
309 Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
310 318
311 UUID folder1Id = UUID.Parse("00000000-0000-0000-0000-000000000070"); 319 UUID folder1Id = UUID.Parse("00000000-0000-0000-0000-000000000070");
312 InventoryFolderImpl rootFolder = userInfo.RootFolder; 320 InventoryFolderImpl rootFolder = userInfo.RootFolder;
@@ -323,4 +331,4 @@ namespace OpenSim.Framework.Communications.Tests
323 Assert.That(myScene.InventoryService.QueryFolder(myFolder), Is.Null); 331 Assert.That(myScene.InventoryService.QueryFolder(myFolder), Is.Null);
324 } 332 }
325 } 333 }
326} 334} \ 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
54 [TestFixture] 54 [TestFixture]
55 public class InventoryArchiverTests 55 public class InventoryArchiverTests
56 { 56 {
57 private void InventoryReceived(UUID userId)
58 {
59 lock (this)
60 {
61 Monitor.PulseAll(this);
62 }
63 }
64
57 private void SaveCompleted( 65 private void SaveCompleted(
58 bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException) 66 bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException)
59 { 67 {
@@ -61,7 +69,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
61 { 69 {
62 Monitor.PulseAll(this); 70 Monitor.PulseAll(this);
63 } 71 }
64 } 72 }
65 73
66 /// <summary> 74 /// <summary>
67 /// Test saving a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet). 75 /// 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
82 string userFirstName = "Jock"; 90 string userFirstName = "Jock";
83 string userLastName = "Stirrup"; 91 string userLastName = "Stirrup";
84 UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020"); 92 UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
93 CachedUserInfo userInfo;
94
95 lock (this)
96 {
97 userInfo
98 = UserProfileTestUtils.CreateUserWithInventory(
99 cm, userFirstName, userLastName, userId, InventoryReceived);
100 Monitor.Wait(this, 60000);
101 }
102
103 /*
85 cm.UserAdminService.AddUser(userFirstName, userLastName, string.Empty, string.Empty, 1000, 1000, userId); 104 cm.UserAdminService.AddUser(userFirstName, userLastName, string.Empty, string.Empty, 1000, 1000, userId);
86 CachedUserInfo userInfo = cm.UserProfileCacheService.GetUserDetails(userId); 105 CachedUserInfo userInfo = cm.UserProfileCacheService.GetUserDetails(userId, InventoryReceived);
87 userInfo.FetchInventory(); 106 userInfo.FetchInventory();
88 for (int i = 0 ; i < 50 ; i++) 107 for (int i = 0 ; i < 50 ; i++)
89 { 108 {
@@ -92,6 +111,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
92 Thread.Sleep(200); 111 Thread.Sleep(200);
93 } 112 }
94 Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)"); 113 Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
114 */
95 115
96 // Create asset 116 // Create asset
97 SceneObjectGroup object1; 117 SceneObjectGroup object1;
@@ -337,15 +357,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
337 Assert.That(user2Profile.SurName == user2LastName); 357 Assert.That(user2Profile.SurName == user2LastName);
338 358
339 CachedUserInfo userInfo 359 CachedUserInfo userInfo
340 = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName); 360 = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName);
341 userInfo.FetchInventory(); 361 userInfo.OnInventoryReceived += InventoryReceived;
342 for (int i = 0 ; i < 50 ; i++) 362
363 lock (this)
343 { 364 {
344 if (userInfo.HasReceivedInventory == true) 365 userInfo.FetchInventory();
345 break; 366 Monitor.Wait(this, 60000);
346 Thread.Sleep(200);
347 } 367 }
348 Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)"); 368
349 InventoryItemBase foundItem = userInfo.RootFolder.FindItemByPath(itemName); 369 InventoryItemBase foundItem = userInfo.RootFolder.FindItemByPath(itemName);
350 370
351 Assert.That(foundItem.CreatorId, Is.EqualTo(item1.CreatorId)); 371 Assert.That(foundItem.CreatorId, Is.EqualTo(item1.CreatorId));
@@ -365,8 +385,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
365 TestHelper.InMethod(); 385 TestHelper.InMethod();
366 Scene scene = SceneSetupHelpers.SetupScene(""); 386 Scene scene = SceneSetupHelpers.SetupScene("");
367 CommunicationsManager commsManager = scene.CommsManager; 387 CommunicationsManager commsManager = scene.CommsManager;
388 CachedUserInfo userInfo;
368 389
369 CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(commsManager); 390 lock (this)
391 {
392 userInfo = UserProfileTestUtils.CreateUserWithInventory(commsManager, InventoryReceived);
393 Monitor.Wait(this, 60000);
394 }
395
370 //userInfo.FetchInventory(); 396 //userInfo.FetchInventory();
371 /* 397 /*
372 for (int i = 0 ; i < 50 ; i++) 398 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
41 /// Create a test user with a standard inventory 41 /// Create a test user with a standard inventory
42 /// </summary> 42 /// </summary>
43 /// <param name="commsManager"></param> 43 /// <param name="commsManager"></param>
44 /// <param name="callback">
45 /// Callback to invoke when inventory has been loaded. This is required because
46 /// loading may be asynchronous, even on standalone
47 /// </param>
44 /// <returns></returns> 48 /// <returns></returns>
45 public static CachedUserInfo CreateUserWithInventory(CommunicationsManager commsManager) 49 public static CachedUserInfo CreateUserWithInventory(
50 CommunicationsManager commsManager, OnInventoryReceivedDelegate callback)
46 { 51 {
47 UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000099"); 52 UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000099");
48 return CreateUserWithInventory(commsManager, userId); 53 return CreateUserWithInventory(commsManager, userId, callback);
49 } 54 }
50 55
51 /// <summary> 56 /// <summary>
52 /// Create a test user with a standard inventory 57 /// Create a test user with a standard inventory
53 /// </summary> 58 /// </summary>
54 /// <param name="commsManager"></param> 59 /// <param name="commsManager"></param>
55 /// <param name="userId">Explicit user id to use for user creation</param> 60 /// <param name="userId">User ID</param>
61 /// <param name="callback">
62 /// Callback to invoke when inventory has been loaded. This is required because
63 /// loading may be asynchronous, even on standalone
64 /// </param>
56 /// <returns></returns> 65 /// <returns></returns>
57 public static CachedUserInfo CreateUserWithInventory(CommunicationsManager commsManager, UUID userId) 66 public static CachedUserInfo CreateUserWithInventory(
67 CommunicationsManager commsManager, UUID userId, OnInventoryReceivedDelegate callback)
68 {
69 return CreateUserWithInventory(commsManager, "Bill", "Bailey", userId, callback);
70 }
71
72 /// <summary>
73 /// Create a test user with a standard inventory
74 /// </summary>
75 /// <param name="commsManager"></param>
76 /// <param name="firstName">First name of user</param>
77 /// <param name="lastName">Last name of user</param>
78 /// <param name="userId">User ID</param>
79 /// <param name="callback">
80 /// Callback to invoke when inventory has been loaded. This is required because
81 /// loading may be asynchronous, even on standalone
82 /// </param>
83 /// <returns></returns>
84 public static CachedUserInfo CreateUserWithInventory(
85 CommunicationsManager commsManager, string firstName, string lastName,
86 UUID userId, OnInventoryReceivedDelegate callback)
58 { 87 {
59 LocalUserServices lus = (LocalUserServices)commsManager.UserService; 88 LocalUserServices lus = (LocalUserServices)commsManager.UserService;
60 lus.AddUser("Bill", "Bailey", "troll", "bill@bailey.com", 1000, 1000, userId); 89 lus.AddUser(firstName, lastName, "troll", "bill@bailey.com", 1000, 1000, userId);
61 90
62 CachedUserInfo userInfo = commsManager.UserProfileCacheService.GetUserDetails(userId); 91 CachedUserInfo userInfo = commsManager.UserProfileCacheService.GetUserDetails(userId);
92 userInfo.OnInventoryReceived += callback;
63 userInfo.FetchInventory(); 93 userInfo.FetchInventory();
64 94
65 return userInfo; 95 return userInfo;
66 } 96 }
67 } 97 }
68} 98}