@Test
public void testShouldNotCompeleteOpenedRegionSuccessfullyIfVersionMismatches()
throws Exception {
try {
TEST_UTIL.startMiniZKCluster();
final Server server = new MockServer();
HTableDescriptor htd = new HTableDescriptor(
"testShouldNotCompeleteOpenedRegionSuccessfullyIfVersionMismatches");
final HRegionInfo hri = new HRegionInfo(htd, HConstants.EMPTY_END_ROW,
HConstants.EMPTY_END_ROW);
HRegion region = HRegion.createHRegion(hri, HBaseTestingUtility
.getTestDir(), server.getConfiguration());
assertNotNull(region);
AssignmentManager am = Mockito.mock(AssignmentManager.class);
when(am.isRegionInTransition(hri)).thenReturn(
new RegionState(region.getRegionInfo(), RegionState.State.OPEN,
System.currentTimeMillis()));
// create a node with OPENED state
zkw = HBaseTestingUtility.createAndForceNodeToOpenedState(TEST_UTIL,
region, server.getServerName());
when(am.getZKTable()).thenReturn(new ZKTable(zkw));
Stat stat = new Stat();
String nodeName = ZKAssign.getNodeName(zkw, hri.getEncodedName());
ZKUtil.getDataAndWatch(zkw, nodeName, stat);
// use the version for the OpenedRegionHandler
OpenedRegionHandler handler = new OpenedRegionHandler(server, am, region
.getRegionInfo(), new HServerInfo(new HServerAddress(
new InetSocketAddress(1111)), 0, ""), stat.getVersion());
// Once again overwrite the same znode so that the version changes.
ZKAssign.transitionNode(zkw, region.getRegionInfo(), server
.getServerName(), EventType.RS_ZK_REGION_OPENED,
EventType.RS_ZK_REGION_OPENED, stat.getVersion());
// Should not invoke assignmentmanager.regionOnline. If it is invoked as
// per current mocking it will throw null pointer exception.