Skip to content

Commit a8e638a

Browse files
committed
Rewrite unit test to simply inflate heap
1 parent 7ec5344 commit a8e638a

File tree

2 files changed

+41
-232
lines changed

2 files changed

+41
-232
lines changed

src/test/java/io/reactivex/rxjava3/internal/operators/observable/ObservableCacheTest.java

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,19 @@
1616
import static org.junit.Assert.*;
1717
import static org.mockito.Mockito.*;
1818

19+
import java.lang.management.ManagementFactory;
20+
import java.lang.management.MemoryMXBean;
21+
import java.lang.management.MemoryUsage;
1922
import java.util.*;
2023
import java.util.concurrent.*;
2124
import java.util.concurrent.atomic.AtomicInteger;
25+
import java.util.concurrent.atomic.AtomicLong;
2226
import java.util.stream.Collectors;
2327
import java.util.stream.IntStream;
2428

29+
import io.reactivex.rxjava3.observables.ConnectableObservable;
2530
import io.reactivex.rxjava3.subjects.CompletableSubject;
31+
import org.junit.Assert;
2632
import org.junit.Test;
2733

2834
import io.reactivex.rxjava3.core.*;
@@ -360,41 +366,50 @@ public void addRemoveRace() {
360366
}
361367

362368
@Test
363-
public void valuesAreReclaimable() {
364-
for (int c = 1; c <= 32; c *= 2) {
365-
for (int numValues : Arrays.asList(0, 1, c - 1, c, c + 1, c * 2 - 1, c * 2, c * 2 + 1)) {
369+
public void valuesAreReclaimable() throws Exception {
370+
ConnectableObservable<byte[]> source =
371+
Observable.range(0, 200)
372+
.map($ -> new byte[1024 * 1024])
373+
.publish();
366374

367-
CompletableSubject termination = CompletableSubject.create();
368-
List<Integer> integers = IntStream.range(0, numValues).boxed().collect(Collectors.toList());
369-
int lastNodeIndex = Math.max(0, ((numValues - 1) / c) * c);
375+
System.out.println("Bounded Replay Leak check: Wait before GC");
376+
Thread.sleep(1000);
370377

371-
List<Reclaimable<Payload>> payloads = integers.stream()
372-
.map(Payload::new)
373-
.map(Reclaimable::of)
374-
.collect(Collectors.toList());
375-
Reclaimable<Observable<Payload>> cache = Reclaimable.of(
376-
Observable.fromStream(payloads.stream().map(Reclaimable::remove))
377-
.concatWith(termination)
378-
.cacheWithInitialCapacity(c));
378+
System.out.println("Bounded Replay Leak check: GC");
379+
System.gc();
379380

380-
TestObserver<Integer> o = cache.remove().map(Payload::value).test();
381+
Thread.sleep(500);
381382

382-
Reclaimable.forceGC()
383-
.assertReclaimed(cache)
384-
.assertAllReclaimed(payloads.subList(0, lastNodeIndex))
385-
.assertAllUnreclaimed(payloads.subList(lastNodeIndex, numValues));
383+
final MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
384+
MemoryUsage memHeap = memoryMXBean.getHeapMemoryUsage();
385+
long initial = memHeap.getUsed();
386386

387-
o.assertValueSequence(integers)
388-
.assertNotComplete()
389-
.assertNoErrors();
387+
System.out.printf("Bounded Replay Leak check: Starting: %.3f MB%n", initial / 1024.0 / 1024.0);
390388

391-
termination.onComplete();
389+
final AtomicLong after = new AtomicLong();
392390

393-
o.assertValueSequence(integers)
394-
.assertComplete();
391+
source.cache().lastElement().subscribe(new Consumer<byte[]>() {
392+
@Override
393+
public void accept(byte[] v) throws Exception {
394+
System.out.println("Bounded Replay Leak check: Wait before GC 2");
395+
Thread.sleep(1000);
396+
397+
System.out.println("Bounded Replay Leak check: GC 2");
398+
System.gc();
395399

396-
Reclaimable.forceGC().assertAllReclaimed(payloads);
400+
Thread.sleep(500);
401+
402+
after.set(memoryMXBean.getHeapMemoryUsage().getUsed());
397403
}
404+
});
405+
406+
source.connect();
407+
408+
System.out.printf("Bounded Replay Leak check: After: %.3f MB%n", after.get() / 1024.0 / 1024.0);
409+
410+
if (initial + 100 * 1024 * 1024 < after.get()) {
411+
Assert.fail("Bounded Replay Leak check: Memory leak detected: " + (initial / 1024.0 / 1024.0)
412+
+ " -> " + after.get() / 1024.0 / 1024.0);
398413
}
399414
}
400415

src/test/java/io/reactivex/rxjava3/testsupport/Reclaimable.java

Lines changed: 0 additions & 206 deletions
This file was deleted.

0 commit comments

Comments
 (0)