@Test
  public void testSaveToVersion() throws Exception {
    Log.info(Log.FAC_TEST, "Starting testSaveToVersion");

    // Testing problem of disappearing versions, inability to get latest. Use simpler
    // object than a collection.
    NDNHandle lput = NDNHandle.open();
    NDNHandle lget = NDNHandle.open();
    try {
      ContentName testName =
          new ContentName(testHelper.getTestNamespace("testSaveToVersion"), stringObjName);

      NDNTime desiredVersion = NDNTime.now();

      NDNStringObject so = new NDNStringObject(testName, "First value", SaveType.REPOSITORY, lput);
      setupNamespace(testName);
      saveAndLog("SpecifiedVersion", so, desiredVersion, "Time: " + desiredVersion);
      TestUtils.checkObject(lput, so);
      Assert.assertEquals("Didn't write correct version", desiredVersion, so.getVersion());

      NDNStringObject ro = new NDNStringObject(testName, lget);
      ro.waitForData();
      Assert.assertEquals("Didn't read correct version", desiredVersion, ro.getVersion());
      ContentName versionName = ro.getVersionedName();

      saveAndLog("UpdatedVersion", so, null, "ReplacementData");
      TestUtils.checkObject(lput, so);
      updateAndLog("UpdatedData", ro, null);
      Assert.assertTrue(
          "New version " + so.getVersion() + " should be later than old version " + desiredVersion,
          (desiredVersion.before(so.getVersion())));
      Assert.assertEquals("Didn't read correct version", so.getVersion(), ro.getVersion());

      NDNStringObject ro2 = new NDNStringObject(versionName, null);
      ro2.waitForData();
      Assert.assertEquals("Didn't read correct version", desiredVersion, ro2.getVersion());
    } finally {
      lput.close();
      lget.close();
      KeyManager.closeDefaultKeyManager();
    }

    Log.info(Log.FAC_TEST, "Completed testSaveToVersion");
  }
  @Test
  public void testUpdateInBackground() throws Exception {
    Log.info(Log.FAC_TEST, "Starting testUpdateInBackground");

    NDNHandle thandle = NDNHandle.open();
    NDNHandle thandle2 = NDNHandle.open();
    NDNHandle thandle3 = NDNHandle.open();

    try {
      ContentName testName =
          new ContentName(
              testHelper.getTestNamespace("testUpdateInBackground"), stringObjName, "name1");
      // Make writer first, so it picks up readers first interests even before it writes.
      NDNStringObject c2 =
          new NDNStringObject(testName, (String) null, SaveType.REPOSITORY, thandle);

      NDNStringObject c0 =
          new NDNStringObject(testName, (String) null, SaveType.REPOSITORY, thandle2);
      c0.updateInBackground();

      NDNStringObject c1 =
          new NDNStringObject(testName, (String) null, SaveType.REPOSITORY, thandle3);
      c1.updateInBackground(true);

      Assert.assertFalse(c0.available());
      Assert.assertFalse(c0.isSaved());
      Assert.assertFalse(c1.available());
      Assert.assertFalse(c1.isSaved());

      NDNTime t1 = saveAndLog("First string", c2, null, "Here is the first string.");
      TestUtils.checkObject(thandle, c2);
      Log.info(
          Log.FAC_TEST,
          "Saved c2: "
              + c2.getVersionedName()
              + " c0 available? "
              + c0.available()
              + " c1 available? "
              + c1.available());
      c0.waitForData();
      Assert.assertEquals("c0 update", c0.getVersion(), c2.getVersion());
      c1.waitForData();
      Assert.assertEquals("c1 update", c1.getVersion(), c2.getVersion());

      NDNTime t2 = saveAndLog("Second string", c2, null, "Here is the second string.");
      TestUtils.checkObject(thandle, c2);
      doWait(c1, t2);
      Assert.assertEquals("c1 update 2", c1.getVersion(), c2.getVersion());
      Assert.assertEquals("c0 unchanged", c0.getVersion(), t1);

      // Sleep for a while and see how fast the interests come. Should be only 2 interests.
      Log.info(Log.FAC_TEST, "Sleeping, count background interests.");
      long time = System.currentTimeMillis();
      Thread.sleep(2000);
      long elapsed = System.currentTimeMillis() - time;
      long count = (elapsed / 4000) + 1;
      Log.info(
          Log.FAC_TEST,
          "Slept " + elapsed / 1000.0 + " seconds, should have been " + count + " interests.");

      NDNTime t3 = saveAndLog("Third string", c2, null, "Here is the third string.");
      TestUtils.checkObject(thandle, c2);
      doWait(c1, t3);
      Assert.assertEquals("c1 update 3", c1.getVersion(), c2.getVersion());
      Assert.assertEquals("c0 unchanged", c0.getVersion(), t1);

      c1.cancelInterest();
    } finally {
      thandle.close();
      thandle2.close();
      thandle3.close();
      KeyManager.closeDefaultKeyManager();
    }

    Log.info(Log.FAC_TEST, "Completed testUpdateInBackground");
  }