|
1
|
|
/* |
|
2
|
|
* Copyright 2014-2026 Grzegorz Piwowarek, https://4comprehension.com/ |
|
3
|
|
* |
|
4
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
5
|
|
* you may not use this file except in compliance with the License. |
|
6
|
|
* You may obtain a copy of the License at |
|
7
|
|
* |
|
8
|
|
* https://www.apache.org/licenses/LICENSE-2.0 |
|
9
|
|
* |
|
10
|
|
* Unless required by applicable law or agreed to in writing, software |
|
11
|
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
12
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
13
|
|
* See the License for the specific language governing permissions and |
|
14
|
|
* limitations under the License. |
|
15
|
|
*/ |
|
16
|
|
package com.pivovarit.collectors; |
|
17
|
|
|
|
18
|
|
import java.util.concurrent.atomic.AtomicLong; |
|
19
|
|
|
|
20
|
|
final class Deadline { |
|
21
|
|
|
|
22
|
|
private static final long UNSET = Long.MIN_VALUE; |
|
23
|
|
|
|
24
|
|
private final long timeoutNanos; |
|
25
|
|
private final AtomicLong deadlineNanos = new AtomicLong(UNSET); |
|
26
|
|
|
|
27
|
|
Deadline(long timeoutNanos) { |
|
28
|
|
this.timeoutNanos = timeoutNanos; |
|
29
|
|
} |
|
30
|
|
|
|
31
|
|
long remainingNanos() { |
|
32
|
|
long deadline = deadlineNanos.get(); |
|
33
|
1
1. remainingNanos : negated conditional → KILLED
|
if (deadline == UNSET) { |
|
34
|
1
1. remainingNanos : Replaced long addition with subtraction → KILLED
|
long candidate = System.nanoTime() + timeoutNanos; |
|
35
|
1
1. remainingNanos : negated conditional → SURVIVED
|
deadline = deadlineNanos.compareAndSet(UNSET, candidate) ? candidate : deadlineNanos.get(); |
|
36
|
|
} |
|
37
|
2
1. remainingNanos : Replaced long subtraction with addition → KILLED
2. remainingNanos : replaced long return with 0 for com/pivovarit/collectors/Deadline::remainingNanos → KILLED
|
return Math.max(0, deadline - System.nanoTime()); |
|
38
|
|
} |
|
39
|
|
} |
| | Mutations |
| 33 |
|
1.1 Location : remainingNanos Killed by : com.pivovarit.collectors.DeadlineTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.DeadlineTest]/[method:shouldNotReturnNegativeAfterDeadlinePassed()] negated conditional → KILLED
|
| 34 |
|
1.1 Location : remainingNanos Killed by : com.pivovarit.collectors.DeadlineTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.DeadlineTest]/[method:shouldNotObserveSpuriousTimeoutWhenCalledConcurrently()] Replaced long addition with subtraction → KILLED
|
| 35 |
|
1.1 Location : remainingNanos Killed by : none negated conditional → SURVIVED
Covering tests
Covered by tests:
- com.pivovarit.collectors.DeadlineTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.DeadlineTest]/[method:shouldNotObserveSpuriousTimeoutWhenCalledConcurrently()]
- com.pivovarit.collectors.DeadlineTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.DeadlineTest]/[method:shouldNotReturnNegativeAfterDeadlinePassed()]
- com.pivovarit.collectors.DeadlineTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.DeadlineTest]/[method:shouldCountDownAfterStart()]
- com.pivovarit.collectors.DeadlineTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.DeadlineTest]/[method:shouldNotStartUntilFirstRemainingCall()]
- com.pivovarit.collectors.test.TimeoutStreamingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.TimeoutStreamingTest]/[method:shouldNotTimeoutOrderedWhenFastEnough()]
- com.pivovarit.collectors.test.TimeoutStreamingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.TimeoutStreamingTest]/[method:shouldNotTimeoutUnorderedWhenFastEnough()]
- com.pivovarit.collectors.test.TimeoutStreamingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.TimeoutStreamingTest]/[method:shouldTimeoutUnordered()]
- com.pivovarit.collectors.test.StreamingInterruptionTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.StreamingInterruptionTest]/[test-factory:shouldUnblockConsumerOnInterrupt()]/[dynamic-test:#2]
- com.pivovarit.collectors.test.StreamingInterruptionTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.StreamingInterruptionTest]/[test-factory:shouldUnblockConsumerOnInterrupt()]/[dynamic-test:#4]
- com.pivovarit.collectors.CompletionOrderSpliteratorTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.CompletionOrderSpliteratorTest]/[method:shouldTimeoutWhenNoElementBecomesAvailable()]
- com.pivovarit.collectors.test.TimeoutStreamingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.TimeoutStreamingTest]/[method:shouldTimeoutOrdered()]
- com.pivovarit.collectors.test.TimeoutStreamingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.TimeoutStreamingTest]/[method:shouldTimeoutStreamingBy()]
- com.pivovarit.collectors.test.TimeoutStreamingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.TimeoutStreamingTest]/[method:shouldTimeoutWhenBatching()]
- com.pivovarit.collectors.test.TimeoutStreamingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.TimeoutStreamingTest]/[method:shouldEmitCompletedElementBeforeTimeoutOrdered()]
- com.pivovarit.collectors.test.TimeoutStreamingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.TimeoutStreamingTest]/[method:shouldEmitCompletedElementBeforeTimeoutUnordered()]
|
| 37 |
|
1.1 Location : remainingNanos Killed by : com.pivovarit.collectors.DeadlineTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.DeadlineTest]/[method:shouldNotReturnNegativeAfterDeadlinePassed()] Replaced long subtraction with addition → KILLED
2.2 Location : remainingNanos Killed by : com.pivovarit.collectors.DeadlineTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.DeadlineTest]/[method:shouldNotObserveSpuriousTimeoutWhenCalledConcurrently()] replaced long return with 0 for com/pivovarit/collectors/Deadline::remainingNanos → KILLED
|