/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.integration;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.easymock.EasyMock;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import de.rcenvironment.core.communication.api.CommunicationService;
import de.rcenvironment.core.communication.common.LogicalNodeId;
import de.rcenvironment.core.communication.common.NodeIdentifierTestUtils;
import de.rcenvironment.core.component.api.DistributedComponentKnowledge;
import de.rcenvironment.core.component.api.DistributedComponentKnowledgeService;
import de.rcenvironment.core.component.integration.internal.ToolIntegrationDocumentationServiceImpl;
import de.rcenvironment.core.component.model.api.ComponentInstallation;
import de.rcenvironment.core.component.model.api.ComponentInterface;
import de.rcenvironment.core.component.model.api.ComponentRevision;
import de.rcenvironment.core.configuration.ConfigurationService;
import de.rcenvironment.core.configuration.ConfigurationService.ConfigurablePathId;
import de.rcenvironment.core.utils.common.TempFileServiceAccess;
import de.rcenvironment.core.utils.common.rpc.RemoteOperationException;
/**
* Tests for {@link ToolIntegrationDocumentationService}.
*
* @author Sascha Zur
* @author Robert Mischke (8.0.0 id adaptations)
*/
public class ToolIntegrationDocumentationServiceTest {
private static final LogicalNodeId LOCAL_NODE_ID = NodeIdentifierTestUtils.createTestDefaultLogicalNodeId();
private static final String TOOL_IDENTIFIER_1 = "identifier1";
private static final String HASH_1 = "hash1";
private static final String TOOL_IDENTIFIER_2 = "identifier2";
private static final String HASH_2 = "hash2";
private File cachedir = null;
/**
* Set up the environment.
*/
@Before
public void setup() {
TempFileServiceAccess.setupUnitTestEnvironment();
try {
cachedir = TempFileServiceAccess.getInstance().createManagedTempDir();
} catch (IOException e) {
Assert.fail("Could not set up test directory");
}
}
/**
* Test if cache is used correctly.
*/
@Test
public void testDocumentationServiceCache() {
ToolIntegrationDocumentationServiceImpl service = new ToolIntegrationDocumentationServiceImpl();
Set<ComponentInstallation> ciSet = new HashSet<ComponentInstallation>();
ciSet.add(createComponentInstallation(TOOL_IDENTIFIER_1, HASH_1, LOCAL_NODE_ID.getLogicalNodeIdString()));
ciSet.add(createComponentInstallation(TOOL_IDENTIFIER_2, HASH_2, LOCAL_NODE_ID.getLogicalNodeIdString()));
DistributedComponentKnowledgeService dcks = createMockedKnowledgeService(ciSet);
service.bindDistributedComponentKnowledgeService(dcks);
ConfigurationService configService = createConfigService(cachedir);
service.bindConfigurationService(configService);
byte[] returnArray = new byte[] { 1, 1, 1, 0, 0, 0 };
List<String> toolIDs = new ArrayList<>();
toolIDs.add(TOOL_IDENTIFIER_1);
toolIDs.add(TOOL_IDENTIFIER_2);
RemoteToolIntegrationService rtis = createRemoteServiceMock(returnArray, toolIDs);
CommunicationService commService = createRemoteServiceWithReturningByteArray(LOCAL_NODE_ID, rtis);
service.bindCommunicationService(commService);
File directory1;
try {
directory1 = service.getToolDocumentation(TOOL_IDENTIFIER_1,
service.getComponentDocumentationList(TOOL_IDENTIFIER_1).get(HASH_1), HASH_1);
File directory2 =
service.getToolDocumentation(TOOL_IDENTIFIER_1, service.getComponentDocumentationList(TOOL_IDENTIFIER_1).get(HASH_1),
HASH_1);
Assert.assertEquals(directory1, directory2);
File directory3 =
service.getToolDocumentation(TOOL_IDENTIFIER_2,
service.getComponentDocumentationList(TOOL_IDENTIFIER_2).get(HASH_2), HASH_2);
Assert.assertEquals(false, directory3.equals(directory1));
} catch (RemoteOperationException | IOException e) {
Assert.fail();
}
EasyMock.verify(rtis);
}
private RemoteToolIntegrationService createRemoteServiceMock(byte[] returnArray, List<String> toolIDs) {
RemoteToolIntegrationService rtis = EasyMock.createStrictMock(RemoteToolIntegrationService.class);
for (String tool : toolIDs) {
try {
EasyMock.expect(rtis.getToolDocumentation(tool)).andReturn(returnArray);
} catch (RemoteOperationException e) {
Assert.fail();
}
}
EasyMock.replay(rtis);
return rtis;
}
/**
* Clean up.
*/
@After
public void tearDown() {
try {
TempFileServiceAccess.getInstance().disposeManagedTempDirOrFile(cachedir);
} catch (IOException e) {
Assert.fail();
}
}
private ComponentInstallation createComponentInstallation(String installationID, String hash, String nodeID) {
ComponentInstallation ci = EasyMock.createNiceMock(ComponentInstallation.class);
EasyMock.expect(ci.getInstallationId()).andReturn(installationID).anyTimes();
ComponentInterface cint = EasyMock.createNiceMock(ComponentInterface.class);
EasyMock.expect(cint.getDocumentationHash()).andReturn(hash).anyTimes();
EasyMock.replay(cint);
ComponentRevision cr = EasyMock.createNiceMock(ComponentRevision.class);
EasyMock.expect(cr.getComponentInterface()).andReturn(cint).anyTimes();
EasyMock.replay(cr);
EasyMock.expect(ci.getComponentRevision()).andReturn(cr).anyTimes();
EasyMock.expect(ci.getNodeId()).andReturn(nodeID).anyTimes();
EasyMock.replay(ci);
return ci;
}
private CommunicationService createRemoteServiceWithReturningByteArray(LogicalNodeId nodeId, RemoteToolIntegrationService rtis) {
CommunicationService commService = EasyMock.createNiceMock(CommunicationService.class);
EasyMock.expect(
commService.getRemotableService(RemoteToolIntegrationService.class, nodeId))
.andReturn(rtis).anyTimes();
EasyMock.replay(commService);
return commService;
}
private ConfigurationService createConfigService(File tempDirPath) {
ConfigurationService configService = EasyMock.createNiceMock(ConfigurationService.class);
EasyMock.expect(configService.getConfigurablePath(ConfigurablePathId.PROFILE_INTERNAL_DATA)).andReturn(tempDirPath);
EasyMock.replay(configService);
return configService;
}
private DistributedComponentKnowledgeService createMockedKnowledgeService(Set<ComponentInstallation> ciSet) {
DistributedComponentKnowledge dck = EasyMock.createNiceMock(DistributedComponentKnowledge.class);
EasyMock.expect(dck.getAllInstallations()).andReturn(ciSet).anyTimes();
EasyMock.replay(dck);
DistributedComponentKnowledgeService dcks = EasyMock.createNiceMock(DistributedComponentKnowledgeService.class);
EasyMock.expect(dcks.getCurrentComponentKnowledge()).andReturn(dck).anyTimes();
EasyMock.replay(dcks);
return dcks;
}
}