blob: ec4add4141db57906f337da988c89adbc640a060 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package org.apache.cloudstack.metrics;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.cloudstack.api.ListVMsUsageHistoryCmd;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.response.VmMetricsStatsResponse;
import org.apache.commons.lang3.time.DateUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.utils.Pair;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VmStatsVO;
import com.cloud.vm.dao.UserVmDao;
import com.cloud.vm.dao.VmStatsDao;
@RunWith(MockitoJUnitRunner.class)
public class MetricsServiceImplTest {
@Spy
@InjectMocks
MetricsServiceImpl spy;
@Mock
ListVMsUsageHistoryCmd listVMsUsageHistoryCmdMock;
@Mock
UserVmVO userVmVOMock;
@Mock
SearchBuilder<UserVmVO> sbMock;
@Mock
SearchCriteria<UserVmVO> scMock;
@Mock
UserVmDao userVmDaoMock;
@Mock
VmStatsDao vmStatsDaoMock;
@Captor
ArgumentCaptor<String> stringCaptor1, stringCaptor2;
@Captor
ArgumentCaptor<Object[]> objectArrayCaptor;
@Captor
ArgumentCaptor<SearchCriteria.Op> opCaptor;
long fakeVmId1 = 1L, fakeVmId2 = 2L;
Pair<List<? extends VMInstanceVO>, Integer> expectedVmListAndCounter;
@Mock
Pair<List<? extends VMInstanceVO>, Integer> expectedVmListAndCounterMock;
@Mock
Map<Long,List<VmStatsVO>> vmStatsMapMock;
@Mock
VmStatsVO vmStatsVOMock;
private void prepareSearchCriteriaWhenUseSetParameters() {
Mockito.doNothing().when(scMock).setParameters(Mockito.anyString(), Mockito.any());
}
private void preparesearchForUserVmsInternalTest() {
expectedVmListAndCounter = new Pair<>(Arrays.asList(userVmVOMock), 1);
Mockito.doReturn(1L).when(listVMsUsageHistoryCmdMock).getStartIndex();
Mockito.doReturn(2L).when(listVMsUsageHistoryCmdMock).getPageSizeVal();
Mockito.doReturn(sbMock).when(userVmDaoMock).createSearchBuilder();
Mockito.doReturn(fakeVmId1).when(userVmVOMock).getId();
Mockito.doReturn(userVmVOMock).when(sbMock).entity();
Mockito.doReturn(scMock).when(sbMock).create();
Mockito.doReturn(new Pair<List<UserVmVO>, Integer>(Arrays.asList(userVmVOMock), 1))
.when(userVmDaoMock).searchAndCount(Mockito.any(), Mockito.any());
}
@Test
public void searchForUserVmsInternalTestWithOnlyOneId() {
preparesearchForUserVmsInternalTest();
prepareSearchCriteriaWhenUseSetParameters();
Mockito.doReturn(fakeVmId1).when(listVMsUsageHistoryCmdMock).getId();
Mockito.doReturn(null).when(listVMsUsageHistoryCmdMock).getIds();
Mockito.doReturn(null).when(listVMsUsageHistoryCmdMock).getName();
Mockito.doReturn(null).when(listVMsUsageHistoryCmdMock).getKeyword();
Pair<List<UserVmVO>, Integer> result = spy.searchForUserVmsInternal(listVMsUsageHistoryCmdMock);
Mockito.verify(scMock).setParameters(stringCaptor1.capture(), objectArrayCaptor.capture());
Assert.assertEquals("idIN", stringCaptor1.getValue());
Assert.assertEquals(Arrays.asList(fakeVmId1), objectArrayCaptor.getAllValues());
Assert.assertEquals(expectedVmListAndCounter, result);
}
@Test
public void searchForUserVmsInternalTestWithAListOfIds() {
List<Long> expected = Arrays.asList(fakeVmId1, fakeVmId2);
preparesearchForUserVmsInternalTest();
prepareSearchCriteriaWhenUseSetParameters();
Mockito.doReturn(null).when(listVMsUsageHistoryCmdMock).getId();
Mockito.doReturn(expected).when(listVMsUsageHistoryCmdMock).getIds();
Mockito.doReturn(null).when(listVMsUsageHistoryCmdMock).getName();
Mockito.doReturn(null).when(listVMsUsageHistoryCmdMock).getKeyword();
Pair<List<UserVmVO>, Integer> result = spy.searchForUserVmsInternal(listVMsUsageHistoryCmdMock);
Mockito.verify(scMock).setParameters(stringCaptor1.capture(), objectArrayCaptor.capture());
Assert.assertEquals("idIN", stringCaptor1.getValue());
Assert.assertEquals(expected, objectArrayCaptor.getAllValues());
Assert.assertEquals(expectedVmListAndCounter, result);
}
@Test
public void searchForUserVmsInternalTestWithName() {
preparesearchForUserVmsInternalTest();
prepareSearchCriteriaWhenUseSetParameters();
Mockito.doReturn(null).when(listVMsUsageHistoryCmdMock).getId();
Mockito.doReturn(null).when(listVMsUsageHistoryCmdMock).getIds();
Mockito.doReturn("fakeName").when(listVMsUsageHistoryCmdMock).getName();
Mockito.doReturn(null).when(listVMsUsageHistoryCmdMock).getKeyword();
Pair<List<UserVmVO>, Integer> result = spy.searchForUserVmsInternal(listVMsUsageHistoryCmdMock);
Mockito.verify(scMock).setParameters(stringCaptor1.capture(), objectArrayCaptor.capture());
Assert.assertEquals("displayName", stringCaptor1.getValue());
Assert.assertEquals("%fakeName%", objectArrayCaptor.getValue());
Assert.assertEquals(expectedVmListAndCounter, result);
}
@Test
public void searchForUserVmsInternalTestWithKeyword() {
preparesearchForUserVmsInternalTest();
prepareSearchCriteriaWhenUseSetParameters();
Mockito.doReturn(scMock).when(userVmDaoMock).createSearchCriteria();
Mockito.doReturn(null).when(listVMsUsageHistoryCmdMock).getId();
Mockito.doReturn(null).when(listVMsUsageHistoryCmdMock).getIds();
Mockito.doReturn(null).when(listVMsUsageHistoryCmdMock).getName();
Mockito.doReturn("fakeKeyword").when(listVMsUsageHistoryCmdMock).getKeyword();
Pair<List<UserVmVO>, Integer> result = spy.searchForUserVmsInternal(listVMsUsageHistoryCmdMock);
Mockito.verify(scMock, Mockito.times(2)).addOr(stringCaptor1.capture(), opCaptor.capture(), objectArrayCaptor.capture());
List<String> conditions = stringCaptor1.getAllValues();
List<Object[]> params = objectArrayCaptor.getAllValues();
Assert.assertEquals("displayName", conditions.get(0));
Assert.assertEquals("state", conditions.get(1));
Assert.assertEquals("%fakeKeyword%", params.get(0));
Assert.assertEquals("fakeKeyword", params.get(1));
Assert.assertEquals(expectedVmListAndCounter, result);
}
@Test
public void searchForVmMetricsStatsInternalTestWithAPopulatedListOfVms() {
Mockito.doNothing().when(spy).validateDateParams(Mockito.any(), Mockito.any());
Mockito.doReturn(new ArrayList<VmStatsVO>()).when(spy).findVmStatsAccordingToDateParams(
Mockito.anyLong(), Mockito.any(), Mockito.any());
Mockito.doReturn(fakeVmId1).when(userVmVOMock).getId();
Map<Long,List<VmStatsVO>> expected = new HashMap<Long,List<VmStatsVO>>();
expected.put(fakeVmId1, new ArrayList<VmStatsVO>());
Date startDate = Mockito.mock(Date.class);
Date endDate = Mockito.mock(Date.class);
Map<Long,List<VmStatsVO>> result = spy.searchForVmMetricsStatsInternal(
startDate, endDate, Arrays.asList(userVmVOMock));
Mockito.verify(userVmVOMock).getId();
Mockito.verify(spy).findVmStatsAccordingToDateParams(
Mockito.anyLong(), Mockito.any(), Mockito.any());
Assert.assertEquals(expected, result);
}
@Test
public void searchForVmMetricsStatsInternalTestWithAnEmptyListOfVms() {
Mockito.doNothing().when(spy).validateDateParams(Mockito.any(), Mockito.any());
Map<Long,List<VmStatsVO>> expected = new HashMap<Long,List<VmStatsVO>>();
Date startDate = Mockito.mock(Date.class);
Date endDate = Mockito.mock(Date.class);
Map<Long,List<VmStatsVO>> result = spy.searchForVmMetricsStatsInternal(
startDate, endDate, new ArrayList<UserVmVO>());
Mockito.verify(userVmVOMock, Mockito.never()).getId();
Mockito.verify(spy, Mockito.never()).findVmStatsAccordingToDateParams(
Mockito.anyLong(), Mockito.any(), Mockito.any());
Assert.assertEquals(expected, result);
}
@Test(expected = InvalidParameterValueException.class)
public void validateDateParamsTestWithEndDateBeforeStartDate() {
Date startDate = new Date();
Date endDate = DateUtils.addSeconds(startDate, -1);
spy.validateDateParams(startDate, endDate);
}
@Test
public void findVmStatsAccordingToDateParamsTestWithStartDateAndEndDate() {
Date startDate = new Date();
Date endDate = DateUtils.addSeconds(startDate, 1);
Mockito.doReturn(new ArrayList<VmStatsVO>()).when(vmStatsDaoMock).findByVmIdAndTimestampBetween(
Mockito.anyLong(), Mockito.any(), Mockito.any());
spy.findVmStatsAccordingToDateParams(fakeVmId1, startDate, endDate);
Mockito.verify(vmStatsDaoMock).findByVmIdAndTimestampBetween(
Mockito.anyLong(), Mockito.any(), Mockito.any());
}
@Test
public void findVmStatsAccordingToDateParamsTestWithOnlyStartDate() {
Date startDate = new Date();
Date endDate = null;
Mockito.doReturn(new ArrayList<VmStatsVO>()).when(vmStatsDaoMock).findByVmIdAndTimestampGreaterThanEqual(
Mockito.anyLong(), Mockito.any());
spy.findVmStatsAccordingToDateParams(fakeVmId1, startDate, endDate);
Mockito.verify(vmStatsDaoMock).findByVmIdAndTimestampGreaterThanEqual(
Mockito.anyLong(), Mockito.any());
}
@Test
public void findVmStatsAccordingToDateParamsTestWithOnlyEndDate() {
Date startDate = null;
Date endDate = new Date();
Mockito.doReturn(new ArrayList<VmStatsVO>()).when(vmStatsDaoMock).findByVmIdAndTimestampLessThanEqual(
Mockito.anyLong(), Mockito.any());
spy.findVmStatsAccordingToDateParams(fakeVmId1, startDate, endDate);
Mockito.verify(vmStatsDaoMock).findByVmIdAndTimestampLessThanEqual(
Mockito.anyLong(), Mockito.any());
}
@Test
public void findVmStatsAccordingToDateParamsTestWithNoDate() {
Mockito.doReturn(new ArrayList<VmStatsVO>()).when(vmStatsDaoMock).findByVmId(Mockito.anyLong());
spy.findVmStatsAccordingToDateParams(fakeVmId1, null, null);
Mockito.verify(vmStatsDaoMock).findByVmId(Mockito.anyLong());
}
@Test
public void createVmMetricsStatsResponseTestWithValidInput() {
Mockito.doReturn("").when(userVmVOMock).getUuid();
Mockito.doReturn("").when(userVmVOMock).getName();
Mockito.doReturn("").when(userVmVOMock).getDisplayName();
Mockito.doReturn(fakeVmId1).when(userVmVOMock).getId();
Mockito.doReturn(Arrays.asList(userVmVOMock)).when(expectedVmListAndCounterMock).first();
Mockito.doReturn(null).when(vmStatsMapMock).get(Mockito.any());
Mockito.doReturn(null).when(spy).createStatsResponse(Mockito.any());
ListResponse<VmMetricsStatsResponse> result = spy.createVmMetricsStatsResponse(
expectedVmListAndCounterMock.first(), vmStatsMapMock);
Assert.assertEquals(Integer.valueOf(1), result.getCount());
}
@Test(expected = NullPointerException.class)
public void createVmMetricsStatsResponseTestWithNoUserVmList() {
spy.createVmMetricsStatsResponse(null, vmStatsMapMock);
}
@Test(expected = NullPointerException.class)
public void createVmMetricsStatsResponseTestWithNoVmStatsList() {
spy.createVmMetricsStatsResponse(expectedVmListAndCounterMock.first(), null);
}
@Test
public void createStatsResponseTestWithValidStatsData() {
final String fakeVmStatsData = "{\"vmId\":1,\"cpuUtilization\":15.615905273486222,\"networkReadKBs\":0.1,"
+ "\"networkWriteKBs\":0.2,\"diskReadIOs\":0.1,\"diskWriteIOs\":0.2,\"diskReadKBs\":1.1,"
+ "\"diskWriteKBs\":2.1,\"memoryKBs\":262144.0,\"intfreememoryKBs\":262144.0,\"targetmemoryKBs\":262144.0,"
+ "\"numCPUs\":1,\"entityType\":\"vm\"}";
Mockito.doReturn(new Date()).when(vmStatsVOMock).getTimestamp();
Mockito.doReturn(fakeVmStatsData).when(vmStatsVOMock).getVmStatsData();
spy.createStatsResponse(Arrays.asList(vmStatsVOMock));
}
}