1
+ using Microsoft . Extensions . Configuration ;
1
2
using Microsoft . Extensions . DependencyInjection ;
2
3
using Orleans . Runtime . Placement ;
3
4
using Orleans . Runtime . Placement . Filtering ;
@@ -10,6 +11,9 @@ namespace UnitTests.PlacementFilterTests;
10
11
[ TestCategory ( "Placement" ) , TestCategory ( "Filters" ) ]
11
12
public class GrainPlacementFilterTests : TestClusterPerTest
12
13
{
14
+ public static Dictionary < string , List < string > > FilterScratchpad = new ( ) ;
15
+ private static Random random = new ( ) ;
16
+
13
17
protected override void ConfigureTestCluster ( TestClusterBuilder builder )
14
18
{
15
19
builder . AddSiloBuilderConfigurator < SiloConfigurator > ( ) ;
@@ -22,10 +26,13 @@ public void Configure(ISiloBuilder hostBuilder)
22
26
hostBuilder . ConfigureServices ( services =>
23
27
{
24
28
services . AddPlacementFilter < TestPlacementFilterStrategy , TestPlacementFilterDirector > ( ServiceLifetime . Singleton ) ;
29
+ services . AddPlacementFilter < OrderAPlacementFilterStrategy , OrderAPlacementFilterDirector > ( ServiceLifetime . Singleton ) ;
30
+ services . AddPlacementFilter < OrderBPlacementFilterStrategy , OrderBPlacementFilterDirector > ( ServiceLifetime . Singleton ) ;
25
31
} ) ;
26
32
}
27
33
}
28
34
35
+
29
36
[ Fact , TestCategory ( "Functional" ) ]
30
37
public async Task PlacementFilter_GrainWithoutFilterCanBeCalled ( )
31
38
{
@@ -49,9 +56,79 @@ public async Task PlacementFilter_FilterIsTriggered()
49
56
await task ;
50
57
Assert . True ( triggered ) ;
51
58
}
59
+
60
+ [ Fact , TestCategory ( "Functional" ) ]
61
+ public async Task PlacementFilter_OrderAB12 ( )
62
+ {
63
+ await HostedCluster . WaitForLivenessToStabilizeAsync ( ) ;
64
+
65
+ var primaryKey = random . Next ( ) ;
66
+ var testGrain = Client . GetGrain < ITestAB12FilteredGrain > ( primaryKey ) ;
67
+ await testGrain . Ping ( ) ;
68
+ var list = FilterScratchpad . GetValueOrAddNew ( testGrain . GetGrainId ( ) . ToString ( ) ) ;
69
+ Assert . Equal ( 2 , list . Count ) ;
70
+ Assert . Equal ( "A" , list [ 0 ] ) ;
71
+ Assert . Equal ( "B" , list [ 1 ] ) ;
72
+ }
73
+
74
+ [ Fact , TestCategory ( "Functional" ) ]
75
+ public async Task PlacementFilter_OrderAB21 ( )
76
+ {
77
+ await HostedCluster . WaitForLivenessToStabilizeAsync ( ) ;
78
+
79
+ var primaryKey = random . Next ( ) ;
80
+ var testGrain = Client . GetGrain < ITestAB21FilteredGrain > ( primaryKey ) ;
81
+ await testGrain . Ping ( ) ;
82
+ var list = FilterScratchpad . GetValueOrAddNew ( testGrain . GetGrainId ( ) . ToString ( ) ) ;
83
+ Assert . Equal ( 2 , list . Count ) ;
84
+ Assert . Equal ( "B" , list [ 0 ] ) ;
85
+ Assert . Equal ( "A" , list [ 1 ] ) ;
86
+ }
87
+
88
+ [ Fact , TestCategory ( "Functional" ) ]
89
+ public async Task PlacementFilter_OrderBA12 ( )
90
+ {
91
+ await HostedCluster . WaitForLivenessToStabilizeAsync ( ) ;
92
+
93
+ var primaryKey = random . Next ( ) ;
94
+ var testGrain = Client . GetGrain < ITestBA12FilteredGrain > ( primaryKey ) ;
95
+ await testGrain . Ping ( ) ;
96
+ var list = FilterScratchpad . GetValueOrAddNew ( testGrain . GetGrainId ( ) . ToString ( ) ) ;
97
+ Assert . Equal ( 2 , list . Count ) ;
98
+ Assert . Equal ( "B" , list [ 0 ] ) ;
99
+ Assert . Equal ( "A" , list [ 1 ] ) ;
100
+ }
101
+
102
+ [ Fact , TestCategory ( "Functional" ) ]
103
+ public async Task PlacementFilter_OrderBA21 ( )
104
+ {
105
+ await HostedCluster . WaitForLivenessToStabilizeAsync ( ) ;
106
+
107
+ var primaryKey = random . Next ( ) ;
108
+ var testGrain = Client . GetGrain < ITestBA21FilteredGrain > ( primaryKey ) ;
109
+ await testGrain . Ping ( ) ;
110
+
111
+ var list = FilterScratchpad . GetValueOrAddNew ( testGrain . GetGrainId ( ) . ToString ( ) ) ;
112
+ Assert . Equal ( 2 , list . Count ) ;
113
+ Assert . Equal ( "A" , list [ 0 ] ) ;
114
+ Assert . Equal ( "B" , list [ 1 ] ) ;
115
+ }
116
+
117
+ [ Fact , TestCategory ( "Functional" ) ]
118
+ public async Task PlacementFilter_DuplicateOrder ( )
119
+ {
120
+ await HostedCluster . WaitForLivenessToStabilizeAsync ( ) ;
121
+
122
+ var primaryKey = random . Next ( ) ;
123
+ var testGrain = Client . GetGrain < ITestDuplicateOrderFilteredGrain > ( primaryKey ) ;
124
+ await Assert . ThrowsAsync < InvalidOperationException > ( async ( ) =>
125
+ {
126
+ await testGrain . Ping ( ) ;
127
+ } ) ;
128
+ }
52
129
}
53
130
54
- [ TestPlacementFilter ]
131
+ [ TestPlacementFilter ( order : 1 ) ]
55
132
public class TestFilteredGrain : Grain , ITestFilteredGrain
56
133
{
57
134
public Task Ping ( ) => Task . CompletedTask ;
@@ -62,9 +139,14 @@ public interface ITestFilteredGrain : IGrainWithIntegerKey
62
139
Task Ping ( ) ;
63
140
}
64
141
65
- public class TestPlacementFilterAttribute ( ) : PlacementFilterAttribute ( new TestPlacementFilterStrategy ( ) ) ;
142
+ public class TestPlacementFilterAttribute ( int order ) : PlacementFilterAttribute ( new TestPlacementFilterStrategy ( order ) ) ;
66
143
67
- public class TestPlacementFilterStrategy : PlacementFilterStrategy ;
144
+ public class TestPlacementFilterStrategy( int order ) : PlacementFilterStrategy ( order )
145
+ {
146
+ public TestPlacementFilterStrategy ( ) : this ( 0 )
147
+ {
148
+ }
149
+ }
68
150
69
151
public class TestPlacementFilterDirector ( ) : IPlacementFilterDirector
70
152
{
@@ -76,3 +158,110 @@ public IEnumerable<SiloAddress> Filter(PlacementFilterStrategy filterStrategy, P
76
158
return silos ;
77
159
}
78
160
}
161
+
162
+
163
+
164
+ public class OrderAPlacementFilterAttribute ( int order ) : PlacementFilterAttribute ( new OrderAPlacementFilterStrategy ( order ) ) ;
165
+
166
+ public class OrderAPlacementFilterStrategy( int order ) : PlacementFilterStrategy ( order )
167
+ {
168
+ public OrderAPlacementFilterStrategy ( ) : this ( 0 )
169
+ {
170
+ }
171
+ }
172
+
173
+ public class OrderAPlacementFilterDirector : IPlacementFilterDirector
174
+ {
175
+ public IEnumerable < SiloAddress > Filter ( PlacementFilterStrategy filterStrategy , PlacementTarget target , IEnumerable < SiloAddress > silos )
176
+ {
177
+ var dict = GrainPlacementFilterTests . FilterScratchpad ;
178
+ var list = dict . GetValueOrAddNew ( target . GrainIdentity . ToString ( ) ) ;
179
+ list . Add ( "A" ) ;
180
+ return silos ;
181
+ }
182
+ }
183
+
184
+
185
+ public class OrderBPlacementFilterAttribute ( int order ) : PlacementFilterAttribute ( new OrderBPlacementFilterStrategy ( order ) ) ;
186
+
187
+ public class OrderBPlacementFilterStrategy( int order ) : PlacementFilterStrategy ( order )
188
+ {
189
+
190
+ public OrderBPlacementFilterStrategy ( ) : this ( 0 )
191
+ {
192
+ }
193
+ }
194
+
195
+ public class OrderBPlacementFilterDirector ( ) : IPlacementFilterDirector
196
+ {
197
+ public IEnumerable < SiloAddress > Filter ( PlacementFilterStrategy filterStrategy , PlacementTarget target , IEnumerable < SiloAddress > silos )
198
+ {
199
+ var dict = GrainPlacementFilterTests . FilterScratchpad ;
200
+ var list = dict . GetValueOrAddNew ( target . GrainIdentity . ToString ( ) ) ;
201
+ list . Add ( "B" ) ;
202
+ return silos ;
203
+ }
204
+ }
205
+
206
+ [ OrderAPlacementFilter ( order : 1 ) ]
207
+ [ OrderBPlacementFilter ( order : 2 ) ]
208
+ public class TestAB12FilteredGrain : Grain , ITestAB12FilteredGrain
209
+ {
210
+ public Task Ping ( ) => Task . CompletedTask ;
211
+ }
212
+
213
+ public interface ITestAB12FilteredGrain : IGrainWithIntegerKey
214
+ {
215
+ Task Ping ( ) ;
216
+ }
217
+
218
+ [ OrderAPlacementFilter ( order : 2 ) ]
219
+ [ OrderBPlacementFilter ( order : 1 ) ]
220
+ public class TestAB21FilteredGrain : Grain , ITestAB21FilteredGrain
221
+ {
222
+ public Task Ping ( ) => Task . CompletedTask ;
223
+ }
224
+
225
+ public interface ITestAB21FilteredGrain : IGrainWithIntegerKey
226
+ {
227
+ Task Ping ( ) ;
228
+ }
229
+
230
+ [ OrderBPlacementFilter ( order : 1 ) ]
231
+ [ OrderAPlacementFilter ( order : 2 ) ]
232
+ public class TestBA12FilteredGrain : Grain , ITestBA12FilteredGrain
233
+ {
234
+ public Task Ping ( ) => Task . CompletedTask ;
235
+ }
236
+
237
+ public interface ITestBA12FilteredGrain : IGrainWithIntegerKey
238
+ {
239
+ Task Ping ( ) ;
240
+ }
241
+
242
+
243
+ [ OrderBPlacementFilter ( order : 2 ) ]
244
+ [ OrderAPlacementFilter ( order : 1 ) ]
245
+ public class TestBA121FilteredGrain : Grain , ITestBA21FilteredGrain
246
+ {
247
+ public Task Ping ( ) => Task . CompletedTask ;
248
+ }
249
+
250
+ public interface ITestBA21FilteredGrain : IGrainWithIntegerKey
251
+ {
252
+ Task Ping ( ) ;
253
+ }
254
+
255
+
256
+
257
+ [ OrderBPlacementFilter ( order : 2 ) ]
258
+ [ OrderAPlacementFilter ( order : 2 ) ]
259
+ public class TestDuplicateOrderFilteredGrain : Grain , ITestDuplicateOrderFilteredGrain
260
+ {
261
+ public Task Ping ( ) => Task . CompletedTask ;
262
+ }
263
+
264
+ public interface ITestDuplicateOrderFilteredGrain : IGrainWithIntegerKey
265
+ {
266
+ Task Ping ( ) ;
267
+ }
0 commit comments