package org.ovirt.engine.core.bll.network.macpool;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.hamcrest.core.IsSame;
import org.junit.Test;
public class MacsStorageTest {
@Test
public void rangesAltersInServingRequestsWhenLastRangeHasAvailableMac() {
assertRangeAltering(5, Arrays.asList(1, 3), Arrays.asList(0, 2, 4, 0, 2, 4));
}
@Test
public void rangesAltersInServingRequestsWhenLastRangeHasNotAvailableMac() {
assertRangeAltering(5, Arrays.asList(0, 3, 4), Arrays.asList(1, 2, 1, 2));
}
private void assertRangeAltering(int numberOfRanges,
List<Integer> rangesWithoutAvailableMacs, List<Integer> expectedRangeIndices) {
List<Range> ranges = createMockedRanges(numberOfRanges);
mockAvailableMacsInRange(ranges, rangesWithoutAvailableMacs);
MacsStorage macsStorage = new MacsStorage(false);
addRangesToStorage(ranges, macsStorage);
assertReturnedRange(ranges, macsStorage, expectedRangeIndices);
}
private void assertReturnedRange(List<Range> ranges, MacsStorage macsStorage, List<Integer> expectedRangeIndices) {
for (int expectedRangeIndex : expectedRangeIndices) {
Range actualRange = macsStorage.getRangeWithAvailableMac();
Range expectedRange = ranges.get(expectedRangeIndex);
assertThat(actualRange, new IsSame<>(expectedRange));
}
}
private void addRangesToStorage(List<Range> ranges, MacsStorage macsStorage) {
for (Range range : ranges) {
macsStorage.addRange(range);
}
}
private void mockAvailableMacsInRange(List<Range> ranges, List<Integer> rangesWithoutAvailableMacs) {
for(int i = 0; i < ranges.size(); i++) {
Range range = ranges.get(i);
boolean shouldBeEmpty = rangesWithoutAvailableMacs.contains(i);
when(range.getAvailableCount()).thenReturn(shouldBeEmpty ? 0 : 1);
}
}
private List<Range> createMockedRanges(int count) {
List<Range> result = new ArrayList<>(count);
for(int i = 0; i < count; i++) {
result.add(mock(Range.class));
}
return result;
}
}