From d8af1ea8d0473f2684e1d5d30e368e72b1264a31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Sun, 17 May 2020 18:10:06 +0200 Subject: [PATCH] Test module --- .../modules/WorkingCopyPoolModule.java | 9 +- .../modules/WorkingCopyPoolModuleTest.java | 105 ++++++++++++++++++ 2 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 scm-webapp/src/test/java/sonia/scm/lifecycle/modules/WorkingCopyPoolModuleTest.java diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/WorkingCopyPoolModule.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/WorkingCopyPoolModule.java index 63e9ce6cd4..209e8263d0 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/WorkingCopyPoolModule.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/WorkingCopyPoolModule.java @@ -26,22 +26,23 @@ package sonia.scm.lifecycle.modules; import com.google.inject.AbstractModule; import sonia.scm.plugin.PluginLoader; +import sonia.scm.repository.work.NoneCachingWorkingCopyPool; import sonia.scm.repository.work.WorkingCopyPool; public class WorkingCopyPoolModule extends AbstractModule { - public static final String DEFAULT_WORKING_COPY_POOL_STRATEGY = "sonia.scm.repository.work.NoneCachingWorkingCopyPool"; + public static final String DEFAULT_WORKING_COPY_POOL_STRATEGY = NoneCachingWorkingCopyPool.class.getName(); public static final String WORKING_COPY_POOL_STRATEGY_PROPERTY = "scm.workingCopyPoolStrategy"; - private final PluginLoader pluginLoader; + private final ClassLoader classLoader; public WorkingCopyPoolModule(PluginLoader pluginLoader) { - this.pluginLoader = pluginLoader; + this.classLoader = pluginLoader.getUberClassLoader(); } @Override protected void configure() { String workingCopyPoolStrategy = System.getProperty(WORKING_COPY_POOL_STRATEGY_PROPERTY, DEFAULT_WORKING_COPY_POOL_STRATEGY); try { - Class strategyClass = (Class) pluginLoader.getUberClassLoader().loadClass(workingCopyPoolStrategy); + Class strategyClass = (Class) classLoader.loadClass(workingCopyPoolStrategy); bind(WorkingCopyPool.class).to(strategyClass); } catch (Exception e) { throw new RuntimeException("could not instantiate class for working copy pool: " + workingCopyPoolStrategy, e); diff --git a/scm-webapp/src/test/java/sonia/scm/lifecycle/modules/WorkingCopyPoolModuleTest.java b/scm-webapp/src/test/java/sonia/scm/lifecycle/modules/WorkingCopyPoolModuleTest.java new file mode 100644 index 0000000000..22797fa0ed --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/lifecycle/modules/WorkingCopyPoolModuleTest.java @@ -0,0 +1,105 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package sonia.scm.lifecycle.modules; + +import com.google.inject.Binder; +import com.google.inject.binder.AnnotatedBindingBuilder; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import sonia.scm.plugin.PluginLoader; +import sonia.scm.repository.work.NoneCachingWorkingCopyPool; +import sonia.scm.repository.work.SimpleWorkingCopyFactory; +import sonia.scm.repository.work.WorkingCopy; +import sonia.scm.repository.work.WorkingCopyPool; + +import java.io.File; + +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static sonia.scm.lifecycle.modules.WorkingCopyPoolModule.WORKING_COPY_POOL_STRATEGY_PROPERTY; + +@ExtendWith(MockitoExtension.class) +class WorkingCopyPoolModuleTest { + + @Mock + PluginLoader pluginLoader; + @Mock + Binder binder; + @Mock + AnnotatedBindingBuilder bindingBuilder; + + @BeforeEach + void initClassLoader() { + lenient().when(pluginLoader.getUberClassLoader()).thenReturn(getClass().getClassLoader()); + } + + @AfterEach + void cleanProperty() { + System.clearProperty(WORKING_COPY_POOL_STRATEGY_PROPERTY); + } + + @Test + void shouldBindToDefaultWithoutProperty() { + System.clearProperty(WORKING_COPY_POOL_STRATEGY_PROPERTY); + WorkingCopyPoolModule module = new WorkingCopyPoolModule(pluginLoader); + when(binder.bind(WorkingCopyPool.class)).thenReturn(bindingBuilder); + + module.configure(binder); + + verify(bindingBuilder).to(NoneCachingWorkingCopyPool.class); + } + + @Test + void shouldBindToCustomPoolFromProperty() { + System.setProperty(WORKING_COPY_POOL_STRATEGY_PROPERTY, TestPool.class.getName()); + WorkingCopyPoolModule module = new WorkingCopyPoolModule(pluginLoader); + when(binder.bind(WorkingCopyPool.class)).thenReturn(bindingBuilder); + + module.configure(binder); + + verify(bindingBuilder).to(TestPool.class); + } + + static class TestPool implements WorkingCopyPool { + @Override + public WorkingCopy getWorkingCopy(SimpleWorkingCopyFactory.WorkingCopyContext context) { + return null; + } + + @Override + public void contextClosed(SimpleWorkingCopyFactory.WorkingCopyContext workingCopyContext, File workdir) { + + } + + @Override + public void shutdown() { + + } + } +}