diff options
author | Justin Clark-Casey (justincc) | 2012-11-17 01:01:14 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-11-17 01:01:14 +0000 |
commit | 2aa58c58435e0071da185d32a3f3cb622f699de0 (patch) | |
tree | 3c787f543101b44ca45adb43d0a6a9b49133b5a2 | |
parent | Add basic XInventoryServicesTests.TestAddItem() regression test. (diff) | |
download | opensim-SC_OLD-2aa58c58435e0071da185d32a3f3cb622f699de0.zip opensim-SC_OLD-2aa58c58435e0071da185d32a3f3cb622f699de0.tar.gz opensim-SC_OLD-2aa58c58435e0071da185d32a3f3cb622f699de0.tar.bz2 opensim-SC_OLD-2aa58c58435e0071da185d32a3f3cb622f699de0.tar.xz |
Do not allow invariants to change on calls to XInventoryService.UpdateItem()
This is to help track down http://opensimulator.org/mantis/view.php?id=6359 where creator IDs on items and rezzed objects have been reported to sometimes change.
This should never happen - a particular item should never change creators (if an item is given then a new item (with new id) is created).
Invariants are inventory type, asset type, folder (changed only on MoveItems()), CreatorIdentification and Owner.
If caller attempts to change an invariant, warning is logged but other properties are still changed.
If you see this warning, reporting on Mantis 6359 would be very welcome with the exact operation being done at the time.
-rw-r--r-- | OpenSim/Services/InventoryService/Tests/XInventoryServiceTests.cs | 110 | ||||
-rw-r--r-- | OpenSim/Services/InventoryService/XInventoryService.cs | 40 |
2 files changed, 140 insertions, 10 deletions
diff --git a/OpenSim/Services/InventoryService/Tests/XInventoryServiceTests.cs b/OpenSim/Services/InventoryService/Tests/XInventoryServiceTests.cs index d2356c5..9e3fa69 100644 --- a/OpenSim/Services/InventoryService/Tests/XInventoryServiceTests.cs +++ b/OpenSim/Services/InventoryService/Tests/XInventoryServiceTests.cs | |||
@@ -43,8 +43,18 @@ namespace OpenSim.Services.InventoryService.Tests | |||
43 | /// TODO: Fill out more tests. | 43 | /// TODO: Fill out more tests. |
44 | /// </remarks> | 44 | /// </remarks> |
45 | [TestFixture] | 45 | [TestFixture] |
46 | public class XInventoryServiceTests | 46 | public class XInventoryServiceTests : OpenSimTestCase |
47 | { | 47 | { |
48 | private IInventoryService CreateXInventoryService() | ||
49 | { | ||
50 | IConfigSource config = new IniConfigSource(); | ||
51 | config.AddConfig("InventoryService"); | ||
52 | config.Configs["InventoryService"].Set("StorageProvider", "OpenSim.Tests.Common.dll"); | ||
53 | |||
54 | return ServerUtils.LoadPlugin<IInventoryService>( | ||
55 | "OpenSim.Services.InventoryService.dll:XInventoryService", new Object[] { config }); | ||
56 | } | ||
57 | |||
48 | /// <summary> | 58 | /// <summary> |
49 | /// Tests add item operation. | 59 | /// Tests add item operation. |
50 | /// </summary> | 60 | /// </summary> |
@@ -54,25 +64,31 @@ namespace OpenSim.Services.InventoryService.Tests | |||
54 | [Test] | 64 | [Test] |
55 | public void TestAddItem() | 65 | public void TestAddItem() |
56 | { | 66 | { |
67 | TestHelpers.InMethod(); | ||
68 | |||
57 | string creatorId = TestHelpers.ParseTail(0x1).ToString(); | 69 | string creatorId = TestHelpers.ParseTail(0x1).ToString(); |
58 | UUID ownerId = TestHelpers.ParseTail(0x2); | 70 | UUID ownerId = TestHelpers.ParseTail(0x2); |
59 | UUID itemId = TestHelpers.ParseTail(0x10); | 71 | UUID itemId = TestHelpers.ParseTail(0x10); |
60 | UUID assetId = TestHelpers.ParseTail(0x20); | 72 | UUID assetId = TestHelpers.ParseTail(0x20); |
73 | UUID folderId = TestHelpers.ParseTail(0x30); | ||
74 | int invType = (int)InventoryType.Animation; | ||
75 | int assetType = (int)AssetType.Animation; | ||
61 | string itemName = "item1"; | 76 | string itemName = "item1"; |
62 | 77 | ||
63 | IConfigSource config = new IniConfigSource(); | 78 | IInventoryService xis = CreateXInventoryService(); |
64 | config.AddConfig("InventoryService"); | ||
65 | config.Configs["InventoryService"].Set("StorageProvider", "OpenSim.Tests.Common.dll"); | ||
66 | |||
67 | IInventoryService xis | ||
68 | = ServerUtils.LoadPlugin<IInventoryService>( | ||
69 | "OpenSim.Services.InventoryService.dll:XInventoryService", new Object[] { config }); | ||
70 | 79 | ||
71 | InventoryItemBase itemToStore | 80 | InventoryItemBase itemToStore |
72 | = new InventoryItemBase(itemId, ownerId) | 81 | = new InventoryItemBase(itemId, ownerId) |
73 | { CreatorId = creatorId.ToString(), AssetID = assetId, Name = itemName }; | 82 | { |
83 | CreatorIdentification = creatorId.ToString(), | ||
84 | AssetID = assetId, | ||
85 | Name = itemName, | ||
86 | Folder = folderId, | ||
87 | InvType = invType, | ||
88 | AssetType = assetType | ||
89 | }; | ||
74 | 90 | ||
75 | xis.AddItem(itemToStore); | 91 | Assert.That(xis.AddItem(itemToStore), Is.True); |
76 | 92 | ||
77 | InventoryItemBase itemRetrieved = new InventoryItemBase(itemId); | 93 | InventoryItemBase itemRetrieved = new InventoryItemBase(itemId); |
78 | itemRetrieved = xis.GetItem(itemRetrieved); | 94 | itemRetrieved = xis.GetItem(itemRetrieved); |
@@ -81,7 +97,81 @@ namespace OpenSim.Services.InventoryService.Tests | |||
81 | Assert.That(itemRetrieved.CreatorId, Is.EqualTo(creatorId)); | 97 | Assert.That(itemRetrieved.CreatorId, Is.EqualTo(creatorId)); |
82 | Assert.That(itemRetrieved.Owner, Is.EqualTo(ownerId)); | 98 | Assert.That(itemRetrieved.Owner, Is.EqualTo(ownerId)); |
83 | Assert.That(itemRetrieved.AssetID, Is.EqualTo(assetId)); | 99 | Assert.That(itemRetrieved.AssetID, Is.EqualTo(assetId)); |
100 | Assert.That(itemRetrieved.Folder, Is.EqualTo(folderId)); | ||
101 | Assert.That(itemRetrieved.InvType, Is.EqualTo(invType)); | ||
102 | Assert.That(itemRetrieved.AssetType, Is.EqualTo(assetType)); | ||
84 | Assert.That(itemRetrieved.Name, Is.EqualTo(itemName)); | 103 | Assert.That(itemRetrieved.Name, Is.EqualTo(itemName)); |
85 | } | 104 | } |
105 | |||
106 | [Test] | ||
107 | public void TestUpdateItem() | ||
108 | { | ||
109 | TestHelpers.InMethod(); | ||
110 | // TestHelpers.EnableLogging(); | ||
111 | |||
112 | string creatorId = TestHelpers.ParseTail(0x1).ToString(); | ||
113 | UUID ownerId = TestHelpers.ParseTail(0x2); | ||
114 | UUID itemId = TestHelpers.ParseTail(0x10); | ||
115 | UUID assetId = TestHelpers.ParseTail(0x20); | ||
116 | UUID folderId = TestHelpers.ParseTail(0x30); | ||
117 | int invType = (int)InventoryType.Animation; | ||
118 | int assetType = (int)AssetType.Animation; | ||
119 | string itemName = "item1"; | ||
120 | string itemName2 = "item2"; | ||
121 | |||
122 | IInventoryService xis = CreateXInventoryService(); | ||
123 | |||
124 | InventoryItemBase itemToStore | ||
125 | = new InventoryItemBase(itemId, ownerId) | ||
126 | { | ||
127 | CreatorIdentification = creatorId.ToString(), | ||
128 | AssetID = assetId, | ||
129 | Name = itemName, | ||
130 | Folder = folderId, | ||
131 | InvType = invType, | ||
132 | AssetType = assetType | ||
133 | }; | ||
134 | |||
135 | Assert.That(xis.AddItem(itemToStore), Is.True); | ||
136 | |||
137 | // Normal update | ||
138 | itemToStore.Name = itemName2; | ||
139 | |||
140 | Assert.That(xis.UpdateItem(itemToStore), Is.True); | ||
141 | |||
142 | InventoryItemBase itemRetrieved = new InventoryItemBase(itemId); | ||
143 | itemRetrieved = xis.GetItem(itemRetrieved); | ||
144 | |||
145 | Assert.That(itemRetrieved, Is.Not.Null); | ||
146 | Assert.That(itemRetrieved.Name, Is.EqualTo(itemName2)); | ||
147 | |||
148 | // Attempt to update properties that should never change | ||
149 | string creatorId2 = TestHelpers.ParseTail(0x7).ToString(); | ||
150 | UUID ownerId2 = TestHelpers.ParseTail(0x8); | ||
151 | UUID folderId2 = TestHelpers.ParseTail(0x70); | ||
152 | int invType2 = (int)InventoryType.CallingCard; | ||
153 | int assetType2 = (int)AssetType.CallingCard; | ||
154 | string itemName3 = "item3"; | ||
155 | |||
156 | itemToStore.CreatorIdentification = creatorId2.ToString(); | ||
157 | itemToStore.Owner = ownerId2; | ||
158 | itemToStore.Folder = folderId2; | ||
159 | itemToStore.InvType = invType2; | ||
160 | itemToStore.AssetType = assetType2; | ||
161 | itemToStore.Name = itemName3; | ||
162 | |||
163 | Assert.That(xis.UpdateItem(itemToStore), Is.True); | ||
164 | |||
165 | itemRetrieved = xis.GetItem(itemRetrieved); | ||
166 | |||
167 | Assert.That(itemRetrieved, Is.Not.Null); | ||
168 | Assert.That(itemRetrieved.CreatorId, Is.EqualTo(creatorId)); | ||
169 | Assert.That(itemRetrieved.Owner, Is.EqualTo(ownerId)); | ||
170 | Assert.That(itemRetrieved.AssetID, Is.EqualTo(assetId)); | ||
171 | Assert.That(itemRetrieved.Folder, Is.EqualTo(folderId)); | ||
172 | Assert.That(itemRetrieved.InvType, Is.EqualTo(invType)); | ||
173 | Assert.That(itemRetrieved.AssetType, Is.EqualTo(assetType)); | ||
174 | Assert.That(itemRetrieved.Name, Is.EqualTo(itemName3)); | ||
175 | } | ||
86 | } | 176 | } |
87 | } \ No newline at end of file | 177 | } \ No newline at end of file |
diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs index 9abc5e4..00faa44 100644 --- a/OpenSim/Services/InventoryService/XInventoryService.cs +++ b/OpenSim/Services/InventoryService/XInventoryService.cs | |||
@@ -476,6 +476,46 @@ namespace OpenSim.Services.InventoryService | |||
476 | // m_log.InfoFormat( | 476 | // m_log.InfoFormat( |
477 | // "[XINVENTORY SERVICE]: Updating item {0} {1} in folder {2}", item.Name, item.ID, item.Folder); | 477 | // "[XINVENTORY SERVICE]: Updating item {0} {1} in folder {2}", item.Name, item.ID, item.Folder); |
478 | 478 | ||
479 | InventoryItemBase retrievedItem = GetItem(item); | ||
480 | |||
481 | if (retrievedItem == null) | ||
482 | { | ||
483 | m_log.WarnFormat( | ||
484 | "[XINVENTORY SERVICE]: Tried to update item {0} {1}, owner {2} but no existing item found.", | ||
485 | item.Name, item.ID, item.Owner); | ||
486 | |||
487 | return false; | ||
488 | } | ||
489 | |||
490 | // Do not allow invariants to change. Changes to folder ID occur in MoveItems() | ||
491 | if (retrievedItem.InvType != item.InvType | ||
492 | || retrievedItem.AssetType != item.AssetType | ||
493 | || retrievedItem.Folder != item.Folder | ||
494 | || retrievedItem.CreatorIdentification != item.CreatorIdentification | ||
495 | || retrievedItem.Owner != item.Owner) | ||
496 | { | ||
497 | m_log.WarnFormat( | ||
498 | "[XINVENTORY SERVICE]: Caller to UpdateItem() for {0} {1} tried to alter property(s) that should be invariant, (InvType, AssetType, Folder, CreatorIdentification, Owner), existing ({2}, {3}, {4}, {5}, {6}), update ({7}, {8}, {9}, {10}, {11})", | ||
499 | retrievedItem.Name, | ||
500 | retrievedItem.ID, | ||
501 | retrievedItem.InvType, | ||
502 | retrievedItem.AssetType, | ||
503 | retrievedItem.Folder, | ||
504 | retrievedItem.CreatorIdentification, | ||
505 | retrievedItem.Owner, | ||
506 | item.InvType, | ||
507 | item.AssetType, | ||
508 | item.Folder, | ||
509 | item.CreatorIdentification, | ||
510 | item.Owner); | ||
511 | |||
512 | item.InvType = retrievedItem.InvType; | ||
513 | item.AssetType = retrievedItem.AssetType; | ||
514 | item.Folder = retrievedItem.Folder; | ||
515 | item.CreatorIdentification = retrievedItem.CreatorIdentification; | ||
516 | item.Owner = retrievedItem.Owner; | ||
517 | } | ||
518 | |||
479 | return m_Database.StoreItem(ConvertFromOpenSim(item)); | 519 | return m_Database.StoreItem(ConvertFromOpenSim(item)); |
480 | } | 520 | } |
481 | 521 | ||