    @Test
    public void switchAsyncHeavily() {

        for (int i = 1; i < 1024; i *= 2) {
            System.out.println("switchAsyncHeavily >> " + i);

            final Queue<Throwable> q = new ConcurrentLinkedQueue<Throwable>();

            final long[] lastSeen = { 0L };

            final int j = i;
            TestSubscriber<Integer> ts = new TestSubscriber<Integer>(i) {
                int count;
                @Override
                public void onNext(Integer t) {
                    super.onNext(t);
                    lastSeen[0] = System.currentTimeMillis();
                    if (++count == j) {
                        count = 0;
                        requestMore(j);
                    }
                }
            };

            Observable.range(1, 10000)
                    .observeOn(Schedulers.computation(), i)
                    .map(new Func1<Integer, Observable<Integer>>() {
                        @Override
                        public Observable<Integer> call(Integer v) {
                            return Observable.range(1, 1000).observeOn(Schedulers.computation(), j)
                                    .doOnError(new Action1<Throwable>() {
                                        @Override
                                        public void call(Throwable e) {
                                            q.add(e);
                                        }
                                    });
                        }
                    })
                    .lift(OperatorSwitchThenUnsubscribe.<Integer>instance())
                    .timeout(30, TimeUnit.SECONDS)
                    .subscribe(ts);

            ts.awaitTerminalEvent(60, TimeUnit.SECONDS);
            if (!q.isEmpty()) {
                AssertionError ae = new AssertionError("Dropped exceptions");
                ae.initCause(new CompositeException(q));
                throw ae;
            }
            ts.assertNoErrors();
            if (ts.getCompletions() == 0) {
                fail("switchAsyncHeavily timed out @ " + j + " (" + ts.getOnNextEvents().size() + " onNexts received, last was " + (System.currentTimeMillis() - lastSeen[0]) + " ms ago");
            }
        }
    }