@Test
  public void testRepeatableRead() throws CacheException {
    final TXManagerImpl txMgrImpl = (TXManagerImpl) txMgr;
    TXStateProxy tx;

    // try repeating a get and make sure it doesn't cause a conflict
    region.put("key1", "value1"); // non-tx
    txMgrImpl.begin();
    assertEquals("value1", region.get("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);

    assertEquals("value1", region.get("key1"));
    txMgrImpl.commit();

    // try repeating a get and modify the entry and make sure it causes a conflict
    region.put("key1", "value1"); // non-tx
    txMgrImpl.begin();
    assertEquals("value1", region.get("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals("value1", region.get("key1"));
    region.put("key1", "value3");
    assertEquals("value3", region.get("key1"));
    try {
      txMgrImpl.commit();
      fail("expected CommitConflictException");
    } catch (CommitConflictException ignored) {
    }

    // try repeating a getEntry and make sure it doesn't cause a conflict
    region.put("key1", "value1"); // non-tx
    txMgrImpl.begin();
    region.getEntry("key1");
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);

    assertEquals("value1", region.get("key1"));
    txMgrImpl.commit();

    // try repeating a getEntry and modify the entry and make sure it causes a conflict
    region.put("key1", "value1"); // non-tx
    txMgrImpl.begin();
    region.getEntry("key1");
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    region.put("key1", "value3");
    try {
      txMgrImpl.commit();
      fail("expected CommitConflictException");
    } catch (CommitConflictException ignored) {
    }

    // try RR when entry fetched using entrySet
    region.put("key1", "value1"); // non-tx
    txMgrImpl.begin();
    region.get("key1"); // bootstrap the tx, entrySet does not
    region.entrySet(false).iterator().next();
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);

    assertEquals("value1", region.get("key1"));
    txMgrImpl.commit();

    // try RRW->CONFLICT when entry fetched using entrySet
    region.put("key1", "value1"); // non-tx
    txMgrImpl.begin();
    region.get("key1"); // bootstrap the tx, entrySet does not
    region.entrySet(false).iterator().next();
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals("value1", region.get("key1"));
    region.put("key1", "value3");
    try {
      txMgrImpl.commit();
      fail("expected CommitConflictException");
    } catch (CommitConflictException ignored) {
    }

    // try containsKey
    region.put("key1", "value1"); // non-tx
    txMgrImpl.begin();
    assertEquals(true, region.containsKey("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.remove("key1"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(true, region.containsKey("key1"));
    txMgrImpl.commit();
    region.put("key1", "value1"); // non-tx
    txMgrImpl.begin();
    assertEquals(true, region.containsKey("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.remove("key1"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(true, region.containsKey("key1"));
    region.put("key1", "value3");
    assertEquals(true, region.containsKey("key1"));
    try {
      txMgrImpl.commit();
      fail("expected CommitConflictException");
    } catch (CommitConflictException ignored) {
    }
    // try containsValueForKey
    region.put("key1", "value1"); // non-tx
    txMgrImpl.begin();
    assertEquals(true, region.containsValueForKey("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.remove("key1"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(true, region.containsValueForKey("key1"));
    txMgrImpl.commit();
    region.put("key1", "value1"); // non-tx
    txMgrImpl.begin();
    assertEquals(true, region.containsValueForKey("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.remove("key1"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(true, region.containsValueForKey("key1"));
    region.put("key1", "value3");
    assertEquals(true, region.containsValueForKey("key1"));
    try {
      txMgrImpl.commit();
      fail("expected CommitConflictException");
    } catch (CommitConflictException ignored) {
    }

    // now try the same things but with no entry in committed state at
    // the time of the first read
    // try repeating a get and make sure it doesn't cause a conflict
    region.remove("key1"); // non-tx
    txMgrImpl.begin();
    assertEquals(null, region.get("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);

    assertEquals(null, region.get("key1"));
    txMgrImpl.commit();

    // try repeating a get and modify the entry and make sure it causes a conflict
    region.remove("key1"); // non-tx
    txMgrImpl.begin();
    assertEquals(null, region.get("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(null, region.get("key1"));
    region.put("key1", "value3");
    assertEquals("value3", region.get("key1"));
    try {
      txMgrImpl.commit();
      fail("expected CommitConflictException");
    } catch (CommitConflictException ignored) {
    }

    // try repeating a getEntry and make sure it doesn't cause a conflict
    region.remove("key1"); // non-tx
    txMgrImpl.begin();
    assertEquals(null, region.getEntry("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);

    assertEquals(null, region.getEntry("key1"));
    txMgrImpl.commit();

    // try repeating a getEntry and modify the entry and make sure it causes a conflict
    region.remove("key1"); // non-tx
    txMgrImpl.begin();
    assertEquals(null, region.getEntry("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(null, region.getEntry("key1"));
    region.put("key1", "value3");
    try {
      txMgrImpl.commit();
      fail("expected CommitConflictException");
    } catch (CommitConflictException ignored) {
    }

    // try containsKey
    region.remove("key1"); // non-tx
    txMgrImpl.begin();
    assertEquals(false, region.containsKey("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(false, region.containsKey("key1"));
    txMgrImpl.commit();
    region.remove("key1"); // non-tx
    txMgrImpl.begin();
    assertEquals(false, region.containsKey("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(false, region.containsKey("key1"));
    region.put("key1", "value3");
    assertEquals(true, region.containsKey("key1"));
    try {
      txMgrImpl.commit();
      fail("expected CommitConflictException");
    } catch (CommitConflictException ignored) {
    }

    // try containsValueForKey
    region.remove("key1"); // non-tx
    txMgrImpl.begin();
    assertEquals(false, region.containsValueForKey("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(false, region.containsValueForKey("key1"));
    txMgrImpl.commit();
    region.remove("key1"); // non-tx
    txMgrImpl.begin();
    assertEquals(false, region.containsValueForKey("key1"));
    tx = txMgrImpl.pauseTransaction();
    region.put("key1", "value2"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(false, region.containsValueForKey("key1"));
    region.put("key1", "value3");
    assertEquals(true, region.containsValueForKey("key1"));
    try {
      txMgrImpl.commit();
      fail("expected CommitConflictException");
    } catch (CommitConflictException ignored) {
    }

    // try an invalidate of an already invalid entry
    region.remove("key1"); // non-tx
    region.create("key1", null); // non-tx
    txMgrImpl.begin();
    region.get("key1");
    region.localInvalidate("key1"); // should be a noop since it is already invalid
    tx = txMgrImpl.pauseTransaction();
    region.remove("key1"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    txMgrImpl.commit();
    assertEquals(false, region.containsKey("key1"));

    // make sure a noop invalidate is repeatable read
    region.remove("key1"); // non-tx
    region.create("key1", null); // non-tx
    txMgrImpl.begin();
    region.localInvalidate("key1"); // should be a noop since it is already invalid
    tx = txMgrImpl.pauseTransaction();
    region.remove("key1"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(true, region.containsKey("key1"));
    assertEquals(false, region.containsValueForKey("key1"));
    txMgrImpl.commit();
    assertEquals(false, region.containsKey("key1"));

    // make sure a destroy that throws entryNotFound is repeatable read
    region.remove("key1"); // non-tx
    txMgrImpl.begin();
    try {
      region.localDestroy("key1");
      fail("expected EntryNotFoundException");
    } catch (EntryNotFoundException ignored) {
    }
    tx = txMgrImpl.pauseTransaction();
    region.create("key1", "value1"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(false, region.containsKey("key1"));
    txMgrImpl.commit();
    assertEquals(true, region.containsKey("key1"));
    region.remove("key1"); // non-tx

    // make sure a create that throws entryExists is repeatable read
    region.create("key1", "non-tx-value1"); // non-tx
    txMgrImpl.begin();
    try {
      region.create("key1", "value1");
      fail("expected EntryExistsException");
    } catch (EntryExistsException ignored) {
    }
    tx = txMgrImpl.pauseTransaction();
    region.remove("key1"); // non-tx
    txMgrImpl.unpauseTransaction(tx);
    assertEquals(true, region.containsKey("key1"));
    txMgrImpl.commit();
    assertEquals(false, region.containsKey("key1"));
  }
Test to make sure CacheListener callbacks are called in place with the CacheEvents properly
constructed
geode-core/src/integrationTest/java/org/apache/geode/TXJUnitTest.java