@Test
  public void bothOldAndNewEventsShouldBeProcessedByOldSender() {
    // Roll mixed site locator to current
    rollLocatorToCurrent(site1Locator, site1LocatorPort, site1DistributedSystemId, site1Locators,
        site2Locators);

    // Roll one mixed site server to current
    rollStartAndConfigureServerToCurrent(site1Server1, site1Locators, site2DistributedSystemId,
        regionName, site1SenderId, ParallelGatewaySenderQueue.DEFAULT_MESSAGE_SYNC_INTERVAL);
    site1Server1.invoke(() -> pauseSender(site1SenderId));

    // double check queue size should be numPuts
    site1Server1.invoke(() -> waitForQueueRegionToCertainSize(site1SenderId, numPuts, false));
    site1Server2.invoke(() -> waitForQueueRegionToCertainSize(site1SenderId, numPuts, false));

    // do additional puts, at least half of them will be put into new sender, then distributed to
    // the old sender
    site1Client.invoke(() -> {
      Region region = getCache().getRegion(regionName);
      for (int i = numPuts; i < numPuts * 2; i++) {
        region.put(i, i);
      }
    });

    // check queue size should be numPuts*2
    site1Server1.invoke(() -> waitForQueueRegionToCertainSize(site1SenderId, numPuts * 2, false));
    site1Server2.invoke(() -> waitForQueueRegionToCertainSize(site1SenderId, numPuts * 2, false));

    // Start and configure old site servers
    startAndConfigureServers(site2Server1, site2Server2, site2Locators, site1DistributedSystemId,
        regionName, site2SenderId, ParallelGatewaySenderQueue.DEFAULT_MESSAGE_SYNC_INTERVAL);

    // stop the new sender to force all the old+new events are processed by the remained old sender
    site1Server1.invoke(JUnit4CacheTestCase::closeCache);

    // resume the senders at mixed site
    site1Server2.invoke(() -> resumeSender(site1SenderId));

    // Wait for mixed site queues to be empty
    site1Server2.invoke(() -> waitForQueueRegionToCertainSize(site1SenderId, 0, false));

    // Verify remote site received events
    int remoteServer1EventsReceived = site2Server1.invoke(() -> getEventsReceived(regionName));
    int remoteServer2EventsReceived = site2Server2.invoke(() -> getEventsReceived(regionName));
    assertEquals(numPuts * 2, remoteServer1EventsReceived + remoteServer2EventsReceived);

    // Clear events received in both sites
    site1Server2.invoke(() -> clearEventsReceived(regionName));
    site2Server1.invoke(() -> clearEventsReceived(regionName));
    site2Server2.invoke(() -> clearEventsReceived(regionName));
  }
get new events to flow back to the old member and have the old member try to deserialize
the new event
1.create 2 old senders, pause
2.do puts, build up the queue.
3.roll one sender to current
4.do additional puts that get queued in the new member with a redundant copy on the old member
5.remove the new member
6.start sender on old member

The old sender should handle both old and new events, the remove site should receive all of
them
geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeNewSenderProcessOldEvent.java