/* * 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 ) ); } }