InventoryArchiverTests.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. /*
  2. * Copyright (c) Contributors, http://opensimulator.org/
  3. * See CONTRIBUTORS.TXT for a full list of copyright holders.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. * * Neither the name of the OpenSimulator Project nor the
  13. * names of its contributors may be used to endorse or promote products
  14. * derived from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
  17. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
  20. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  25. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. using System;
  28. using System.Collections.Generic;
  29. using System.IO;
  30. using System.Reflection;
  31. using System.Threading;
  32. using NUnit.Framework;
  33. using NUnit.Framework.SyntaxHelpers;
  34. using OpenMetaverse;
  35. using OpenSim.Data;
  36. using OpenSim.Framework;
  37. using OpenSim.Framework.Serialization;
  38. using OpenSim.Framework.Serialization.External;
  39. using OpenSim.Framework.Communications;
  40. using OpenSim.Framework.Communications.Cache;
  41. using OpenSim.Framework.Communications.Osp;
  42. using OpenSim.Region.CoreModules.Avatar.Inventory.Archiver;
  43. using OpenSim.Region.CoreModules.World.Serialiser;
  44. using OpenSim.Region.Framework.Scenes;
  45. using OpenSim.Region.Framework.Scenes.Serialization;
  46. using OpenSim.Services.Interfaces;
  47. using OpenSim.Tests.Common;
  48. using OpenSim.Tests.Common.Mock;
  49. using OpenSim.Tests.Common.Setup;
  50. namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
  51. {
  52. [TestFixture]
  53. public class InventoryArchiverTests
  54. {
  55. protected ManualResetEvent mre = new ManualResetEvent(false);
  56. private void InventoryReceived(UUID userId)
  57. {
  58. lock (this)
  59. {
  60. Monitor.PulseAll(this);
  61. }
  62. }
  63. private void SaveCompleted(
  64. Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream,
  65. Exception reportedException)
  66. {
  67. mre.Set();
  68. }
  69. /// <summary>
  70. /// Test saving a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet).
  71. /// </summary>
  72. // Commenting for now! The mock inventory service needs more beef, at least for
  73. // GetFolderForType
  74. [Test]
  75. public void TestSaveIarV0_1()
  76. {
  77. TestHelper.InMethod();
  78. //log4net.Config.XmlConfigurator.Configure();
  79. InventoryArchiverModule archiverModule = new InventoryArchiverModule(true);
  80. Scene scene = SceneSetupHelpers.SetupScene("Inventory");
  81. SceneSetupHelpers.SetupSceneModules(scene, archiverModule);
  82. CommunicationsManager cm = scene.CommsManager;
  83. // Create user
  84. string userFirstName = "Jock";
  85. string userLastName = "Stirrup";
  86. UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
  87. lock (this)
  88. {
  89. UserProfileTestUtils.CreateUserWithInventory(
  90. cm, userFirstName, userLastName, userId, InventoryReceived);
  91. Monitor.Wait(this, 60000);
  92. }
  93. // Create asset
  94. SceneObjectGroup object1;
  95. SceneObjectPart part1;
  96. {
  97. string partName = "My Little Dog Object";
  98. UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040");
  99. PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere();
  100. Vector3 groupPosition = new Vector3(10, 20, 30);
  101. Quaternion rotationOffset = new Quaternion(20, 30, 40, 50);
  102. Vector3 offsetPosition = new Vector3(5, 10, 15);
  103. part1
  104. = new SceneObjectPart(
  105. ownerId, shape, groupPosition, rotationOffset, offsetPosition);
  106. part1.Name = partName;
  107. object1 = new SceneObjectGroup(part1);
  108. scene.AddNewSceneObject(object1, false);
  109. }
  110. UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
  111. AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1);
  112. scene.AssetService.Store(asset1);
  113. // Create item
  114. UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080");
  115. InventoryItemBase item1 = new InventoryItemBase();
  116. item1.Name = "My Little Dog";
  117. item1.AssetID = asset1.FullID;
  118. item1.ID = item1Id;
  119. InventoryFolderBase objsFolder
  120. = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userId, "Objects");
  121. item1.Folder = objsFolder.ID;
  122. scene.AddInventoryItem(userId, item1);
  123. MemoryStream archiveWriteStream = new MemoryStream();
  124. archiverModule.OnInventoryArchiveSaved += SaveCompleted;
  125. mre.Reset();
  126. archiverModule.ArchiveInventory(
  127. Guid.NewGuid(), userFirstName, userLastName, "Objects", "troll", archiveWriteStream);
  128. mre.WaitOne(60000, false);
  129. byte[] archive = archiveWriteStream.ToArray();
  130. MemoryStream archiveReadStream = new MemoryStream(archive);
  131. TarArchiveReader tar = new TarArchiveReader(archiveReadStream);
  132. //bool gotControlFile = false;
  133. bool gotObject1File = false;
  134. //bool gotObject2File = false;
  135. string expectedObject1FileName = InventoryArchiveWriteRequest.CreateArchiveItemName(item1);
  136. string expectedObject1FilePath = string.Format(
  137. "{0}{1}{2}",
  138. ArchiveConstants.INVENTORY_PATH,
  139. InventoryArchiveWriteRequest.CreateArchiveFolderName(objsFolder),
  140. expectedObject1FileName);
  141. string filePath;
  142. TarArchiveReader.TarEntryType tarEntryType;
  143. Console.WriteLine("Reading archive");
  144. while (tar.ReadEntry(out filePath, out tarEntryType) != null)
  145. {
  146. Console.WriteLine("Got {0}", filePath);
  147. // if (ArchiveConstants.CONTROL_FILE_PATH == filePath)
  148. // {
  149. // gotControlFile = true;
  150. // }
  151. if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH) && filePath.EndsWith(".xml"))
  152. {
  153. // string fileName = filePath.Remove(0, "Objects/".Length);
  154. //
  155. // if (fileName.StartsWith(part1.Name))
  156. // {
  157. Assert.That(expectedObject1FilePath, Is.EqualTo(filePath));
  158. gotObject1File = true;
  159. // }
  160. // else if (fileName.StartsWith(part2.Name))
  161. // {
  162. // Assert.That(fileName, Is.EqualTo(expectedObject2FileName));
  163. // gotObject2File = true;
  164. // }
  165. }
  166. }
  167. // Assert.That(gotControlFile, Is.True, "No control file in archive");
  168. Assert.That(gotObject1File, Is.True, "No item1 file in archive");
  169. // Assert.That(gotObject2File, Is.True, "No object2 file in archive");
  170. // TODO: Test presence of more files and contents of files.
  171. }
  172. /// <summary>
  173. /// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where
  174. /// an account exists with the creator name.
  175. /// </summary>
  176. ///
  177. /// This test also does some deeper probing of loading into nested inventory structures
  178. [Test]
  179. public void TestLoadIarV0_1ExistingUsers()
  180. {
  181. TestHelper.InMethod();
  182. //log4net.Config.XmlConfigurator.Configure();
  183. string userFirstName = "Mr";
  184. string userLastName = "Tiddles";
  185. UUID userUuid = UUID.Parse("00000000-0000-0000-0000-000000000555");
  186. string userItemCreatorFirstName = "Lord";
  187. string userItemCreatorLastName = "Lucan";
  188. UUID userItemCreatorUuid = UUID.Parse("00000000-0000-0000-0000-000000000666");
  189. string item1Name = "b.lsl";
  190. string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(item1Name, UUID.Random());
  191. MemoryStream archiveWriteStream = new MemoryStream();
  192. TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream);
  193. InventoryItemBase item1 = new InventoryItemBase();
  194. item1.Name = item1Name;
  195. item1.AssetID = UUID.Random();
  196. item1.GroupID = UUID.Random();
  197. item1.CreatorId = OspResolver.MakeOspa(userItemCreatorFirstName, userItemCreatorLastName);
  198. //item1.CreatorId = userUuid.ToString();
  199. //item1.CreatorId = "00000000-0000-0000-0000-000000000444";
  200. item1.Owner = UUID.Zero;
  201. string item1FileName
  202. = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName);
  203. tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1));
  204. tar.Close();
  205. MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray());
  206. SerialiserModule serialiserModule = new SerialiserModule();
  207. InventoryArchiverModule archiverModule = new InventoryArchiverModule(true);
  208. // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene
  209. Scene scene = SceneSetupHelpers.SetupScene("inventory");
  210. IUserAdminService userAdminService = scene.CommsManager.UserAdminService;
  211. SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
  212. userAdminService.AddUser(
  213. userFirstName, userLastName, "meowfood", String.Empty, 1000, 1000, userUuid);
  214. userAdminService.AddUser(
  215. userItemCreatorFirstName, userItemCreatorLastName, "hampshire",
  216. String.Empty, 1000, 1000, userItemCreatorUuid);
  217. archiverModule.DearchiveInventory(userFirstName, userLastName, "/", "meowfood", archiveReadStream);
  218. CachedUserInfo userInfo
  219. = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName);
  220. InventoryItemBase foundItem1
  221. = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, item1Name);
  222. Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1");
  223. // We have to disable this check since loaded items that did find users via OSPA resolution are now only storing the
  224. // UUID, not the OSPA itself.
  225. // Assert.That(
  226. // foundItem1.CreatorId, Is.EqualTo(item1.CreatorId),
  227. // "Loaded item non-uuid creator doesn't match original");
  228. Assert.That(
  229. foundItem1.CreatorId, Is.EqualTo(userItemCreatorUuid.ToString()),
  230. "Loaded item non-uuid creator doesn't match original");
  231. Assert.That(
  232. foundItem1.CreatorIdAsUuid, Is.EqualTo(userItemCreatorUuid),
  233. "Loaded item uuid creator doesn't match original");
  234. Assert.That(foundItem1.Owner, Is.EqualTo(userUuid),
  235. "Loaded item owner doesn't match inventory reciever");
  236. // Now try loading to a root child folder
  237. UserInventoryTestUtils.CreateInventoryFolder(scene.InventoryService, userInfo.UserProfile.ID, "xA");
  238. archiveReadStream = new MemoryStream(archiveReadStream.ToArray());
  239. archiverModule.DearchiveInventory(userFirstName, userLastName, "xA", "meowfood", archiveReadStream);
  240. InventoryItemBase foundItem2
  241. = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, "xA/" + item1Name);
  242. Assert.That(foundItem2, Is.Not.Null, "Didn't find loaded item 2");
  243. // Now try loading to a more deeply nested folder
  244. UserInventoryTestUtils.CreateInventoryFolder(scene.InventoryService, userInfo.UserProfile.ID, "xB/xC");
  245. archiveReadStream = new MemoryStream(archiveReadStream.ToArray());
  246. archiverModule.DearchiveInventory(userFirstName, userLastName, "xB/xC", "meowfood", archiveReadStream);
  247. InventoryItemBase foundItem3
  248. = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, "xB/xC/" + item1Name);
  249. Assert.That(foundItem3, Is.Not.Null, "Didn't find loaded item 3");
  250. }
  251. [Test]
  252. public void TestIarV0_1WithEscapedChars()
  253. {
  254. TestHelper.InMethod();
  255. // log4net.Config.XmlConfigurator.Configure();
  256. string itemName = "You & you are a mean/man/";
  257. string humanEscapedItemName = @"You & you are a mean\/man\/";
  258. string userPassword = "meowfood";
  259. InventoryArchiverModule archiverModule = new InventoryArchiverModule(true);
  260. Scene scene = SceneSetupHelpers.SetupScene("Inventory");
  261. SceneSetupHelpers.SetupSceneModules(scene, archiverModule);
  262. CommunicationsManager cm = scene.CommsManager;
  263. // Create user
  264. string userFirstName = "Jock";
  265. string userLastName = "Stirrup";
  266. UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
  267. lock (this)
  268. {
  269. UserProfileTestUtils.CreateUserWithInventory(
  270. cm, userFirstName, userLastName, userPassword, userId, InventoryReceived);
  271. Monitor.Wait(this, 60000);
  272. }
  273. // Create asset
  274. SceneObjectGroup object1;
  275. SceneObjectPart part1;
  276. {
  277. string partName = "part name";
  278. UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040");
  279. PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere();
  280. Vector3 groupPosition = new Vector3(10, 20, 30);
  281. Quaternion rotationOffset = new Quaternion(20, 30, 40, 50);
  282. Vector3 offsetPosition = new Vector3(5, 10, 15);
  283. part1
  284. = new SceneObjectPart(
  285. ownerId, shape, groupPosition, rotationOffset, offsetPosition);
  286. part1.Name = partName;
  287. object1 = new SceneObjectGroup(part1);
  288. scene.AddNewSceneObject(object1, false);
  289. }
  290. UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
  291. AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1);
  292. scene.AssetService.Store(asset1);
  293. // Create item
  294. UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080");
  295. InventoryItemBase item1 = new InventoryItemBase();
  296. item1.Name = itemName;
  297. item1.AssetID = asset1.FullID;
  298. item1.ID = item1Id;
  299. InventoryFolderBase objsFolder
  300. = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userId, "Objects");
  301. item1.Folder = objsFolder.ID;
  302. scene.AddInventoryItem(userId, item1);
  303. MemoryStream archiveWriteStream = new MemoryStream();
  304. archiverModule.OnInventoryArchiveSaved += SaveCompleted;
  305. mre.Reset();
  306. archiverModule.ArchiveInventory(
  307. Guid.NewGuid(), userFirstName, userLastName, "Objects", userPassword, archiveWriteStream);
  308. mre.WaitOne(60000, false);
  309. // LOAD ITEM
  310. MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray());
  311. archiverModule.DearchiveInventory(userFirstName, userLastName, "Scripts", userPassword, archiveReadStream);
  312. InventoryItemBase foundItem1
  313. = InventoryArchiveUtils.FindItemByPath(
  314. scene.InventoryService, userId, "Scripts/Objects/" + humanEscapedItemName);
  315. Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1");
  316. // Assert.That(
  317. // foundItem1.CreatorId, Is.EqualTo(userUuid),
  318. // "Loaded item non-uuid creator doesn't match that of the loading user");
  319. Assert.That(
  320. foundItem1.Name, Is.EqualTo(itemName),
  321. "Loaded item name doesn't match saved name");
  322. }
  323. /// <summary>
  324. /// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where
  325. /// embedded creators do not exist in the system
  326. /// </summary>
  327. ///
  328. /// This may possibly one day get overtaken by the as yet incomplete temporary profiles feature
  329. /// (as tested in the a later commented out test)
  330. [Test]
  331. public void TestLoadIarV0_1AbsentUsers()
  332. {
  333. TestHelper.InMethod();
  334. //log4net.Config.XmlConfigurator.Configure();
  335. string userFirstName = "Charlie";
  336. string userLastName = "Chan";
  337. UUID userUuid = UUID.Parse("00000000-0000-0000-0000-000000000999");
  338. string userItemCreatorFirstName = "Bat";
  339. string userItemCreatorLastName = "Man";
  340. //UUID userItemCreatorUuid = UUID.Parse("00000000-0000-0000-0000-000000008888");
  341. string itemName = "b.lsl";
  342. string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(itemName, UUID.Random());
  343. MemoryStream archiveWriteStream = new MemoryStream();
  344. TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream);
  345. InventoryItemBase item1 = new InventoryItemBase();
  346. item1.Name = itemName;
  347. item1.AssetID = UUID.Random();
  348. item1.GroupID = UUID.Random();
  349. item1.CreatorId = OspResolver.MakeOspa(userItemCreatorFirstName, userItemCreatorLastName);
  350. //item1.CreatorId = userUuid.ToString();
  351. //item1.CreatorId = "00000000-0000-0000-0000-000000000444";
  352. item1.Owner = UUID.Zero;
  353. string item1FileName
  354. = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName);
  355. tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1));
  356. tar.Close();
  357. MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray());
  358. SerialiserModule serialiserModule = new SerialiserModule();
  359. InventoryArchiverModule archiverModule = new InventoryArchiverModule(true);
  360. // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene
  361. Scene scene = SceneSetupHelpers.SetupScene("inventory");
  362. IUserAdminService userAdminService = scene.CommsManager.UserAdminService;
  363. SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
  364. userAdminService.AddUser(
  365. userFirstName, userLastName, "meowfood", String.Empty, 1000, 1000, userUuid);
  366. archiverModule.DearchiveInventory(userFirstName, userLastName, "/", "meowfood", archiveReadStream);
  367. CachedUserInfo userInfo
  368. = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName);
  369. InventoryItemBase foundItem1
  370. = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, itemName);
  371. Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1");
  372. // Assert.That(
  373. // foundItem1.CreatorId, Is.EqualTo(userUuid),
  374. // "Loaded item non-uuid creator doesn't match that of the loading user");
  375. Assert.That(
  376. foundItem1.CreatorIdAsUuid, Is.EqualTo(userUuid),
  377. "Loaded item uuid creator doesn't match that of the loading user");
  378. }
  379. /// <summary>
  380. /// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where
  381. /// no account exists with the creator name
  382. /// </summary>
  383. /// Disabled since temporary profiles have not yet been implemented.
  384. //[Test]
  385. public void TestLoadIarV0_1TempProfiles()
  386. {
  387. TestHelper.InMethod();
  388. //log4net.Config.XmlConfigurator.Configure();
  389. string userFirstName = "Dennis";
  390. string userLastName = "Menace";
  391. UUID userUuid = UUID.Parse("00000000-0000-0000-0000-000000000aaa");
  392. string user2FirstName = "Walter";
  393. string user2LastName = "Mitty";
  394. string itemName = "b.lsl";
  395. string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(itemName, UUID.Random());
  396. MemoryStream archiveWriteStream = new MemoryStream();
  397. TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream);
  398. InventoryItemBase item1 = new InventoryItemBase();
  399. item1.Name = itemName;
  400. item1.AssetID = UUID.Random();
  401. item1.GroupID = UUID.Random();
  402. item1.CreatorId = OspResolver.MakeOspa(user2FirstName, user2LastName);
  403. item1.Owner = UUID.Zero;
  404. string item1FileName
  405. = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName);
  406. tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1));
  407. tar.Close();
  408. MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray());
  409. SerialiserModule serialiserModule = new SerialiserModule();
  410. InventoryArchiverModule archiverModule = new InventoryArchiverModule(true);
  411. // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene
  412. Scene scene = SceneSetupHelpers.SetupScene();
  413. IUserAdminService userAdminService = scene.CommsManager.UserAdminService;
  414. SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
  415. userAdminService.AddUser(
  416. userFirstName, userLastName, "meowfood", String.Empty, 1000, 1000, userUuid);
  417. archiverModule.DearchiveInventory(userFirstName, userLastName, "/", "troll", archiveReadStream);
  418. // Check that a suitable temporary user profile has been created.
  419. UserProfileData user2Profile
  420. = scene.CommsManager.UserService.GetUserProfile(
  421. OspResolver.HashName(user2FirstName + " " + user2LastName));
  422. Assert.That(user2Profile, Is.Not.Null);
  423. Assert.That(user2Profile.FirstName == user2FirstName);
  424. Assert.That(user2Profile.SurName == user2LastName);
  425. CachedUserInfo userInfo
  426. = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName);
  427. userInfo.OnInventoryReceived += InventoryReceived;
  428. lock (this)
  429. {
  430. userInfo.FetchInventory();
  431. Monitor.Wait(this, 60000);
  432. }
  433. InventoryItemBase foundItem = userInfo.RootFolder.FindItemByPath(itemName);
  434. Assert.That(foundItem.CreatorId, Is.EqualTo(item1.CreatorId));
  435. Assert.That(
  436. foundItem.CreatorIdAsUuid, Is.EqualTo(OspResolver.HashName(user2FirstName + " " + user2LastName)));
  437. Assert.That(foundItem.Owner, Is.EqualTo(userUuid));
  438. Console.WriteLine("### Successfully completed {0} ###", MethodBase.GetCurrentMethod());
  439. }
  440. /// <summary>
  441. /// Test replication of an archive path to the user's inventory.
  442. /// </summary>
  443. [Test]
  444. public void TestReplicateArchivePathToUserInventory()
  445. {
  446. TestHelper.InMethod();
  447. //log4net.Config.XmlConfigurator.Configure();
  448. Scene scene = SceneSetupHelpers.SetupScene("inventory");
  449. CommunicationsManager commsManager = scene.CommsManager;
  450. CachedUserInfo userInfo;
  451. lock (this)
  452. {
  453. userInfo = UserProfileTestUtils.CreateUserWithInventory(commsManager, InventoryReceived);
  454. Monitor.Wait(this, 60000);
  455. }
  456. //Console.WriteLine("userInfo.RootFolder 1: {0}", userInfo.RootFolder);
  457. Dictionary <string, InventoryFolderBase> foldersCreated = new Dictionary<string, InventoryFolderBase>();
  458. List<InventoryNodeBase> nodesLoaded = new List<InventoryNodeBase>();
  459. string folder1Name = "a";
  460. string folder2Name = "b";
  461. string itemName = "c.lsl";
  462. string folder1ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder1Name, UUID.Random());
  463. string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random());
  464. string itemArchiveName = InventoryArchiveWriteRequest.CreateArchiveItemName(itemName, UUID.Random());
  465. string itemArchivePath
  466. = string.Format(
  467. "{0}{1}{2}{3}",
  468. ArchiveConstants.INVENTORY_PATH, folder1ArchiveName, folder2ArchiveName, itemArchiveName);
  469. //Console.WriteLine("userInfo.RootFolder 2: {0}", userInfo.RootFolder);
  470. new InventoryArchiveReadRequest(scene, userInfo, null, (Stream)null)
  471. .ReplicateArchivePathToUserInventory(
  472. itemArchivePath, false, scene.InventoryService.GetRootFolder(userInfo.UserProfile.ID),
  473. foldersCreated, nodesLoaded);
  474. //Console.WriteLine("userInfo.RootFolder 3: {0}", userInfo.RootFolder);
  475. //InventoryFolderImpl folder1 = userInfo.RootFolder.FindFolderByPath("a");
  476. InventoryFolderBase folder1
  477. = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userInfo.UserProfile.ID, "a");
  478. Assert.That(folder1, Is.Not.Null, "Could not find folder a");
  479. InventoryFolderBase folder2 = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1, "b");
  480. Assert.That(folder2, Is.Not.Null, "Could not find folder b");
  481. }
  482. }
  483. }