@Test
  public void testUpdateVersion() {

    assertThat(VersionType.INTERNAL.updateVersion(Versions.NOT_SET, 10), equalTo(1l));
    assertThat(VersionType.INTERNAL.updateVersion(Versions.NOT_FOUND, 10), equalTo(1l));
    assertThat(VersionType.INTERNAL.updateVersion(1, 1), equalTo(2l));
    assertThat(VersionType.INTERNAL.updateVersion(2, Versions.MATCH_ANY), equalTo(3l));

    assertThat(VersionType.EXTERNAL.updateVersion(Versions.NOT_SET, 10), equalTo(10l));
    assertThat(VersionType.EXTERNAL.updateVersion(Versions.NOT_FOUND, 10), equalTo(10l));
    assertThat(VersionType.EXTERNAL.updateVersion(1, 10), equalTo(10l));

    assertThat(VersionType.EXTERNAL_GTE.updateVersion(Versions.NOT_SET, 10), equalTo(10l));
    assertThat(VersionType.EXTERNAL_GTE.updateVersion(Versions.NOT_FOUND, 10), equalTo(10l));
    assertThat(VersionType.EXTERNAL_GTE.updateVersion(1, 10), equalTo(10l));
    assertThat(VersionType.EXTERNAL_GTE.updateVersion(10, 10), equalTo(10l));

    assertThat(VersionType.FORCE.updateVersion(Versions.NOT_SET, 10), equalTo(10l));
    assertThat(VersionType.FORCE.updateVersion(Versions.NOT_FOUND, 10), equalTo(10l));
    assertThat(VersionType.FORCE.updateVersion(11, 10), equalTo(10l));

    // Old indexing code
    //        if (index.versionType() == VersionType.INTERNAL) { // internal version type
    //            updatedVersion = (currentVersion == Versions.NOT_SET || currentVersion ==
    // Versions.NOT_FOUND) ? 1 : currentVersion + 1;
    //        } else { // external version type
    //            updatedVersion = expectedVersion;
    //        }
  }
  @Test
  public void testVersionValidation() {
    assertTrue(
        VersionType.EXTERNAL.validateVersionForWrites(randomIntBetween(1, Integer.MAX_VALUE)));
    assertFalse(VersionType.EXTERNAL.validateVersionForWrites(Versions.MATCH_ANY));
    assertFalse(
        VersionType.EXTERNAL.validateVersionForWrites(randomIntBetween(Integer.MIN_VALUE, 0)));
    assertTrue(VersionType.EXTERNAL.validateVersionForReads(Versions.MATCH_ANY));
    assertTrue(
        VersionType.EXTERNAL.validateVersionForReads(randomIntBetween(1, Integer.MAX_VALUE)));
    assertFalse(
        VersionType.EXTERNAL.validateVersionForReads(randomIntBetween(Integer.MIN_VALUE, -1)));

    assertTrue(
        VersionType.EXTERNAL_GTE.validateVersionForWrites(randomIntBetween(1, Integer.MAX_VALUE)));
    assertFalse(VersionType.EXTERNAL_GTE.validateVersionForWrites(Versions.MATCH_ANY));
    assertFalse(
        VersionType.EXTERNAL_GTE.validateVersionForWrites(randomIntBetween(Integer.MIN_VALUE, 0)));
    assertTrue(VersionType.EXTERNAL_GTE.validateVersionForReads(Versions.MATCH_ANY));
    assertTrue(
        VersionType.EXTERNAL_GTE.validateVersionForReads(randomIntBetween(1, Integer.MAX_VALUE)));
    assertFalse(
        VersionType.EXTERNAL_GTE.validateVersionForReads(randomIntBetween(Integer.MIN_VALUE, -1)));

    assertTrue(VersionType.FORCE.validateVersionForWrites(randomIntBetween(1, Integer.MAX_VALUE)));
    assertFalse(VersionType.FORCE.validateVersionForWrites(Versions.MATCH_ANY));
    assertFalse(VersionType.FORCE.validateVersionForWrites(randomIntBetween(Integer.MIN_VALUE, 0)));
    assertTrue(VersionType.FORCE.validateVersionForReads(Versions.MATCH_ANY));
    assertTrue(VersionType.FORCE.validateVersionForReads(randomIntBetween(1, Integer.MAX_VALUE)));
    assertFalse(VersionType.FORCE.validateVersionForReads(randomIntBetween(Integer.MIN_VALUE, -1)));

    assertTrue(
        VersionType.INTERNAL.validateVersionForWrites(randomIntBetween(1, Integer.MAX_VALUE)));
    assertTrue(VersionType.INTERNAL.validateVersionForWrites(Versions.MATCH_ANY));
    assertFalse(
        VersionType.INTERNAL.validateVersionForWrites(randomIntBetween(Integer.MIN_VALUE, 0)));
    assertTrue(VersionType.INTERNAL.validateVersionForReads(Versions.MATCH_ANY));
    assertTrue(
        VersionType.INTERNAL.validateVersionForReads(randomIntBetween(1, Integer.MAX_VALUE)));
    assertFalse(
        VersionType.INTERNAL.validateVersionForReads(randomIntBetween(Integer.MIN_VALUE, -1)));
  }
  public void testInternalVersionConflict() throws Exception {
    assertFalse(
        VersionType.INTERNAL.isVersionConflictForWrites(10, Versions.MATCH_ANY, randomBoolean()));
    assertFalse(VersionType.INTERNAL.isVersionConflictForReads(10, Versions.MATCH_ANY));

    // if we didn't find a version (but the index does support it), we don't like it unless
    // MATCH_ANY
    assertTrue(
        VersionType.INTERNAL.isVersionConflictForWrites(Versions.NOT_FOUND, 10, randomBoolean()));
    assertTrue(VersionType.INTERNAL.isVersionConflictForReads(Versions.NOT_FOUND, 10));
    assertFalse(
        VersionType.INTERNAL.isVersionConflictForWrites(
            Versions.NOT_FOUND, Versions.MATCH_ANY, randomBoolean()));
    assertFalse(
        VersionType.INTERNAL.isVersionConflictForReads(Versions.NOT_FOUND, Versions.MATCH_ANY));

    // deletes
    assertFalse(
        VersionType.INTERNAL.isVersionConflictForWrites(
            Versions.NOT_FOUND, Versions.MATCH_DELETED, true));
    assertFalse(VersionType.INTERNAL.isVersionConflictForWrites(10, Versions.MATCH_DELETED, true));

    // and the stupid usual case
    assertFalse(VersionType.INTERNAL.isVersionConflictForWrites(10, 10, randomBoolean()));
    assertFalse(VersionType.INTERNAL.isVersionConflictForReads(10, 10));
    assertTrue(VersionType.INTERNAL.isVersionConflictForWrites(9, 10, randomBoolean()));
    assertTrue(VersionType.INTERNAL.isVersionConflictForReads(9, 10));
    assertTrue(VersionType.INTERNAL.isVersionConflictForWrites(10, 9, randomBoolean()));
    assertTrue(VersionType.INTERNAL.isVersionConflictForReads(10, 9));

    // Old indexing code, dictating behavior
    //        if (expectedVersion != Versions.MATCH_ANY && currentVersion != Versions.NOT_SET) {
    //            // an explicit version is provided, see if there is a conflict
    //            // if we did not find anything, and a version is provided, so we do expect to find
    // a doc under that version
    //            // this is important, since we don't allow to preset a version in order to handle
    // deletes
    //            if (currentVersion == Versions.NOT_FOUND) {
    //                throw new VersionConflictEngineException(shardId, index.type(), index.id(),
    // Versions.NOT_FOUND, expectedVersion);
    //            } else if (expectedVersion != currentVersion) {
    //                throw new VersionConflictEngineException(shardId, index.type(), index.id(),
    // currentVersion, expectedVersion);
    //            }
    //        }
    //        updatedVersion = (currentVersion == Versions.NOT_SET || currentVersion ==
    // Versions.NOT_FOUND) ? 1 : currentVersion + 1;
  }