/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.cache.disk;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Test for the score-based eviction comparator.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({System.class})
public class ScoreBasedEvictionComparatorSupplierTest {
private static final long RANDOM_SEED = 42;
private List<DiskStorage.Entry> entries;
@Before
public void setUp() {
Random random = new Random(RANDOM_SEED);
PowerMockito.mockStatic(System.class);
when(System.currentTimeMillis()).thenReturn(0l);
entries = new ArrayList<>();
for (int i = 0; i < 100; i++) {
DiskStorage.Entry entry = mock(DiskStorage.Entry.class);
when(entry.getTimestamp()).thenReturn(random.nextLong());
when(entry.getSize()).thenReturn(random.nextLong());
entries.add(entry);
}
}
@Test
public void testTimestampOnlyOrder() {
doTest(1f, 0f);
for (int i = 0; i < entries.size() - 1; i++) {
assertTrue(entries.get(i).getTimestamp() < entries.get(i + 1).getTimestamp());
}
}
@Test
public void testSizeOnlyOrder() {
doTest(0f, 1f);
for (int i = 0; i < entries.size() - 1; i++) {
assertTrue(entries.get(i).getSize() > entries.get(i + 1).getSize());
}
}
@Test
public void testEqualOrder() {
doTest(1f, 1f);
}
@Test
public void testWeightedOrder() {
doTest(2f, 3f);
}
private void doTest(float ageWeight, float sizeWeight) {
ScoreBasedEvictionComparatorSupplier supplier =
new ScoreBasedEvictionComparatorSupplier(ageWeight, sizeWeight);
Collections.sort(entries, supplier.get());
for (int i = 0; i < entries.size() - 1; i++) {
assertTrue(supplier.calculateScore(entries.get(i), 0) >
supplier.calculateScore(entries.get(i + 1), 0));
}
}
}