opensim – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 eva 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 log4net.Config;
30 using NUnit.Framework;
31 using OpenMetaverse;
32 using OpenSim.Framework;
33 using OpenSim.Tests.Common;
34 using log4net;
35 using System.Reflection;
36 using System.Data.Common;
37  
38 // DBMS-specific:
39 using MySql.Data.MySqlClient;
40 using OpenSim.Data.MySQL;
41  
42 using System.Data.SqlClient;
43 using OpenSim.Data.MSSQL;
44  
45 using Mono.Data.Sqlite;
46 using OpenSim.Data.SQLite;
47  
48 namespace OpenSim.Data.Tests
49 {
50 [TestFixture(Description = "Inventory store tests (SQLite)")]
51 public class SQLiteInventoryTests : InventoryTests<SqliteConnection, SQLiteInventoryStore>
52 {
53 }
54  
55 [TestFixture(Description = "Inventory store tests (MySQL)")]
56 public class MySqlInventoryTests : InventoryTests<MySqlConnection, MySQLInventoryData>
57 {
58 }
59  
60 [TestFixture(Description = "Inventory store tests (MS SQL Server)")]
61 public class MSSQLInventoryTests : InventoryTests<SqlConnection, MSSQLInventoryData>
62 {
63 }
64  
65 public class InventoryTests<TConn, TInvStore> : BasicDataServiceTest<TConn, TInvStore>
66 where TConn : DbConnection, new()
67 where TInvStore : class, IInventoryDataPlugin, new()
68 {
69 public IInventoryDataPlugin db;
70  
71 public UUID zero = UUID.Zero;
72  
73 public UUID folder1 = UUID.Random();
74 public UUID folder2 = UUID.Random();
75 public UUID folder3 = UUID.Random();
76 public UUID owner1 = UUID.Random();
77 public UUID owner2 = UUID.Random();
78 public UUID owner3 = UUID.Random();
79  
80 public UUID item1 = UUID.Random();
81 public UUID item2 = UUID.Random();
82 public UUID item3 = UUID.Random();
83 public UUID asset1 = UUID.Random();
84 public UUID asset2 = UUID.Random();
85 public UUID asset3 = UUID.Random();
86  
87 public string name1;
88 public string name2 = "First Level folder";
89 public string name3 = "First Level folder 2";
90 public string niname1 = "My Shirt";
91 public string iname1 = "Shirt";
92 public string iname2 = "Text Board";
93 public string iname3 = "No Pants Barrel";
94  
95 public InventoryTests(string conn) : base(conn)
96 {
97 name1 = "Root Folder for " + owner1.ToString();
98 }
99 public InventoryTests() : this("") { }
100  
101 protected override void InitService(object service)
102 {
103 ClearDB();
104 db = (IInventoryDataPlugin)service;
105 db.Initialise(m_connStr);
106 }
107  
108 private void ClearDB()
109 {
110 DropTables("inventoryitems", "inventoryfolders");
111 ResetMigrations("InventoryStore");
112 }
113  
114 [Test]
115 public void T001_LoadEmpty()
116 {
117 TestHelpers.InMethod();
118  
119 Assert.That(db.getInventoryFolder(zero), Is.Null);
120 Assert.That(db.getInventoryFolder(folder1), Is.Null);
121 Assert.That(db.getInventoryFolder(folder2), Is.Null);
122 Assert.That(db.getInventoryFolder(folder3), Is.Null);
123  
124 Assert.That(db.getInventoryItem(zero), Is.Null);
125 Assert.That(db.getInventoryItem(item1), Is.Null);
126 Assert.That(db.getInventoryItem(item2), Is.Null);
127 Assert.That(db.getInventoryItem(item3), Is.Null);
128  
129 Assert.That(db.getUserRootFolder(zero), Is.Null);
130 Assert.That(db.getUserRootFolder(owner1), Is.Null);
131 }
132  
133 // 01x - folder tests
134 [Test]
135 public void T010_FolderNonParent()
136 {
137 TestHelpers.InMethod();
138  
139 InventoryFolderBase f1 = NewFolder(folder2, folder1, owner1, name2);
140 // the folder will go in
141 db.addInventoryFolder(f1);
142 InventoryFolderBase f1a = db.getUserRootFolder(owner1);
143 Assert.That(f1a, Is.Null);
144 }
145  
146 [Test]
147 public void T011_FolderCreate()
148 {
149 TestHelpers.InMethod();
150  
151 InventoryFolderBase f1 = NewFolder(folder1, zero, owner1, name1);
152 // TODO: this is probably wrong behavior, but is what we have
153 // db.updateInventoryFolder(f1);
154 // InventoryFolderBase f1a = db.getUserRootFolder(owner1);
155 // Assert.That(uuid1, Is.EqualTo(f1a.ID))
156 // Assert.That(name1, Text.Matches(f1a.Name), "Assert.That(name1, Text.Matches(f1a.Name))");
157 // Assert.That(db.getUserRootFolder(owner1), Is.Null);
158  
159 // succeed with true
160 db.addInventoryFolder(f1);
161 InventoryFolderBase f1a = db.getUserRootFolder(owner1);
162 Assert.That(folder1, Is.EqualTo(f1a.ID), "Assert.That(folder1, Is.EqualTo(f1a.ID))");
163 Assert.That(name1, Is.StringMatching(f1a.Name), "Assert.That(name1, Text.Matches(f1a.Name))");
164 }
165  
166 // we now have the following tree
167 // folder1
168 // +--- folder2
169 // +--- folder3
170  
171 [Test]
172 public void T012_FolderList()
173 {
174 TestHelpers.InMethod();
175  
176 InventoryFolderBase f2 = NewFolder(folder3, folder1, owner1, name3);
177 db.addInventoryFolder(f2);
178  
179 Assert.That(db.getInventoryFolders(zero).Count, Is.EqualTo(1), "Assert.That(db.getInventoryFolders(zero).Count, Is.EqualTo(1))");
180 Assert.That(db.getInventoryFolders(folder1).Count, Is.EqualTo(2), "Assert.That(db.getInventoryFolders(folder1).Count, Is.EqualTo(2))");
181 Assert.That(db.getInventoryFolders(folder2).Count, Is.EqualTo(0), "Assert.That(db.getInventoryFolders(folder2).Count, Is.EqualTo(0))");
182 Assert.That(db.getInventoryFolders(folder3).Count, Is.EqualTo(0), "Assert.That(db.getInventoryFolders(folder3).Count, Is.EqualTo(0))");
183 Assert.That(db.getInventoryFolders(UUID.Random()).Count, Is.EqualTo(0), "Assert.That(db.getInventoryFolders(UUID.Random()).Count, Is.EqualTo(0))");
184  
185 }
186  
187 [Test]
188 public void T013_FolderHierarchy()
189 {
190 TestHelpers.InMethod();
191  
192 int n = db.getFolderHierarchy(zero).Count; // (for dbg - easier to see what's returned)
193 Assert.That(n, Is.EqualTo(0), "Assert.That(db.getFolderHierarchy(zero).Count, Is.EqualTo(0))");
194 n = db.getFolderHierarchy(folder1).Count;
195 Assert.That(n, Is.EqualTo(2), "Assert.That(db.getFolderHierarchy(folder1).Count, Is.EqualTo(2))");
196 Assert.That(db.getFolderHierarchy(folder2).Count, Is.EqualTo(0), "Assert.That(db.getFolderHierarchy(folder2).Count, Is.EqualTo(0))");
197 Assert.That(db.getFolderHierarchy(folder3).Count, Is.EqualTo(0), "Assert.That(db.getFolderHierarchy(folder3).Count, Is.EqualTo(0))");
198 Assert.That(db.getFolderHierarchy(UUID.Random()).Count, Is.EqualTo(0), "Assert.That(db.getFolderHierarchy(UUID.Random()).Count, Is.EqualTo(0))");
199 }
200  
201  
202 [Test]
203 public void T014_MoveFolder()
204 {
205 TestHelpers.InMethod();
206  
207 InventoryFolderBase f2 = db.getInventoryFolder(folder2);
208 f2.ParentID = folder3;
209 db.moveInventoryFolder(f2);
210  
211 Assert.That(db.getInventoryFolders(zero).Count, Is.EqualTo(1), "Assert.That(db.getInventoryFolders(zero).Count, Is.EqualTo(1))");
212 Assert.That(db.getInventoryFolders(folder1).Count, Is.EqualTo(1), "Assert.That(db.getInventoryFolders(folder1).Count, Is.EqualTo(1))");
213 Assert.That(db.getInventoryFolders(folder2).Count, Is.EqualTo(0), "Assert.That(db.getInventoryFolders(folder2).Count, Is.EqualTo(0))");
214 Assert.That(db.getInventoryFolders(folder3).Count, Is.EqualTo(1), "Assert.That(db.getInventoryFolders(folder3).Count, Is.EqualTo(1))");
215 Assert.That(db.getInventoryFolders(UUID.Random()).Count, Is.EqualTo(0), "Assert.That(db.getInventoryFolders(UUID.Random()).Count, Is.EqualTo(0))");
216 }
217  
218 [Test]
219 public void T015_FolderHierarchy()
220 {
221 TestHelpers.InMethod();
222  
223 Assert.That(db.getFolderHierarchy(zero).Count, Is.EqualTo(0), "Assert.That(db.getFolderHierarchy(zero).Count, Is.EqualTo(0))");
224 Assert.That(db.getFolderHierarchy(folder1).Count, Is.EqualTo(2), "Assert.That(db.getFolderHierarchy(folder1).Count, Is.EqualTo(2))");
225 Assert.That(db.getFolderHierarchy(folder2).Count, Is.EqualTo(0), "Assert.That(db.getFolderHierarchy(folder2).Count, Is.EqualTo(0))");
226 Assert.That(db.getFolderHierarchy(folder3).Count, Is.EqualTo(1), "Assert.That(db.getFolderHierarchy(folder3).Count, Is.EqualTo(1))");
227 Assert.That(db.getFolderHierarchy(UUID.Random()).Count, Is.EqualTo(0), "Assert.That(db.getFolderHierarchy(UUID.Random()).Count, Is.EqualTo(0))");
228 }
229  
230 // Item tests
231 [Test]
232 public void T100_NoItems()
233 {
234 TestHelpers.InMethod();
235  
236 Assert.That(db.getInventoryInFolder(zero).Count, Is.EqualTo(0), "Assert.That(db.getInventoryInFolder(zero).Count, Is.EqualTo(0))");
237 Assert.That(db.getInventoryInFolder(folder1).Count, Is.EqualTo(0), "Assert.That(db.getInventoryInFolder(folder1).Count, Is.EqualTo(0))");
238 Assert.That(db.getInventoryInFolder(folder2).Count, Is.EqualTo(0), "Assert.That(db.getInventoryInFolder(folder2).Count, Is.EqualTo(0))");
239 Assert.That(db.getInventoryInFolder(folder3).Count, Is.EqualTo(0), "Assert.That(db.getInventoryInFolder(folder3).Count, Is.EqualTo(0))");
240 }
241  
242 // TODO: Feeding a bad inventory item down the data path will
243 // crash the system. This is largely due to the builder
244 // routines. That should be fixed and tested for.
245 [Test]
246 public void T101_CreatItems()
247 {
248 TestHelpers.InMethod();
249  
250 db.addInventoryItem(NewItem(item1, folder3, owner1, iname1, asset1));
251 db.addInventoryItem(NewItem(item2, folder3, owner1, iname2, asset2));
252 db.addInventoryItem(NewItem(item3, folder3, owner1, iname3, asset3));
253 Assert.That(db.getInventoryInFolder(folder3).Count, Is.EqualTo(3), "Assert.That(db.getInventoryInFolder(folder3).Count, Is.EqualTo(3))");
254 }
255  
256 [Test]
257 public void T102_CompareItems()
258 {
259 TestHelpers.InMethod();
260  
261 InventoryItemBase i1 = db.getInventoryItem(item1);
262 InventoryItemBase i2 = db.getInventoryItem(item2);
263 InventoryItemBase i3 = db.getInventoryItem(item3);
264 Assert.That(i1.Name, Is.EqualTo(iname1), "Assert.That(i1.Name, Is.EqualTo(iname1))");
265 Assert.That(i2.Name, Is.EqualTo(iname2), "Assert.That(i2.Name, Is.EqualTo(iname2))");
266 Assert.That(i3.Name, Is.EqualTo(iname3), "Assert.That(i3.Name, Is.EqualTo(iname3))");
267 Assert.That(i1.Owner, Is.EqualTo(owner1), "Assert.That(i1.Owner, Is.EqualTo(owner1))");
268 Assert.That(i2.Owner, Is.EqualTo(owner1), "Assert.That(i2.Owner, Is.EqualTo(owner1))");
269 Assert.That(i3.Owner, Is.EqualTo(owner1), "Assert.That(i3.Owner, Is.EqualTo(owner1))");
270 Assert.That(i1.AssetID, Is.EqualTo(asset1), "Assert.That(i1.AssetID, Is.EqualTo(asset1))");
271 Assert.That(i2.AssetID, Is.EqualTo(asset2), "Assert.That(i2.AssetID, Is.EqualTo(asset2))");
272 Assert.That(i3.AssetID, Is.EqualTo(asset3), "Assert.That(i3.AssetID, Is.EqualTo(asset3))");
273 }
274  
275 [Test]
276 public void T103_UpdateItem()
277 {
278 TestHelpers.InMethod();
279  
280 // TODO: probably shouldn't have the ability to have an
281 // owner of an item in a folder not owned by the user
282  
283 InventoryItemBase i1 = db.getInventoryItem(item1);
284 i1.Name = niname1;
285 i1.Description = niname1;
286 i1.Owner = owner2;
287 db.updateInventoryItem(i1);
288  
289 i1 = db.getInventoryItem(item1);
290 Assert.That(i1.Name, Is.EqualTo(niname1), "Assert.That(i1.Name, Is.EqualTo(niname1))");
291 Assert.That(i1.Description, Is.EqualTo(niname1), "Assert.That(i1.Description, Is.EqualTo(niname1))");
292 Assert.That(i1.Owner, Is.EqualTo(owner2), "Assert.That(i1.Owner, Is.EqualTo(owner2))");
293 }
294  
295 [Test]
296 public void T104_RandomUpdateItem()
297 {
298 TestHelpers.InMethod();
299  
300 PropertyScrambler<InventoryFolderBase> folderScrambler =
301 new PropertyScrambler<InventoryFolderBase>()
302 .DontScramble(x => x.Owner)
303 .DontScramble(x => x.ParentID)
304 .DontScramble(x => x.ID);
305 UUID owner = UUID.Random();
306 UUID folder = UUID.Random();
307 UUID rootId = UUID.Random();
308 UUID rootAsset = UUID.Random();
309 InventoryFolderBase f1 = NewFolder(folder, zero, owner, name1);
310 folderScrambler.Scramble(f1);
311  
312 db.addInventoryFolder(f1);
313 InventoryFolderBase f1a = db.getUserRootFolder(owner);
314 Assert.That(f1a, Constraints.PropertyCompareConstraint(f1));
315  
316 folderScrambler.Scramble(f1a);
317  
318 db.updateInventoryFolder(f1a);
319  
320 InventoryFolderBase f1b = db.getUserRootFolder(owner);
321 Assert.That(f1b, Constraints.PropertyCompareConstraint(f1a));
322  
323 //Now we have a valid folder to insert into, we can insert the item.
324 PropertyScrambler<InventoryItemBase> inventoryScrambler =
325 new PropertyScrambler<InventoryItemBase>()
326 .DontScramble(x => x.ID)
327 .DontScramble(x => x.AssetID)
328 .DontScramble(x => x.Owner)
329 .DontScramble(x => x.Folder);
330 InventoryItemBase root = NewItem(rootId, folder, owner, iname1, rootAsset);
331 inventoryScrambler.Scramble(root);
332 db.addInventoryItem(root);
333  
334 InventoryItemBase expected = db.getInventoryItem(rootId);
335 Assert.That(expected, Constraints.PropertyCompareConstraint(root)
336 .IgnoreProperty(x => x.InvType)
337 .IgnoreProperty(x => x.CreatorIdAsUuid)
338 .IgnoreProperty(x => x.Description)
339 .IgnoreProperty(x => x.CreatorIdentification)
340 .IgnoreProperty(x => x.CreatorData));
341  
342 inventoryScrambler.Scramble(expected);
343 db.updateInventoryItem(expected);
344  
345 InventoryItemBase actual = db.getInventoryItem(rootId);
346 Assert.That(actual, Constraints.PropertyCompareConstraint(expected)
347 .IgnoreProperty(x => x.InvType)
348 .IgnoreProperty(x => x.CreatorIdAsUuid)
349 .IgnoreProperty(x => x.Description)
350 .IgnoreProperty(x => x.CreatorIdentification)
351 .IgnoreProperty(x => x.CreatorData));
352 }
353  
354 [Test]
355 public void T999_StillNull()
356 {
357 TestHelpers.InMethod();
358  
359 // After all tests are run, these should still return no results
360 Assert.That(db.getInventoryFolder(zero), Is.Null);
361 Assert.That(db.getInventoryItem(zero), Is.Null);
362 Assert.That(db.getUserRootFolder(zero), Is.Null);
363 Assert.That(db.getInventoryInFolder(zero).Count, Is.EqualTo(0), "Assert.That(db.getInventoryInFolder(zero).Count, Is.EqualTo(0))");
364 }
365  
366 private InventoryItemBase NewItem(UUID id, UUID parent, UUID owner, string name, UUID asset)
367 {
368 InventoryItemBase i = new InventoryItemBase();
369 i.ID = id;
370 i.Folder = parent;
371 i.Owner = owner;
372 i.CreatorId = owner.ToString();
373 i.Name = name;
374 i.Description = name;
375 i.AssetID = asset;
376 return i;
377 }
378  
379 private InventoryFolderBase NewFolder(UUID id, UUID parent, UUID owner, string name)
380 {
381 InventoryFolderBase f = new InventoryFolderBase();
382 f.ID = id;
383 f.ParentID = parent;
384 f.Owner = owner;
385 f.Name = name;
386 return f;
387 }
388 }
389 }