@Test
  public void shouldRetrieveLowLevelCacheEntryForDefaultBinaryStore() {
    final BinaryKey key = new BinaryKey("key-123");
    when(mockStoreFunc.apply(mockRepo)).thenReturn(mockStore);

    final LowLevelStorageService testObj = spy(new LowLevelStorageService());
    testObj.setRepository(mockRepo);
    testObj.setGetBinaryStore(mockStoreFunc);
    testObj.getLowLevelCacheEntries(key);
    verify(testObj, times(1)).getLowLevelCacheEntriesFromStore(mockStore, key);
  }
  @Test
  public void shouldReturnAnEmptySetForMissingBinaryStore() {

    when(mockStoreFunc.apply(mockRepo)).thenReturn(null);

    final LowLevelStorageService testObj = new LowLevelStorageService();
    testObj.setGetBinaryStore(mockStoreFunc);
    final Set<LowLevelCacheEntry> entries =
        testObj.getLowLevelCacheEntries(new BinaryKey("key-123"));

    assertEquals(0, entries.size());
  }
  @Test
  public void testGetBinaryBlobs() throws RepositoryException {

    when(mockNode.getProperty(JCR_DATA)).thenReturn(mockProperty);
    when(mockStore.toString()).thenReturn("foo");
    when(mockKeyFunc.apply(mockProperty)).thenReturn(mockKey);
    when(mockStoreFunc.apply(mockRepo)).thenReturn(mockStore);
    final LowLevelStorageService testObj = new LowLevelStorageService();
    testObj.setGetBinaryStore(mockStoreFunc);
    testObj.setGetBinaryKey(mockKeyFunc);
    testObj.setRepository(mockRepo);
    final Set<LowLevelCacheEntry> actual = testObj.getLowLevelCacheEntries(mockNode);
    assertEquals("/foo", actual.iterator().next().getExternalIdentifier());
  }
  @Test
  public void testTransformBinaryBlobs() throws RepositoryException {

    when(mockNode.getProperty(JcrConstants.JCR_DATA)).thenReturn(mockProperty);
    when(mockStore.toString()).thenReturn("foo");
    when(mockKeyFunc.apply(mockProperty)).thenReturn(mockKey);
    when(mockStoreFunc.apply(mockRepo)).thenReturn(mockStore);
    final LowLevelStorageService testObj = new LowLevelStorageService();
    testObj.setGetBinaryStore(mockStoreFunc);
    testObj.setGetBinaryKey(mockKeyFunc);
    testObj.setRepository(mockRepo);
    @SuppressWarnings("unchecked")
    final Function<LowLevelCacheEntry, String> testFunc = mock(Function.class);
    when(testFunc.apply(any(LowLevelCacheEntry.class))).thenReturn("bar");
    final Collection<String> actual = testObj.transformLowLevelCacheEntries(mockNode, testFunc);
    assertEquals("bar", actual.iterator().next());
    verify(testFunc).apply(any(LowLevelCacheEntry.class));
  }
  /**
   * Extract the BinaryStore out of Modeshape (infinspan, jdbc, file, transient, etc)
   *
   * @return
   */
  @Override
  public Map<String, String> apply(final Repository input) {
    checkNotNull(input, "null cannot have a BinaryStore!");

    final Map<String, String> result = new LinkedHashMap<>();
    final BinaryStore store = getBinaryStore.apply(input);

    if (!(store instanceof InfinispanBinaryStore)) {
      return result;
    }

    final InfinispanBinaryStore ispnStore = (InfinispanBinaryStore) store;

    final List<Cache<?, ?>> caches = ispnStore.getCaches();
    final DefaultCacheManager cm = (DefaultCacheManager) caches.get(0).getCacheManager();

    if (cm == null) {
      LOGGER.debug("Could not get cluster configuration information");
      return result;
    }

    final int nodeView;

    if (cm.getTransport() != null) {
      nodeView = cm.getTransport().getViewId() + 1;
    } else {
      nodeView = UNKNOWN_NODE_VIEW;
    }

    result.put(CLUSTER_NAME, cm.getClusterName());
    result.put(
        CACHE_MODE, cm.getCache().getCacheConfiguration().clustering().cacheMode().toString());
    result.put(NODE_ADDRESS, cm.getNodeAddress());
    result.put(PHYSICAL_ADDRESS, cm.getPhysicalAddresses());
    result.put(NODE_VIEW, nodeView == UNKNOWN_NODE_VIEW ? "Unknown" : String.valueOf(nodeView));
    result.put(CLUSTER_SIZE, String.valueOf(cm.getClusterSize()));
    result.put(CLUSTER_MEMBERS, cm.getClusterMembers());
    return result;
  }