/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.component.integration; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.easymock.Capture; import org.easymock.CaptureType; import org.easymock.EasyMock; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import de.rcenvironment.core.component.api.ComponentException; import de.rcenvironment.core.component.execution.api.ComponentContext; import de.rcenvironment.core.component.execution.api.ComponentEventAnnouncement; import de.rcenvironment.core.component.execution.api.ComponentEventAnnouncementDispatcher; import de.rcenvironment.core.component.execution.api.ComponentLog; import de.rcenvironment.core.utils.common.StringUtils; import de.rcenvironment.core.utils.common.TempFileService; import de.rcenvironment.core.utils.common.TempFileServiceAccess; import de.rcenvironment.toolkit.utils.text.TextLinesReceiver; /** * Test cases for {@link CommonToolIntegratorComponent}. * * @author Doreen Seider */ public class CommonToolIntegratorComponentTest { private static final String FAILED_TO_CREATE_FILE_WITH_VERIFICATION_KEY = "Failed to create file with verification key"; private static final String FILE_WITH_VERIFICATION_KEY_CREATED = "File with verification key created"; private static final String WAITING_FOR_APPROVAL = "Waiting for approval"; private static final String VERIFICATION_TOKEN = "some-token"; private static File tempDir; /** * Creates a temporary directory used by this unit tests. * * @throws IOException on unexpected error */ @BeforeClass public static void createTempDirectory() throws IOException { TempFileServiceAccess.setupUnitTestEnvironment(); TempFileService tempFileService = TempFileServiceAccess.getInstance(); tempDir = tempFileService.createManagedTempDir(); } /** * Deletes the temporary directory used by this unit tests. * * @throws IOException on unexpected error */ @AfterClass public static void deleteTempDirectory() throws IOException { TempFileService tempFileService = TempFileServiceAccess.getInstance(); tempFileService.disposeManagedTempDirOrFile(tempDir); } /** * Tests creation of verification key file. * * @throws IOException on expected error * @throws ComponentException on expected error */ @Test public void testVerificationTokenFileHandling() throws IOException, ComponentException { ComponentLog compLogMock = EasyMock.createStrictMock(ComponentLog.class); Capture<String> logMessageCapture = new Capture<>(CaptureType.ALL); compLogMock.componentInfo(EasyMock.capture(logMessageCapture)); EasyMock.expectLastCall().times(2); EasyMock.replay(compLogMock); ComponentContext compCtxMock = createComponentContextMock(true, false, compLogMock, null); CommonToolIntegratorComponent comp = instantiateAndSetupComponent(compCtxMock); comp.handleVerificationToken(VERIFICATION_TOKEN); EasyMock.verify(compLogMock); EasyMock.verify(compCtxMock); assertTrue(logMessageCapture.getValues().get(0).contains(FILE_WITH_VERIFICATION_KEY_CREATED)); assertTrue(logMessageCapture.getValues().get(1).contains(WAITING_FOR_APPROVAL)); String fileConent = FileUtils.readFileToString(new File(tempDir, "verification-key")); assertTrue(fileConent.startsWith(StringUtils.format("Verification key: %s", VERIFICATION_TOKEN))); assertTrue(fileConent.contains("How to verify tool results?")); } /** * Tests if component only fails if neither verification token file could be stored nor the email with the verification token could be * sent. * * @throws IOException on expected error * @throws ComponentException on expected error */ @Test public void testVerificationTokenInFailureCase() throws IOException, ComponentException { // file succeeds, mail fails ComponentLog compLogMock = EasyMock.createStrictMock(ComponentLog.class); Capture<String> logInfoMessageCapture = new Capture<>(CaptureType.ALL); compLogMock.componentInfo(EasyMock.capture(logInfoMessageCapture)); EasyMock.expectLastCall().times(2); EasyMock.replay(compLogMock); ComponentEventAnnouncementDispatcher compEveAnnDispatcherMock = createComponentEventAnnouncementDispatcher(false); ComponentContext compCtxMock = createComponentContextMock(true, true, compLogMock, compEveAnnDispatcherMock); CommonToolIntegratorComponent comp = instantiateAndSetupComponent(compCtxMock); comp.handleVerificationToken(VERIFICATION_TOKEN); verifyVerificationTokenRelatedMocks(compLogMock, compEveAnnDispatcherMock, compCtxMock); assertTrue(logInfoMessageCapture.getValues().get(0).contains(FILE_WITH_VERIFICATION_KEY_CREATED)); assertTrue(logInfoMessageCapture.getValues().get(1).contains(WAITING_FOR_APPROVAL)); // file succeeds, mails fails EasyMock.reset(compLogMock); EasyMock.reset(compEveAnnDispatcherMock); EasyMock.reset(compCtxMock); Capture<String> logErrorMessageCapture = new Capture<>(CaptureType.ALL); logInfoMessageCapture = new Capture<>(CaptureType.ALL); compLogMock.componentError(EasyMock.capture(logErrorMessageCapture)); EasyMock.expectLastCall().once(); compLogMock.componentInfo(EasyMock.capture(logInfoMessageCapture)); EasyMock.expectLastCall().times(2); EasyMock.replay(compLogMock); compEveAnnDispatcherMock = createComponentEventAnnouncementDispatcher(true); compCtxMock = createComponentContextMock(false, true, compLogMock, compEveAnnDispatcherMock); comp = instantiateAndSetupComponent(compCtxMock); comp.handleVerificationToken(VERIFICATION_TOKEN); verifyVerificationTokenRelatedMocks(compLogMock, compEveAnnDispatcherMock, compCtxMock); assertTrue(logErrorMessageCapture.getValues().get(0).contains(FAILED_TO_CREATE_FILE_WITH_VERIFICATION_KEY)); assertTrue(logInfoMessageCapture.getValues().get(0).contains("Email with verification key sent")); assertTrue(logInfoMessageCapture.getValues().get(1).contains(WAITING_FOR_APPROVAL)); // file fails, mails fails // file succeeds, mails fails EasyMock.reset(compLogMock); logErrorMessageCapture = new Capture<>(CaptureType.ALL); logInfoMessageCapture = new Capture<>(CaptureType.ALL); compLogMock.componentError(EasyMock.capture(logErrorMessageCapture)); EasyMock.replay(compLogMock); compEveAnnDispatcherMock = createComponentEventAnnouncementDispatcher(false); compCtxMock = createComponentContextMock(false, true, compLogMock, compEveAnnDispatcherMock); comp = instantiateAndSetupComponent(compCtxMock); try { comp.handleVerificationToken(VERIFICATION_TOKEN); fail("Exception expected"); } catch (ComponentException e) { assertTrue(e.getMessage().contains("")); } verifyVerificationTokenRelatedMocks(compLogMock, compEveAnnDispatcherMock, compCtxMock); assertTrue(logErrorMessageCapture.getValues().get(0).contains(FAILED_TO_CREATE_FILE_WITH_VERIFICATION_KEY)); } private void verifyVerificationTokenRelatedMocks(ComponentLog compLogMock, ComponentEventAnnouncementDispatcher compEveAnnDispatcherMock, ComponentContext compCtxMock) { EasyMock.verify(compLogMock); EasyMock.verify(compEveAnnDispatcherMock); EasyMock.verify(compCtxMock); } private ComponentContext createComponentContextMock(boolean tokenFileCreationShouldSucceed, boolean emailEnabled, ComponentLog compLogMock, ComponentEventAnnouncementDispatcher compEveAnnDispatcherMock) throws IOException { final String compName = "some comp name"; final int executionCount = 7; final String wfName = "some wf name"; final String mailAddress = "some_name@mail.de"; ComponentContext compCtxMock = EasyMock.createStrictMock(ComponentContext.class); EasyMock.expect(compCtxMock.getService(ComponentEventAnnouncementDispatcher.class)).andStubReturn(compEveAnnDispatcherMock); if (tokenFileCreationShouldSucceed) { EasyMock.expect(compCtxMock.getConfigurationValue(ToolIntegrationConstants.KEY_VERIFICATION_TOKEN_LOCATION)) .andStubReturn(tempDir.getAbsolutePath()); } else { File invalidTokenLocation = new File(tempDir, "file"); invalidTokenLocation.createNewFile(); EasyMock.expect(compCtxMock.getConfigurationValue(ToolIntegrationConstants.KEY_VERIFICATION_TOKEN_LOCATION)) .andStubReturn(invalidTokenLocation.getAbsolutePath()); } if (emailEnabled) { EasyMock.expect(compCtxMock.getConfigurationValue(ToolIntegrationConstants.KEY_VERIFICATION_TOKEN_RECIPIENTS)) .andStubReturn(mailAddress); } else { EasyMock.expect(compCtxMock.getConfigurationValue(ToolIntegrationConstants.KEY_VERIFICATION_TOKEN_RECIPIENTS)) .andStubReturn(null); } EasyMock.expect(compCtxMock.getLog()).andStubReturn(compLogMock); EasyMock.expect(compCtxMock.getComponentName()).andStubReturn(compName); EasyMock.expect(compCtxMock.getExecutionCount()).andStubReturn(executionCount); EasyMock.expect(compCtxMock.getWorkflowInstanceName()).andStubReturn(wfName); EasyMock.replay(compCtxMock); return compCtxMock; } private ComponentEventAnnouncementDispatcher createComponentEventAnnouncementDispatcher(boolean succeeding) { ComponentEventAnnouncementDispatcher compEveAnnDispatcherMock = EasyMock.createStrictMock(ComponentEventAnnouncementDispatcher.class); EasyMock.expect(compEveAnnDispatcherMock.dispatchWorkflowEventAnnouncementViaMail(EasyMock.anyObject(String[].class), EasyMock.anyObject(ComponentEventAnnouncement.class), EasyMock.anyObject(TextLinesReceiver.class))).andStubReturn(succeeding); EasyMock.replay(compEveAnnDispatcherMock); return compEveAnnDispatcherMock; } private CommonToolIntegratorComponent instantiateAndSetupComponent(ComponentContext compCtxMock) { CommonToolIntegratorComponent comp = new CommonToolIntegratorComponent(); comp.setComponentContext(compCtxMock); return comp; } }