@Test
  public void testOlderEventIgnoredEvenIfTombstoneHasExpired() throws Exception {
    String name = nameRule.getMethodName();
    RegionFactory f = cache.createRegionFactory(RegionShortcut.REPLICATE);
    final DistributedRegion region = (DistributedRegion) f.create(name);

    // simulate a put() getting into AbstractRegionMap.basicPut() and creating an entry
    // that has not yet been initialized with values. Then do a destroy that will encounter
    // the entry
    String key = "destroyedKey1";
    VersionedThinRegionEntryHeap entry =
        new VersionedThinRegionEntryHeapObjectKey(region, key, Token.REMOVED_PHASE1);
    entry.setLastModified(
        System.currentTimeMillis() - (2 * TombstoneService.REPLICATE_TOMBSTONE_TIMEOUT));
    ((AbstractRegionMap) region.getRegionMap()).putEntryIfAbsentForTest(entry);
    cache.getLogger().info("entry inserted into cache: " + entry);

    EntryEventImpl ev = EntryEventImpl.create(region, Operation.DESTROY, key, null, null, true,
        new InternalDistributedMember(InetAddress.getLocalHost(), 1234));
    VersionTag tag = VersionTag.create((InternalDistributedMember) ev.getDistributedMember());
    tag.setIsRemoteForTesting();
    tag.setEntryVersion(3);
    tag.setRegionVersion(12345);
    tag.setVersionTimeStamp(
        System.currentTimeMillis() - TombstoneService.REPLICATE_TOMBSTONE_TIMEOUT);
    tag.setDistributedSystemId(1);
    ev.setVersionTag(tag);
    cache.getLogger().info("trying to destroy the entry: " + region.getRegionEntry(key));
    region.basicDestroy(ev, false, null); // expectedOldValue not supported on
    entry = (VersionedThinRegionEntryHeap) region.getRegionEntry(key);
    region.dumpBackingMap();
    Assert.assertTrue(entry != null, "expected to find a region entry for " + key);
    Assert.assertTrue(entry.isTombstone(),
        "expected entry to be found and be a tombstone but it is " + entry);
    Assert.assertTrue(entry.getVersionStamp().getEntryVersion() == tag.getEntryVersion(),
        "expected " + tag.getEntryVersion() + " but found "
            + entry.getVersionStamp().getEntryVersion());

    // pause to let the clock change
    Thread.sleep(100);

    ev = EntryEventImpl.create(region, Operation.UPDATE, key, null, null, true,
        new InternalDistributedMember(InetAddress.getLocalHost(), 1234));
    tag = VersionTag.create((InternalDistributedMember) ev.getDistributedMember());
    tag.setIsRemoteForTesting();
    tag.setEntryVersion(1);
    tag.setRegionVersion(12340);
    tag.setVersionTimeStamp(
        System.currentTimeMillis() - TombstoneService.REPLICATE_TOMBSTONE_TIMEOUT - 10000);
    tag.setDistributedSystemId(1);
    ev.setVersionTag(tag);
    cache.getLogger()
        .info("trying to update the entry with an older event: " + region.getRegionEntry(key));
    region.virtualPut(ev, false, true, null, false, tag.getVersionTimeStamp(), true);
    entry = (VersionedThinRegionEntryHeap) region.getRegionEntry(key);
    region.dumpBackingMap();
    Assert.assertTrue(entry != null, "expected to find a region entry for " + key);
    Assert.assertTrue(entry.isTombstone(),
        "expected entry to be found and be a tombstone but it is " + entry);
    Assert.assertTrue(entry.getVersionStamp().getEntryVersion() == 3,
        "expected 3" + " but found " + entry.getVersionStamp().getEntryVersion());

  }
In bug #47868 a thread puts a REMOVED_PHASE1 entry in the map but is unable to lock the entry
before a Destroy thread gets it. The Destroy thread did not apply its operation but threw an
EntryNotFoundException. It is supposed to create a Tombstone.
geode-core/src/integrationTest/java/org/apache/geode/internal/cache/TombstoneCreationJUnitTest.java