/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo Framework
* Version: 1.4
*
* This file is part of Qcadoo.
*
* Qcadoo is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.plugin.internal.manager;
import com.qcadoo.plugin.api.*;
import com.qcadoo.plugin.api.artifact.PluginArtifact;
import com.qcadoo.plugin.internal.PluginException;
import com.qcadoo.plugin.internal.api.*;
import com.qcadoo.plugin.internal.dependencymanager.SimplePluginStatusResolver;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mockito;
import java.io.File;
import java.util.Collections;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newHashSet;
import static org.junit.Assert.*;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.*;
public class PluginManagerInstallTest {
private final InternalPlugin plugin = mock(InternalPlugin.class);
private final InternalPlugin anotherPlugin = mock(InternalPlugin.class);
private final InternalPluginAccessor pluginAccessor = mock(InternalPluginAccessor.class);
private final PluginDao pluginDao = mock(PluginDao.class);
private final PluginDependencyManager pluginDependencyManager = mock(PluginDependencyManager.class);
private final PluginFileManager pluginFileManager = mock(PluginFileManager.class);
private final PluginDescriptorParser pluginDescriptorParser = mock(PluginDescriptorParser.class);
private final PluginArtifact pluginArtifact = mock(PluginArtifact.class);
private DefaultPluginManager pluginManager;
private final File file = mock(File.class, RETURNS_DEEP_STUBS);
@Before
public void init() {
given(pluginAccessor.getPlugin("pluginname")).willReturn(plugin);
given(anotherPlugin.getIdentifier()).willReturn("pluginname");
given(anotherPlugin.getVersion()).willReturn(new Version("1.2.5"));
given(plugin.getVersion()).willReturn(new Version("1.2.4"));
pluginManager = new DefaultPluginManager();
pluginManager.setPluginAccessor(pluginAccessor);
pluginManager.setPluginDao(pluginDao);
pluginManager.setPluginDependencyManager(pluginDependencyManager);
pluginManager.setPluginFileManager(pluginFileManager);
pluginManager.setPluginDescriptorParser(pluginDescriptorParser);
}
@Test
public void shouldInstallTemporaryPlugin() throws Exception {
// given
given(plugin.hasState(PluginState.TEMPORARY)).willReturn(true);
given(plugin.getState()).willReturn(PluginState.TEMPORARY);
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(plugin.getFilename()).willReturn("filename");
given(anotherPlugin.getFilename()).willReturn("anotherFilename");
given(file.getName()).willReturn("tempFileName");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.satisfiedDependencies();
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao).save(anotherPlugin);
verify(pluginAccessor).savePlugin(anotherPlugin);
verify(anotherPlugin).changeStateTo(plugin.getState());
verify(pluginFileManager).uninstallPlugin("filename");
assertTrue(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.SUCCESS, pluginOperationResult.getStatus());
assertEquals(0, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
}
@Test
public void shouldFailureWithCorruptedPluginOnInstall() throws Exception {
// given
given(pluginDescriptorParser.parse(file)).willThrow(new PluginException(""));
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(file.getName()).willReturn("filename");
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao, never()).save(Mockito.any(InternalPlugin.class));
verify(pluginAccessor, never()).savePlugin(Mockito.any(InternalPlugin.class));
verify(pluginFileManager).uninstallPlugin("filename");
assertFalse(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.CORRUPTED_PLUGIN, pluginOperationResult.getStatus());
}
@Test
public void shouldFailureOnUploadingPluginOnInstall() throws Exception {
// given
given(pluginFileManager.uploadPlugin(pluginArtifact)).willThrow(new PluginException(""));
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao, never()).save(Mockito.any(InternalPlugin.class));
verify(pluginAccessor, never()).savePlugin(Mockito.any(InternalPlugin.class));
assertFalse(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.CANNOT_UPLOAD_PLUGIN, pluginOperationResult.getStatus());
}
@Test
public void shouldInstallTemporaryPluginAndNotifyAboutMissingDependencies() throws Exception {
// given
given(plugin.hasState(PluginState.TEMPORARY)).willReturn(true);
given(plugin.getState()).willReturn(PluginState.TEMPORARY);
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(plugin.getFilename()).willReturn("filename");
given(anotherPlugin.getFilename()).willReturn("anotherFilename");
given(file.getName()).willReturn("tempFileName");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.unsatisfiedDependencies(Collections
.singleton(new PluginDependencyInformation("unknownplugin", new VersionOfDependency(null))));
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao).save(anotherPlugin);
verify(pluginAccessor).savePlugin(anotherPlugin);
verify(anotherPlugin).changeStateTo(plugin.getState());
verify(pluginFileManager).uninstallPlugin("filename");
assertTrue(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.SUCCESS_WITH_MISSING_DEPENDENCIES, pluginOperationResult.getStatus());
assertEquals(1, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
assertEquals(1, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
assertTrue(pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies()
.contains(new PluginDependencyInformation("unknownplugin", new VersionOfDependency(""))));
}
@Test
public void shouldInstallDisabledPlugin() throws Exception {
// given
given(plugin.hasState(PluginState.DISABLED)).willReturn(true);
given(plugin.getState()).willReturn(PluginState.DISABLED);
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(plugin.getFilename()).willReturn("filename");
given(anotherPlugin.getFilename()).willReturn("anotherFilename");
given(file.getName()).willReturn("tempFileName");
given(pluginFileManager.installPlugin("anotherFilename")).willReturn(true);
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.satisfiedDependencies();
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao).save(anotherPlugin);
verify(pluginAccessor).savePlugin(anotherPlugin);
verify(anotherPlugin).changeStateTo(plugin.getState());
verify(pluginFileManager).uninstallPlugin("filename");
assertTrue(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.SUCCESS_WITH_RESTART, pluginOperationResult.getStatus());
assertEquals(0, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
}
@Test
public void shouldFailureInstallDisabledPluginWithMissingDependencies() throws Exception {
// given
given(plugin.hasState(PluginState.DISABLED)).willReturn(true);
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(anotherPlugin.getFilename()).willReturn("filename");
given(file.getName()).willReturn("tempFileName");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.unsatisfiedDependencies(Collections
.singleton(new PluginDependencyInformation("unknownplugin", new VersionOfDependency(""))));
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao, never()).save(anotherPlugin);
verify(pluginAccessor, never()).savePlugin(anotherPlugin);
verify(anotherPlugin, never()).changeStateTo(plugin.getState());
verify(pluginFileManager).uninstallPlugin("filename");
assertFalse(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.UNSATISFIED_DEPENDENCIES, pluginOperationResult.getStatus());
assertEquals(1, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
assertEquals(1, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
assertTrue(pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies()
.contains(new PluginDependencyInformation("unknownplugin", new VersionOfDependency(""))));
}
@Test
public void shouldInstallEnabledPlugin() throws Exception {
// given
given(plugin.hasState(PluginState.ENABLED)).willReturn(true);
given(plugin.getState()).willReturn(PluginState.ENABLED);
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(pluginFileManager.installPlugin("anotherFilename")).willReturn(true);
given(anotherPlugin.getFilename()).willReturn("anotherFilename");
given(file.getName()).willReturn("tempFileName");
given(plugin.getFilename()).willReturn("filename");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.satisfiedDependencies();
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
InternalPlugin dependencyPlugin = mock(InternalPlugin.class);
given(pluginAccessor.getPlugin("dependencyplugin")).willReturn(dependencyPlugin);
given(dependencyPlugin.getIdentifier()).willReturn("dependencyplugin");
InternalPlugin dependencyPlugin2 = mock(InternalPlugin.class);
given(pluginAccessor.getPlugin("dependencyplugin2")).willReturn(dependencyPlugin2);
given(dependencyPlugin2.getIdentifier()).willReturn("dependencyplugin2");
PluginDependencyResult installPluginDependencyResult = PluginDependencyResultImpl.dependenciesToDisable(newHashSet(
new PluginDependencyInformation("dependencyplugin", new VersionOfDependency("")),
new PluginDependencyInformation("dependencyplugin2", new VersionOfDependency(""))));
given(
pluginDependencyManager.getDependenciesToUpdate(Mockito.eq(plugin), Mockito.eq(anotherPlugin),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(installPluginDependencyResult);
given(
pluginDependencyManager.sortPluginsInDependencyOrder(newArrayList((Plugin) dependencyPlugin2,
(Plugin) dependencyPlugin))).willReturn(
newArrayList((Plugin) dependencyPlugin, (Plugin) dependencyPlugin2));
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
InOrder inOrderDisable = inOrder(dependencyPlugin2, dependencyPlugin, plugin);
inOrderDisable.verify(dependencyPlugin2).changeStateTo(PluginState.DISABLED);
inOrderDisable.verify(dependencyPlugin).changeStateTo(PluginState.DISABLED);
inOrderDisable.verify(plugin).changeStateTo(PluginState.DISABLED);
InOrder inOrderEnabling = inOrder(anotherPlugin, dependencyPlugin, dependencyPlugin2);
inOrderEnabling.verify(anotherPlugin).changeStateTo(PluginState.ENABLING);
inOrderEnabling.verify(dependencyPlugin).changeStateTo(PluginState.ENABLING);
inOrderEnabling.verify(dependencyPlugin2).changeStateTo(PluginState.ENABLING);
verify(pluginDao).save(anotherPlugin);
verify(pluginAccessor).savePlugin(anotherPlugin);
verify(pluginDao).save(dependencyPlugin);
verify(pluginDao).save(dependencyPlugin2);
verify(pluginFileManager).uninstallPlugin("filename");
assertTrue(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.SUCCESS_WITH_RESTART, pluginOperationResult.getStatus());
assertEquals(0, pluginOperationResult.getPluginDependencyResult().getDependenciesToEnable().size());
assertEquals(0, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
}
@Test
public void shouldFailureInstallEnabledPluginWithUnsatisfiedDependenciesAfterUpdate() throws Exception {
// given
given(plugin.hasState(PluginState.ENABLED)).willReturn(true);
given(plugin.getState()).willReturn(PluginState.ENABLED);
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(pluginFileManager.installPlugin("anotherFilename")).willReturn(true);
given(anotherPlugin.getFilename()).willReturn("anotherFilename");
given(file.getName()).willReturn("tempFileName");
given(plugin.getFilename()).willReturn("filename");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.satisfiedDependencies();
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
PluginDependencyResult installPluginDependencyResult = PluginDependencyResultImpl.dependenciesToUpdate(Collections
.<PluginDependencyInformation> emptySet(), newHashSet(new PluginDependencyInformation("dependencyplugin",
new VersionOfDependency(""))));
given(
pluginDependencyManager.getDependenciesToUpdate(Mockito.eq(plugin), Mockito.eq(anotherPlugin),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(installPluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao, never()).save(anotherPlugin);
verify(pluginAccessor, never()).savePlugin(anotherPlugin);
verify(anotherPlugin, never()).changeStateTo(plugin.getState());
verify(pluginFileManager).uninstallPlugin("anotherFilename");
assertFalse(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.UNSATISFIED_DEPENDENCIES_AFTER_UPDATE, pluginOperationResult.getStatus());
assertEquals(1, pluginOperationResult.getPluginDependencyResult().getDependenciesToDisableUnsatisfiedAfterUpdate().size());
assertTrue(pluginOperationResult.getPluginDependencyResult().getDependenciesToDisableUnsatisfiedAfterUpdate()
.contains(new PluginDependencyInformation("dependencyplugin", new VersionOfDependency(""))));
}
@Test
public void shouldFailureInstallEnabledPluginWithUnsitisfiedDependencies() throws Exception {
// given
given(plugin.hasState(PluginState.ENABLED)).willReturn(true);
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(anotherPlugin.getFilename()).willReturn("filename");
given(file.getName()).willReturn("tempFileName");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.unsatisfiedDependencies(Collections
.singleton(new PluginDependencyInformation("unknownplugin", new VersionOfDependency(""))));
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao, never()).save(anotherPlugin);
verify(pluginAccessor, never()).savePlugin(anotherPlugin);
verify(anotherPlugin, never()).changeStateTo(plugin.getState());
verify(pluginFileManager).uninstallPlugin("filename");
assertFalse(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.UNSATISFIED_DEPENDENCIES, pluginOperationResult.getStatus());
assertEquals(1, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
assertTrue(pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies()
.contains(new PluginDependencyInformation("unknownplugin", new VersionOfDependency(""))));
}
@Test
public void shouldFailureInstallEnabledPluginWithDisabledDependencies() throws Exception {
// given
given(plugin.hasState(PluginState.ENABLED)).willReturn(true);
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(anotherPlugin.getFilename()).willReturn("filename");
given(file.getName()).willReturn("tempFileName");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.dependenciesToEnable(Collections
.singleton(new PluginDependencyInformation("unknownplugin", new VersionOfDependency(""))));
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao, never()).save(anotherPlugin);
verify(pluginAccessor, never()).savePlugin(anotherPlugin);
verify(anotherPlugin, never()).changeStateTo(plugin.getState());
verify(pluginFileManager).uninstallPlugin("filename");
assertFalse(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.DEPENDENCIES_TO_ENABLE, pluginOperationResult.getStatus());
assertEquals(0, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
assertEquals(1, pluginOperationResult.getPluginDependencyResult().getDependenciesToEnable().size());
assertEquals(1, pluginOperationResult.getPluginDependencyResult().getDependenciesToEnable().size());
assertTrue(pluginOperationResult.getPluginDependencyResult().getDependenciesToEnable()
.contains(new PluginDependencyInformation("unknownplugin", new VersionOfDependency(""))));
}
@Test
public void shouldNotInstallDisabledPluginIfCannotInstall() throws Exception {
// given
given(plugin.hasState(PluginState.DISABLED)).willReturn(true);
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(plugin.getFilename()).willReturn("filename");
given(anotherPlugin.getFilename()).willReturn("anotherFilename");
given(pluginFileManager.installPlugin("anotherFilename")).willReturn(false);
given(file.getName()).willReturn("tempFileName");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.satisfiedDependencies();
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao, never()).save(anotherPlugin);
verify(pluginAccessor, never()).savePlugin(anotherPlugin);
verify(anotherPlugin, never()).changeStateTo(plugin.getState());
verify(pluginFileManager, never()).uninstallPlugin("filename");
verify(pluginFileManager).uninstallPlugin("anotherFilename");
assertFalse(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.CANNOT_INSTALL_PLUGIN_FILE, pluginOperationResult.getStatus());
assertEquals(0, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
}
@Test
public void shouldNotInstallEnabledPluginIfCannotInstall() throws Exception {
// given
given(plugin.hasState(PluginState.ENABLED)).willReturn(true);
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(plugin.getFilename()).willReturn("filename");
given(anotherPlugin.getFilename()).willReturn("anotherFilename");
given(pluginFileManager.installPlugin("anotherFilename")).willReturn(false);
given(file.getName()).willReturn("tempFileName");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.satisfiedDependencies();
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao, never()).save(anotherPlugin);
verify(pluginAccessor, never()).savePlugin(anotherPlugin);
verify(anotherPlugin, never()).changeStateTo(plugin.getState());
verify(pluginFileManager, never()).uninstallPlugin("filename");
verify(pluginFileManager).uninstallPlugin("anotherFilename");
assertFalse(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.CANNOT_INSTALL_PLUGIN_FILE, pluginOperationResult.getStatus());
assertEquals(0, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
}
@Test
public void shouldNotInstallSystemPlugin() throws Exception {
// given
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(anotherPlugin.isSystemPlugin()).willReturn(true);
given(anotherPlugin.getFilename()).willReturn("anotherFilename");
given(file.getName()).willReturn("tempFileName");
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao, never()).save(anotherPlugin);
verify(pluginAccessor, never()).savePlugin(anotherPlugin);
verify(pluginFileManager).uninstallPlugin("anotherFilename");
assertFalse(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.SYSTEM_PLUGIN_UPDATING, pluginOperationResult.getStatus());
}
@Test
public void shouldInstallNotExistingPlugin() throws Exception {
// given
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(anotherPlugin.getIdentifier()).willReturn("notExistingPluginname");
given(file.getName()).willReturn("tempFileName");
given(anotherPlugin.getFilename()).willReturn("anotherFilename");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.satisfiedDependencies();
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao).save(anotherPlugin);
verify(pluginAccessor).savePlugin(anotherPlugin);
verify(anotherPlugin).changeStateTo(PluginState.TEMPORARY);
assertTrue(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.SUCCESS, pluginOperationResult.getStatus());
assertEquals(0, pluginOperationResult.getPluginDependencyResult().getDependenciesToEnable().size());
assertEquals(0, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
}
@Test
public void shouldInstallNotExistingPluginAndNotifyAboutMissingDependencies() throws Exception {
// given
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(anotherPlugin.getIdentifier()).willReturn("notExistingPluginname");
given(file.getName()).willReturn("tempFileName");
given(anotherPlugin.getFilename()).willReturn("anotherFilename");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.unsatisfiedDependencies(Collections
.singleton(new PluginDependencyInformation("unknownplugin", new VersionOfDependency(""))));
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao).save(anotherPlugin);
verify(pluginAccessor).savePlugin(anotherPlugin);
assertTrue(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.SUCCESS_WITH_MISSING_DEPENDENCIES, pluginOperationResult.getStatus());
assertEquals(0, pluginOperationResult.getPluginDependencyResult().getDependenciesToEnable().size());
assertEquals(1, pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies().size());
assertTrue(pluginOperationResult.getPluginDependencyResult().getUnsatisfiedDependencies()
.contains(new PluginDependencyInformation("unknownplugin")));
}
@Test
public void shouldNotInstallPluginWithIncorrectVersion() throws Exception {
// given
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(anotherPlugin.getVersion()).willReturn(new Version("1.2.0"));
given(anotherPlugin.getFilename()).willReturn("anotherFilename");
given(file.getName()).willReturn("tempFileName");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.satisfiedDependencies();
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao, never()).save(anotherPlugin);
verify(pluginAccessor, never()).savePlugin(anotherPlugin);
verify(pluginFileManager).uninstallPlugin("anotherFilename");
assertFalse(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.CANNOT_DOWNGRADE_PLUGIN, pluginOperationResult.getStatus());
}
@Test
public void shouldNotInstallPluginWithCyclicDependencies() throws Exception {
// given
given(pluginDescriptorParser.parse(file)).willReturn(anotherPlugin);
given(pluginFileManager.uploadPlugin(pluginArtifact)).willReturn(file);
given(anotherPlugin.getFilename()).willReturn("anotherFilename");
given(file.getName()).willReturn("tempFileName");
PluginDependencyResult pluginDependencyResult = PluginDependencyResultImpl.cyclicDependencies();
given(
pluginDependencyManager.getDependenciesToEnable(Mockito.eq(newArrayList((Plugin) anotherPlugin)),
Mockito.any(SimplePluginStatusResolver.class))).willReturn(pluginDependencyResult);
// when
PluginOperationResult pluginOperationResult = pluginManager.installPlugin(pluginArtifact);
// then
verify(pluginDao, never()).save(anotherPlugin);
verify(pluginAccessor, never()).savePlugin(anotherPlugin);
verify(pluginFileManager).uninstallPlugin("anotherFilename");
assertFalse(pluginOperationResult.isSuccess());
assertEquals(PluginOperationStatus.DEPENDENCIES_CYCLES_EXISTS, pluginOperationResult.getStatus());
}
}