{
BootstrapPullThread bsPuller =
createBootstrapPullThread(false, false, false, false, false, null, 12000, 1, true,
50L, 100L, "source1", "source2");
Checkpoint cp = _ckptHandlerTwoSources.createInitialBootstrapCheckpoint(null, 0L);
cp.setBootstrapServerInfo(_serverInfoName);
bsPuller.getComponentStatus().start();
ConnectionState connState = bsPuller.getConnectionState();
connState.getSourcesNameMap().put("source1", new IdNamePair(1L, "source1"));
connState.getSourcesNameMap().put("source2", new IdNamePair(2L, "source2"));
connState.getSourceIdMap().put(2L, new IdNamePair(2L, "source1"));
connState.getSourceIdMap().put(2L, new IdNamePair(2L, "source1"));
connState.switchToBootstrap(cp);
testTransitionCase(bsPuller, StateId.BOOTSTRAP, StateId.REQUEST_START_SCN, cp);
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.REQUEST_START_SCN, StateId.START_SCN_RESPONSE_SUCCESS, null);
bsPuller.getMessageQueue().clear();
Map<Long, List<RegisterResponseEntry>> entries = new HashMap<Long, List<RegisterResponseEntry>>();
entries.put(1L, new ArrayList<RegisterResponseEntry>());
connState.setSourcesSchemas(entries);
//set the startSCN
testTransitionCase(bsPuller, StateId.START_SCN_RESPONSE_SUCCESS, StateId.REQUEST_STREAM, null);
Assert.assertEquals(cp.getConsumptionMode(), DbusClientMode.BOOTSTRAP_SNAPSHOT);
Assert.assertEquals(cp.getSnapshotSource(), "source1");
Assert.assertFalse(cp.isSnapShotSourceCompleted());
//start snapshot for source1
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS, null);
bsPuller.getMessageQueue().clear();
cp.setSnapshotOffset(Checkpoint.FULLY_CONSUMED_WINDOW_OFFSET);
testTransitionCase(bsPuller, StateId.STREAM_REQUEST_SUCCESS, StateId.STREAM_RESPONSE_DONE, null);
//finish the snapshot phase for source1
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.STREAM_RESPONSE_DONE, StateId.REQUEST_TARGET_SCN, null);
//set targetSCN after the snapshot phase for source1
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.REQUEST_TARGET_SCN, StateId.TARGET_SCN_RESPONSE_SUCCESS, null);
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.TARGET_SCN_RESPONSE_SUCCESS, StateId.REQUEST_STREAM, null);
Assert.assertEquals(cp.getConsumptionMode(), DbusClientMode.BOOTSTRAP_CATCHUP);
Assert.assertFalse(cp.isCatchupSourceCompleted());
Assert.assertEquals(cp.getWindowScn(), 50L, "WindowSCN Check");
Assert.assertEquals(cp.getCatchupSource(), "source1", "Catchup Source check");
//start catch-up for source1
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS, null);
//finish the catch-up phase for source1
cp.setWindowOffset(Checkpoint.FULLY_CONSUMED_WINDOW_OFFSET);
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.STREAM_REQUEST_SUCCESS, StateId.STREAM_RESPONSE_DONE, cp);
//start the snapshot phase for source2
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.STREAM_RESPONSE_DONE, StateId.REQUEST_STREAM, null);
Assert.assertEquals(cp.getConsumptionMode(), DbusClientMode.BOOTSTRAP_SNAPSHOT);
Assert.assertEquals(cp.getSnapshotSource(), "source2");
Assert.assertFalse(cp.isSnapShotSourceCompleted());
Assert.assertTrue(cp.isCatchupSourceCompleted());
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS, null);
//finish the snapshot phase for source2
bsPuller.getMessageQueue().clear();
cp.setSnapshotOffset(Checkpoint.FULLY_CONSUMED_WINDOW_OFFSET);
testTransitionCase(bsPuller, StateId.STREAM_REQUEST_SUCCESS, StateId.STREAM_RESPONSE_DONE, null);
//set targetSCN after the snapshot phase for source2
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.STREAM_RESPONSE_DONE, StateId.REQUEST_TARGET_SCN, null);
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.REQUEST_TARGET_SCN, StateId.TARGET_SCN_RESPONSE_SUCCESS, null);
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.TARGET_SCN_RESPONSE_SUCCESS, StateId.REQUEST_STREAM, null);
//start catch-up for source1
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS, null);
Assert.assertEquals(cp.getConsumptionMode(), DbusClientMode.BOOTSTRAP_CATCHUP);
Assert.assertFalse(cp.isCatchupSourceCompleted());
Assert.assertEquals(cp.getWindowScn(), 50L, "WindowSCN Check");
Assert.assertEquals(cp.getCatchupSource(), "source1", "Catchup Source check");
cp.setWindowOffset(Checkpoint.FULLY_CONSUMED_WINDOW_OFFSET);
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.STREAM_REQUEST_SUCCESS, StateId.STREAM_RESPONSE_DONE, cp);
//finish the catch-up phase for source1
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.STREAM_RESPONSE_DONE, StateId.REQUEST_STREAM, cp);
//start catch-up for source2
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS, null);
Assert.assertEquals(cp.getConsumptionMode(), DbusClientMode.BOOTSTRAP_CATCHUP);
Assert.assertFalse(cp.isCatchupSourceCompleted());
Assert.assertEquals(cp.getWindowScn(), 50L, "WindowSCN Check");
Assert.assertEquals(cp.getCatchupSource(), "source2", "Catchup Source check");
//finish the catch-up phase for source2
cp.setWindowOffset(Checkpoint.FULLY_CONSUMED_WINDOW_OFFSET);
bsPuller.getMessageQueue().clear();
testTransitionCase(bsPuller, StateId.STREAM_REQUEST_SUCCESS, StateId.STREAM_RESPONSE_DONE, cp);
Assert.assertEquals(cp.getConsumptionMode(), DbusClientMode.BOOTSTRAP_CATCHUP,
"Consumption Mode check");
}