private void verifyBlobReadOptions(MockId id, EnumSet<StoreGetOptions> storeGetOptions,
      StoreErrorCodes expectedErrorCode) throws StoreException {
    try {
      BlobReadOptions options = state.index.getBlobReadInfo(id, storeGetOptions);
      if (expectedErrorCode != null) {
        fail("Should have failed because a StoreException is expected");
      }
      IndexValue putEntryValue = state.getExpectedValue(id, true);
      assertEquals("StoreKey not as expected", id, options.getMessageInfo().getStoreKey());
      assertEquals("Log Segment Name not as expected", putEntryValue.getOffset().getName(),
          options.getLogSegmentName());
      assertEquals("Offset not as expected for entry " + putEntryValue.toString(),
          putEntryValue.getOffset().getOffset(), options.getOffset());
      assertEquals("Size not as expected", putEntryValue.getSize(), options.getMessageInfo().getSize());
      assertEquals("ExpiresAtMs not as expected", putEntryValue.getExpiresAtMs(),
          options.getMessageInfo().getExpirationTimeInMs());
      if (storeGetOptions.contains(StoreGetOptions.Store_Include_Deleted) && state.deletedKeys.contains(id)) {
        assertTrue("MessageInfo for deleted messages should have deleted flag true",
            options.getMessageInfo().isDeleted());
      }
    } catch (StoreException e) {
      if (expectedErrorCode == null) {
        throw e;
      } else {
        assertEquals("Unexpected StoreErrorCode", expectedErrorCode, e.getErrorCode());
      }
    }
  }
Verifies that the {@link BlobReadOptions} returned from {@link PersistentIndex#getBlobReadInfo(StoreKey, EnumSet)}
matches the expected value.
@param id the {@link MockId} to use
@param storeGetOptions the {@link StoreGetOptions} to use.
@param expectedErrorCode if this operation is expected to fail, the {@link StoreErrorCodes} expected.
@throws StoreException
ambry-store/src/test/java/com/github/ambry/store/IndexTest.java