/*
* Title: CloudSim Toolkit
* Description: CloudSim (Cloud Simulation) Toolkit for Modeling and Simulation of Clouds
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
*
* Copyright (c) 2009-2012, The University of Melbourne, Australia
*/
package org.cloudbus.cloudsim;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
/**
* @author Anton Beloglazov
* @since CloudSim Toolkit 2.0
*/
public class CloudletSchedulerSingleServiceTest {
private static final long CLOUDLET_LENGTH = 1000;
private static final long CLOUDLET_FILE_SIZE = 300;
private static final long CLOUDLET_OUTPUT_SIZE = 300;
private static final double MIPS = 1000;
private static final int PES_NUMBER = 2;
private CloudletSchedulerDynamicWorkload vmScheduler;
@Before
public void setUp() throws Exception {
vmScheduler = new CloudletSchedulerDynamicWorkload(MIPS, PES_NUMBER);
}
@Test
public void testGetNumberOfPes() {
assertEquals(PES_NUMBER, vmScheduler.getNumberOfPes());
}
@Test
public void testGetMips() {
assertEquals(MIPS, vmScheduler.getMips(), 0);
}
@Test
public void testGetUnderAllocatedMips() {
UtilizationModelStochastic utilizationModel = new UtilizationModelStochastic();
Cloudlet cloudlet = new Cloudlet(0, CLOUDLET_LENGTH, PES_NUMBER, CLOUDLET_FILE_SIZE, CLOUDLET_OUTPUT_SIZE,
utilizationModel, utilizationModel, utilizationModel);
ResCloudlet rcl = new ResCloudlet(cloudlet);
Map<String, Double> underAllocatedMips = new HashMap<String, Double>();
assertEquals(underAllocatedMips, vmScheduler.getUnderAllocatedMips());
underAllocatedMips.put(rcl.getUid(), MIPS / 2);
vmScheduler.updateUnderAllocatedMipsForCloudlet(rcl, MIPS / 2);
assertEquals(underAllocatedMips, vmScheduler.getUnderAllocatedMips());
underAllocatedMips.put(rcl.getUid(), MIPS);
vmScheduler.updateUnderAllocatedMipsForCloudlet(rcl, MIPS / 2);
assertEquals(underAllocatedMips, vmScheduler.getUnderAllocatedMips());
}
@Test
public void testGetCurrentRequestedMips() {
UtilizationModelStochastic utilizationModel = new UtilizationModelStochastic();
Cloudlet cloudlet = new Cloudlet(0, CLOUDLET_LENGTH, PES_NUMBER, CLOUDLET_FILE_SIZE, CLOUDLET_OUTPUT_SIZE,
utilizationModel, utilizationModel, utilizationModel);
cloudlet.setResourceParameter(0, 0, 0);
List<Double> mipsShare = new ArrayList<Double>();
mipsShare.add(MIPS);
mipsShare.add(MIPS);
vmScheduler.setCurrentMipsShare(mipsShare);
assertEquals(mipsShare.size(), vmScheduler.getCurrentMipsShare().size(), 0);
assertEquals(mipsShare.get(0), vmScheduler.getCurrentMipsShare().get(0), 0);
assertEquals(mipsShare.get(1), vmScheduler.getCurrentMipsShare().get(1), 0);
double utilization = utilizationModel.getUtilization(0);
vmScheduler.cloudletSubmit(cloudlet);
List<Double> requestedMips = new ArrayList<Double>();
requestedMips.add(MIPS * utilization);
requestedMips.add(MIPS * utilization);
assertEquals(requestedMips, vmScheduler.getCurrentRequestedMips());
}
@Test
public void testGetTotalUtilization() {
UtilizationModelStochastic utilizationModel = new UtilizationModelStochastic();
Cloudlet cloudlet = new Cloudlet(0, CLOUDLET_LENGTH, PES_NUMBER, CLOUDLET_FILE_SIZE, CLOUDLET_OUTPUT_SIZE,
utilizationModel, utilizationModel, utilizationModel);
cloudlet.setResourceParameter(0, 0, 0);
List<Double> mipsShare = new ArrayList<Double>();
mipsShare.add(MIPS);
mipsShare.add(MIPS);
vmScheduler.setCurrentMipsShare(mipsShare);
assertEquals(mipsShare.size(), vmScheduler.getCurrentMipsShare().size(), 0);
assertEquals(mipsShare.get(0), vmScheduler.getCurrentMipsShare().get(0), 0);
assertEquals(mipsShare.get(1), vmScheduler.getCurrentMipsShare().get(1), 0);
double utilization = utilizationModel.getUtilization(0);
vmScheduler.cloudletSubmit(cloudlet, 0);
assertEquals(utilization, vmScheduler.getTotalUtilizationOfCpu(0), 0);
}
@Test
public void testCloudletFinish() {
UtilizationModelStochastic utilizationModel = new UtilizationModelStochastic();
Cloudlet cloudlet = new Cloudlet(0, CLOUDLET_LENGTH, PES_NUMBER, CLOUDLET_FILE_SIZE, CLOUDLET_OUTPUT_SIZE,
utilizationModel, utilizationModel, utilizationModel);
cloudlet.setResourceParameter(0, 0, 0);
List<Double> mipsShare = new ArrayList<Double>();
mipsShare.add(MIPS);
mipsShare.add(MIPS);
vmScheduler.setCurrentMipsShare(mipsShare);
vmScheduler.cloudletSubmit(cloudlet, 0);
vmScheduler.cloudletFinish(new ResCloudlet(cloudlet));
assertEquals(Cloudlet.SUCCESS, vmScheduler.getCloudletStatus(0));
assertTrue(vmScheduler.isFinishedCloudlets());
assertSame(cloudlet, vmScheduler.getNextFinishedCloudlet());
}
@Test
public void testGetTotalCurrentMips() {
List<Double> mipsShare = new ArrayList<Double>();
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
vmScheduler.setCurrentMipsShare(mipsShare);
assertEquals(MIPS / 2, vmScheduler.getTotalCurrentMips(), 0);
}
@Test
public void testGetTotalCurrentMipsForCloudlet() {
UtilizationModelStochastic utilizationModel = new UtilizationModelStochastic();
Cloudlet cloudlet = new Cloudlet(0, CLOUDLET_LENGTH, PES_NUMBER, CLOUDLET_FILE_SIZE, CLOUDLET_OUTPUT_SIZE,
utilizationModel, utilizationModel, utilizationModel);
cloudlet.setResourceParameter(0, 0, 0);
ResCloudlet rgl = new ResCloudlet(cloudlet);
List<Double> mipsShare = new ArrayList<Double>();
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
assertEquals(MIPS / 4.0 * PES_NUMBER, vmScheduler.getTotalCurrentAvailableMipsForCloudlet(rgl, mipsShare), 0);
}
@Test
public void testGetEstimatedFinishTimeLowUtilization() {
UtilizationModel utilizationModel = createMock(UtilizationModel.class);
expect(utilizationModel.getUtilization(0))
.andReturn(0.11)
.anyTimes();
replay(utilizationModel);
testGetEstimatedFinishTime(utilizationModel);
verify(utilizationModel);
}
@Test
public void testGetEstimatedFinishTimeHighUtilization() {
UtilizationModel utilizationModel = createMock(UtilizationModel.class);
expect(utilizationModel.getUtilization(0))
.andReturn(0.91)
.anyTimes();
replay(utilizationModel);
testGetEstimatedFinishTime(utilizationModel);
verify(utilizationModel);
}
public void testGetEstimatedFinishTime(UtilizationModel utilizationModel) {
Cloudlet cloudlet = new Cloudlet(0, CLOUDLET_LENGTH, PES_NUMBER, CLOUDLET_FILE_SIZE, CLOUDLET_OUTPUT_SIZE,
utilizationModel, utilizationModel, utilizationModel);
cloudlet.setResourceParameter(0, 0, 0);
ResCloudlet rgl = new ResCloudlet(cloudlet);
List<Double> mipsShare = new ArrayList<Double>();
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
vmScheduler.setCurrentMipsShare(mipsShare);
double utilization = utilizationModel.getUtilization(0);
double totalCurrentMipsForCloudlet = MIPS / 4 * PES_NUMBER;
double requestedMips = (int) (utilization * PES_NUMBER * MIPS);
if (requestedMips > totalCurrentMipsForCloudlet) {
requestedMips = totalCurrentMipsForCloudlet;
}
double expectedFinishTime = (double) CLOUDLET_LENGTH * PES_NUMBER / requestedMips;
double actualFinishTime = vmScheduler.getEstimatedFinishTime(rgl, 0);
assertEquals(expectedFinishTime, actualFinishTime, 0);
}
@Test
public void testCloudletSubmitLowUtilization() {
UtilizationModel utilizationModel = createMock(UtilizationModel.class);
expect(utilizationModel.getUtilization(0))
.andReturn(0.11)
.anyTimes();
replay(utilizationModel);
testCloudletSubmit(utilizationModel);
verify(utilizationModel);
}
@Test
public void testCloudletSubmitHighUtilization() {
UtilizationModel utilizationModel = createMock(UtilizationModel.class);
expect(utilizationModel.getUtilization(0))
.andReturn(0.91)
.anyTimes();
replay(utilizationModel);
testCloudletSubmit(utilizationModel);
verify(utilizationModel);
}
public void testCloudletSubmit(UtilizationModel utilizationModel) {
Cloudlet cloudlet = new Cloudlet(0, CLOUDLET_LENGTH, PES_NUMBER, CLOUDLET_FILE_SIZE, CLOUDLET_OUTPUT_SIZE,
utilizationModel, utilizationModel, utilizationModel);
cloudlet.setResourceParameter(0, 0, 0);
List<Double> mipsShare = new ArrayList<Double>();
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
vmScheduler.setCurrentMipsShare(mipsShare);
double utilization = utilizationModel.getUtilization(0);
double totalCurrentMipsForCloudlet = MIPS / 4 * PES_NUMBER;
double requestedMips = (int) (utilization * PES_NUMBER * MIPS);
if (requestedMips > totalCurrentMipsForCloudlet) {
requestedMips = totalCurrentMipsForCloudlet;
}
double expectedFinishTime = (double) CLOUDLET_LENGTH * PES_NUMBER / requestedMips;
double actualFinishTime = vmScheduler.cloudletSubmit(cloudlet);
assertEquals(expectedFinishTime, actualFinishTime, 0);
}
@Test
public void testUpdateVmProcessingLowUtilization() {
UtilizationModel utilizationModel = createMock(UtilizationModel.class);
expect(utilizationModel.getUtilization(0))
.andReturn(0.11)
.anyTimes();
expect(utilizationModel.getUtilization(1.0))
.andReturn(0.11)
.anyTimes();
replay(utilizationModel);
testUpdateVmProcessing(utilizationModel);
verify(utilizationModel);
}
@Test
public void testUpdateVmProcessingHighUtilization() {
UtilizationModel utilizationModel = createMock(UtilizationModel.class);
expect(utilizationModel.getUtilization(0))
.andReturn(0.91)
.anyTimes();
expect(utilizationModel.getUtilization(1.0))
.andReturn(0.91)
.anyTimes();
replay(utilizationModel);
testUpdateVmProcessing(utilizationModel);
verify(utilizationModel);
}
@Test
public void testUpdateVmProcessingLowAndHighUtilization() {
UtilizationModel utilizationModel = createMock(UtilizationModel.class);
expect(utilizationModel.getUtilization(0))
.andReturn(0.11)
.anyTimes();
expect(utilizationModel.getUtilization(1.0))
.andReturn(0.91)
.anyTimes();
replay(utilizationModel);
testUpdateVmProcessing(utilizationModel);
verify(utilizationModel);
}
public void testUpdateVmProcessing(UtilizationModel utilizationModel) {
Cloudlet cloudlet = new Cloudlet(0, CLOUDLET_LENGTH, PES_NUMBER, CLOUDLET_FILE_SIZE, CLOUDLET_OUTPUT_SIZE,
utilizationModel, utilizationModel, utilizationModel);
cloudlet.setResourceParameter(0, 0, 0);
List<Double> mipsShare = new ArrayList<Double>();
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
mipsShare.add(MIPS / 4);
vmScheduler.setCurrentMipsShare(mipsShare);
vmScheduler.cloudletSubmit(cloudlet);
double totalCurrentMipsForCloudlet = MIPS / 4 * PES_NUMBER;
double utilization1 = utilizationModel.getUtilization(0);
double requestedMips1 = (int) (utilization1 * PES_NUMBER * MIPS);
if (requestedMips1 > totalCurrentMipsForCloudlet) {
requestedMips1 = totalCurrentMipsForCloudlet;
}
double expectedCompletiontime1 = ((double) CLOUDLET_LENGTH * PES_NUMBER) / requestedMips1;
double actualCompletionTime1 = vmScheduler.updateVmProcessing(0, mipsShare);
assertEquals(expectedCompletiontime1, actualCompletionTime1, 0);
double utilization2 = utilizationModel.getUtilization(1);
double requestedMips2 = (int) (utilization2 * PES_NUMBER * MIPS);
if (requestedMips2 > totalCurrentMipsForCloudlet) {
requestedMips2 = totalCurrentMipsForCloudlet;
}
double expectedCompletiontime2 = 1 + ((CLOUDLET_LENGTH * PES_NUMBER - requestedMips1 * 1)) / requestedMips2;
double actualCompletionTime2 = vmScheduler.updateVmProcessing(1, mipsShare);
assertEquals(expectedCompletiontime2, actualCompletionTime2, 0);
assertFalse(vmScheduler.isFinishedCloudlets());
assertEquals(0, vmScheduler.updateVmProcessing(CLOUDLET_LENGTH, mipsShare), 0);
assertTrue(vmScheduler.isFinishedCloudlets());
}
}