Add some more unit tests

This commit is contained in:
vishesh92 2026-03-31 15:18:32 +05:30
parent a529e30a40
commit 31a4a014db
No known key found for this signature in database
GPG Key ID: 4E395186CBFA790B
1 changed files with 113 additions and 1 deletions

View File

@ -41,11 +41,27 @@ import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.cert.X509Certificate;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import org.mockito.MockedStatic;
import org.mockito.MockedConstruction;
import com.cloud.utils.ssh.SSHCmdHelper;
import com.cloud.host.HostVO;
import com.cloud.vm.VMInstanceVO;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import com.cloud.vm.dao.VMInstanceDao;
import com.trilead.ssh2.Connection;
import com.cloud.agent.api.routing.NetworkElementCommand;
import org.apache.cloudstack.api.ApiConstants;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
@ -65,7 +81,12 @@ public class CAManagerImplTest {
private AgentManager agentManager;
@Mock
private CAProvider caProvider;
@Mock
private VMInstanceDao vmInstanceDao;
@Mock
private NetworkOrchestrationService networkOrchestrationService;
@Mock
private ConfigurationDao configDao;
@InjectMocks
@Spy
private CAManagerImpl caManager = new CAManagerImpl();
@ -216,4 +237,95 @@ public class CAManagerImplTest {
Assert.assertFalse(caManager.getActiveCertificatesMap().containsKey("10.0.0.1"));
Assert.assertFalse(caManager.getActiveCertificatesMap().containsKey("192.168.0.1"));
}
@Test
public void testProvisionCertificateViaSsh() throws Exception {
Connection sshConnection = Mockito.mock(Connection.class);
final String agentIp = "192.168.1.1";
final String agentHostname = "host1";
final String caProviderStr = "root";
try (MockedStatic<SSHCmdHelper> sshCmdHelperMock = Mockito.mockStatic(SSHCmdHelper.class)) {
SSHCmdHelper.SSHCmdResult successResult = new SSHCmdHelper.SSHCmdResult(0, "someCsr", "");
sshCmdHelperMock.when(() -> SSHCmdHelper.sshExecuteCmdWithResult(Mockito.eq(sshConnection), Mockito.anyString()))
.thenReturn(successResult);
final KeyPair keyPair = CertUtils.generateRandomKeyPair(1024);
final X509Certificate x509 = CertUtils.generateV3Certificate(null, keyPair, keyPair.getPublic(), "CN=ca", "SHA256withRSA", 365, null, null);
Mockito.doReturn(new Certificate(x509, null, Collections.singletonList(x509)))
.when(caManager).issueCertificate(Mockito.anyString(), Mockito.anyList(), Mockito.anyList(), Mockito.nullable(Integer.class), Mockito.anyString());
caManager.provisionCertificateViaSsh(sshConnection, agentIp, agentHostname, caProviderStr);
sshCmdHelperMock.verify(() -> SSHCmdHelper.sshExecuteCmdWithResult(Mockito.eq(sshConnection), Mockito.contains("keystore-setup")), Mockito.times(1));
sshCmdHelperMock.verify(() -> SSHCmdHelper.sshExecuteCmdWithResult(Mockito.eq(sshConnection), Mockito.contains("keystore-cert-import")), Mockito.times(1));
}
}
@Test
public void testProvisionKvmHostViaSsh() throws Exception {
HostVO host = Mockito.mock(HostVO.class);
Mockito.when(host.getPrivateIpAddress()).thenReturn("192.168.1.1");
Mockito.when(host.getName()).thenReturn("host1");
Mockito.when(host.getClusterId()).thenReturn(1L);
Mockito.doNothing().when(hostDao).loadDetails(host);
Mockito.when(host.getDetail(ApiConstants.USERNAME)).thenReturn("root");
Mockito.when(host.getDetail(ApiConstants.PASSWORD)).thenReturn("password");
Mockito.when(configDao.getValue("ssh.privatekey")).thenReturn("privatekey");
try (MockedConstruction<Connection> ignored = Mockito.mockConstruction(Connection.class,
(mock, context) -> {
// Do nothing on connect
});
MockedStatic<SSHCmdHelper> sshCmdHelperMock = Mockito.mockStatic(SSHCmdHelper.class)) {
sshCmdHelperMock.when(() -> SSHCmdHelper.acquireAuthorizedConnectionWithPublicKey(Mockito.any(Connection.class), Mockito.anyString(), Mockito.anyString()))
.thenReturn(true);
Mockito.doNothing().when(caManager).provisionCertificateViaSsh(Mockito.any(Connection.class), Mockito.anyString(), Mockito.anyString(), Mockito.anyString());
Method method = CAManagerImpl.class.getDeclaredMethod("provisionKvmHostViaSsh", Host.class, String.class);
method.setAccessible(true);
boolean result = (Boolean) method.invoke(caManager, host, "root");
Assert.assertTrue(result);
Mockito.verify(caManager, Mockito.times(1)).provisionCertificateViaSsh(Mockito.any(Connection.class), Mockito.eq("192.168.1.1"), Mockito.eq("host1"), Mockito.eq("root"));
sshCmdHelperMock.verify(() -> SSHCmdHelper.sshExecuteCmd(Mockito.any(Connection.class), Mockito.eq("sudo service cloudstack-agent restart")), Mockito.times(1));
}
}
@Test
public void testProvisionSystemVmViaSsh() throws Exception {
Host host = Mockito.mock(Host.class);
Mockito.when(host.getName()).thenReturn("v-1-VM");
VMInstanceVO vm = Mockito.mock(VMInstanceVO.class);
Mockito.when(vm.getHostId()).thenReturn(1L);
Mockito.when(vm.getHostName()).thenReturn("host1");
Mockito.when(vm.getInstanceName()).thenReturn("v-1-VM");
Mockito.when(vmInstanceDao.findVMByInstanceName("v-1-VM")).thenReturn(vm);
Map<String, String> accessDetails = new HashMap<>();
accessDetails.put(NetworkElementCommand.ROUTER_IP, "192.168.1.2");
Mockito.when(networkOrchestrationService.getSystemVMAccessDetails(vm)).thenReturn(accessDetails);
HostVO hypervisorHost = Mockito.mock(HostVO.class);
Mockito.when(hostDao.findById(1L)).thenReturn(hypervisorHost);
final KeyPair keyPair = CertUtils.generateRandomKeyPair(1024);
final X509Certificate x509 = CertUtils.generateV3Certificate(null, keyPair, keyPair.getPublic(), "CN=ca", "SHA256withRSA", 365, null, null);
Certificate cert = new Certificate(x509, null, Collections.singletonList(x509));
Mockito.doReturn(cert)
.when(caManager).issueCertificate(Mockito.nullable(String.class), Mockito.anyList(), Mockito.anyList(), Mockito.nullable(Integer.class), Mockito.anyString());
Mockito.doReturn(true)
.when(caManager).deployCertificate(Mockito.eq(hypervisorHost), Mockito.eq(cert), Mockito.anyBoolean(), Mockito.eq(accessDetails));
Method method = CAManagerImpl.class.getDeclaredMethod("provisionSystemVmViaSsh", Host.class, Boolean.class, String.class);
method.setAccessible(true);
boolean result = (Boolean) method.invoke(caManager, host, true, "root");
Assert.assertTrue(result);
Mockito.verify(caManager, Mockito.times(1)).deployCertificate(Mockito.eq(hypervisorHost), Mockito.eq(cert), Mockito.eq(true), Mockito.eq(accessDetails));
}
}