Interface PublisherVerificationRules
-
- All Known Implementing Classes:
IdentityProcessorVerification,PublisherVerification
public interface PublisherVerificationRules
Internal TCK use only. Add / Remove tests for PublisherVerification here to make sure that they arre added/removed in the other places.
-
-
Method Summary
All Methods Instance Methods Abstract Methods Modifier and Type Method Description voidoptional_spec104_mustSignalOnErrorWhenFails()Asks for an errorPublisherthat should callonSubscribeexactly once followed by a single call toonError()without receiving any requests and otherwise not throwing any exception.voidoptional_spec105_emptyStreamMustTerminateBySignallingOnComplete()Asks for an emptyPublisher(i.e., length 0) and verifies it completes in a timely manner.voidoptional_spec111_maySupportMultiSubscribe()Asks for a single-elementPublisherand subscribes to it twice, without consuming with eitherSubscriberinstance (i.e., no requests are issued).voidoptional_spec111_multicast_mustProduceTheSameElementsInTheSameSequenceToAllOfItsSubscribersWhenRequestingManyUpfront()Asks for a shortPublisher(length 3), subscribes 3Subscribers to it, requests more than the length items upfront with each and verifies they all received the same items in the same order (but does not verify they all complete).voidoptional_spec111_multicast_mustProduceTheSameElementsInTheSameSequenceToAllOfItsSubscribersWhenRequestingManyUpfrontAndCompleteAsExpected()Asks for a shortPublisher(length 3), subscribes 3Subscribers to it, requests more than the length items upfront with each and verifies they all received the same items in the same order followed by anonCompletesignal.voidoptional_spec111_multicast_mustProduceTheSameElementsInTheSameSequenceToAllOfItsSubscribersWhenRequestingOneByOne()Asks for a shortPublisher(length 5), subscribes 3Subscribers to it, requests with different patterns and checks if all 3 received the same events in the same order.voidoptional_spec111_registeredSubscribersMustReceiveOnNextOrOnCompleteSignals()Asks for a single-elementPublisherand subscribes to it twice.voidoptional_spec309_requestNegativeNumberMaySignalIllegalArgumentExceptionWithSpecificMessage()Asks for a shortPublisher(length 10) and issues a random, negativerequest()call which should trigger anonErrorcall with anIllegalArgumentException.voidrequired_createPublisher1MustProduceAStreamOfExactly1Element()Asks for aPublisherthat should emit exactly one item and complete (both within a timeout specified byTestEnvironment.defaultTimeoutMillis()) in response to a request(1).voidrequired_createPublisher3MustProduceAStreamOfExactly3Elements()Asks for aPublisherthat should emit exactly three items and complete (all within a timeout specified byTestEnvironment.defaultTimeoutMillis()).voidrequired_spec101_subscriptionRequestMustResultInTheCorrectNumberOfProducedElements()Asks for aPublisherthat responds to a request pattern of 0 (not requesting upfront), 1, 1 and 2 in a timely manner.voidrequired_spec102_maySignalLessThanRequestedAndTerminateSubscription()Asks for a shortPublisherand verifies that requesting once and with more than the length (but bounded) results in the correct number of items to be emitted (i.e., length 3 and request 10) followed by anonCompletesignal.voidrequired_spec105_mustSignalOnCompleteWhenFiniteStreamTerminates()Asks for a shortPublisher(i.e., length 3) and verifies, after requesting one by one, the sequence completes normally.voidrequired_spec107_mustNotEmitFurtherSignalsOnceOnCompleteHasBeenSignalled()Asks for a single-elementPublisherand checks if requesting after the terminal event doesn't lead to more items or terminal signals to be emitted.voidrequired_spec109_mayRejectCallsToSubscribeIfPublisherIsUnableOrUnwillingToServeThemRejectionMustTriggerOnErrorAfterOnSubscribe()Asks for an errorPublisherthat should callonSubscribeexactly once followed by a single call toonError()without receiving any requests.voidrequired_spec109_mustIssueOnSubscribeForNonNullSubscriber()Asks for an emptyPublisherand verifies ifonSubscribesignal was emitted before any otheronNext,onErrororonCompletesignal.voidrequired_spec109_subscribeThrowNPEOnNullSubscriber()Asks for an emptyPublisherand callssubscribeon it withnullthat should result in aNullPointerExceptionto be thrown.voidrequired_spec302_mustAllowSynchronousRequestCallsFromOnNextAndOnSubscribe()Asks for a shortPublisher(length 6), requests several times from withinonSubscribeand then requests one-by-one fromonNext.voidrequired_spec303_mustNotAllowUnboundedRecursion()Asks for aPublisherwith length equal to the value returned byrequired_validate_boundedDepthOfOnNextAndRequestRecursion()plus 1, callsrequest(1)externally and then from withinonNextand checks if the stack depth did not increase beyond the amount permitted byrequired_validate_boundedDepthOfOnNextAndRequestRecursion().voidrequired_spec306_afterSubscriptionIsCancelledRequestMustBeNops()Asks for a shortPublisher(length 3) and verifies that cancelling without requesting anything, then requesting items should result in no signals to be emitted.voidrequired_spec307_afterSubscriptionIsCancelledAdditionalCancelationsMustBeNops()Asks for a single-elementPublisherand verifies that without requesting anything, cancelling the sequence multiple times should result in no signals to be emitted and should result in an thrown exception.voidrequired_spec309_requestNegativeNumberMustSignalIllegalArgumentException()Asks for a shortPublisher(length 10) and issues a random, negativerequest()call which should trigger anonErrorcall with anIllegalArgumentException.voidrequired_spec309_requestZeroMustSignalIllegalArgumentException()Asks for a shortPublisher(length 10) and issues arequest(0)which should trigger anonErrorcall with anIllegalArgumentException.voidrequired_spec312_cancelMustMakeThePublisherToEventuallyStopSignaling()Asks for a shortPublisher(length 20), requests some items (less than the length), consumes one item then cancels the sequence and verifies the publisher emitted at most the requested amount and stopped emitting (or terminated).voidrequired_spec313_cancelMustMakeThePublisherEventuallyDropAllReferencesToTheSubscriber()Asks for a shortPublisher(length 3) requests and consumes one element from it, cancels theSubscription, callsSystem.gc()and then checks if all references to the testSubscriberhas been dropped (by checking theWeakReferencehas been emptied).voidrequired_spec317_mustNotSignalOnErrorWhenPendingAboveLongMaxValue()Asks for a very longPublisher(up toInteger.MAX_VALUE), requestsLong.MAX_VALUE - 1after each received item and expects no failure due to a potential overflow in the pending emission count while consuming 10 items and cancelling the sequence.voidrequired_spec317_mustSupportACumulativePendingElementCountUpToLongMaxValue()Asks for a shortPublisher(length 3) and requestsLong.MAX_VALUEfrom it in total (split across twoLong.MAX_VALUE / 2and onerequest(1)), verifying that thePublisheremits all of its items and completes normally.voidrequired_spec317_mustSupportAPendingElementCountUpToLongMaxValue()Asks for a shortPublisher(length 3) and requestsLong.MAX_VALUEfrom it, verifying that thePublisheremits all of its items and completes normally and does not keep spinning attempting to fulfill theLong.MAX_VALUEdemand by some means.voidrequired_validate_boundedDepthOfOnNextAndRequestRecursion()Validates that the override ofPublisherVerification.boundedDepthOfOnNextAndRequestRecursion()returns a positive value.voidrequired_validate_maxElementsFromPublisher()Validates that the override ofPublisherVerification.maxElementsFromPublisher()returns a non-negative value.voidstochastic_spec103_mustSignalOnMethodsSequentially()Asks for a shortPublisher(i.e., length 10), repeatedly subscribes to thisPublisher, requests items one by one and verifies thePublishercalls theonXXXmethods non-overlappingly.voiduntested_spec106_mustConsiderSubscriptionCancelledAfterOnErrorOrOnCompleteHasBeenCalled()Currently, this test is skipped because it is unclear this rule can be effectively checked on aPublisherinstance without looking into or hooking into the implementation of it.voiduntested_spec107_mustNotEmitFurtherSignalsOnceOnErrorHasBeenSignalled()Currently, this test is skipped, although it is possible to validate an errorPublisheralong the same lines asrequired_spec107_mustNotEmitFurtherSignalsOnceOnCompleteHasBeenSignalled().voiduntested_spec108_possiblyCanceledSubscriptionShouldNotReceiveOnErrorOrOnCompleteSignals()Currently, this test is skipped because there was no agreement on how to verify its "eventually" requirement.voiduntested_spec109_subscribeShouldNotThrowNonFatalThrowable()Currently, this test is skipped because there is no common agreement on what is to be considered a fatal exception and besides,Publisher.subscribeis only allowed throw aNullPointerExceptionand any other exception would require looking into or hooking into the implementation of thePublisher.voiduntested_spec110_rejectASubscriptionRequestIfTheSameSubscriberSubscribesTwice()Currently, this test is skipped because enforcing rule §1.10 requires unlimited retention and reference-equal checks on all incomingSubscriberwhich is generally infeasible, plus reusing the sameSubscriberinstance is better detected (or ignored) insideSubscriber.onSubscribewhen the method is called multiple times.voiduntested_spec304_requestShouldNotPerformHeavyComputations()Currently, this test is skipped because arequestcould enter into a synchronous computation viaonNextlegally and otherwise there is no common agreement how to detect such heavy computation reliably.voiduntested_spec305_cancelMustNotSynchronouslyPerformHeavyComputation()Currently, this test is skipped because there is no reliable agreed upon way to detect a heavy computation.
-
-
-
Method Detail
-
required_validate_maxElementsFromPublisher
void required_validate_maxElementsFromPublisher() throws java.lang.Exception
Validates that the override ofPublisherVerification.maxElementsFromPublisher()returns a non-negative value.- Throws:
java.lang.Exception
-
required_validate_boundedDepthOfOnNextAndRequestRecursion
void required_validate_boundedDepthOfOnNextAndRequestRecursion() throws java.lang.Exception
Validates that the override ofPublisherVerification.boundedDepthOfOnNextAndRequestRecursion()returns a positive value.- Throws:
java.lang.Exception
-
required_createPublisher1MustProduceAStreamOfExactly1Element
void required_createPublisher1MustProduceAStreamOfExactly1Element() throws java.lang.Throwable
Asks for aPublisherthat should emit exactly one item and complete (both within a timeout specified byTestEnvironment.defaultTimeoutMillis()) in response to a request(1).The test is not executed if
PublisherVerification.maxElementsFromPublisher()returns zero. If this test fails, the following could be checked within thePublisherimplementation:- the
Publisher.subscribe(Subscriber)method has actual implementation, - in the
Publisher.subscribe(Subscriber)method, if there is an upstreamPublisher, thatPublisheris actually subscribed to, - if the
Publisheris part of a chain, all elements actually issue arequest()call in response to the test subscriber or by default to their upstream, - in the
Publisher.subscribe(Subscriber)method, theSubscriber.onSubscribeis called as part of the preparation process (usually before subscribing to otherPublishers), - if the
Publisherimplementation works for a consumer that callsrequest(1), - if the
Publisherimplementation is able to emit anonCompletewithout requests, - that the
Publisherimplementation does not emit more than the allowed elements (exactly one).
- Throws:
java.lang.Throwable
- the
-
required_createPublisher3MustProduceAStreamOfExactly3Elements
void required_createPublisher3MustProduceAStreamOfExactly3Elements() throws java.lang.Throwable
Asks for aPublisherthat should emit exactly three items and complete (all within a timeout specified byTestEnvironment.defaultTimeoutMillis()).The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 3.The tests requests one-by-one and verifies each single response item arrives in time.
If this test fails, the following could be checked within the
Publisherimplementation:- the
Publisher.subscribe(Subscriber)method has actual implementation, - in the
Publisher.subscribe(Subscriber)method, if there is an upstreamPublisher, thatPublisheris actually subscribed to, - if the
Publisheris part of a chain, all elements actually issue arequest()call in response to the test subscriber or by default to their upstream, - in the
Publisher.subscribe(Subscriber)method, theSubscriber.onSubscribeis called as part of the preparation process (usually before subscribing to otherPublishers), - if the
Publisherimplementation works for a subscriber that callsrequest(1)after consuming an item, - if the
Publisherimplementation is able to emit anonCompletewithout requests.
- Throws:
java.lang.Throwable
- the
-
required_spec101_subscriptionRequestMustResultInTheCorrectNumberOfProducedElements
void required_spec101_subscriptionRequestMustResultInTheCorrectNumberOfProducedElements() throws java.lang.Throwable
Asks for aPublisherthat responds to a request pattern of 0 (not requesting upfront), 1, 1 and 2 in a timely manner.Verifies rule: 1.1
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 5.This test ensures that the
Publisherimplementation correctly responds torequest()calls that in total are less than the number of elements thisPublishercould emit (thus the completion event won't be emitted).If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - if the
Publisherimplementation considers the cumulative request amount it receives, - if the
Publisherdoesn't lose anyrequest()signal and the state transition from idle -> emitting or emitting -> keep emitting works properly.
- Throws:
java.lang.Throwable
- the
-
required_spec102_maySignalLessThanRequestedAndTerminateSubscription
void required_spec102_maySignalLessThanRequestedAndTerminateSubscription() throws java.lang.Throwable
Asks for a shortPublisherand verifies that requesting once and with more than the length (but bounded) results in the correct number of items to be emitted (i.e., length 3 and request 10) followed by anonCompletesignal.Verifies rule: 1.2
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 3.This test ensures that the
Publisherimplementation can deal with larger requests than the number of items it can produce.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass.
- Throws:
java.lang.Throwable
- the
-
stochastic_spec103_mustSignalOnMethodsSequentially
void stochastic_spec103_mustSignalOnMethodsSequentially() throws java.lang.Throwable
Asks for a shortPublisher(i.e., length 10), repeatedly subscribes to thisPublisher, requests items one by one and verifies thePublishercalls theonXXXmethods non-overlappingly.Verifies rule: 1.3
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 10.Note that this test is probabilistic, that is, may not capture any concurrent invocation in a {code Publisher} implementation. Note also that this test is sensitive to cases when a
request()call inonSubscribe()triggers an asynchronous call to the otheronXXXmethods. In contrast, the test allows synchronous call chain ofonSubscribe -> request -> onNext.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - if a
request()call fromonSubscribe()could trigger an asynchronous call toonNext()and if so, make sure suchrequest()calls are deferred until the call toonSubscribe()returns normally.
- Throws:
java.lang.Throwable
- the
-
optional_spec104_mustSignalOnErrorWhenFails
void optional_spec104_mustSignalOnErrorWhenFails() throws java.lang.Throwable
Asks for an errorPublisherthat should callonSubscribeexactly once followed by a single call toonError()without receiving any requests and otherwise not throwing any exception.Verifies rule: 1.4
The test is not executed if
PublisherVerification.createErrorPublisher()returns null.If this test fails, the following could be checked within the error
Publisherimplementation:- the
Publisher.subscribe(Subscriber)method has actual implementation, - in the
Publisher.subscribe(Subscriber)method, if there is an upstreamPublisher, thatPublisheris actually subscribed to, - if the
Publisherimplementation does signal anonSubscribebefore signallingonError, - if the
Publisherimplementation is able to emit anonErrorwithout requests, - if the
Publisheris non-empty as this test requires aPublisherto signal anonErroreagerly.
- Throws:
java.lang.Throwable
- the
-
required_spec105_mustSignalOnCompleteWhenFiniteStreamTerminates
void required_spec105_mustSignalOnCompleteWhenFiniteStreamTerminates() throws java.lang.Throwable
Asks for a shortPublisher(i.e., length 3) and verifies, after requesting one by one, the sequence completes normally.Verifies rule: 1.5
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 3.Note that the tests requests 1 after the items have been received and before expecting an
onCompletesignal.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass,
- Throws:
java.lang.Throwable
- the
-
optional_spec105_emptyStreamMustTerminateBySignallingOnComplete
void optional_spec105_emptyStreamMustTerminateBySignallingOnComplete() throws java.lang.Throwable
Asks for an emptyPublisher(i.e., length 0) and verifies it completes in a timely manner.Verifies rule: 1.5
Note that the tests requests 1 before expecting an
onCompletesignal.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - if the
Publisheris non-empty as this test requires aPublisherwithout items.
- Throws:
java.lang.Throwable
- the
-
untested_spec106_mustConsiderSubscriptionCancelledAfterOnErrorOrOnCompleteHasBeenCalled
void untested_spec106_mustConsiderSubscriptionCancelledAfterOnErrorOrOnCompleteHasBeenCalled() throws java.lang.Throwable
Currently, this test is skipped because it is unclear this rule can be effectively checked on aPublisherinstance without looking into or hooking into the implementation of it.Verifies rule: 1.6
- Throws:
java.lang.Throwable
-
required_spec107_mustNotEmitFurtherSignalsOnceOnCompleteHasBeenSignalled
void required_spec107_mustNotEmitFurtherSignalsOnceOnCompleteHasBeenSignalled() throws java.lang.Throwable
Asks for a single-elementPublisherand checks if requesting after the terminal event doesn't lead to more items or terminal signals to be emitted.Verifies rule: 1.7
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 1.The tests requests more items than the expected
Publisherlength upfront and some more items after its completion.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - the indication for the terminal state is properly persisted and a request call can't trigger emission of more items or another terminal signal.
- Throws:
java.lang.Throwable
- the
-
untested_spec107_mustNotEmitFurtherSignalsOnceOnErrorHasBeenSignalled
void untested_spec107_mustNotEmitFurtherSignalsOnceOnErrorHasBeenSignalled() throws java.lang.Throwable
Currently, this test is skipped, although it is possible to validate an errorPublisheralong the same lines asrequired_spec107_mustNotEmitFurtherSignalsOnceOnCompleteHasBeenSignalled().Verifies rule: 1.7
- Throws:
java.lang.Throwable
-
untested_spec108_possiblyCanceledSubscriptionShouldNotReceiveOnErrorOrOnCompleteSignals
void untested_spec108_possiblyCanceledSubscriptionShouldNotReceiveOnErrorOrOnCompleteSignals() throws java.lang.Throwable
Currently, this test is skipped because there was no agreement on how to verify its "eventually" requirement.Verifies rule: 1.8
- Throws:
java.lang.Throwable
-
required_spec109_mustIssueOnSubscribeForNonNullSubscriber
void required_spec109_mustIssueOnSubscribeForNonNullSubscriber() throws java.lang.Throwable
Asks for an emptyPublisherand verifies ifonSubscribesignal was emitted before any otheronNext,onErrororonCompletesignal.Verifies rule: 1.9
Note that this test doesn't request anything, however, an
onNextis not considered as a failure.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - the
Publisher.subscribe(Subscriber)method has actual implementation, - in the
Publisher.subscribe(Subscriber)method, if there is an upstreamPublisher, thatPublisheris actually subscribed to, - in the
Publisher.subscribe(Subscriber)method, theSubscriber.onSubscribeis called as part of the preparation process (usually before subscribing to otherPublishers).
- Throws:
java.lang.Throwable
- the
-
untested_spec109_subscribeShouldNotThrowNonFatalThrowable
void untested_spec109_subscribeShouldNotThrowNonFatalThrowable() throws java.lang.Throwable
Currently, this test is skipped because there is no common agreement on what is to be considered a fatal exception and besides,Publisher.subscribeis only allowed throw aNullPointerExceptionand any other exception would require looking into or hooking into the implementation of thePublisher.Verifies rule: 1.9
- Throws:
java.lang.Throwable
-
required_spec109_subscribeThrowNPEOnNullSubscriber
void required_spec109_subscribeThrowNPEOnNullSubscriber() throws java.lang.Throwable
Asks for an emptyPublisherand callssubscribeon it withnullthat should result in aNullPointerExceptionto be thrown.Verifies rule: 1.9
If this test fails, check if the
subscribe()implementation has an explicit null check (or a method dereference on theSubscriber), especially if the incomingSubscriberis wrapped or stored to be used later.- Throws:
java.lang.Throwable
-
required_spec109_mayRejectCallsToSubscribeIfPublisherIsUnableOrUnwillingToServeThemRejectionMustTriggerOnErrorAfterOnSubscribe
void required_spec109_mayRejectCallsToSubscribeIfPublisherIsUnableOrUnwillingToServeThemRejectionMustTriggerOnErrorAfterOnSubscribe() throws java.lang.Throwable
Asks for an errorPublisherthat should callonSubscribeexactly once followed by a single call toonError()without receiving any requests.Verifies rule: 1.9
The test is not executed if
PublisherVerification.createErrorPublisher()returns null.The difference between this test and
optional_spec104_mustSignalOnErrorWhenFails()is that there is no explicit verification if exceptions were thrown in addition to the regularonSubscribe+onErrorsignal pair.If this test fails, the following could be checked within the error
Publisherimplementation:- the
Publisher.subscribe(Subscriber)method has actual implementation, - in the
Publisher.subscribe(Subscriber)method, if there is an upstreamPublisher, thatPublisheris actually subscribed to, - if the
Publisherimplementation is able to emit anonErrorwithout requests, - if the
Publisheris non-empty as this test expects aPublisherwithout items.
- Throws:
java.lang.Throwable
- the
-
untested_spec110_rejectASubscriptionRequestIfTheSameSubscriberSubscribesTwice
void untested_spec110_rejectASubscriptionRequestIfTheSameSubscriberSubscribesTwice() throws java.lang.Throwable
Currently, this test is skipped because enforcing rule §1.10 requires unlimited retention and reference-equal checks on all incomingSubscriberwhich is generally infeasible, plus reusing the sameSubscriberinstance is better detected (or ignored) insideSubscriber.onSubscribewhen the method is called multiple times.Verifies rule: 1.10
- Throws:
java.lang.Throwable
-
optional_spec111_maySupportMultiSubscribe
void optional_spec111_maySupportMultiSubscribe() throws java.lang.Throwable
Asks for a single-elementPublisherand subscribes to it twice, without consuming with eitherSubscriberinstance (i.e., no requests are issued).Verifies rule: 1.11
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 1.Note that this test ignores what signals the
Publisheremits. Any exception thrown through non-regular means will indicate a skipped test.- Throws:
java.lang.Throwable
-
optional_spec111_registeredSubscribersMustReceiveOnNextOrOnCompleteSignals
void optional_spec111_registeredSubscribersMustReceiveOnNextOrOnCompleteSignals() throws java.lang.Throwable
Asks for a single-elementPublisherand subscribes to it twice. EachSubscriberrequests for 1 element and checks if onNext or onComplete signals was received.Verifies rule: 1.11, and depends on valid implementation of rule 1.5 in order to verify this.
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 1.Any exception thrown through non-regular means will indicate a skipped test.
- Throws:
java.lang.Throwable
-
optional_spec111_multicast_mustProduceTheSameElementsInTheSameSequenceToAllOfItsSubscribersWhenRequestingOneByOne
void optional_spec111_multicast_mustProduceTheSameElementsInTheSameSequenceToAllOfItsSubscribersWhenRequestingOneByOne() throws java.lang.Throwable
Asks for a shortPublisher(length 5), subscribes 3Subscribers to it, requests with different patterns and checks if all 3 received the same events in the same order.Verifies rule: 1.11
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 5.The request pattern for the first
Subscriberis (1, 1, 2, 1); for the second is (2, 3) and for the third is (3, 1, 1).Note that this test requires a
Publisherthat always emits the same signals to anySubscriber, regardless of when they subscribe and how they request elements. I.e., a "live"Publisheremitting the current time would not pass this test.Note that this test is optional and may appear skipped even if the behavior should be actually supported by the
Publisher, see the skip message for an indication of this.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - if the
Publisherimplementation considers the cumulative request amount it receives, - if the
Publisherdoesn't lose anyrequest()signal and the state transition from idle -> emitting or emitting -> keep emitting works properly.
- Throws:
java.lang.Throwable
- the
-
optional_spec111_multicast_mustProduceTheSameElementsInTheSameSequenceToAllOfItsSubscribersWhenRequestingManyUpfront
void optional_spec111_multicast_mustProduceTheSameElementsInTheSameSequenceToAllOfItsSubscribersWhenRequestingManyUpfront() throws java.lang.Throwable
Asks for a shortPublisher(length 3), subscribes 3Subscribers to it, requests more than the length items upfront with each and verifies they all received the same items in the same order (but does not verify they all complete).Verifies rule: 1.11
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 3.Note that this test requires a
Publisherthat always emits the same signals to anySubscriber, regardless of when they subscribe and how they request elements. I.e., a "live"Publisheremitting the current time would not pass this test.Note that this test is optional and may appear skipped even if the behavior should be actually supported by the
Publisher, see the skip message for an indication of this.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - if the
Publisherimplementation considers the cumulative request amount it receives, - if the
Publisherdoesn't lose anyrequest()signal and the state transition from idle -> emitting or emitting -> keep emitting works properly.
- Throws:
java.lang.Throwable
- the
-
optional_spec111_multicast_mustProduceTheSameElementsInTheSameSequenceToAllOfItsSubscribersWhenRequestingManyUpfrontAndCompleteAsExpected
void optional_spec111_multicast_mustProduceTheSameElementsInTheSameSequenceToAllOfItsSubscribersWhenRequestingManyUpfrontAndCompleteAsExpected() throws java.lang.Throwable
Asks for a shortPublisher(length 3), subscribes 3Subscribers to it, requests more than the length items upfront with each and verifies they all received the same items in the same order followed by anonCompletesignal.Verifies rule: 1.11
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 3.Note that this test requires a
Publisherthat always emits the same signals to anySubscriber, regardless of when they subscribe and how they request elements. I.e., a "live"Publisheremitting the current time would not pass this test.Note that this test is optional and may appear skipped even if the behavior should be actually supported by the
Publisher, see the skip message for an indication of this.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - if the
Publisherimplementation considers the cumulative request amount it receives, - if the
Publisherdoesn't lose anyrequest()signal and the state transition from idle -> emitting or emitting -> keep emitting works properly.
- Throws:
java.lang.Throwable
- the
-
required_spec302_mustAllowSynchronousRequestCallsFromOnNextAndOnSubscribe
void required_spec302_mustAllowSynchronousRequestCallsFromOnNextAndOnSubscribe() throws java.lang.Throwable
Asks for a shortPublisher(length 6), requests several times from withinonSubscribeand then requests one-by-one fromonNext.Verifies rule: 3.2
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 6.The request pattern is 3 x 1 from within
onSubscribeand one from within eachonNextinvocation.The test consumes the
Publisherbut otherwise doesn't verify thePublishercompletes (however, it checks for errors).If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - if the
Publisherimplementation considers the cumulative request amount it receives, - if the
Publisherdoesn't lose anyrequest()signal and the state transition from idle -> emitting or emitting -> keep emitting works properly.
- Throws:
java.lang.Throwable
- the
-
required_spec303_mustNotAllowUnboundedRecursion
void required_spec303_mustNotAllowUnboundedRecursion() throws java.lang.Throwable
Asks for aPublisherwith length equal to the value returned byrequired_validate_boundedDepthOfOnNextAndRequestRecursion()plus 1, callsrequest(1)externally and then from withinonNextand checks if the stack depth did not increase beyond the amount permitted byrequired_validate_boundedDepthOfOnNextAndRequestRecursion().Verifies rule: 3.3
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less thanrequired_validate_boundedDepthOfOnNextAndRequestRecursion()plus 1.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - the implementation doesn't allow unbounded recursion when
request()is called from withinonNext, i.e., the lack of reentrant-safe state machine around the request amount (such as a for loop with a bound on the parameternthat callsonNext).
- Throws:
java.lang.Throwable
- the
-
untested_spec304_requestShouldNotPerformHeavyComputations
void untested_spec304_requestShouldNotPerformHeavyComputations() throws java.lang.Exception
Currently, this test is skipped because arequestcould enter into a synchronous computation viaonNextlegally and otherwise there is no common agreement how to detect such heavy computation reliably.Verifies rule: 3.4
- Throws:
java.lang.Exception
-
untested_spec305_cancelMustNotSynchronouslyPerformHeavyComputation
void untested_spec305_cancelMustNotSynchronouslyPerformHeavyComputation() throws java.lang.Exception
Currently, this test is skipped because there is no reliable agreed upon way to detect a heavy computation.Verifies rule: 3.5
- Throws:
java.lang.Exception
-
required_spec306_afterSubscriptionIsCancelledRequestMustBeNops
void required_spec306_afterSubscriptionIsCancelledRequestMustBeNops() throws java.lang.Throwable
Asks for a shortPublisher(length 3) and verifies that cancelling without requesting anything, then requesting items should result in no signals to be emitted.Verifies rule: 3.6
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 3.The post-cancellation request pattern is (1, 1, 1).
If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - the cancellation indicator flag is properly persisted (may require volatile) and checked as part of the signal emission process.
- Throws:
java.lang.Throwable
- the
-
required_spec307_afterSubscriptionIsCancelledAdditionalCancelationsMustBeNops
void required_spec307_afterSubscriptionIsCancelledAdditionalCancelationsMustBeNops() throws java.lang.Throwable
Asks for a single-elementPublisherand verifies that without requesting anything, cancelling the sequence multiple times should result in no signals to be emitted and should result in an thrown exception.Verifies rule: 3.7
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 1.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - the cancellation indicator flag is properly persisted (may require volatile) and checked as part of the signal emission process.
- Throws:
java.lang.Throwable
- the
-
required_spec309_requestZeroMustSignalIllegalArgumentException
void required_spec309_requestZeroMustSignalIllegalArgumentException() throws java.lang.Throwable
Asks for a shortPublisher(length 10) and issues arequest(0)which should trigger anonErrorcall with anIllegalArgumentException.Verifies rule: 3.9
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 10.Note that this test expects the
IllegalArgumentExceptionbeing signalled throughonError, not by throwing fromrequest()(which is also forbidden) or signalling the error by any other means (i.e., through theThread.currentThread().getUncaughtExceptionHandler()for example).Note also that requesting and emission may happen concurrently and honoring this rule may require extra coordination within the
Publisher.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - the
Publishercan emit anonErrorin this particular case, even if there was no prior and legalrequestcall and even if thePublisherwould like to emit items first before emitting anonErrorin general.
- Throws:
java.lang.Throwable
- the
-
required_spec309_requestNegativeNumberMustSignalIllegalArgumentException
void required_spec309_requestNegativeNumberMustSignalIllegalArgumentException() throws java.lang.Throwable
Asks for a shortPublisher(length 10) and issues a random, negativerequest()call which should trigger anonErrorcall with anIllegalArgumentException.Verifies rule: 3.9
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 10.Note that this test expects the
IllegalArgumentExceptionbeing signalled throughonError, not by throwing fromrequest()(which is also forbidden) or signalling the error by any other means (i.e., through theThread.currentThread().getUncaughtExceptionHandler()for example).Note also that requesting and emission may happen concurrently and honoring this rule may require extra coordination within the
Publisher.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - the
Publishercan emit anonErrorin this particular case, even if there was no prior and legalrequestcall and even if thePublisherwould like to emit items first before emitting anonErrorin general.
- Throws:
java.lang.Throwable
- the
-
optional_spec309_requestNegativeNumberMaySignalIllegalArgumentExceptionWithSpecificMessage
void optional_spec309_requestNegativeNumberMaySignalIllegalArgumentExceptionWithSpecificMessage() throws java.lang.Throwable
Asks for a shortPublisher(length 10) and issues a random, negativerequest()call which should trigger anonErrorcall with anIllegalArgumentException.Verifies rule: 3.9
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 10.Note that this test expects the
IllegalArgumentExceptionbeing signalled throughonError, not by throwing fromrequest()(which is also forbidden) or signalling the error by any other means (i.e., through theThread.currentThread().getUncaughtExceptionHandler()for example).Note also that requesting and emission may happen concurrently and honoring this rule may require extra coordination within the
Publisher.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - the
Publishercan emit anonErrorin this particular case, even if there was no prior and legalrequestcall and even if thePublisherwould like to emit items first before emitting anonErrorin general.
- Throws:
java.lang.Throwable
- the
-
required_spec312_cancelMustMakeThePublisherToEventuallyStopSignaling
void required_spec312_cancelMustMakeThePublisherToEventuallyStopSignaling() throws java.lang.Throwable
Asks for a shortPublisher(length 20), requests some items (less than the length), consumes one item then cancels the sequence and verifies the publisher emitted at most the requested amount and stopped emitting (or terminated).Verifies rule: 3.12
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 20.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - the cancellation indicator flag is properly persisted (may require volatile) and checked as part of the signal emission process.
- Throws:
java.lang.Throwable
- the
-
required_spec313_cancelMustMakeThePublisherEventuallyDropAllReferencesToTheSubscriber
void required_spec313_cancelMustMakeThePublisherEventuallyDropAllReferencesToTheSubscriber() throws java.lang.Throwable
Asks for a shortPublisher(length 3) requests and consumes one element from it, cancels theSubscription, callsSystem.gc()and then checks if all references to the testSubscriberhas been dropped (by checking theWeakReferencehas been emptied).Verifies rule: 3.13
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 3.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - the cancellation indicator flag is properly persisted (may require volatile) and checked as part of the signal emission process.
- the
Publisherstores theSubscriberreference somewhere which is then not cleaned up when theSubscriberis cancelled. Note that this may happen on many code paths in aPublisher, for example in an emission loop that terminates because of thecancelsignal or because reaching a terminal state. Note also that eagerly nullingSubscriberreferences may not be necessary for this test to pass in case there is a self-contained chain of them (i.e.,Publisher.subscribe()creates a chain of freshSubscriberinstances where each of them only references their downstreamSubscriberthus the chain can get GC'd when the reference to the finalSubscriberis dropped).
- Throws:
java.lang.Throwable
- the
-
required_spec317_mustSupportAPendingElementCountUpToLongMaxValue
void required_spec317_mustSupportAPendingElementCountUpToLongMaxValue() throws java.lang.Throwable
Asks for a shortPublisher(length 3) and requestsLong.MAX_VALUEfrom it, verifying that thePublisheremits all of its items and completes normally and does not keep spinning attempting to fulfill theLong.MAX_VALUEdemand by some means.Verifies rule: 3.17
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 3.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - if the
Publisherimplementation considers the cumulative request amount it receives, - if the
Publisherdoesn't lose anyrequest()signal and the state transition from idle -> emitting or emitting -> keep emitting works properly.
- Throws:
java.lang.Throwable
- the
-
required_spec317_mustSupportACumulativePendingElementCountUpToLongMaxValue
void required_spec317_mustSupportACumulativePendingElementCountUpToLongMaxValue() throws java.lang.Throwable
Asks for a shortPublisher(length 3) and requestsLong.MAX_VALUEfrom it in total (split across twoLong.MAX_VALUE / 2and onerequest(1)), verifying that thePublisheremits all of its items and completes normally.Verifies rule: 3.17
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less than 3.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - if the
Publisherimplementation considers the cumulative request amount it receives, - if the
Publisherimplements adding individual request amounts together properly (not overflowing into zero or negative pending request amounts) or not properly deducing the number of emitted items from the pending amount, - if the
Publisherdoesn't lose anyrequest()signal and the state transition from idle -> emitting or emitting -> keep emitting works properly.
- Throws:
java.lang.Throwable
- the
-
required_spec317_mustNotSignalOnErrorWhenPendingAboveLongMaxValue
void required_spec317_mustNotSignalOnErrorWhenPendingAboveLongMaxValue() throws java.lang.Throwable
Asks for a very longPublisher(up toInteger.MAX_VALUE), requestsLong.MAX_VALUE - 1after each received item and expects no failure due to a potential overflow in the pending emission count while consuming 10 items and cancelling the sequence.Verifies rule: 3.17
The test is not executed if
PublisherVerification.maxElementsFromPublisher()is less thanInteger.MAX_VALUE.The request pattern is one
request(1)upfront and tenrequest(Long.MAX_VALUE - 1)after.If this test fails, the following could be checked within the
Publisherimplementation:- the
TestEnvironmenthas large enough timeout specified in case thePublisherhas some time-delay behavior, - make sure the
required_createPublisher1MustProduceAStreamOfExactly1Element()andrequired_createPublisher3MustProduceAStreamOfExactly3Elements()tests pass, - if the
Publisherimplementation considers the cumulative request amount it receives, - if the
Publisherimplements adding individual request amounts together properly (not overflowing into zero or negative pending request amounts) or not properly deducing the number of emitted items from the pending amount, - if the
Publisherdoesn't lose anyrequest()signal and the state transition from idle -> emitting or emitting -> keep emitting works properly.
- Throws:
java.lang.Throwable
- the
-
-