You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: tck/README.md
+82-32
Original file line number
Diff line number
Diff line change
@@ -10,11 +10,11 @@ The TCK is implemented using **plain Java (1.6)** and **TestNG** tests, and shou
10
10
The TCK aims to cover all rules defined in the Specification, however for some rules outlined in the Specification it is
11
11
not possible (or viable) to construct automated tests, thus the TCK does not claim to completely verify an implementation, however it is very helpful and is able to validate the most important rules.
12
12
13
-
The TCK is split up into 4 files JUnit 4 test classes which should be extended by implementers, providing their `Publisher` / `Subscriber` implementations for the test harness to validate them. The tests are split in the following way:
13
+
The TCK is split up into 4 TestNG test classes which should be extended by implementers (read , providing their `Publisher` / `Subscriber` implementations for the test harness to validate them. The tests are split in the following way:
14
14
15
15
*`PublisherVerification`
16
-
*`SubscriberBlackboxVerification`
17
16
*`SubscriberWhiteboxVerification`
17
+
*`SubscriberBlackboxVerification`
18
18
*`IdentityProcessorVerification`
19
19
20
20
The next sections include examples on how these can be used and describe the various configuration options.
@@ -32,53 +32,65 @@ The TCK is provided as binary artifact on [Maven Central](http://search.maven.or
32
32
33
33
Please refer to the [Reactive Streams Specification](https://github.com/reactive-streams/reactive-streams) for the current latest version number. Make sure that the API and TCK dependency versions are equal.
34
34
35
-
### Types of tests
35
+
### Test method naming convention
36
36
37
37
Since the TCK is aimed at Reactive Stream implementers, looking into the sources of the TCK is well expected,
38
38
and should help during a libraries implementation cycle.
39
39
40
40
In order to make mapping between test cases and Specification rules easier, each test case covering a specific
41
-
Specification rule abides the following naming convention: `spec###_DESC` where:
41
+
Specification rule abides the following naming convention: `TYPE_spec###_DESC` where:
42
42
43
+
*`TYPE` is one of: [#type-required](required), [#type-optional](optional), [#type-stochastic](stochastic) or [#type-untested](untested) which describe if this test is covering a Rule that MUST or SHOULD be implemented. The specific words are explained in detail below.
43
44
*`###` is the Rule number (`1.xx` Rules are about Publishers, `2.xx` Rules are about Subscribers etc.)
44
45
*`DESC` is a short explanation of what exactly is being tested in this test case, as sometimes one Rule may have multiple test cases in order to cover the entire Rule.
The prefixes of the names of the test methods are used in order to signify the character of the test. For example, these are the kinds of prefixes you may find:
... means that this test case is optional, it covers a *MAY* or *SHOULD* Rule of the Specification. This prefix is also used if more configuration is needed in order to run it, e.g. `@Additional(implement = "createErrorStatePublisher") @Test` signals the implementer that in order to include this test case in his test runs, (s)he must implement the `Publisher<T> createErrorStatePublisher()` method.
70
+
<aname="type-optional"></a>
71
+
The `optional_` means that this test case is optional, it covers a *MAY* or *SHOULD* Rule of the Specification.
72
+
This prefix is also used if more configuration is needed in order to run it, e.g.
73
+
`@Additional(implement = "createFailedPublisher") @Test` signals the implementer that in order to run this test
74
+
one has to implement the `Publisher<T> createFailedPublisher()` method.
... means that the Rule is either racy, and/or inherently hard to verify without heavy modification of the tested implementation. Usually this means that this test case can yield false positives ("be green") even if for some case, the given implementation may violate the tested behaviour.
80
+
<aname="type-stochastic"></a>
81
+
The `stochastic_` means that the Rule is either racy, and/or inherently hard to verify without heavy modification of the tested implementation.
82
+
Usually this means that this test case can yield false positives ("be green") even if for some case, the given implementation may violate the tested behaviour.
... means that the test case is not implemented, either because it is inherently hard to verify (e.g. Rules which use the wording "*SHOULD consider X as Y*") or have not been implemented yet (though we hope we have implemented all we could!). Such tests will show up in your test runs as `SKIPPED`, with a message pointing out that the TCK is unable to validate this Rule. We would be delighted if you can figure out a way to deterministically test Rules, which have been marked with this prefix – pull requests are very welcome!
88
+
<aname="type-untested"></a>
89
+
The `untested_` means that the test case is not implemented, either because it is inherently hard to verify (e.g. Rules which use
90
+
the wording "*SHOULD consider X as Y*") or have not been implemented yet (though we hope we have implemented all we
91
+
could!). Such tests will show up in your test runs as `SKIPPED`, with a message pointing out that the TCK is unable to
92
+
validate this Rule. We would be delighted if you can figure out a way to deterministically test Rules, which have been
93
+
marked with this prefix – pull requests are very welcome!
82
94
83
95
### Test isolation
84
96
@@ -142,7 +154,7 @@ public class RangePublisherTest extends PublisherVerification<Integer> {
@@ -167,14 +179,17 @@ public class RangePublisherTest extends PublisherVerification<Integer> {
167
179
168
180
Notable configuration options include:
169
181
170
-
*`maxElementsFromPublisher` – which should only be overridden in case the Publisher under test is not able to provide arbitrary length streams, e.g. it's wrapping a `Future<T>` and thus can only publish up to 1 element. In such case you should return `1` from this method. It will cause all tests which require more elements in order to validate a certain Rule to be skipped,
171
-
*`boundedDepthOfOnNextAndRequestRecursion` – which should only be overridden in case of synchronous Publishers. This number will be used to validate if a
172
-
`Subscription` actually solves the "unbounded recursion" problem (Rule 3.3).
182
+
*`maxElementsFromPublisher` – which should only be overridden in case the Publisher under test is not able to provide
183
+
arbitrary length streams, e.g. it's wrapping a `Future<T>` and thus can only publish up to 1 element. In such case you
184
+
should return `1` from this method. It will cause all tests which require more elements in order to validate a certain
185
+
Rule to be skipped,
186
+
*`boundedDepthOfOnNextAndRequestRecursion` – which should only be overridden in case of synchronous Publishers.
187
+
This number will be used to validate if a `Subscription` actually solves the "unbounded recursion" problem (Rule 3.3).
173
188
174
189
### Timeout configuration
175
190
Publisher tests make use of two kinds of timeouts, one is the `defaultTimeoutMillis` which corresponds to all methods used
176
191
within the TCK which await for something to happen. The other timeout is `publisherReferenceGCTimeoutMillis` which is only used in order to verify
177
-
[Rule 3.13](https://github.com/reactive-streams/reactive-streams#3.13) which defines that subscriber references MUST be dropped
192
+
[Rule 3.13](https://github.com/reactive-streams/reactive-streams#3.13) which defines that subscriber references dropped
178
193
by the Publisher.
179
194
180
195
In order to configure these timeouts (for example when running on a slow continious integtation machine), you can either:
@@ -239,7 +254,7 @@ The `createElement` method MAY be called from multiple
239
254
threads, so in case of more complicated implementations, please be aware of this fact.
240
255
241
256
**Very Advanced**: While we do not expect many implementations having to do so, it is possible to take full control of the `Publisher`
242
-
which will be driving the TCKs test. You can do this by implementing the `createHelperPublisher` method in which you can implement your
257
+
which will be driving the TCKs test. This can be achieved by implementing the `createHelperPublisher` method in which you can implement your
243
258
own Publisher which will then be used by the TCK to drive your Subscriber tests:
244
259
245
260
```java
@@ -375,7 +390,7 @@ public class MySubscriberTest extends BlackboxSubscriberVerification<Integer> {
notVerified("Unable to implement test because ...");
519
+
@Override
520
+
publicPublisher<Integer>createFailedPublisher() {
521
+
returnnull; // returning null means that the tests validating a failed publisher will be skipped
477
522
}
478
523
479
524
}
480
525
```
481
526
482
-
## Upgrade story
527
+
## Upgrading the TCK to newer versions
528
+
While we do not expect the Reactive Streams specification to change in the forseeable future,
529
+
it *may happen* that some semantics may need to change at some point. In this case you should expect test
530
+
methods being phased out in terms of deprecation or removal, new tests may also be added over time.
483
531
484
-
**TODO** - What is our story about updating the TCK? How do we make sure that implementations don't accidentally miss some change in the spec, if the TCK is unable to fail verify the new behavior? Comments are very welcome, discussion about this is under-way in [Issue #99 – TCK Upgrade Story](https://github.com/reactive-streams/reactive-streams/issues/99).
532
+
In general this should not be of much concern, unless overriding test methods in your test suite.
533
+
We ask implementers who find the need of overriding provided test methods to reach out via opening tickets
534
+
on the `reactive-streams/reactive-streams-jvm` project, so we can discuss the use case and, most likely, improve the TCK.
485
535
486
536
## Using the TCK from other languages
487
537
@@ -504,7 +554,7 @@ class IterablePublisherTest(env: TestEnvironment, publisherShutdownTimeout: Long
s.onError(newException("Unable to serve subscribers right now!"))
@@ -518,4 +568,4 @@ class IterablePublisherTest(env: TestEnvironment, publisherShutdownTimeout: Long
518
568
519
569
Contributions to this document are very welcome!
520
570
521
-
If you're implementing reactive streams using the TCK in some language, please feel free to share an example on how to best use it from your language of choice.
571
+
When implementing Reactive Streams using the TCK in some language, please feel free to share an example on how to best use it from your language of choice.
0 commit comments