package org.ovirt.engine.core.utils.hostinstall; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.when; import java.io.ByteArrayInputStream; import java.io.IOException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.Spy; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.utils.FileUtil; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; /** * This test class only tests the logic inside the runCommandArray method, since the rest of the class is logic-free, or * externally dependent */ @RunWith(PowerMockRunner.class) @PrepareForTest({ Config.class, FileUtil.class }) public class OpenSslCAWrapperTest { static final int defaultSignCertTimeoutInSeconds = 30; @Spy OpenSslCAWrapper openSslWrapper = new OpenSslCAWrapper(); @Mock Process processMock; @Mock Runtime runtimeMock; // Static mock does not hold if done only in @BeforeClass, must be done before each test @Before public void setup() throws IOException { MockitoAnnotations.initMocks(this); // Mocking the Config class mockStatic(Config.class); when(Config.resolveSignScriptPath()).thenReturn(new String()); when(Config.GetValue(any(ConfigValues.class))).thenReturn(new String()); when(Config.GetValue(ConfigValues.SignCertTimeoutInSeconds)).thenReturn(defaultSignCertTimeoutInSeconds); when(Config.resolveCABasePath()).thenReturn(new String()); // Mocking the org.ovirt.engine.core.utils FileUtil class mockStatic(FileUtil.class); when(FileUtil.fileExists(any(String.class))).thenReturn(true); // Mocking the process and openSslWrapper when(processMock.getInputStream()).thenReturn(new ByteArrayInputStream(new byte[1])); when(processMock.getErrorStream()).thenReturn(new ByteArrayInputStream(new byte[1])); when(openSslWrapper.getRuntime()).thenReturn(runtimeMock); when(runtimeMock.exec(any(String[].class))).thenReturn(processMock); } @Test public void signCertificateRequestValidTest() { processSucceeds(); assertTrue(execSignCertificateRequest()); } @Test public void signCertificateRequestBadExitValueTest() { processFails(); assertFalse(execSignCertificateRequest()); } @Test public void signCertificateRequestTimeoutTest() { processSucceeds(); // In order to cause a timeout, timeout is set to zero when(Config.GetValue(ConfigValues.SignCertTimeoutInSeconds)).thenReturn(0); assertFalse(execSignCertificateRequest()); } private void processSucceeds() { setExternalReturnValue(0); } private void processFails() { setExternalReturnValue(1); } private void setExternalReturnValue(final int returnValue) { when(processMock.exitValue()).thenReturn(returnValue); } private boolean execSignCertificateRequest() { return openSslWrapper.SignCertificateRequest(null, 0, null); } }