clockwerk-opensim-stable – Blame information for rev 3

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 vero 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  
28 using System;
29 using System.Collections.Generic;
30 using System.IO;
31 using System.Reflection;
32 using System.Threading;
33 using NUnit.Framework;
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.Region.CoreModules.Avatar.Inventory.Archiver;
41 using OpenSim.Region.CoreModules.World.Serialiser;
42 using OpenSim.Region.Framework.Scenes;
43 using OpenSim.Region.Framework.Scenes.Serialization;
44 using OpenSim.Services.Interfaces;
45 using OpenSim.Tests.Common;
46 using OpenSim.Tests.Common.Mock;
47  
48 namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
49 {
50 [TestFixture]
51 public class InventoryArchiveSaveTests : InventoryArchiveTestCase
52 {
53 protected TestScene m_scene;
54 protected InventoryArchiverModule m_archiverModule;
55  
56 [SetUp]
57 public override void SetUp()
58 {
59 base.SetUp();
60  
61 SerialiserModule serialiserModule = new SerialiserModule();
62 m_archiverModule = new InventoryArchiverModule();
63  
64 m_scene = new SceneHelpers().SetupScene();
65 SceneHelpers.SetupSceneModules(m_scene, serialiserModule, m_archiverModule);
66 }
67  
68 /// <summary>
69 /// Test that the IAR has the required files in the right order.
70 /// </summary>
71 /// <remarks>
72 /// At the moment, the only thing that matters is that the control file is the very first one.
73 /// </remarks>
74 [Test]
75 public void TestOrder()
76 {
77 TestHelpers.InMethod();
78 // log4net.Config.XmlConfigurator.Configure();
79  
80 MemoryStream archiveReadStream = new MemoryStream(m_iarStreamBytes);
81 TarArchiveReader tar = new TarArchiveReader(archiveReadStream);
82 string filePath;
83 TarArchiveReader.TarEntryType tarEntryType;
84  
85 byte[] data = tar.ReadEntry(out filePath, out tarEntryType);
86 Assert.That(filePath, Is.EqualTo(ArchiveConstants.CONTROL_FILE_PATH));
87  
88 InventoryArchiveReadRequest iarr
89 = new InventoryArchiveReadRequest(null, null, null, null, null, (Stream)null, false);
90 iarr.LoadControlFile(filePath, data);
91  
92 Assert.That(iarr.ControlFileLoaded, Is.True);
93 }
94  
95 [Test]
96 public void TestSaveRootFolderToIar()
97 {
98 TestHelpers.InMethod();
99 // TestHelpers.EnableLogging();
100  
101 string userFirstName = "Jock";
102 string userLastName = "Stirrup";
103 string userPassword = "troll";
104 UUID userId = TestHelpers.ParseTail(0x20);
105  
106 UserAccountHelpers.CreateUserWithInventory(m_scene, userFirstName, userLastName, userId, userPassword);
107  
108 MemoryStream archiveWriteStream = new MemoryStream();
109 m_archiverModule.OnInventoryArchiveSaved += SaveCompleted;
110  
111 mre.Reset();
112 m_archiverModule.ArchiveInventory(
3 vero 113 Guid.NewGuid(), userFirstName, userLastName, "/", archiveWriteStream);
1 vero 114 mre.WaitOne(60000, false);
115  
116 // Test created iar
117 byte[] archive = archiveWriteStream.ToArray();
118 MemoryStream archiveReadStream = new MemoryStream(archive);
119 TarArchiveReader tar = new TarArchiveReader(archiveReadStream);
120  
121 // InventoryArchiveUtils.
122 bool gotObjectsFolder = false;
123  
124 string objectsFolderName
125 = string.Format(
126 "{0}{1}",
127 ArchiveConstants.INVENTORY_PATH,
128 InventoryArchiveWriteRequest.CreateArchiveFolderName(
129 UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, userId, "Objects")));
130  
131 string filePath;
132 TarArchiveReader.TarEntryType tarEntryType;
133  
134 while (tar.ReadEntry(out filePath, out tarEntryType) != null)
135 {
136 // Console.WriteLine("Got {0}", filePath);
137  
138 // Lazily, we only bother to look for the system objects folder created when we call CreateUserWithInventory()
139 // XXX: But really we need to stop all that stuff being created in tests or check for such folders
140 // more thoroughly
141 if (filePath == objectsFolderName)
142 gotObjectsFolder = true;
143 }
144  
145 Assert.That(gotObjectsFolder, Is.True);
146 }
147  
148 [Test]
149 public void TestSaveNonRootFolderToIar()
150 {
151 TestHelpers.InMethod();
152 // TestHelpers.EnableLogging();
153  
154 string userFirstName = "Jock";
155 string userLastName = "Stirrup";
156 string userPassword = "troll";
157 UUID userId = TestHelpers.ParseTail(0x20);
158  
159 UserAccountHelpers.CreateUserWithInventory(m_scene, userFirstName, userLastName, userId, userPassword);
160  
161 // Create base folder
162 InventoryFolderBase f1
163 = UserInventoryHelpers.CreateInventoryFolder(m_scene.InventoryService, userId, "f1", true);
164  
165 // Create item1
166 SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, userId, "My Little Dog Object", 0x5);
167 InventoryItemBase i1 = UserInventoryHelpers.AddInventoryItem(m_scene, so1, 0x50, 0x60, "f1");
168  
169 // Create embedded folder
170 InventoryFolderBase f1_1
171 = UserInventoryHelpers.CreateInventoryFolder(m_scene.InventoryService, userId, "f1/f1.1", true);
172  
173 // Create embedded item
174 SceneObjectGroup so1_1 = SceneHelpers.CreateSceneObject(1, userId, "My Little Cat Object", 0x6);
175 InventoryItemBase i2 = UserInventoryHelpers.AddInventoryItem(m_scene, so1_1, 0x500, 0x600, "f1/f1.1");
176  
177 MemoryStream archiveWriteStream = new MemoryStream();
178 m_archiverModule.OnInventoryArchiveSaved += SaveCompleted;
179  
180 mre.Reset();
181 m_archiverModule.ArchiveInventory(
3 vero 182 Guid.NewGuid(), userFirstName, userLastName, "f1", archiveWriteStream);
1 vero 183 mre.WaitOne(60000, false);
184  
185 // Test created iar
186 byte[] archive = archiveWriteStream.ToArray();
187 MemoryStream archiveReadStream = new MemoryStream(archive);
188 TarArchiveReader tar = new TarArchiveReader(archiveReadStream);
189  
190 // InventoryArchiveUtils.
191 bool gotf1 = false, gotf1_1 = false, gotso1 = false, gotso2 = false;
192  
193 string f1FileName
194 = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, InventoryArchiveWriteRequest.CreateArchiveFolderName(f1));
195 string f1_1FileName
196 = string.Format("{0}{1}", f1FileName, InventoryArchiveWriteRequest.CreateArchiveFolderName(f1_1));
197 string so1FileName
198 = string.Format("{0}{1}", f1FileName, InventoryArchiveWriteRequest.CreateArchiveItemName(i1));
199 string so2FileName
200 = string.Format("{0}{1}", f1_1FileName, InventoryArchiveWriteRequest.CreateArchiveItemName(i2));
201  
202 string filePath;
203 TarArchiveReader.TarEntryType tarEntryType;
204  
205 while (tar.ReadEntry(out filePath, out tarEntryType) != null)
206 {
207 // Console.WriteLine("Got {0}", filePath);
208  
209 if (filePath == f1FileName)
210 gotf1 = true;
211 else if (filePath == f1_1FileName)
212 gotf1_1 = true;
213 else if (filePath == so1FileName)
214 gotso1 = true;
215 else if (filePath == so2FileName)
216 gotso2 = true;
217 }
218  
219 // Assert.That(gotControlFile, Is.True, "No control file in archive");
220 Assert.That(gotf1, Is.True);
221 Assert.That(gotf1_1, Is.True);
222 Assert.That(gotso1, Is.True);
223 Assert.That(gotso2, Is.True);
224  
225 // TODO: Test presence of more files and contents of files.
226 }
227  
228 /// <summary>
229 /// Test saving a single inventory item to an IAR
230 /// (subject to change since there is no fixed format yet).
231 /// </summary>
232 [Test]
233 public void TestSaveItemToIar()
234 {
235 TestHelpers.InMethod();
236 // log4net.Config.XmlConfigurator.Configure();
237  
238 // Create user
239 string userFirstName = "Jock";
240 string userLastName = "Stirrup";
241 string userPassword = "troll";
242 UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
243 UserAccountHelpers.CreateUserWithInventory(m_scene, userFirstName, userLastName, userId, userPassword);
244  
245 // Create asset
246 UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040");
247 SceneObjectGroup object1 = SceneHelpers.CreateSceneObject(1, ownerId, "My Little Dog Object", 0x50);
248  
249 UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
250 AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1);
251 m_scene.AssetService.Store(asset1);
252  
253 // Create item
254 UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080");
255 string item1Name = "My Little Dog";
256 InventoryItemBase item1 = new InventoryItemBase();
257 item1.Name = item1Name;
258 item1.AssetID = asset1.FullID;
259 item1.ID = item1Id;
260 InventoryFolderBase objsFolder
261 = InventoryArchiveUtils.FindFoldersByPath(m_scene.InventoryService, userId, "Objects")[0];
262 item1.Folder = objsFolder.ID;
263 m_scene.AddInventoryItem(item1);
264  
265 MemoryStream archiveWriteStream = new MemoryStream();
266 m_archiverModule.OnInventoryArchiveSaved += SaveCompleted;
267  
268 mre.Reset();
269 m_archiverModule.ArchiveInventory(
3 vero 270 Guid.NewGuid(), userFirstName, userLastName, "Objects/" + item1Name, archiveWriteStream);
1 vero 271 mre.WaitOne(60000, false);
272  
273 byte[] archive = archiveWriteStream.ToArray();
274 MemoryStream archiveReadStream = new MemoryStream(archive);
275 TarArchiveReader tar = new TarArchiveReader(archiveReadStream);
276  
277 //bool gotControlFile = false;
278 bool gotObject1File = false;
279 //bool gotObject2File = false;
280 string expectedObject1FileName = InventoryArchiveWriteRequest.CreateArchiveItemName(item1);
281 string expectedObject1FilePath = string.Format(
282 "{0}{1}",
283 ArchiveConstants.INVENTORY_PATH,
284 expectedObject1FileName);
285  
286 string filePath;
287 TarArchiveReader.TarEntryType tarEntryType;
288  
289 // Console.WriteLine("Reading archive");
290  
291 while (tar.ReadEntry(out filePath, out tarEntryType) != null)
292 {
293 Console.WriteLine("Got {0}", filePath);
294  
295 // if (ArchiveConstants.CONTROL_FILE_PATH == filePath)
296 // {
297 // gotControlFile = true;
298 // }
299  
300 if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH) && filePath.EndsWith(".xml"))
301 {
302 // string fileName = filePath.Remove(0, "Objects/".Length);
303 //
304 // if (fileName.StartsWith(part1.Name))
305 // {
306 Assert.That(expectedObject1FilePath, Is.EqualTo(filePath));
307 gotObject1File = true;
308 // }
309 // else if (fileName.StartsWith(part2.Name))
310 // {
311 // Assert.That(fileName, Is.EqualTo(expectedObject2FileName));
312 // gotObject2File = true;
313 // }
314 }
315 }
316  
317 // Assert.That(gotControlFile, Is.True, "No control file in archive");
318 Assert.That(gotObject1File, Is.True, "No item1 file in archive");
319 // Assert.That(gotObject2File, Is.True, "No object2 file in archive");
320  
321 // TODO: Test presence of more files and contents of files.
322 }
323  
324 /// <summary>
325 /// Test saving a single inventory item to an IAR without its asset
326 /// </summary>
327 [Test]
328 public void TestSaveItemToIarNoAssets()
329 {
330 TestHelpers.InMethod();
331 // log4net.Config.XmlConfigurator.Configure();
332  
333 // Create user
334 string userFirstName = "Jock";
335 string userLastName = "Stirrup";
336 string userPassword = "troll";
337 UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
338 UserAccountHelpers.CreateUserWithInventory(m_scene, userFirstName, userLastName, userId, userPassword);
339  
340 // Create asset
341 UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040");
342 SceneObjectGroup object1 = SceneHelpers.CreateSceneObject(1, ownerId, "My Little Dog Object", 0x50);
343  
344 UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
345 AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1);
346 m_scene.AssetService.Store(asset1);
347  
348 // Create item
349 UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080");
350 string item1Name = "My Little Dog";
351 InventoryItemBase item1 = new InventoryItemBase();
352 item1.Name = item1Name;
353 item1.AssetID = asset1.FullID;
354 item1.ID = item1Id;
355 InventoryFolderBase objsFolder
356 = InventoryArchiveUtils.FindFoldersByPath(m_scene.InventoryService, userId, "Objects")[0];
357 item1.Folder = objsFolder.ID;
358 m_scene.AddInventoryItem(item1);
359  
360 MemoryStream archiveWriteStream = new MemoryStream();
361  
362 Dictionary<string, Object> options = new Dictionary<string, Object>();
363 options.Add("noassets", true);
364  
365 // When we're not saving assets, archiving is being done synchronously.
366 m_archiverModule.ArchiveInventory(
3 vero 367 Guid.NewGuid(), userFirstName, userLastName, "Objects/" + item1Name, archiveWriteStream, options);
1 vero 368  
369 byte[] archive = archiveWriteStream.ToArray();
370 MemoryStream archiveReadStream = new MemoryStream(archive);
371 TarArchiveReader tar = new TarArchiveReader(archiveReadStream);
372  
373 //bool gotControlFile = false;
374 bool gotObject1File = false;
375 //bool gotObject2File = false;
376 string expectedObject1FileName = InventoryArchiveWriteRequest.CreateArchiveItemName(item1);
377 string expectedObject1FilePath = string.Format(
378 "{0}{1}",
379 ArchiveConstants.INVENTORY_PATH,
380 expectedObject1FileName);
381  
382 string filePath;
383 TarArchiveReader.TarEntryType tarEntryType;
384  
385 // Console.WriteLine("Reading archive");
386  
387 while (tar.ReadEntry(out filePath, out tarEntryType) != null)
388 {
389 Console.WriteLine("Got {0}", filePath);
390  
391 // if (ArchiveConstants.CONTROL_FILE_PATH == filePath)
392 // {
393 // gotControlFile = true;
394 // }
395  
396 if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH) && filePath.EndsWith(".xml"))
397 {
398 // string fileName = filePath.Remove(0, "Objects/".Length);
399 //
400 // if (fileName.StartsWith(part1.Name))
401 // {
402 Assert.That(expectedObject1FilePath, Is.EqualTo(filePath));
403 gotObject1File = true;
404 // }
405 // else if (fileName.StartsWith(part2.Name))
406 // {
407 // Assert.That(fileName, Is.EqualTo(expectedObject2FileName));
408 // gotObject2File = true;
409 // }
410 }
411 else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH))
412 {
413 Assert.Fail("Found asset path in TestSaveItemToIarNoAssets()");
414 }
415 }
416  
417 // Assert.That(gotControlFile, Is.True, "No control file in archive");
418 Assert.That(gotObject1File, Is.True, "No item1 file in archive");
419 // Assert.That(gotObject2File, Is.True, "No object2 file in archive");
420  
421 // TODO: Test presence of more files and contents of files.
422 }
423 }
424 }