@@ -178,14 +178,85 @@ extension AnomaliesTest {
178
178
}
179
179
180
180
func testShareReplayOneInitialEmissionDeadlock( ) {
181
- let exp = expectation ( description: " `share(replay: 1)` doesn't cause a deadlock in multithreaded environment because it replays with its own lock acquired " )
182
-
183
- let sharedSource = Observable < Void > . create { observer in
181
+ let immediatelyEmittingSource = Observable < Void > . create { observer in
184
182
observer. on ( . next( ( ) ) )
185
183
return Disposables . create ( )
186
184
}
187
185
. share ( replay: 1 )
188
186
187
+ let exp = createInitialEmissionsDeadlockExpectation (
188
+ sourceName: " `share(replay: 1)` " ,
189
+ immediatelyEmittingSource: immediatelyEmittingSource
190
+ )
191
+
192
+ wait ( for: [ exp] , timeout: 1 )
193
+ }
194
+
195
+ func testIdleBehaviorSubjectInitialEmissionDeadlock( ) {
196
+ let immediatelyEmittingSource = BehaviorSubject < Void > ( value: ( ) )
197
+
198
+ let exp = createInitialEmissionsDeadlockExpectation (
199
+ sourceName: " 'Idle BehaviorSubject' " ,
200
+ immediatelyEmittingSource: immediatelyEmittingSource
201
+ )
202
+
203
+ wait ( for: [ exp] , timeout: 1 )
204
+ }
205
+
206
+ func testCompletedBehaviorSubjectInitialEmissionDeadlock( ) {
207
+ let immediatelyEmittingSource = BehaviorSubject < Void > ( value: ( ) )
208
+ immediatelyEmittingSource. on ( . completed)
209
+
210
+ let exp = createInitialEmissionsDeadlockExpectation (
211
+ sourceName: " 'BehaviorSubject with completed event' " ,
212
+ immediatelyEmittingSource: immediatelyEmittingSource
213
+ )
214
+
215
+ wait ( for: [ exp] , timeout: 1 )
216
+ }
217
+
218
+ func testCompletedPublishSubjectInitialEmissionDeadlock( ) {
219
+ let immediatelyEmittingSource = PublishSubject < Void > ( )
220
+ immediatelyEmittingSource. on ( . completed)
221
+
222
+ let exp = createInitialEmissionsDeadlockExpectation (
223
+ sourceName: " 'PublishSubject with completed event' " ,
224
+ immediatelyEmittingSource: immediatelyEmittingSource
225
+ )
226
+
227
+ wait ( for: [ exp] , timeout: 1 )
228
+ }
229
+
230
+ func testIdleReplaySubjectInitialEmissionDeadlock( ) {
231
+ let immediatelyEmittingSource = ReplaySubject< Void> . create( bufferSize: 1 )
232
+ immediatelyEmittingSource. on ( . next( ( ) ) )
233
+
234
+ let exp = createInitialEmissionsDeadlockExpectation (
235
+ sourceName: " 'Idle ReplaySubject' " ,
236
+ immediatelyEmittingSource: immediatelyEmittingSource
237
+ )
238
+
239
+ wait ( for: [ exp] , timeout: 1 )
240
+ }
241
+
242
+ func testCompletedReplaySubjectInitialEmissionDeadlock( ) {
243
+ let immediatelyEmittingSource = ReplaySubject< Void> . create( bufferSize: 1 )
244
+ immediatelyEmittingSource. on ( . completed)
245
+
246
+ let exp = createInitialEmissionsDeadlockExpectation (
247
+ sourceName: " 'ReplaySubject with completed event' " ,
248
+ immediatelyEmittingSource: immediatelyEmittingSource
249
+ )
250
+
251
+ wait ( for: [ exp] , timeout: 1 )
252
+ }
253
+
254
+ private func createInitialEmissionsDeadlockExpectation(
255
+ sourceName: String ,
256
+ immediatelyEmittingSource: Observable < Void >
257
+ ) -> XCTestExpectation {
258
+ let exp = expectation ( description: " ` \( sourceName) ` doesn't cause a deadlock in multithreaded environment because it replays with its own lock acquired " )
259
+
189
260
let triggerRange = 0 ..< 100
190
261
191
262
let concurrentScheduler = ConcurrentDispatchQueueScheduler ( qos: . userInitiated)
@@ -194,7 +265,7 @@ extension AnomaliesTest {
194
265
Observable . just ( ( ) )
195
266
. observe ( on: concurrentScheduler)
196
267
. flatMap { _ in
197
- sharedSource
268
+ immediatelyEmittingSource
198
269
}
199
270
. take ( 1 )
200
271
} )
@@ -203,6 +274,6 @@ extension AnomaliesTest {
203
274
exp. fulfill ( )
204
275
} )
205
276
206
- wait ( for : [ exp] , timeout : 1 )
277
+ return exp
207
278
}
208
279
}
0 commit comments