content: // Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
  //  This source code is licensed under both the GPLv2 (found in the
  //  COPYING file in the root directory) and Apache 2.0 License
  //  (found in the LICENSE.Apache file in the root directory).
  
  package org.rocksdb;
  
  import org.junit.ClassRule;
  import org.junit.Test;
  
  import static org.assertj.core.api.Assertions.assertThat;
  
  public class BlockBasedTableConfigTest {
  
    @ClassRule
    public static final RocksMemoryResource rocksMemoryResource =
        new RocksMemoryResource();
  
    @Test
    public void noBlockCache() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      blockBasedTableConfig.setNoBlockCache(true);
      assertThat(blockBasedTableConfig.noBlockCache()).isTrue();
    }
  
    @Test
    public void blockCacheSize() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      blockBasedTableConfig.setBlockCacheSize(8 * 1024);
      assertThat(blockBasedTableConfig.blockCacheSize()).
          isEqualTo(8 * 1024);
    }
  
    @Test
    public void blockSizeDeviation() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      blockBasedTableConfig.setBlockSizeDeviation(12);
      assertThat(blockBasedTableConfig.blockSizeDeviation()).
          isEqualTo(12);
    }
  
    @Test
    public void blockRestartInterval() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      blockBasedTableConfig.setBlockRestartInterval(15);
      assertThat(blockBasedTableConfig.blockRestartInterval()).
          isEqualTo(15);
    }
  
    @Test
    public void wholeKeyFiltering() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      blockBasedTableConfig.setWholeKeyFiltering(false);
      assertThat(blockBasedTableConfig.wholeKeyFiltering()).
          isFalse();
    }
  
    @Test
    public void cacheIndexAndFilterBlocks() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      blockBasedTableConfig.setCacheIndexAndFilterBlocks(true);
      assertThat(blockBasedTableConfig.cacheIndexAndFilterBlocks()).
          isTrue();
  
    }
  
    @Test
    public void hashIndexAllowCollision() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      blockBasedTableConfig.setHashIndexAllowCollision(false);
      assertThat(blockBasedTableConfig.hashIndexAllowCollision()).
          isFalse();
    }
  
    @Test
    public void blockCacheCompressedSize() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      blockBasedTableConfig.setBlockCacheCompressedSize(40);
      assertThat(blockBasedTableConfig.blockCacheCompressedSize()).
          isEqualTo(40);
    }
  
    @Test
    public void checksumType() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      assertThat(ChecksumType.values().length).isEqualTo(3);
      assertThat(ChecksumType.valueOf("kxxHash")).
          isEqualTo(ChecksumType.kxxHash);
      blockBasedTableConfig.setChecksumType(ChecksumType.kNoChecksum);
      blockBasedTableConfig.setChecksumType(ChecksumType.kxxHash);
      assertThat(blockBasedTableConfig.checksumType().equals(
          ChecksumType.kxxHash));
    }
  
    @Test
    public void indexType() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      assertThat(IndexType.values().length).isEqualTo(3);
      blockBasedTableConfig.setIndexType(IndexType.kHashSearch);
      assertThat(blockBasedTableConfig.indexType().equals(
          IndexType.kHashSearch));
      assertThat(IndexType.valueOf("kBinarySearch")).isNotNull();
      blockBasedTableConfig.setIndexType(IndexType.valueOf("kBinarySearch"));
      assertThat(blockBasedTableConfig.indexType().equals(
          IndexType.kBinarySearch));
    }
  
    @Test
    public void blockCacheCompressedNumShardBits() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      blockBasedTableConfig.setBlockCacheCompressedNumShardBits(4);
      assertThat(blockBasedTableConfig.blockCacheCompressedNumShardBits()).
          isEqualTo(4);
    }
  
    @Test
    public void cacheNumShardBits() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      blockBasedTableConfig.setCacheNumShardBits(5);
      assertThat(blockBasedTableConfig.cacheNumShardBits()).
          isEqualTo(5);
    }
  
    @Test
    public void blockSize() {
      BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();
      blockBasedTableConfig.setBlockSize(10);
      assertThat(blockBasedTableConfig.blockSize()).isEqualTo(10);
    }
  
  
    @Test
    public void blockBasedTableWithFilter() {
      try(final Options options = new Options()
          .setTableFormatConfig(new BlockBasedTableConfig()
          .setFilter(new BloomFilter(10)))) {
        assertThat(options.tableFactoryName()).
            isEqualTo("BlockBasedTable");
      }
    }
  
    @Test
    public void blockBasedTableWithoutFilter() {
      try(final Options options = new Options().setTableFormatConfig(
          new BlockBasedTableConfig().setFilter(null))) {
        assertThat(options.tableFactoryName()).
            isEqualTo("BlockBasedTable");
      }
    }
  
    @Test
    public void blockBasedTableFormatVersion() {
      BlockBasedTableConfig config = new BlockBasedTableConfig();
      for (int version=0; version<=2; version++) {
        config.setFormatVersion(version);
        assertThat(config.formatVersion()).isEqualTo(version);
      }
    }
  
    @Test(expected = AssertionError.class)
    public void blockBasedTableFormatVersionFailNegative() {
      BlockBasedTableConfig config = new BlockBasedTableConfig();
      config.setFormatVersion(-1);
    }
  
    @Test(expected = AssertionError.class)
    public void blockBasedTableFormatVersionFailIllegalVersion() {
      BlockBasedTableConfig config = new BlockBasedTableConfig();
      config.setFormatVersion(3);
    }
  }
  