public void testValidations() throws Exception {
    // Valid object ids
    ObjectIDSet validOids = new BitSetObjectIDSet();
    for (int i = 0; i < 10; i++) {
      for (int j = 0; j < 50; j++) {
        long longOid = 100 * i + j;
        validOids.add(new ObjectID(longOid));
      }
    }

    ClientID[] cids = new ClientID[10];
    for (int i = 0; i < 10; i++) {
      cids[i] = new ClientID(i);
    }

    for (int i = 0; i < 10; i++) {
      ObjectIDSet validate = new BitSetObjectIDSet();
      for (int j = 0; j < 100; j++) {
        long longOid = 100 * i + j;
        validate.add(new ObjectID(longOid));
      }
      invalidateObjectManager.addObjectsToValidateFor(cids[i], validate);
    }

    invalidateObjectManager.start();

    invalidateObjectManager.validateObjects(validOids);

    ArrayList list = inValidateSink.getList();
    Assert.assertEquals(10, list.size());

    for (int i = 0; i < 10; i++) {
      InvalidateObjectsForClientContext clientContext =
          (InvalidateObjectsForClientContext) list.get(i);
      ClientID cid = clientContext.getClientID();
      int k = (int) cid.toLong();

      Invalidations invalidationsGot = invalidateObjectManager.getObjectsIDsToInvalidate(cid);
      Invalidations expected = new Invalidations();
      ObjectID mapID = ObjectID.NULL_ID;
      for (int j = 50; j < 100; j++) {
        long longOid = 100 * k + j;
        expected.add(mapID, new ObjectID(longOid));
      }
      Assert.assertEquals(expected, invalidationsGot);
    }
  }
  public void testBasic() throws Exception {
    invalidateObjectManager.start();

    ClientID cid1 = new ClientID(1);
    ClientID cid2 = new ClientID(2);

    ObjectID mapId1 = new ObjectID(1001);
    ObjectID mapId2 = new ObjectID(1002);
    ObjectID mapId3 = new ObjectID(1003);

    Invalidations invalidations = new Invalidations();
    for (int i = 1; i <= 10; i++) {
      invalidations.add(mapId1, new ObjectID(i));
      invalidations.add(mapId2, new ObjectID(i + 10));
    }

    invalidateObjectManager.invalidateObjectFor(cid1, invalidations);

    Invalidations invalidationsGot = invalidateObjectManager.getObjectsIDsToInvalidate(cid1);
    Assert.assertTrue(invalidationsGot.equals(invalidations));
    ArrayList list = inValidateSink.getList();
    Assert.assertEquals(1, list.size());
    InvalidateObjectsForClientContext clientContext =
        (InvalidateObjectsForClientContext) list.get(0);
    Assert.assertEquals(cid1, clientContext.getClientID());
    list.clear();

    invalidations = new Invalidations();
    for (int i = 1; i <= 10; i++) {
      invalidations.add(mapId1, new ObjectID(i));
      invalidations.add(mapId2, new ObjectID(i + 10));
    }
    Invalidations total = new Invalidations();
    total.add(invalidations);

    list = inValidateSink.getList();
    Assert.assertEquals(0, list.size());
    invalidateObjectManager.invalidateObjectFor(cid1, invalidations);
    list = inValidateSink.getList();
    Assert.assertEquals(1, list.size());

    Invalidations invalidations2 = new Invalidations();
    for (int i = 1; i <= 10; i++) {
      invalidations2.add(mapId3, new ObjectID(i + 20));
    }
    total.add(invalidations2);

    invalidateObjectManager.invalidateObjectFor(cid1, invalidations2);
    list = inValidateSink.getList();
    Assert.assertEquals(1, list.size());

    invalidationsGot = invalidateObjectManager.getObjectsIDsToInvalidate(cid1);
    Assert.assertTrue(invalidationsGot.equals(total));

    list.clear();

    invalidationsGot = invalidateObjectManager.getObjectsIDsToInvalidate(cid1);
    Assert.assertNull(invalidationsGot);

    Invalidations invalidationsCid1 = new Invalidations();
    Invalidations invalidationsCheckCid1 = new Invalidations();
    Invalidations invalidationsCid2 = new Invalidations();
    Invalidations invalidationsCheckCid2 = new Invalidations();
    for (int i = 1; i <= 10; i++) {
      invalidationsCid1.add(mapId1, new ObjectID(i));
      invalidationsCheckCid1.add(mapId1, new ObjectID(i));
      invalidationsCid2.add(mapId2, new ObjectID(i + 10));
      invalidationsCheckCid2.add(mapId2, new ObjectID(i + 10));
    }

    invalidateObjectManager.invalidateObjectFor(cid1, invalidationsCid1);
    invalidateObjectManager.invalidateObjectFor(cid2, invalidationsCid2);

    list = inValidateSink.getList();
    Assert.assertEquals(2, list.size());
    clientContext = (InvalidateObjectsForClientContext) list.get(0);
    Assert.assertEquals(cid1, clientContext.getClientID());
    clientContext = (InvalidateObjectsForClientContext) list.get(1);
    Assert.assertEquals(cid2, clientContext.getClientID());

    invalidationsGot = invalidateObjectManager.getObjectsIDsToInvalidate(cid1);
    Assert.assertTrue(invalidationsGot.equals(invalidationsCheckCid1));

    invalidationsGot = invalidateObjectManager.getObjectsIDsToInvalidate(cid2);
    Assert.assertTrue(invalidationsGot.equals(invalidationsCheckCid2));
  }