@@ -11,66 +11,86 @@ public partial class ThreadPoolBoundHandleTests
11
11
[ Fact ]
12
12
public unsafe void AllocateNativeOverlapped_NullAsCallback_ThrowsArgumentNullException ( )
13
13
{
14
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
15
-
16
- Assert . Throws < ArgumentNullException > ( "callback" , ( ) =>
14
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
17
15
{
18
- handle . AllocateNativeOverlapped ( null , new object ( ) , new byte [ 256 ] ) ;
19
- } ) ;
16
+ Assert . Throws < ArgumentNullException > ( "callback" , ( ) =>
17
+ {
18
+ handle . AllocateNativeOverlapped ( null , new object ( ) , new byte [ 256 ] ) ;
19
+ } ) ;
20
+ }
20
21
}
21
22
22
23
[ Fact ]
23
24
public unsafe void AllocateNativeOverlapped_PreAllocated_ThrowsArgumentNullException ( )
24
25
{
25
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
26
-
27
- Assert . Throws < ArgumentNullException > ( "preAllocated" , ( ) =>
26
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
28
27
{
29
- handle . AllocateNativeOverlapped ( ( PreAllocatedOverlapped ) null ) ;
30
- } ) ;
28
+ Assert . Throws < ArgumentNullException > ( "preAllocated" , ( ) =>
29
+ {
30
+ handle . AllocateNativeOverlapped ( ( PreAllocatedOverlapped ) null ) ;
31
+ } ) ;
32
+ }
31
33
}
32
34
33
35
[ Fact ]
34
36
public unsafe void AllocateNativeOverlapped_NullAsContext_DoesNotThrow ( )
35
37
{
36
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
37
- NativeOverlapped * result = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , ( object ) null , new byte [ 256 ] ) ;
38
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
39
+ {
40
+ NativeOverlapped * result = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , ( object ) null , new byte [ 256 ] ) ;
41
+
42
+ Assert . True ( result != null ) ;
38
43
39
- Assert . True ( result != null ) ;
44
+ handle . FreeNativeOverlapped ( result ) ;
45
+ }
40
46
}
41
47
42
48
[ Fact ]
43
49
public unsafe void AllocateNativeOverlapped_NullAsPinData_DoesNotThrow ( )
44
50
{
45
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
46
- NativeOverlapped * result = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , ( byte [ ] ) null ) ;
51
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
52
+ {
53
+ NativeOverlapped * result = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , ( byte [ ] ) null ) ;
54
+
55
+ Assert . True ( result != null ) ;
47
56
48
- Assert . True ( result != null ) ;
57
+ handle . FreeNativeOverlapped ( result ) ;
58
+ }
49
59
}
50
60
51
61
[ Fact ]
52
62
public unsafe void AllocateNativeOverlapped_EmptyArrayAsPinData_DoesNotThrow ( )
53
63
{
54
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
55
- NativeOverlapped * result = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new byte [ 0 ] ) ;
64
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
65
+ {
66
+ NativeOverlapped * result = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new byte [ 0 ] ) ;
67
+
68
+ Assert . True ( result != null ) ;
56
69
57
- Assert . True ( result != null ) ;
70
+ handle . FreeNativeOverlapped ( result ) ;
71
+ }
58
72
}
59
73
60
74
[ Fact ]
61
75
public unsafe void AllocateNativeOverlapped_NonBlittableTypeAsPinData_Throws ( )
62
76
{
63
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
64
- Assert . Throws < ArgumentException > ( ( ) => handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new NonBlittableType ( ) { s = "foo" } ) ) ;
77
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
78
+ {
79
+ Assert . Throws < ArgumentException > ( ( ) => handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new NonBlittableType ( ) { s = "foo" } ) ) ;
80
+ }
65
81
}
66
82
67
83
[ Fact ]
68
84
public unsafe void AllocateNativeOverlapped_BlittableTypeAsPinData_DoesNotThrow ( )
69
85
{
70
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
71
- NativeOverlapped * result = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new BlittableType ( ) { i = 42 } ) ;
86
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
87
+ {
88
+ NativeOverlapped * result = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new BlittableType ( ) { i = 42 } ) ;
72
89
73
- Assert . True ( result != null ) ;
90
+ Assert . True ( result != null ) ;
91
+
92
+ handle . FreeNativeOverlapped ( result ) ;
93
+ }
74
94
}
75
95
76
96
[ Fact ]
@@ -81,10 +101,14 @@ public unsafe void AllocateNativeOverlapped_ObjectArrayAsPinData_DoesNotThrow()
81
101
new BlittableType ( ) { i = 1 } ,
82
102
new byte [ 5 ] ,
83
103
} ;
84
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
85
- NativeOverlapped * result = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , array ) ;
104
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
105
+ {
106
+ NativeOverlapped * result = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , array ) ;
86
107
87
- Assert . True ( result != null ) ;
108
+ Assert . True ( result != null ) ;
109
+
110
+ handle . FreeNativeOverlapped ( result ) ;
111
+ }
88
112
}
89
113
90
114
[ Fact ]
@@ -95,113 +119,153 @@ public unsafe void AllocateNativeOverlapped_ObjectArrayWithNonBlittableTypeAsPin
95
119
new NonBlittableType ( ) { s = "foo" } ,
96
120
new byte [ 5 ] ,
97
121
} ;
98
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
99
- Assert . Throws < ArgumentException > ( ( ) => handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , array ) ) ;
122
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
123
+ {
124
+ Assert . Throws < ArgumentException > ( ( ) => handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , array ) ) ;
125
+ }
100
126
}
101
127
102
128
[ Fact ]
103
129
public unsafe void AllocateNativeOverlapped_ReturnedNativeOverlapped_AllFieldsZero ( )
104
130
{
105
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
106
- NativeOverlapped * overlapped = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new byte [ 256 ] ) ;
131
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
132
+ {
133
+ NativeOverlapped * overlapped = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new byte [ 256 ] ) ;
107
134
108
- Assert . Equal ( IntPtr . Zero , overlapped ->InternalLow ) ;
109
- Assert . Equal ( IntPtr . Zero , overlapped ->InternalHigh ) ;
110
- Assert . Equal ( 0 , overlapped ->OffsetLow ) ;
111
- Assert . Equal ( 0 , overlapped ->OffsetHigh ) ;
112
- Assert . Equal ( IntPtr . Zero , overlapped ->EventHandle ) ;
135
+ Assert . Equal ( IntPtr . Zero , overlapped ->InternalLow ) ;
136
+ Assert . Equal ( IntPtr . Zero , overlapped ->InternalHigh ) ;
137
+ Assert . Equal ( 0 , overlapped ->OffsetLow ) ;
138
+ Assert . Equal ( 0 , overlapped ->OffsetHigh ) ;
139
+ Assert . Equal ( IntPtr . Zero , overlapped ->EventHandle ) ;
140
+
141
+ handle . FreeNativeOverlapped ( overlapped ) ;
142
+ }
113
143
}
114
144
115
145
[ Fact ]
116
146
public unsafe void AllocateNativeOverlapped_PreAllocated_ReturnedNativeOverlapped_AllFieldsZero ( )
117
147
{
118
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
119
- PreAllocatedOverlapped preAlloc = new PreAllocatedOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new byte [ 256 ] ) ;
120
- NativeOverlapped * overlapped = handle . AllocateNativeOverlapped ( preAlloc ) ;
121
-
122
- Assert . Equal ( IntPtr . Zero , overlapped ->InternalLow ) ;
123
- Assert . Equal ( IntPtr . Zero , overlapped ->InternalHigh ) ;
124
- Assert . Equal ( 0 , overlapped ->OffsetLow ) ;
125
- Assert . Equal ( 0 , overlapped ->OffsetHigh ) ;
126
- Assert . Equal ( IntPtr . Zero , overlapped ->EventHandle ) ;
148
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
149
+ {
150
+ using ( PreAllocatedOverlapped preAlloc = new PreAllocatedOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new byte [ 256 ] ) )
151
+ {
152
+ NativeOverlapped * overlapped = handle . AllocateNativeOverlapped ( preAlloc ) ;
153
+
154
+ Assert . Equal ( IntPtr . Zero , overlapped ->InternalLow ) ;
155
+ Assert . Equal ( IntPtr . Zero , overlapped ->InternalHigh ) ;
156
+ Assert . Equal ( 0 , overlapped ->OffsetLow ) ;
157
+ Assert . Equal ( 0 , overlapped ->OffsetHigh ) ;
158
+ Assert . Equal ( IntPtr . Zero , overlapped ->EventHandle ) ;
159
+
160
+ handle . FreeNativeOverlapped ( overlapped ) ;
161
+ }
162
+ }
127
163
}
128
164
129
165
[ Fact ]
130
166
public unsafe void AllocateNativeOverlapped_PossibleReusedReturnedNativeOverlapped_OffsetLowAndOffsetHighSetToZero ( )
131
167
{ // The CLR reuses NativeOverlapped underneath, check to make sure that they reset fields back to zero
132
168
133
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
134
- NativeOverlapped * overlapped = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new byte [ 256 ] ) ;
135
- overlapped ->OffsetHigh = 1 ;
136
- overlapped ->OffsetLow = 1 ;
137
- handle . FreeNativeOverlapped ( overlapped ) ;
169
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
170
+ {
171
+ NativeOverlapped * overlapped = handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new byte [ 256 ] ) ;
172
+ overlapped ->OffsetHigh = 1 ;
173
+ overlapped ->OffsetLow = 1 ;
174
+ handle . FreeNativeOverlapped ( overlapped ) ;
175
+
176
+ overlapped = handle . AllocateNativeOverlapped ( ( errorCode , numBytes , overlap ) => { } , new object ( ) , new byte [ 256 ] ) ;
138
177
139
- overlapped = handle . AllocateNativeOverlapped ( ( errorCode , numBytes , overlap ) => { } , new object ( ) , new byte [ 256 ] ) ;
178
+ Assert . Equal ( IntPtr . Zero , overlapped ->InternalLow ) ;
179
+ Assert . Equal ( IntPtr . Zero , overlapped ->InternalHigh ) ;
180
+ Assert . Equal ( 0 , overlapped ->OffsetLow ) ;
181
+ Assert . Equal ( 0 , overlapped ->OffsetHigh ) ;
182
+ Assert . Equal ( IntPtr . Zero , overlapped ->EventHandle ) ;
140
183
141
- Assert . Equal ( IntPtr . Zero , overlapped ->InternalLow ) ;
142
- Assert . Equal ( IntPtr . Zero , overlapped ->InternalHigh ) ;
143
- Assert . Equal ( 0 , overlapped ->OffsetLow ) ;
144
- Assert . Equal ( 0 , overlapped ->OffsetHigh ) ;
145
- Assert . Equal ( IntPtr . Zero , overlapped ->EventHandle ) ;
184
+ handle . FreeNativeOverlapped ( overlapped ) ;
185
+ }
146
186
}
147
187
148
188
[ Fact ]
149
189
public unsafe void AllocateNativeOverlapped_PreAllocated_ReusedReturnedNativeOverlapped_OffsetLowAndOffsetHighSetToZero ( )
150
190
{ // The CLR reuses NativeOverlapped underneath, check to make sure that they reset fields back to zero
151
191
152
- ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
153
- PreAllocatedOverlapped preAlloc = new PreAllocatedOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new byte [ 256 ] ) ;
154
- NativeOverlapped * overlapped = handle . AllocateNativeOverlapped ( preAlloc ) ;
155
- overlapped ->OffsetHigh = 1 ;
156
- overlapped ->OffsetLow = 1 ;
157
- handle . FreeNativeOverlapped ( overlapped ) ;
158
-
159
- overlapped = handle . AllocateNativeOverlapped ( preAlloc ) ;
160
-
161
- Assert . Equal ( IntPtr . Zero , overlapped ->InternalLow ) ;
162
- Assert . Equal ( IntPtr . Zero , overlapped ->InternalHigh ) ;
163
- Assert . Equal ( 0 , overlapped ->OffsetLow ) ;
164
- Assert . Equal ( 0 , overlapped ->OffsetHigh ) ;
165
- Assert . Equal ( IntPtr . Zero , overlapped ->EventHandle ) ;
192
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
193
+ {
194
+ PreAllocatedOverlapped preAlloc = new PreAllocatedOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new byte [ 256 ] ) ;
195
+ NativeOverlapped * overlapped = handle . AllocateNativeOverlapped ( preAlloc ) ;
196
+ overlapped ->OffsetHigh = 1 ;
197
+ overlapped ->OffsetLow = 1 ;
198
+ handle . FreeNativeOverlapped ( overlapped ) ;
199
+
200
+ overlapped = handle . AllocateNativeOverlapped ( preAlloc ) ;
201
+
202
+ Assert . Equal ( IntPtr . Zero , overlapped ->InternalLow ) ;
203
+ Assert . Equal ( IntPtr . Zero , overlapped ->InternalHigh ) ;
204
+ Assert . Equal ( 0 , overlapped ->OffsetLow ) ;
205
+ Assert . Equal ( 0 , overlapped ->OffsetHigh ) ;
206
+ Assert . Equal ( IntPtr . Zero , overlapped ->EventHandle ) ;
207
+
208
+ handle . FreeNativeOverlapped ( overlapped ) ;
209
+ }
166
210
}
167
211
168
212
[ Fact ]
169
213
public unsafe void AllocateNativeOverlapped_WhenDisposed_ThrowsObjectDisposedException ( )
170
214
{
171
- ThreadPoolBoundHandle boundHandle = CreateThreadPoolBoundHandle ( ) ;
172
- boundHandle . Dispose ( ) ;
215
+ ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
216
+ handle . Dispose ( ) ;
173
217
174
218
Assert . Throws < ObjectDisposedException > ( ( ) =>
175
219
{
176
- boundHandle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new byte [ 256 ] ) ;
220
+ handle . AllocateNativeOverlapped ( ( _ , __ , ___ ) => { } , new object ( ) , new byte [ 256 ] ) ;
177
221
} ) ;
178
222
}
179
223
180
224
[ Fact ]
181
225
public unsafe void AllocateNativeOverlapped_PreAllocated_WhenDisposed_ThrowsObjectDisposedException ( )
182
226
{
183
- ThreadPoolBoundHandle boundHandle = CreateThreadPoolBoundHandle ( ) ;
184
-
185
- PreAllocatedOverlapped preAlloc = new PreAllocatedOverlapped ( delegate { } , null , null ) ;
186
- preAlloc . Dispose ( ) ;
187
-
188
- Assert . Throws < ObjectDisposedException > ( ( ) =>
227
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
189
228
{
190
- boundHandle . AllocateNativeOverlapped ( preAlloc ) ;
191
- } ) ;
229
+ PreAllocatedOverlapped preAlloc = new PreAllocatedOverlapped ( delegate { } , null , null ) ;
230
+ preAlloc . Dispose ( ) ;
231
+
232
+ Assert . Throws < ObjectDisposedException > ( ( ) =>
233
+ {
234
+ handle . AllocateNativeOverlapped ( preAlloc ) ;
235
+ } ) ;
236
+ }
192
237
}
193
238
194
239
[ Fact ]
195
240
public unsafe void AllocateNativeOverlapped_PreAllocated_WhenHandleDisposed_ThrowsObjectDisposedException ( )
196
241
{
197
- ThreadPoolBoundHandle boundHandle = CreateThreadPoolBoundHandle ( ) ;
198
- boundHandle . Dispose ( ) ;
242
+ ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) ;
243
+ handle . Dispose ( ) ;
199
244
200
245
PreAllocatedOverlapped preAlloc = new PreAllocatedOverlapped ( delegate { } , null , null ) ;
201
246
202
247
Assert . Throws < ObjectDisposedException > ( ( ) =>
203
248
{
204
- boundHandle . AllocateNativeOverlapped ( preAlloc ) ;
249
+ handle . AllocateNativeOverlapped ( preAlloc ) ;
205
250
} ) ;
206
251
}
252
+
253
+ [ Fact ]
254
+ public unsafe void AllocateNativeOverlapped_PreAllocated_WhenAlreadyAllocated_ThrowsArgumentException ( )
255
+ {
256
+ using ( ThreadPoolBoundHandle handle = CreateThreadPoolBoundHandle ( ) )
257
+ {
258
+ using ( PreAllocatedOverlapped preAlloc = new PreAllocatedOverlapped ( delegate { } , null , null ) )
259
+ {
260
+ NativeOverlapped * overlapped = handle . AllocateNativeOverlapped ( preAlloc ) ;
261
+
262
+ Assert . Throws < ArgumentException > ( ( ) =>
263
+ {
264
+ handle . AllocateNativeOverlapped ( preAlloc ) ;
265
+ } ) ;
266
+
267
+ handle . FreeNativeOverlapped ( overlapped ) ;
268
+ }
269
+ }
270
+ }
207
271
}
0 commit comments