/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License, version 2 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 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 General Public License for more details.
*
*
* Copyright 2017 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.platform.repository.solution.filebased;
import mockit.Deencapsulation;
import mockit.Verifications;
import org.apache.commons.vfs2.FileContent;
import org.apache.commons.vfs2.FileSystemException;
import org.junit.Test;
import org.pentaho.platform.api.repository2.unified.IAclNodeHelper;
import org.pentaho.platform.api.repository2.unified.IRepositoryContentConverterHandler;
import org.pentaho.platform.api.repository2.unified.IUnifiedRepository;
import org.pentaho.platform.api.repository2.unified.RepositoryFile;
import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission;
import org.pentaho.platform.api.repository2.unified.data.simple.SimpleRepositoryFileData;
import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.util.EnumSet;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.mockito.Mockito.*;
public class SolutionRepositoryVfsFileObjectTest {
@Test
public void initFileTest() throws Exception {
String fileRef = "/etc/mondrian/SteelWheels/schema.xml";
String dsRef = "/etc/mondrian/SteelWheels";
SolutionRepositoryVfsFileObject fileObject = new SolutionRepositoryVfsFileObject( fileRef );
SolutionRepositoryVfsFileObject fileObjectSpy = spy( fileObject );
IAclNodeHelper aclNodeHelper = mock( IAclNodeHelper.class );
doReturn( aclNodeHelper ).when( fileObjectSpy ).getAclHelper();
RepositoryFile file = mock( RepositoryFile.class );
doReturn( true ).when( aclNodeHelper ).canAccess( file, EnumSet.of( RepositoryFilePermission.READ ) );
IUnifiedRepository repository = mock( IUnifiedRepository.class );
doReturn( file ).when( repository ).getFile( fileRef );
doReturn( repository ).when( fileObjectSpy ).getRepository();
fileObjectSpy.getName();
verify( repository, times( 1 ) ).getFile( eq( dsRef ) );
verify( repository, times( 1 ) ).getFile( eq( fileRef ) );
verify( aclNodeHelper, times( 1 ) ).canAccess( any( RepositoryFile.class ), eq(
EnumSet.of( RepositoryFilePermission.READ ) ) );
fileRef = "/etca/mondriana/SteelWheels/schema.xml";
fileObject = new SolutionRepositoryVfsFileObject( fileRef );
fileObjectSpy = spy( fileObject );
doReturn( aclNodeHelper ).when( fileObjectSpy ).getAclHelper();
doReturn( false ).when( aclNodeHelper ).canAccess( file, EnumSet.of( RepositoryFilePermission.READ ) );
doReturn( repository ).when( fileObjectSpy ).getRepository();
fileObjectSpy.getName();
verify( repository, times( 2 ) ).getFile( eq( fileRef ) );
verify( aclNodeHelper, times( 2 ) ).canAccess( any( RepositoryFile.class ), eq(
EnumSet.of( RepositoryFilePermission.READ ) ) );
}
@Test
public void testFileRefConstructor() {
String expectedFileRef = "dummyFileRef";
SolutionRepositoryVfsFileObject solutionRepositoryVfsFileObject =
new SolutionRepositoryVfsFileObject( "dummyFileRef" );
assertThat( solutionRepositoryVfsFileObject.getFileRef(), is( expectedFileRef ) );
}
@Test
public void testGetRepo( @mockit.Mocked IUnifiedRepository mockUnifiedRepository ) {
Deencapsulation.setField( SolutionRepositoryVfsFileObject.class, "repository", mockUnifiedRepository );
SolutionRepositoryVfsFileObject solutionRepositoryVfsFileObject =
new SolutionRepositoryVfsFileObject( "dummyFileRef" );
assertThat( solutionRepositoryVfsFileObject.getRepository(), is( mockUnifiedRepository ) );
}
@Test
public void testGetConvertHandler( @mockit.Mocked final IRepositoryContentConverterHandler mockConvertHandler ) {
SolutionRepositoryVfsFileObject solutionRepositoryVfsFileObject =
new SolutionRepositoryVfsFileObject( "dummyFileRef" );
Deencapsulation.setField( solutionRepositoryVfsFileObject, "converterHandler", mockConvertHandler );
assertThat( solutionRepositoryVfsFileObject.getConverterHandler(), is( mockConvertHandler ) );
}
//TODO: change or remove this test once getUrl is fixed or removed
@Test
public void testGetUrl() throws FileSystemException, MalformedURLException {
String fileRef = "/etc/mondrian/SteelWheels/schema.xml";
SolutionRepositoryVfsFileObject solutionRepositoryVfsFileObject = new SolutionRepositoryVfsFileObject( fileRef );
assertThat( solutionRepositoryVfsFileObject.getURL(), is( nullValue() ) );
}
@Test
public void testExists( @mockit.Mocked final RepositoryFile mockRepoFile,
@mockit.Mocked final IAclNodeHelper mockAclHelper,
@mockit.Mocked final IUnifiedRepository mockUnifiedRepository ) throws FileSystemException {
String fileRef = "/etc/mondrian/SteelWheels/schema.xml";
Deencapsulation.setField( SolutionRepositoryVfsFileObject.class, "repository", mockUnifiedRepository );
SolutionRepositoryVfsFileObject testObject = new SolutionRepositoryVfsFileObject( fileRef );
Deencapsulation.setField( testObject, "aclHelper", mockAclHelper );
new mockit.NonStrictExpectations() {
//CHECKSTYLE IGNORE check FOR NEXT 4 LINES
{
mockUnifiedRepository.getFile( anyString ); result = mockRepoFile;
mockAclHelper.canAccess( mockRepoFile, EnumSet.of( RepositoryFilePermission.READ ) ); result = true;
}
};
assertThat( testObject.exists(), is( true ) );
new Verifications() {
//CHECKSTYLE IGNORE check FOR NEXT 4 LINES
{
mockUnifiedRepository.getFile( anyString ); times = 2;
mockAclHelper.canAccess( mockRepoFile, EnumSet.of( RepositoryFilePermission.READ ) ); times = 1;
}
};
}
@Test
@SuppressWarnings( { "checkstyle:onestatementperline", "multiple statements help understand the mock definition" } )
public void testExistsNot( @mockit.Mocked final IAclNodeHelper mockAclHelper,
@mockit.Mocked final IUnifiedRepository mockUnifiedRepository )
throws FileSystemException {
String fileRef = "/etc/mondrian/SteelWheels/schema.xml";
Deencapsulation.setField( SolutionRepositoryVfsFileObject.class, "repository", mockUnifiedRepository );
SolutionRepositoryVfsFileObject solutionRepositoryVfsFileObject = new SolutionRepositoryVfsFileObject( fileRef );
Deencapsulation.setField( solutionRepositoryVfsFileObject, "aclHelper", mockAclHelper );
new mockit.NonStrictExpectations() {
//CHECKSTYLE IGNORE check FOR NEXT 4 LINES
{
mockUnifiedRepository.getFile( anyString ); result = null;
mockAclHelper.canAccess( null, EnumSet.of( RepositoryFilePermission.READ ) ); result = true;
}
};
assertThat( solutionRepositoryVfsFileObject.exists(), is( false ) );
new Verifications() {
//CHECKSTYLE IGNORE check FOR NEXT 4 LINES
{
mockUnifiedRepository.getFile( anyString ); times = 2;
mockAclHelper.canAccess( null, EnumSet.of( RepositoryFilePermission.READ ) ); times = 1;
}
};
}
@Test
@SuppressWarnings( { "checkstyle:onestatementperline", "multiple statements help understand the mock definition" } )
public void testContentRelatedMethods( @mockit.Mocked final RepositoryFile mockRepoFile,
@mockit.Mocked final IAclNodeHelper mockAclHelper,
@mockit.Mocked final IUnifiedRepository mockUnifiedRepository,
@mockit.Mocked final SimpleRepositoryFileData mockFileData )
throws FileSystemException {
String fileRef = "/etc/mondrian/SteelWheels/schema.xml";
new mockit.NonStrictExpectations() {
//CHECKSTYLE IGNORE check FOR NEXT 6 LINES
{
mockUnifiedRepository.getFile( anyString ); result = mockRepoFile;
mockUnifiedRepository.getDataForRead( (Serializable) any, (Class) any ); result = mockFileData;
mockAclHelper.canAccess( mockRepoFile, EnumSet.of( RepositoryFilePermission.READ ) ); result = true;
mockFileData.getStream(); result = new ByteArrayInputStream( "some string".getBytes() );
}
};
Deencapsulation.setField( SolutionRepositoryVfsFileObject.class, "repository", mockUnifiedRepository );
SolutionRepositoryVfsFileObject solutionRepositoryVfsFileObject = new SolutionRepositoryVfsFileObject( fileRef );
Deencapsulation.setField( solutionRepositoryVfsFileObject, "aclHelper", mockAclHelper );
FileContent someFileContent = solutionRepositoryVfsFileObject.getContent();
assertThat( someFileContent, is( notNullValue() ) );
assertThat( solutionRepositoryVfsFileObject.isContentOpen(), is( false ) );
someFileContent.getInputStream();
assertThat( solutionRepositoryVfsFileObject.isContentOpen(), is( true ) );
someFileContent.close();
assertThat( solutionRepositoryVfsFileObject.isContentOpen(), is( false ) );
someFileContent = solutionRepositoryVfsFileObject.getContent();
someFileContent.getInputStream();
assertThat( solutionRepositoryVfsFileObject.isContentOpen(), is( true ) );
solutionRepositoryVfsFileObject.close();
assertThat( solutionRepositoryVfsFileObject.isContentOpen(), is( false ) );
}
}