/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2017 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.di.concurrency; import org.apache.commons.vfs2.impl.DefaultFileSystemManager; import org.apache.commons.vfs2.provider.AbstractFileProvider; import org.junit.After; import org.junit.Test; import org.pentaho.di.core.vfs.KettleVFS; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; public class ConcurrentFileSystemManagerTest { private DefaultFileSystemManager fileSystemManager = (DefaultFileSystemManager) KettleVFS.getInstance().getFileSystemManager(); @After public void tearUp() { this.fileSystemManager.freeUnusedResources(); this.fileSystemManager.close(); } @Test public void getAndPutConcurrently() throws Exception { int numberOfGetters = 5; int numberOfPutters = 1; AtomicBoolean condition = new AtomicBoolean( true ); List<Getter> getters = new ArrayList<>(); for ( int i = 0; i < numberOfGetters; i++ ) { getters.add( new Getter( condition, this.fileSystemManager ) ); } List<Putter> putters = new ArrayList<>(); for ( int i = 0; i < numberOfPutters; i++ ) { putters.add( new Putter( condition, this.fileSystemManager ) ); } ConcurrencyTestRunner.runAndCheckNoExceptionRaised( putters, getters, condition ); } private class Getter extends StopOnErrorCallable<Object> { private DefaultFileSystemManager fsm; Getter( AtomicBoolean condition, DefaultFileSystemManager fsm ) { super( condition ); this.fsm = fsm; } @Override Object doCall() throws Exception { while ( condition.get() ) { this.fsm.getSchemes(); } return null; } } private class Putter extends StopOnErrorCallable<Object> { private DefaultFileSystemManager fsm; AbstractFileProvider provider; Putter( AtomicBoolean condition, DefaultFileSystemManager fsm ) { super( condition ); this.fsm = fsm; provider = mock( AbstractFileProvider.class ); doNothing().when( provider ).freeUnusedResources(); } @Override Object doCall() throws Exception { while ( condition.get() ) { this.fsm.addProvider( "scheme", provider ); // to register only one provider with a given scheme condition.set( false ); } return null; } } }