Test module

This commit is contained in:
René Pfeuffer
2020-05-17 18:10:06 +02:00
committed by René Pfeuffer
parent 3a68e5ff2b
commit d8af1ea8d0
2 changed files with 110 additions and 4 deletions

View File

@@ -26,22 +26,23 @@ package sonia.scm.lifecycle.modules;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
import sonia.scm.plugin.PluginLoader; import sonia.scm.plugin.PluginLoader;
import sonia.scm.repository.work.NoneCachingWorkingCopyPool;
import sonia.scm.repository.work.WorkingCopyPool; import sonia.scm.repository.work.WorkingCopyPool;
public class WorkingCopyPoolModule extends AbstractModule { 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"; public static final String WORKING_COPY_POOL_STRATEGY_PROPERTY = "scm.workingCopyPoolStrategy";
private final PluginLoader pluginLoader; private final ClassLoader classLoader;
public WorkingCopyPoolModule(PluginLoader pluginLoader) { public WorkingCopyPoolModule(PluginLoader pluginLoader) {
this.pluginLoader = pluginLoader; this.classLoader = pluginLoader.getUberClassLoader();
} }
@Override @Override
protected void configure() { protected void configure() {
String workingCopyPoolStrategy = System.getProperty(WORKING_COPY_POOL_STRATEGY_PROPERTY, DEFAULT_WORKING_COPY_POOL_STRATEGY); String workingCopyPoolStrategy = System.getProperty(WORKING_COPY_POOL_STRATEGY_PROPERTY, DEFAULT_WORKING_COPY_POOL_STRATEGY);
try { try {
Class<? extends WorkingCopyPool> strategyClass = (Class<? extends WorkingCopyPool>) pluginLoader.getUberClassLoader().loadClass(workingCopyPoolStrategy); Class<? extends WorkingCopyPool> strategyClass = (Class<? extends WorkingCopyPool>) classLoader.loadClass(workingCopyPoolStrategy);
bind(WorkingCopyPool.class).to(strategyClass); bind(WorkingCopyPool.class).to(strategyClass);
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("could not instantiate class for working copy pool: " + workingCopyPoolStrategy, e); throw new RuntimeException("could not instantiate class for working copy pool: " + workingCopyPoolStrategy, e);

View File

@@ -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<WorkingCopyPool> 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 <R, W> WorkingCopy<R, W> getWorkingCopy(SimpleWorkingCopyFactory<R, W, ?>.WorkingCopyContext context) {
return null;
}
@Override
public void contextClosed(SimpleWorkingCopyFactory<?, ?, ?>.WorkingCopyContext workingCopyContext, File workdir) {
}
@Override
public void shutdown() {
}
}
}