diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Data/Tests/PropertyScrambler.cs (renamed from OpenSim/Data/Tests/ScrambleForTesting.cs) | 101 |
1 files changed, 79 insertions, 22 deletions
diff --git a/OpenSim/Data/Tests/ScrambleForTesting.cs b/OpenSim/Data/Tests/PropertyScrambler.cs index 3a22347..72aaff1 100644 --- a/OpenSim/Data/Tests/ScrambleForTesting.cs +++ b/OpenSim/Data/Tests/PropertyScrambler.cs | |||
@@ -27,18 +27,58 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | ||
31 | using System.Linq.Expressions; | ||
30 | using System.Reflection; | 32 | using System.Reflection; |
31 | using System.Text; | 33 | using System.Text; |
32 | using NUnit.Framework; | 34 | using NUnit.Framework; |
35 | using NUnit.Framework.SyntaxHelpers; | ||
33 | using OpenMetaverse; | 36 | using OpenMetaverse; |
34 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
35 | 38 | ||
36 | namespace OpenSim.Data.Tests | 39 | namespace OpenSim.Data.Tests |
37 | { | 40 | { |
38 | public static class ScrambleForTesting | 41 | |
42 | //This is generic so that the lambda expressions will work right in IDEs. | ||
43 | public class PropertyScrambler<T> | ||
39 | { | 44 | { |
40 | private static readonly Random random = new Random(); | 45 | readonly System.Collections.Generic.List<string> membersToNotScramble = new List<string>(); |
41 | public static void Scramble(object obj) | 46 | |
47 | private void AddExpressionToNotScrableList(Expression expression) | ||
48 | { | ||
49 | UnaryExpression unaryExpression = expression as UnaryExpression; | ||
50 | if (unaryExpression != null) | ||
51 | { | ||
52 | AddExpressionToNotScrableList(unaryExpression.Operand); | ||
53 | return; | ||
54 | } | ||
55 | |||
56 | MemberExpression memberExpression = expression as MemberExpression; | ||
57 | if (memberExpression != null) | ||
58 | { | ||
59 | if (!(memberExpression.Member is PropertyInfo)) | ||
60 | { | ||
61 | throw new NotImplementedException("I don't know how deal with a MemberExpression that is a " + expression.Type); | ||
62 | } | ||
63 | membersToNotScramble.Add(memberExpression.Member.Name); | ||
64 | return; | ||
65 | } | ||
66 | |||
67 | throw new NotImplementedException("I don't know how to parse a " + expression.Type); | ||
68 | } | ||
69 | |||
70 | public PropertyScrambler<T> DontScramble(Expression<Func<T, object>> expression) | ||
71 | { | ||
72 | AddExpressionToNotScrableList(expression.Body); | ||
73 | return this; | ||
74 | } | ||
75 | |||
76 | public void Scramble(T obj) | ||
77 | { | ||
78 | internalScramble(obj); | ||
79 | } | ||
80 | |||
81 | private void internalScramble(object obj) | ||
42 | { | 82 | { |
43 | PropertyInfo[] properties = obj.GetType().GetProperties(); | 83 | PropertyInfo[] properties = obj.GetType().GetProperties(); |
44 | foreach (var property in properties) | 84 | foreach (var property in properties) |
@@ -57,13 +97,16 @@ namespace OpenSim.Data.Tests | |||
57 | { | 97 | { |
58 | foreach (object value in enumerable) | 98 | foreach (object value in enumerable) |
59 | { | 99 | { |
60 | Scramble(value); | 100 | internalScramble(value); |
61 | } | 101 | } |
62 | } | 102 | } |
63 | } | 103 | } |
64 | 104 | ||
65 | private static void RandomizeProperty(object obj, PropertyInfo property, object[] index) | 105 | private readonly Random random = new Random(); |
66 | { | 106 | private void RandomizeProperty(object obj, PropertyInfo property, object[] index) |
107 | {//I'd like a better way to compare, but I had lots of problems with InventoryFolderBase because the ID is inherited. | ||
108 | if (membersToNotScramble.Contains(property.Name)) | ||
109 | return; | ||
67 | Type t = property.PropertyType; | 110 | Type t = property.PropertyType; |
68 | if (!property.CanWrite) | 111 | if (!property.CanWrite) |
69 | return; | 112 | return; |
@@ -71,39 +114,39 @@ namespace OpenSim.Data.Tests | |||
71 | if (value == null) | 114 | if (value == null) |
72 | return; | 115 | return; |
73 | 116 | ||
74 | if (t == typeof (string)) | 117 | if (t == typeof(string)) |
75 | property.SetValue(obj, RandomName(), index); | 118 | property.SetValue(obj, RandomName(), index); |
76 | else if (t == typeof (UUID)) | 119 | else if (t == typeof(UUID)) |
77 | property.SetValue(obj, UUID.Random(), index); | 120 | property.SetValue(obj, UUID.Random(), index); |
78 | else if (t == typeof (sbyte)) | 121 | else if (t == typeof(sbyte)) |
79 | property.SetValue(obj, (sbyte)random.Next(sbyte.MinValue, sbyte.MaxValue), index); | 122 | property.SetValue(obj, (sbyte)random.Next(sbyte.MinValue, sbyte.MaxValue), index); |
80 | else if (t == typeof (short)) | 123 | else if (t == typeof(short)) |
81 | property.SetValue(obj, (short)random.Next(short.MinValue, short.MaxValue), index); | 124 | property.SetValue(obj, (short)random.Next(short.MinValue, short.MaxValue), index); |
82 | else if (t == typeof (int)) | 125 | else if (t == typeof(int)) |
83 | property.SetValue(obj, random.Next(), index); | 126 | property.SetValue(obj, random.Next(), index); |
84 | else if (t == typeof (long)) | 127 | else if (t == typeof(long)) |
85 | property.SetValue(obj, random.Next() * int.MaxValue, index); | 128 | property.SetValue(obj, random.Next() * int.MaxValue, index); |
86 | else if (t == typeof (byte)) | 129 | else if (t == typeof(byte)) |
87 | property.SetValue(obj, (byte)random.Next(byte.MinValue, byte.MaxValue), index); | 130 | property.SetValue(obj, (byte)random.Next(byte.MinValue, byte.MaxValue), index); |
88 | else if (t == typeof (ushort)) | 131 | else if (t == typeof(ushort)) |
89 | property.SetValue(obj, (ushort)random.Next(ushort.MinValue, ushort.MaxValue), index); | 132 | property.SetValue(obj, (ushort)random.Next(ushort.MinValue, ushort.MaxValue), index); |
90 | else if (t == typeof (uint)) | 133 | else if (t == typeof(uint)) |
91 | property.SetValue(obj, Convert.ToUInt32(random.Next()), index); | 134 | property.SetValue(obj, Convert.ToUInt32(random.Next()), index); |
92 | else if (t == typeof (ulong)) | 135 | else if (t == typeof(ulong)) |
93 | property.SetValue(obj, Convert.ToUInt64(random.Next()) * Convert.ToUInt64(UInt32.MaxValue), index); | 136 | property.SetValue(obj, Convert.ToUInt64(random.Next()) * Convert.ToUInt64(UInt32.MaxValue), index); |
94 | else if (t == typeof (bool)) | 137 | else if (t == typeof(bool)) |
95 | property.SetValue(obj, true, index); | 138 | property.SetValue(obj, true, index); |
96 | else if (t == typeof (byte[])) | 139 | else if (t == typeof(byte[])) |
97 | { | 140 | { |
98 | byte[] bytes = new byte[30]; | 141 | byte[] bytes = new byte[30]; |
99 | random.NextBytes(bytes); | 142 | random.NextBytes(bytes); |
100 | property.SetValue(obj, bytes, index); | 143 | property.SetValue(obj, bytes, index); |
101 | } | 144 | } |
102 | else | 145 | else |
103 | Scramble(value); | 146 | internalScramble(value); |
104 | } | 147 | } |
105 | 148 | ||
106 | private static string RandomName() | 149 | private string RandomName() |
107 | { | 150 | { |
108 | StringBuilder name = new StringBuilder(); | 151 | StringBuilder name = new StringBuilder(); |
109 | int size = random.Next(5, 12); | 152 | int size = random.Next(5, 12); |
@@ -117,13 +160,27 @@ namespace OpenSim.Data.Tests | |||
117 | } | 160 | } |
118 | 161 | ||
119 | [TestFixture] | 162 | [TestFixture] |
120 | public class ScrableForTestingTest | 163 | public class PropertyScramblerTests |
121 | { | 164 | { |
122 | [Test] | 165 | [Test] |
123 | public void TestScramble() | 166 | public void TestScramble() |
124 | { | 167 | { |
125 | AssetBase actual = new AssetBase(UUID.Random(), "asset one"); | 168 | AssetBase actual = new AssetBase(UUID.Random(), "asset one"); |
126 | ScrambleForTesting.Scramble(actual); | 169 | new PropertyScrambler<AssetBase>().Scramble(actual); |
170 | } | ||
171 | |||
172 | [Test] | ||
173 | public void DontScramble() | ||
174 | { | ||
175 | UUID uuid = UUID.Random(); | ||
176 | AssetBase asset = new AssetBase(); | ||
177 | asset.FullID = uuid; | ||
178 | new PropertyScrambler<AssetBase>() | ||
179 | .DontScramble(x => x.Metadata) | ||
180 | .DontScramble(x => x.FullID) | ||
181 | .DontScramble(x => x.ID) | ||
182 | .Scramble(asset); | ||
183 | Assert.That(asset.FullID, Is.EqualTo(uuid)); | ||
127 | } | 184 | } |
128 | } | 185 | } |
129 | } \ No newline at end of file | 186 | } \ No newline at end of file |