Skip to content

Commit ec9bd2c

Browse files
committed
fix: getSubscription should not expose internal sentinel subscription
1 parent dba41f0 commit ec9bd2c

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

rxjava-core/src/main/java/rx/subscriptions/SerialSubscription.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
*/
3030
public class SerialSubscription implements Subscription {
3131
private final AtomicReference<Subscription> reference = new AtomicReference<Subscription>(empty());
32-
32+
private volatile Subscription unsubscribe;
33+
3334
private static final Subscription UNSUBSCRIBED = new Subscription() {
3435
@Override
3536
public void unsubscribe() {
@@ -50,8 +51,16 @@ public void setSubscription(final Subscription subscription) {
5051
}
5152
if (reference.compareAndSet(current, subscription)) {
5253
current.unsubscribe();
54+
if(subscription == UNSUBSCRIBED) {
55+
unsubscribe = current;
56+
}
5357
break;
5458
}
5559
} while (true);
5660
}
61+
62+
public Subscription getSubscription() {
63+
Subscription subscription = reference.get();
64+
return subscription == UNSUBSCRIBED ? unsubscribe : subscription;
65+
}
5766
}

rxjava-core/src/test/java/rx/subscriptions/SerialSubscriptionTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package rx.subscriptions;
1717

18+
import static org.junit.Assert.assertSame;
1819
import static org.junit.Assert.fail;
1920
import static org.mockito.Mockito.mock;
2021
import static org.mockito.Mockito.verify;
@@ -46,6 +47,25 @@ public void unsubscribingWithoutUnderlyingDoesNothing() {
4647
serialSubscription.unsubscribe();
4748
}
4849

50+
@Test
51+
public void getSubscriptionShouldReturnSubscriptionAfterUnsubscribe() {
52+
final Subscription underlying = mock(Subscription.class);
53+
serialSubscription.setSubscription(underlying);
54+
serialSubscription.unsubscribe();
55+
assertSame(underlying, serialSubscription.getSubscription());
56+
}
57+
58+
@Test
59+
public void getSubscriptionShouldReturnSetSubscription() {
60+
final Subscription underlying = mock(Subscription.class);
61+
serialSubscription.setSubscription(underlying);
62+
assertSame(underlying, serialSubscription.getSubscription());
63+
64+
final Subscription another = mock(Subscription.class);
65+
serialSubscription.setSubscription(another);
66+
assertSame(another, serialSubscription.getSubscription());
67+
}
68+
4969
@Test
5070
public void unsubscribingTwiceDoesUnsubscribeOnce() {
5171
Subscription underlying = mock(Subscription.class);

0 commit comments

Comments
 (0)