/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package alluxio.worker.block.meta;
import alluxio.worker.block.BlockMetadataManager;
import alluxio.worker.block.BlockMetadataManagerView;
import alluxio.worker.block.TieredBlockStoreTestUtils;
import com.google.common.collect.Lists;
import org.hamcrest.CoreMatchers;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.mockito.Mockito;
import java.io.File;
import java.util.HashSet;
import java.util.List;
/**
* Tests for the {@link StorageDirView} class.
*/
public class StorageDirViewTest {
private static final int TEST_TIER_LEVEL = 0;
private static final int TEST_DIR = 0;
private static final long TEST_SESSION_ID = 2;
private static final long TEST_BLOCK_ID = 9;
private static final long TEST_TEMP_BLOCK_ID = 10;
private static final long TEST_BLOCK_SIZE = 20;
private StorageDir mTestDir;
private StorageDirView mTestDirView;
private StorageTierView mTestTierView;
private BlockMetadataManagerView mMetaManagerView;
/** Rule to create a new temporary folder during each test. */
@Rule
public TemporaryFolder mTestFolder = new TemporaryFolder();
/**
* Sets up all dependencies before a test runs.
*/
@Before
public void before() throws Exception {
File tempFolder = mTestFolder.newFolder();
BlockMetadataManager metaManager =
TieredBlockStoreTestUtils.defaultMetadataManager(tempFolder.getAbsolutePath());
mMetaManagerView =
Mockito.spy(new BlockMetadataManagerView(metaManager, new HashSet<Long>(),
new HashSet<Long>()));
StorageTier testTier = metaManager.getTiers().get(TEST_TIER_LEVEL);
mTestDir = testTier.getDir(TEST_DIR);
mTestTierView = new StorageTierView(testTier, mMetaManagerView);
mTestDirView = new StorageDirView(mTestDir, mTestTierView, mMetaManagerView);
}
/**
* Tests the {@link StorageDirView#getDirViewIndex()} method.
*/
@Test
public void getDirViewIndex() {
Assert.assertEquals(mTestDir.getDirIndex(), mTestDirView.getDirViewIndex());
}
/**
* Tests the {@link StorageDirView#getParentTierView()} method.
*/
@Test
public void getParentTierView() {
Assert.assertEquals(mTestTierView, mTestDirView.getParentTierView());
}
/**
* Tests the {@link StorageDirView#toBlockStoreLocation()} method.
*/
@Test
public void toBlockStoreLocation() {
Assert.assertEquals(mTestDir.toBlockStoreLocation(), mTestDirView.toBlockStoreLocation());
}
/**
* Tests the {@link StorageDirView#getCapacityBytes()} method.
*/
@Test
public void getCapacityBytes() {
Assert.assertEquals(mTestDir.getCapacityBytes(), mTestDirView.getCapacityBytes());
}
/**
* Tests the {@link StorageDirView#getAvailableBytes()} method.
*/
@Test
public void getAvailableBytes() {
Assert.assertEquals(mTestDir.getAvailableBytes(), mTestDirView.getAvailableBytes());
}
/**
* Tests the {@link StorageDirView#getCommittedBytes()} method.
*/
@Test
public void getCommittedBytes() {
Assert.assertEquals(mTestDir.getCommittedBytes(), mTestDirView.getCommittedBytes());
}
/**
* Tests the {@link StorageDirView#getEvictableBlocks()} method.
*/
@Test
public void getEvictableBlocks() throws Exception {
// When test dir is empty, expect no block to be evictable
Assert.assertEquals(0, mTestDirView.getEvitableBytes());
Assert.assertTrue(mTestDirView.getEvictableBlocks().isEmpty());
// Add one block to test dir, expect this block to be evictable
BlockMeta blockMeta = new BlockMeta(TEST_BLOCK_ID, TEST_BLOCK_SIZE, mTestDir);
mTestDir.addBlockMeta(blockMeta);
Assert.assertEquals(TEST_BLOCK_SIZE, mTestDirView.getEvitableBytes());
Assert.assertThat(mTestDirView.getEvictableBlocks(),
CoreMatchers.is((List<BlockMeta>) Lists.newArrayList(blockMeta)));
// Lock this block, expect this block to be non-evictable
Mockito.when(mMetaManagerView.isBlockPinned(TEST_BLOCK_ID)).thenReturn(false);
Mockito.when(mMetaManagerView.isBlockLocked(TEST_BLOCK_ID)).thenReturn(true);
Assert.assertEquals(0, mTestDirView.getEvitableBytes());
Assert.assertTrue(mTestDirView.getEvictableBlocks().isEmpty());
// Pin this block, expect this block to be non-evictable
Mockito.when(mMetaManagerView.isBlockPinned(TEST_BLOCK_ID)).thenReturn(true);
Mockito.when(mMetaManagerView.isBlockLocked(TEST_BLOCK_ID)).thenReturn(false);
Assert.assertEquals(0, mTestDirView.getEvitableBytes());
Assert.assertTrue(mTestDirView.getEvictableBlocks().isEmpty());
// Release pin/lock, expect this block to be evictable
Mockito.when(mMetaManagerView.isBlockPinned(TEST_BLOCK_ID)).thenReturn(false);
Mockito.when(mMetaManagerView.isBlockLocked(TEST_BLOCK_ID)).thenReturn(false);
Assert.assertEquals(TEST_BLOCK_SIZE, mTestDirView.getEvitableBytes());
Assert.assertThat(mTestDirView.getEvictableBlocks(),
CoreMatchers.is((List<BlockMeta>) Lists.newArrayList(blockMeta)));
}
/**
* Tests the {@link StorageDirView#createTempBlockMeta(long, long, long)} method.
*/
@Test
public void createTempBlockMeta() {
TempBlockMeta tempBlockMeta =
mTestDirView.createTempBlockMeta(TEST_SESSION_ID, TEST_TEMP_BLOCK_ID, TEST_BLOCK_SIZE);
Assert.assertEquals(TEST_SESSION_ID, tempBlockMeta.getSessionId());
Assert.assertEquals(TEST_TEMP_BLOCK_ID, tempBlockMeta.getBlockId());
Assert.assertEquals(TEST_BLOCK_SIZE, tempBlockMeta.getBlockSize());
Assert.assertEquals(mTestDir, tempBlockMeta.getParentDir());
}
}