From aedf34c5817b9b83bc9ef5caa313b2ad6c1d2aef Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Fri, 22 Nov 2019 15:43:58 +0100 Subject: [PATCH 1/3] Postpone restart after plugin (de)installation --- .../main/java/sonia/scm/plugin/DefaultPluginManager.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index 07accbcc76..0c931ff7a6 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -243,7 +243,13 @@ public class DefaultPluginManager implements PluginManager { } private void restart(String cause) { - eventBus.post(new RestartEvent(PluginManager.class, cause)); + new Thread(() -> { + try { + Thread.sleep(200); + } catch (InterruptedException e) { + } + eventBus.post(new RestartEvent(PluginManager.class, cause)); + }).start(); } private void cancelPending(List pendingInstallations) { From 450ed7bd4eb10518640d834814800ab08e36b065 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Mon, 25 Nov 2019 08:15:13 +0100 Subject: [PATCH 2/3] Fix unit test --- .../scm/plugin/DefaultPluginManager.java | 9 +++--- .../scm/plugin/DefaultPluginManagerTest.java | 31 +++++++++++-------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index 0c931ff7a6..b74b17cd88 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -187,7 +187,7 @@ public class DefaultPluginManager implements PluginManager { if (!pendingInstallations.isEmpty()) { if (restartAfterInstallation) { - restart("plugin installation"); + triggerRestart("plugin installation"); } else { pendingInstallQueue.addAll(pendingInstallations); updateMayUninstallFlag(); @@ -205,7 +205,7 @@ public class DefaultPluginManager implements PluginManager { markForUninstall(installed); if (restartAfterInstallation) { - restart("plugin installation"); + triggerRestart("plugin installation"); } else { updateMayUninstallFlag(); } @@ -238,11 +238,12 @@ public class DefaultPluginManager implements PluginManager { public void executePendingAndRestart() { PluginPermissions.manage().check(); if (!pendingInstallQueue.isEmpty() || getInstalled().stream().anyMatch(InstalledPlugin::isMarkedForUninstall)) { - restart("execute pending plugin changes"); + triggerRestart("execute pending plugin changes"); } } - private void restart(String cause) { + @VisibleForTesting + void triggerRestart(String cause) { new Thread(() -> { try { Thread.sleep(200); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java index f817476848..f6aa1d7301 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java @@ -12,13 +12,10 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.NotFoundException; import sonia.scm.ScmConstraintViolationException; -import sonia.scm.event.ScmEventBus; -import sonia.scm.lifecycle.RestartEvent; import java.io.IOException; import java.nio.file.Files; @@ -48,9 +45,6 @@ import static sonia.scm.plugin.PluginTestHelper.createInstalled; @ExtendWith(TempDirectory.class) class DefaultPluginManagerTest { - @Mock - private ScmEventBus eventBus; - @Mock private PluginLoader loader; @@ -60,12 +54,13 @@ class DefaultPluginManagerTest { @Mock private PluginInstaller installer; - @InjectMocks private DefaultPluginManager manager; @Mock private Subject subject; + private boolean restartTriggered = false; + @BeforeEach void mockInstaller() { lenient().when(installer.install(any())).then(ic -> { @@ -74,6 +69,16 @@ class DefaultPluginManagerTest { }); } + @BeforeEach + void createPluginManagerToTestWithCapturedRestart() { + manager = new DefaultPluginManager(null, loader, center, installer) { // event bus is only used in restart and this is replaced here + @Override + void triggerRestart(String cause) { + restartTriggered = true; + } + }; + } + @Nested class WithAdminPermissions { @@ -180,7 +185,7 @@ class DefaultPluginManagerTest { manager.install("scm-git-plugin", false); verify(installer).install(git); - verify(eventBus, never()).post(any()); + assertThat(restartTriggered).isFalse(); } @Test @@ -258,7 +263,7 @@ class DefaultPluginManagerTest { manager.install("scm-git-plugin", true); verify(installer).install(git); - verify(eventBus).post(any(RestartEvent.class)); + assertThat(restartTriggered).isTrue(); } @Test @@ -267,7 +272,7 @@ class DefaultPluginManagerTest { when(loader.getInstalledPlugins()).thenReturn(ImmutableList.of(gitInstalled)); manager.install("scm-git-plugin", true); - verify(eventBus, never()).post(any()); + assertThat(restartTriggered).isFalse(); } @Test @@ -289,14 +294,14 @@ class DefaultPluginManagerTest { manager.install("scm-review-plugin", false); manager.executePendingAndRestart(); - verify(eventBus).post(any(RestartEvent.class)); + assertThat(restartTriggered).isTrue(); } @Test void shouldNotSendRestartEventWithoutPendingPlugins() { manager.executePendingAndRestart(); - verify(eventBus, never()).post(any()); + assertThat(restartTriggered).isFalse(); } @Test @@ -447,7 +452,7 @@ class DefaultPluginManagerTest { manager.executePendingAndRestart(); - verify(eventBus).post(any(RestartEvent.class)); + assertThat(restartTriggered).isTrue(); } @Test From 04c004fedee0ad16c7d0805cf28c1a56c869f015 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Mon, 25 Nov 2019 12:25:10 +0000 Subject: [PATCH 3/3] Close branch feature/postpone_restart_for_plugin