diff options
author | Justin Clark-Casey (justincc) | 2011-03-26 00:34:49 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2011-03-26 00:34:49 +0000 |
commit | cc8897fcebdc9d3e875c9bf745ecb77678a776e9 (patch) | |
tree | dbc71e5174977e5e4ab2a5115c72b377acafa5d8 /OpenSim | |
parent | Start using IPrimCounts populated by PrimCountModule instead of LandData coun... (diff) | |
download | opensim-SC-cc8897fcebdc9d3e875c9bf745ecb77678a776e9.zip opensim-SC-cc8897fcebdc9d3e875c9bf745ecb77678a776e9.tar.gz opensim-SC-cc8897fcebdc9d3e875c9bf745ecb77678a776e9.tar.bz2 opensim-SC-cc8897fcebdc9d3e875c9bf745ecb77678a776e9.tar.xz |
Add test for PCM taint. This currently fails due to unexpected behaviour of SceneGraph.ForEachSOG(). This will be corrected soon.
Also adds lots of temproarily debug logging
Diffstat (limited to 'OpenSim')
4 files changed, 201 insertions, 16 deletions
diff --git a/OpenSim/Framework/ILandObject.cs b/OpenSim/Framework/ILandObject.cs new file mode 100644 index 0000000..931e24a --- /dev/null +++ b/OpenSim/Framework/ILandObject.cs | |||
@@ -0,0 +1,112 @@ | |||
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.Collections.Generic; | ||
29 | using OpenMetaverse; | ||
30 | |||
31 | namespace OpenSim.Framework | ||
32 | { | ||
33 | public delegate int overrideParcelMaxPrimCountDelegate(ILandObject obj); | ||
34 | public delegate int overrideSimulatorMaxPrimCountDelegate(ILandObject obj); | ||
35 | |||
36 | public interface ILandObject | ||
37 | { | ||
38 | int GetParcelMaxPrimCount(ILandObject thisObject); | ||
39 | int GetSimulatorMaxPrimCount(ILandObject thisObject); | ||
40 | int GetPrimsFree(); | ||
41 | |||
42 | LandData LandData { get; set; } | ||
43 | bool[,] LandBitmap { get; set; } | ||
44 | UUID RegionUUID { get; } | ||
45 | |||
46 | /// <summary> | ||
47 | /// Prim counts for this land object. | ||
48 | /// </summary> | ||
49 | IPrimCounts PrimCounts { get; set; } | ||
50 | |||
51 | /// <summary> | ||
52 | /// The start point for the land object. This is the western-most point as one scans land working from | ||
53 | /// north to south. | ||
54 | /// </summary> | ||
55 | Vector3 StartPoint { get; } | ||
56 | |||
57 | /// <summary> | ||
58 | /// The end point for the land object. This is the eastern-most point as one scans land working from | ||
59 | /// south to north. | ||
60 | /// </summary> | ||
61 | Vector3 EndPoint { get; } | ||
62 | |||
63 | bool ContainsPoint(int x, int y); | ||
64 | |||
65 | ILandObject Copy(); | ||
66 | |||
67 | void SendLandUpdateToAvatarsOverMe(); | ||
68 | |||
69 | void SendLandProperties(int sequence_id, bool snap_selection, int request_result, IClientAPI remote_client); | ||
70 | void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client); | ||
71 | bool IsEitherBannedOrRestricted(UUID avatar); | ||
72 | bool IsBannedFromLand(UUID avatar); | ||
73 | bool IsRestrictedFromLand(UUID avatar); | ||
74 | void SendLandUpdateToClient(IClientAPI remote_client); | ||
75 | void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client); | ||
76 | List<UUID> CreateAccessListArrayByFlag(AccessList flag); | ||
77 | void SendAccessList(UUID agentID, UUID sessionID, uint flags, int sequenceID, IClientAPI remote_client); | ||
78 | void UpdateAccessList(uint flags, UUID transactionID, int sequenceID, int sections, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client); | ||
79 | void UpdateLandBitmapByteArray(); | ||
80 | void SetLandBitmapFromByteArray(); | ||
81 | bool[,] GetLandBitmap(); | ||
82 | void ForceUpdateLandInfo(); | ||
83 | void SetLandBitmap(bool[,] bitmap); | ||
84 | |||
85 | bool[,] BasicFullRegionLandBitmap(); | ||
86 | bool[,] GetSquareLandBitmap(int start_x, int start_y, int end_x, int end_y); | ||
87 | bool[,] ModifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value); | ||
88 | bool[,] MergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add); | ||
89 | void SendForceObjectSelect(int local_id, int request_type, List<UUID> returnIDs, IClientAPI remote_client); | ||
90 | void SendLandObjectOwners(IClientAPI remote_client); | ||
91 | void ReturnLandObjects(uint type, UUID[] owners, UUID[] tasks, IClientAPI remote_client); | ||
92 | void ResetLandPrimCounts(); | ||
93 | void UpdateLandSold(UUID avatarID, UUID groupID, bool groupOwned, uint AuctionID, int claimprice, int area); | ||
94 | |||
95 | void DeedToGroup(UUID groupID); | ||
96 | |||
97 | void SetParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel); | ||
98 | void SetSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel); | ||
99 | |||
100 | /// <summary> | ||
101 | /// Set the media url for this land parcel | ||
102 | /// </summary> | ||
103 | /// <param name="url"></param> | ||
104 | void SetMediaUrl(string url); | ||
105 | |||
106 | /// <summary> | ||
107 | /// Set the music url for this land parcel | ||
108 | /// </summary> | ||
109 | /// <param name="url"></param> | ||
110 | void SetMusicUrl(string url); | ||
111 | } | ||
112 | } | ||
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 6138056..0b6b04d 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -4276,6 +4276,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4276 | int sequence_id, bool snap_selection, int request_result, ILandObject lo, | 4276 | int sequence_id, bool snap_selection, int request_result, ILandObject lo, |
4277 | float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags) | 4277 | float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags) |
4278 | { | 4278 | { |
4279 | m_log.DebugFormat("[LLCLIENTVIEW]: Sending land properties for {0} to {1}", lo.LandData.GlobalID, Name); | ||
4280 | |||
4279 | LandData landData = lo.LandData; | 4281 | LandData landData = lo.LandData; |
4280 | 4282 | ||
4281 | ParcelPropertiesMessage updateMessage = new ParcelPropertiesMessage(); | 4283 | ParcelPropertiesMessage updateMessage = new ParcelPropertiesMessage(); |
diff --git a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs index 9fd347e..72115a8 100644 --- a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs | |||
@@ -51,8 +51,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
51 | 51 | ||
52 | public class PrimCountModule : IPrimCountModule, INonSharedRegionModule | 52 | public class PrimCountModule : IPrimCountModule, INonSharedRegionModule |
53 | { | 53 | { |
54 | // private static readonly ILog m_log = | 54 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
55 | // LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
56 | 55 | ||
57 | private Scene m_Scene; | 56 | private Scene m_Scene; |
58 | private Dictionary<UUID, PrimCounts> m_PrimCounts = | 57 | private Dictionary<UUID, PrimCounts> m_PrimCounts = |
@@ -123,6 +122,11 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
123 | { | 122 | { |
124 | if (!m_Tainted) | 123 | if (!m_Tainted) |
125 | AddObject(obj); | 124 | AddObject(obj); |
125 | else | ||
126 | m_log.DebugFormat( | ||
127 | "[PRIM COUNT MODULE]: Ignoring OnParcelPrimCountAdd() for {0} on {1} since count is tainted", | ||
128 | obj.Name, m_Scene.RegionInfo.RegionName); | ||
129 | |||
126 | } | 130 | } |
127 | } | 131 | } |
128 | 132 | ||
@@ -133,11 +137,18 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
133 | { | 137 | { |
134 | if (!m_Tainted) | 138 | if (!m_Tainted) |
135 | RemoveObject(obj); | 139 | RemoveObject(obj); |
140 | else | ||
141 | m_log.DebugFormat( | ||
142 | "[PRIM COUNT MODULE]: Ignoring OnObjectBeingRemovedFromScene() for {0} on {1} since count is tainted", | ||
143 | obj.Name, m_Scene.RegionInfo.RegionName); | ||
136 | } | 144 | } |
137 | } | 145 | } |
138 | 146 | ||
139 | private void OnParcelPrimCountTainted() | 147 | private void OnParcelPrimCountTainted() |
140 | { | 148 | { |
149 | m_log.DebugFormat( | ||
150 | "[PRIM COUNT MODULE]: OnParcelPrimCountTainted() called on {0}", m_Scene.RegionInfo.RegionName); | ||
151 | |||
141 | lock (m_TaintLock) | 152 | lock (m_TaintLock) |
142 | m_Tainted = true; | 153 | m_Tainted = true; |
143 | } | 154 | } |
@@ -163,7 +174,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
163 | // NOTE: Call under Taint Lock | 174 | // NOTE: Call under Taint Lock |
164 | private void AddObject(SceneObjectGroup obj) | 175 | private void AddObject(SceneObjectGroup obj) |
165 | { | 176 | { |
166 | // m_log.DebugFormat("[PRIM COUNT MODULE]: Adding object {0} to prim count", obj.Name); | 177 | m_log.DebugFormat("[PRIM COUNT MODULE]: Adding object {0} {1} to prim count", obj.Name, obj.UUID); |
167 | 178 | ||
168 | if (obj.IsAttachment) | 179 | if (obj.IsAttachment) |
169 | return; | 180 | return; |
@@ -214,10 +225,14 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
214 | // NOTE: Call under Taint Lock | 225 | // NOTE: Call under Taint Lock |
215 | private void RemoveObject(SceneObjectGroup obj) | 226 | private void RemoveObject(SceneObjectGroup obj) |
216 | { | 227 | { |
228 | m_log.DebugFormat("[PRIM COUNT MODULE]: Removing object {0} {1} from prim count", obj.Name, obj.UUID); | ||
217 | } | 229 | } |
218 | 230 | ||
219 | public IPrimCounts GetPrimCounts(UUID parcelID) | 231 | public IPrimCounts GetPrimCounts(UUID parcelID) |
220 | { | 232 | { |
233 | m_log.DebugFormat( | ||
234 | "[PRIM COUNT MODULE]: GetPrimCounts for parcel {0} in {1}", parcelID, m_Scene.RegionInfo.RegionName); | ||
235 | |||
221 | PrimCounts primCounts; | 236 | PrimCounts primCounts; |
222 | 237 | ||
223 | lock (m_PrimCounts) | 238 | lock (m_PrimCounts) |
@@ -239,7 +254,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
239 | /// <returns></returns> | 254 | /// <returns></returns> |
240 | public int GetOwnerCount(UUID parcelID) | 255 | public int GetOwnerCount(UUID parcelID) |
241 | { | 256 | { |
242 | // m_log.DebugFormat("[PRIM COUNT MODULE]: GetOwnerCount for {0}", parcelID); | 257 | int count = 0; |
243 | 258 | ||
244 | lock (m_TaintLock) | 259 | lock (m_TaintLock) |
245 | { | 260 | { |
@@ -248,9 +263,14 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
248 | 263 | ||
249 | ParcelCounts counts; | 264 | ParcelCounts counts; |
250 | if (m_ParcelCounts.TryGetValue(parcelID, out counts)) | 265 | if (m_ParcelCounts.TryGetValue(parcelID, out counts)) |
251 | return counts.Owner; | 266 | count = counts.Owner; |
252 | } | 267 | } |
253 | return 0; | 268 | |
269 | m_log.DebugFormat( | ||
270 | "[PRIM COUNT MODULE]: GetOwnerCount for parcel {0} in {1} returning {2}", | ||
271 | parcelID, m_Scene.RegionInfo.RegionName, count); | ||
272 | |||
273 | return count; | ||
254 | } | 274 | } |
255 | 275 | ||
256 | /// <summary> | 276 | /// <summary> |
@@ -260,6 +280,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
260 | /// <returns></returns> | 280 | /// <returns></returns> |
261 | public int GetGroupCount(UUID parcelID) | 281 | public int GetGroupCount(UUID parcelID) |
262 | { | 282 | { |
283 | int count = 0; | ||
284 | |||
263 | lock (m_TaintLock) | 285 | lock (m_TaintLock) |
264 | { | 286 | { |
265 | if (m_Tainted) | 287 | if (m_Tainted) |
@@ -267,9 +289,14 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
267 | 289 | ||
268 | ParcelCounts counts; | 290 | ParcelCounts counts; |
269 | if (m_ParcelCounts.TryGetValue(parcelID, out counts)) | 291 | if (m_ParcelCounts.TryGetValue(parcelID, out counts)) |
270 | return counts.Group; | 292 | count = counts.Group; |
271 | } | 293 | } |
272 | return 0; | 294 | |
295 | m_log.DebugFormat( | ||
296 | "[PRIM COUNT MODULE]: GetGroupCount for parcel {0} in {1} returning {2}", | ||
297 | parcelID, m_Scene.RegionInfo.RegionName, count); | ||
298 | |||
299 | return count; | ||
273 | } | 300 | } |
274 | 301 | ||
275 | /// <summary> | 302 | /// <summary> |
@@ -279,6 +306,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
279 | /// <returns></returns> | 306 | /// <returns></returns> |
280 | public int GetOthersCount(UUID parcelID) | 307 | public int GetOthersCount(UUID parcelID) |
281 | { | 308 | { |
309 | int count = 0; | ||
310 | |||
282 | lock (m_TaintLock) | 311 | lock (m_TaintLock) |
283 | { | 312 | { |
284 | if (m_Tainted) | 313 | if (m_Tainted) |
@@ -286,9 +315,14 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
286 | 315 | ||
287 | ParcelCounts counts; | 316 | ParcelCounts counts; |
288 | if (m_ParcelCounts.TryGetValue(parcelID, out counts)) | 317 | if (m_ParcelCounts.TryGetValue(parcelID, out counts)) |
289 | return counts.Others; | 318 | count = counts.Others; |
290 | } | 319 | } |
291 | return 0; | 320 | |
321 | m_log.DebugFormat( | ||
322 | "[PRIM COUNT MODULE]: GetOthersCount for parcel {0} in {1} returning {2}", | ||
323 | parcelID, m_Scene.RegionInfo.RegionName, count); | ||
324 | |||
325 | return count; | ||
292 | } | 326 | } |
293 | 327 | ||
294 | /// <summary> | 328 | /// <summary> |
@@ -298,6 +332,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
298 | /// <returns></returns> | 332 | /// <returns></returns> |
299 | public int GetSimulatorCount(UUID parcelID) | 333 | public int GetSimulatorCount(UUID parcelID) |
300 | { | 334 | { |
335 | int count = 0; | ||
336 | |||
301 | lock (m_TaintLock) | 337 | lock (m_TaintLock) |
302 | { | 338 | { |
303 | if (m_Tainted) | 339 | if (m_Tainted) |
@@ -308,10 +344,15 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
308 | { | 344 | { |
309 | int val; | 345 | int val; |
310 | if (m_SimwideCounts.TryGetValue(owner, out val)) | 346 | if (m_SimwideCounts.TryGetValue(owner, out val)) |
311 | return val; | 347 | count = val; |
312 | } | 348 | } |
313 | } | 349 | } |
314 | return 0; | 350 | |
351 | m_log.DebugFormat( | ||
352 | "[PRIM COUNT MODULE]: GetOthersCount for parcel {0} in {1} returning {2}", | ||
353 | parcelID, m_Scene.RegionInfo.RegionName, count); | ||
354 | |||
355 | return count; | ||
315 | } | 356 | } |
316 | 357 | ||
317 | /// <summary> | 358 | /// <summary> |
@@ -322,6 +363,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
322 | /// <returns></returns> | 363 | /// <returns></returns> |
323 | public int GetUserCount(UUID parcelID, UUID userID) | 364 | public int GetUserCount(UUID parcelID, UUID userID) |
324 | { | 365 | { |
366 | int count = 0; | ||
367 | |||
325 | lock (m_TaintLock) | 368 | lock (m_TaintLock) |
326 | { | 369 | { |
327 | if (m_Tainted) | 370 | if (m_Tainted) |
@@ -332,16 +375,21 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
332 | { | 375 | { |
333 | int val; | 376 | int val; |
334 | if (counts.Users.TryGetValue(userID, out val)) | 377 | if (counts.Users.TryGetValue(userID, out val)) |
335 | return val; | 378 | count = val; |
336 | } | 379 | } |
337 | } | 380 | } |
338 | return 0; | 381 | |
382 | m_log.DebugFormat( | ||
383 | "[PRIM COUNT MODULE]: GetUserCount for user {0} in parcel {1} in region {2} returning {3}", | ||
384 | userID, parcelID, m_Scene.RegionInfo.RegionName, count); | ||
385 | |||
386 | return count; | ||
339 | } | 387 | } |
340 | 388 | ||
341 | // NOTE: This method MUST be called while holding the taint lock! | 389 | // NOTE: This method MUST be called while holding the taint lock! |
342 | private void Recount() | 390 | private void Recount() |
343 | { | 391 | { |
344 | // m_log.DebugFormat("[PRIM COUNT MODULE]: Recounting prims on {0}", m_Scene.RegionInfo.RegionName); | 392 | m_log.DebugFormat("[PRIM COUNT MODULE]: Recounting prims on {0}", m_Scene.RegionInfo.RegionName); |
345 | 393 | ||
346 | m_OwnerMap.Clear(); | 394 | m_OwnerMap.Clear(); |
347 | m_SimwideCounts.Clear(); | 395 | m_SimwideCounts.Clear(); |
@@ -367,6 +415,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
367 | if (!m_OwnerMap.ContainsKey(k)) | 415 | if (!m_OwnerMap.ContainsKey(k)) |
368 | m_PrimCounts.Remove(k); | 416 | m_PrimCounts.Remove(k); |
369 | } | 417 | } |
418 | |||
370 | m_Tainted = false; | 419 | m_Tainted = false; |
371 | } | 420 | } |
372 | } | 421 | } |
diff --git a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs index c9d393f..80b2859 100644 --- a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs +++ b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs | |||
@@ -126,6 +126,28 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests | |||
126 | Assert.That(pc.Users[m_userId], Is.EqualTo(1)); | 126 | Assert.That(pc.Users[m_userId], Is.EqualTo(1)); |
127 | Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0)); | 127 | Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0)); |
128 | Assert.That(pc.Simulator, Is.EqualTo(1)); | 128 | Assert.That(pc.Simulator, Is.EqualTo(1)); |
129 | } | 129 | } |
130 | |||
131 | /// <summary> | ||
132 | /// Test the count is correct after is has been tainted. | ||
133 | /// </summary> | ||
134 | [Test] | ||
135 | public void TestTaint() | ||
136 | { | ||
137 | TestHelper.InMethod(); | ||
138 | IPrimCounts pc = m_lo.PrimCounts; | ||
139 | |||
140 | SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x01); | ||
141 | m_scene.AddNewSceneObject(sog, false); | ||
142 | |||
143 | m_pcm.TaintPrimCount(); | ||
144 | |||
145 | Assert.That(pc.Owner, Is.EqualTo(3)); | ||
146 | Assert.That(pc.Group, Is.EqualTo(0)); | ||
147 | Assert.That(pc.Others, Is.EqualTo(0)); | ||
148 | Assert.That(pc.Users[m_userId], Is.EqualTo(3)); | ||
149 | Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0)); | ||
150 | Assert.That(pc.Simulator, Is.EqualTo(3)); | ||
151 | } | ||
130 | } | 152 | } |
131 | } \ No newline at end of file | 153 | } \ No newline at end of file |