/*
* Copyright 2010 JBoss Inc
*
* 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.drools.guvnor.server.files;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.InputStream;
import java.security.Principal;
import java.util.Date;
import java.util.Iterator;
import javax.inject.Inject;
import net.sf.webdav.ITransaction;
import org.apache.commons.io.IOUtils;
import org.drools.guvnor.server.test.GuvnorIntegrationTest;
import org.drools.repository.AssetItem;
import org.drools.repository.ModuleItem;
import org.junit.Test;
public class WebDAVImplIntegrationTest extends GuvnorIntegrationTest {
@Inject
protected WebDAVImpl webDAV;
@Test
public void testPath() {
String[] path = webDAV.getPath( "http://goober/whee/webdav/packages/packagename/resource.drl",
true );
assertEquals("packages",
path[0]);
assertEquals( "packagename",
path[1] );
assertEquals( "resource.drl",
path[2] );
path = webDAV.getPath( "foo/webdav",
true );
assertEquals( 0,
path.length );
path = webDAV.getPath( "/" );
assertEquals( 0,
path.length );
path = webDAV.getPath( "/packages/packagename/resource.drl" );
assertEquals( "packages",
path[0] );
assertEquals( "packagename",
path[1] );
assertEquals( "resource.drl",
path[2] );
}
//GUVNOR-669
@Test
public void testPathContainsWebdav() {
String[] path = webDAV.getPath( "http://goober/whee/webdav/packages/ssswebdavss/resource.drl",
true );
assertEquals("packages",
path[0]);
assertEquals( "ssswebdavss",
path[1] );
assertEquals( "resource.drl",
path[2] );
path = webDAV.getPath( "foo/webdav",
true );
assertEquals( 0,
path.length );
path = webDAV.getPath( "/" );
assertEquals( 0,
path.length );
path = webDAV.getPath( "/packages/ssswebdavss/resource.drl" );
assertEquals("packages",
path[0]);
assertEquals( "ssswebdavss",
path[1] );
assertEquals( "resource.drl",
path[2] );
path = webDAV.getPath( "http://goober/whee/webdav/packages/webdav/resource.drl",
true );
assertEquals( "packages",
path[0] );
assertEquals( "webdav",
path[1] );
assertEquals( "resource.drl",
path[2] );
path = webDAV.getPath( "/packages/webdav/resource.drl" );
assertEquals( "packages",
path[0] );
assertEquals( "webdav",
path[1] );
assertEquals( "resource.drl",
path[2] );
}
@Test
public void testBadCopy() throws Exception {
//OSX does stupid shit when copying in the same directory
//for instance, it creates the copy as foobar.x copy - totally hosing
//the file extension.
try {
webDAV.objectExists("/foo/webdav/packages/foobar/Something.drl copy 42");
fail( "should not be allowed" );
} catch ( IllegalArgumentException e ) {
assertNotNull( e.getMessage() );
}
}
@Test
public void testChildrenNames() throws Exception {
String[] children = webDAV.getChildrenNames( new TransactionMock(),
"/packages" );
assertTrue(children.length > 0);
int packageCount = children.length;
ModuleItem pkg = rulesRepository.createModule( "testWebDavChildNames1",
"" );
rulesRepository.createModule("testWebDavChildNames2",
"");
rulesRepository.save();
children = webDAV.getChildrenNames( new TransactionMock(),
"/packages" );
assertEquals( packageCount + 2,
children.length );
assertContains("testWebDavChildNames1",
children);
assertContains("testWebDavChildNames2",
children);
AssetItem asset = pkg.addAsset( "asset1",
"something" );
asset.updateFormat("drl");
asset.checkin("");
asset = pkg.addAsset( "asset2",
"something" );
asset.updateFormat("dsl");
asset.checkin( "" );
children = webDAV.getChildrenNames( new TransactionMock(),
"/packages/testWebDavChildNames1" );
assertEquals(2,
children.length);
assertEquals( "asset1.drl",
children[0] );
assertEquals("asset2.dsl",
children[1]);
children = webDAV.getChildrenNames( new TransactionMock(),
"/packages/testWebDavChildNames1/asset1.drl" );
assertNull( children );
}
@Test
public void testCreateFolder() throws Exception {
String[] children = webDAV.getChildrenNames( new TransactionMock(),
"/packages" );
int packageCount = children.length;
webDAV.createFolder(new TransactionMock(),
"/packages/testCreateWebDavFolder");
children = webDAV.getChildrenNames( new TransactionMock(),
"/packages" );
assertEquals( packageCount + 1,
children.length );
assertContains("testCreateWebDavFolder",
children);
ModuleItem pkg = rulesRepository.loadModule( "testCreateWebDavFolder" );
assertNotNull( pkg );
pkg.addAsset( "someAsset",
"" );
try {
webDAV.createFolder(new TransactionMock(),
"/somethingElse");
fail( "this should not work !" );
} catch ( UnsupportedOperationException e ) {
assertNotNull( e.getMessage() );
}
}
@Test
public void testDates() throws Exception {
/* String uri = "/foo/webdav";
WebDAVImpl imp = getImpl();
assertNotNull( imp.getCreationDate( uri ) );
assertNotNull( imp.getLastModified( uri ) );*/
String uri = "/packages";
assertNotNull(webDAV.getCreationDate(uri));
assertNotNull( webDAV.getLastModified( uri ) );
}
@Test
public void testCreateResourceAndCreatedDate() throws Exception {
webDAV.createFolder( new TransactionMock(),
"/packages/testCreateResourceAndCreatedDate" );
Thread.sleep( 100 );
webDAV.createResource( new TransactionMock(),
"/packages/testCreateResourceAndCreatedDate/asset.drl" );
String[] resources = webDAV.getChildrenNames( new TransactionMock(),
"/packages/testCreateResourceAndCreatedDate" );
assertEquals( 1,
resources.length );
assertEquals( "asset.drl",
resources[0] );
//should be ignored
webDAV.createResource( new TransactionMock(),
"/packages/testCreateResourceAndCreatedDate/._asset.drl" );
webDAV.createResource( new TransactionMock(),
"/packages/.DS_Store" );
ModuleItem pkg = rulesRepository.loadModule( "testCreateResourceAndCreatedDate" );
assertFalse( pkg.containsAsset( "._asset" ) );
assertTrue( pkg.containsAsset( "asset" ) );
Iterator<AssetItem> it = pkg.getAssets();
AssetItem ass = it.next();
assertEquals( "asset",
ass.getName() );
assertEquals( "drl",
ass.getFormat() );
Date create = webDAV.getCreationDate( "/packages/testCreateResourceAndCreatedDate" );
assertNotNull( create );
assertTrue( create.after( new Date( "10-Jul-1974" ) ) );
Date assetCreate = webDAV.getCreationDate( "/packages/testCreateResourceAndCreatedDate/asset.drl" );
assertTrue( assetCreate.after( create ) );
Date lm = webDAV.getLastModified( "/packages/testCreateResourceAndCreatedDate" );
assertNotNull( lm );
assertTrue( lm.after( new Date( "10-Jul-1974" ) ) );
Date alm = webDAV.getLastModified( "/packages/testCreateResourceAndCreatedDate/asset.drl" );
assertTrue( alm.after( lm ) );
try {
webDAV.createResource( new TransactionMock(),
"/hummer.drl" );
fail( "Shouldn't be able to do this" );
} catch ( UnsupportedOperationException e ) {
assertNotNull( e.getMessage() );
}
}
@Test
public void testResourceContent() throws Exception {
ModuleItem pkg = rulesRepository.createModule( "testWebDAVContent",
"" );
AssetItem asset = pkg.addAsset("asset",
"something");
asset.updateFormat( "drl" );
asset.updateContent("Some content");
asset.checkin("");
InputStream data = webDAV.getResourceContent( new TransactionMock(),
"/packages/testWebDAVContent/asset.drl" );
assertEquals( "Some content",
IOUtils.toString( data ) );
asset = pkg.addAsset( "asset2",
"something" );
asset.updateFormat("xls");
asset.updateBinaryContentAttachment( IOUtils.toInputStream( "This is binary" ) );
asset.checkin("");
data = webDAV.getResourceContent( new TransactionMock(),
"/packages/testWebDAVContent/asset2.xls" );
assertEquals("This is binary",
IOUtils.toString(data));
AssetItem asset_ = pkg.addAsset( "somethingelse",
"" );
asset_.updateFormat("drl");
asset_.checkin("");
data = webDAV.getResourceContent( new TransactionMock(),
"/packages/testWebDAVContent/somethingelse.drl" );
assertEquals( "",
IOUtils.toString( data ) );
}
@Test
public void testIsFolder() throws Exception {
assertTrue(webDAV.isFolder("/packages"));
assertTrue( webDAV.isFolder( "/packages/" ) );
assertFalse(webDAV.isFolder("/packages/somePackage"));
webDAV.createFolder( new TransactionMock(),
"/packages/testDAVIsFolder" );
assertTrue(webDAV.isFolder("/packages/testDAVIsFolder"));
assertFalse( webDAV.isFolder( "/packages/somePackage/SomeFile.drl" ) );
}
@Test
public void testIsResource() throws Exception {
assertFalse(webDAV.isResource("/packages"));
assertFalse( webDAV.isResource( "/packages/somePackage" ) );
assertFalse(webDAV.isResource("/packages/somePackage/SomeFile.drl"));
webDAV.createFolder( new TransactionMock(),
"/packages/testDAVIsResource" );
webDAV.createResource(new TransactionMock(),
"/packages/testDAVIsResource/SomeFile.drl");
assertTrue( webDAV.isResource( "/packages/testDAVIsResource/SomeFile.drl" ) );
}
@Test
public void testResourceLength() throws Exception {
assertEquals(0,
webDAV.getResourceLength(new TransactionMock(),
"/webdav/packages"));
webDAV.createFolder( new TransactionMock(),
"/packages/testResourceLengthDAV" );
webDAV.createResource(new TransactionMock(),
"/packages/testResourceLengthDAV/testResourceLength");
assertEquals(0,
webDAV.getResourceLength(new TransactionMock(),
"/packages/testResourceLengthDAV/testResourceLength"));
webDAV.setResourceContent(new TransactionMock(),
"/packages/testResourceLengthDAV/testResourceLength",
IOUtils.toInputStream("some input"),
null,
null);
assertEquals( "some input".getBytes().length,
webDAV.getResourceLength( new TransactionMock(),
"/packages/testResourceLengthDAV/testResourceLength" ) );
}
@Test
public void testObjectExists() throws Exception {
assertTrue(webDAV.objectExists("/packages"));
webDAV.createFolder( new TransactionMock(),
"/packages/testDavObjectExists" );
assertTrue(webDAV.objectExists("/packages/testDavObjectExists"));
assertFalse(webDAV.objectExists("/packages/testDavObjectExistsXXXX"));
assertFalse( webDAV.objectExists( "/packages/testDavObjectExists/foobar.drl" ) );
assertFalse(webDAV.objectExists("/packages/testDavObjectExistsXXXX/foobar.drl"));
}
@Test
public void testRemoveObject() throws Exception {
assertFalse( webDAV.objectExists( "/packages/testDavRemoveObjectFolder" ) );
webDAV.createFolder( new TransactionMock(),
"/packages/testDavRemoveObjectFolder" );
assertTrue( webDAV.objectExists( "/packages/testDavRemoveObjectFolder" ) );
webDAV.removeObject( new TransactionMock(),
"/packages/testDavRemoveObjectFolder" );
assertFalse( webDAV.objectExists( "/packages/testDavRemoveObjectFolder" ) );
webDAV.createFolder( new TransactionMock(),
"/packages/testDavRemoveObjectAsset" );
webDAV.createResource( new TransactionMock(),
"/packages/testDavRemoveObjectAsset/asset.drl" );
AssetItem as = rulesRepository.loadModule( "testDavRemoveObjectAsset" ).loadAsset( "asset" );
long origVer = as.getVersionNumber();
assertTrue( webDAV.objectExists( "/packages/testDavRemoveObjectAsset/asset.drl" ) );
webDAV.removeObject( new TransactionMock(),
"/packages/testDavRemoveObjectAsset/asset.drl" );
assertFalse( webDAV.objectExists( "/packages/testDavRemoveObjectAsset/asset.drl" ) );
assertTrue( webDAV.objectExists( "/packages/testDavRemoveObjectAsset" ) );
webDAV.createResource( new TransactionMock(),
"/packages/testDavRemoveObjectAsset/asset.drl" );
assertTrue( webDAV.objectExists( "/packages/testDavRemoveObjectAsset/asset.drl" ) );
as = rulesRepository.loadModule( "testDavRemoveObjectAsset" ).loadAsset( "asset" );
assertTrue( as.getVersionNumber() > origVer );
webDAV.createFolder( new TransactionMock(),
"/packages/testDavRemoveObjectFolder" );
assertTrue( webDAV.objectExists( "/packages/testDavRemoveObjectFolder" ) );
}
@Test
public void testSetContent() throws Exception {
//WebDAVImpl.setResourceContent adds a trailing \n
final String CONTENT1 = "some input";
final String EXPECTED_CONTENT1 = CONTENT1 + "\n";
final String CONTENT2 = "some more input";
final String EXPECTED_CONTENT2 = CONTENT2 + "\n";
try {
webDAV.createFolder(new TransactionMock(),
"/packages/testSetDavContent");
} finally {
if ( webDAV != null ) {
//This clears the ThreadLocal reference to Repository
webDAV.commit( new TransactionMock() );
}
}
try {
webDAV.createResource( new TransactionMock(),
"/packages/testSetDavContent/Something.drl" );
} finally {
if ( webDAV != null ) {
//This clears the ThreadLocal reference to Repository
webDAV.commit( new TransactionMock() );
}
}
try {
webDAV.setResourceContent( new TransactionMock(),
"/packages/testSetDavContent/Something.drl",
IOUtils.toInputStream( CONTENT1 ),
null,
null );
} finally {
if ( webDAV != null ) {
//This clears the ThreadLocal reference to Repository
webDAV.commit( new TransactionMock() );
}
}
try {
webDAV.getResourceContent(new TransactionMock(),
"/packages/testSetDavContent/Something.drl");
} finally {
if ( webDAV != null ) {
//This clears the ThreadLocal reference to Repository
webDAV.commit( new TransactionMock() );
}
}
try {
AssetItem as = rulesRepository.loadModule("testSetDavContent").loadAsset( "Something" );
assertTrue(as.isBinary());
String result = IOUtils.toString( webDAV.getResourceContent( new TransactionMock(),
"/packages/testSetDavContent/Something.drl" ) );
assertEquals( EXPECTED_CONTENT1,
result );
ModuleItem pkg = rulesRepository.loadModule( "testSetDavContent" );
AssetItem asset = pkg.loadAsset( "Something" );
assertEquals( "drl",
asset.getFormat() );
assertEquals(EXPECTED_CONTENT1,
asset.getContent());
assertEquals( EXPECTED_CONTENT1,
IOUtils.toString( asset.getBinaryContentAttachment() ) );
webDAV.setResourceContent(new TransactionMock(),
"/packages/testSetDavContent/Something.drl",
IOUtils.toInputStream(CONTENT2),
null,
null);
result = IOUtils.toString( webDAV.getResourceContent( new TransactionMock(),
"/packages/testSetDavContent/Something.drl" ) );
assertEquals( EXPECTED_CONTENT2,
result );
} finally {
if ( webDAV != null ) {
//This clears the ThreadLocal reference to Repository
webDAV.commit( new TransactionMock() );
}
}
}
@Test
public void testNewAsset() throws Exception {
//simulating a full lifecycle of a new asset from webdav
try {
webDAV.createFolder(new TransactionMock(),
"/packages/testDavNewAsset");
} finally {
if ( webDAV != null ) {
//This clears the ThreadLocal reference to Repository
webDAV.commit( new TransactionMock() );
}
}
try {
assertFalse( webDAV.objectExists( "/packages/testDavNewAsset/Blah.drl" ) );
} finally {
if ( webDAV != null ) {
//This clears the ThreadLocal reference to Repository
webDAV.commit( new TransactionMock() );
}
}
try {
webDAV.isFolder( "/packages/testDavNewAsset" );
webDAV.isFolder( "/packages/testDavNewAsset/Blah.drl" );
assertFalse( webDAV.objectExists( "/packages/testDavNewAsset/Blah.drl" ) );
webDAV.createResource( new TransactionMock(),
"/packages/testDavNewAsset/Blah.drl" );
webDAV.setResourceContent( new TransactionMock(),
"/packages/testDavNewAsset/Blah.drl",
IOUtils.toInputStream( "blah blah" ),
null,
null );
webDAV.getResourceLength( new TransactionMock(),
"/packages/testDavNewAsset/Blah.drl" );
} finally {
if ( webDAV != null ) {
//This clears the ThreadLocal reference to Repository
webDAV.commit( new TransactionMock() );
}
}
try {
assertTrue(webDAV.objectExists("/packages/testDavNewAsset/Blah.drl"));
} finally {
if ( webDAV != null ) {
//This clears the ThreadLocal reference to Repository
webDAV.commit( new TransactionMock() );
}
}
}
@Test
public void testSnapshot() throws Exception {
//WebDAVImpl.setResourceContent adds a trailing \n
final String CONTENT = "some input";
final String EXPECTED_CONTENT = CONTENT + "\n";
webDAV.createFolder( new TransactionMock(),
"/packages/testDavSnapshot" );
webDAV.createResource( new TransactionMock(),
"/packages/testDavSnapshot/Something.drl" );
webDAV.setResourceContent( new TransactionMock(),
"/packages/testDavSnapshot/Something.drl",
IOUtils.toInputStream( CONTENT ),
null,
null );
rulesRepository.createModuleSnapshot("testDavSnapshot",
"SNAP1");
rulesRepository.createModuleSnapshot("testDavSnapshot",
"SNAP2");
String[] packages = webDAV.getChildrenNames( new TransactionMock(),
"/snapshots" );
assertTrue( packages.length > 0 );
assertContains( "testDavSnapshot",
packages );
String[] snaps = webDAV.getChildrenNames( new TransactionMock(),
"/snapshots/testDavSnapshot" );
assertEquals( 2,
snaps.length );
assertEquals( "SNAP1",
snaps[0] );
assertEquals( "SNAP2",
snaps[1] );
String[] list = webDAV.getChildrenNames( new TransactionMock(),
"/snapshots/testDavSnapshot/SNAP1" );
assertEquals( 1,
list.length );
assertEquals( "Something.drl",
list[0] );
list = webDAV.getChildrenNames( new TransactionMock(),
"/snapshots/testDavSnapshot/SNAP2" );
assertEquals( 1,
list.length );
assertEquals( "Something.drl",
list[0] );
assertNotNull( webDAV.getCreationDate( "/snapshots" ) );
assertNotNull( webDAV.getCreationDate( "/snapshots/testDavSnapshot" ) );
assertNotNull( webDAV.getCreationDate( "/snapshots/testDavSnapshot/SNAP1" ) );
assertNotNull( webDAV.getCreationDate( "/snapshots/testDavSnapshot/SNAP1/Something.drl" ) );
assertNotNull( webDAV.getLastModified( "/snapshots" ) );
assertNotNull( webDAV.getLastModified( "/snapshots/testDavSnapshot" ) );
assertNotNull( webDAV.getLastModified( "/snapshots/testDavSnapshot/SNAP1" ) );
assertNotNull( webDAV.getLastModified( "/snapshots/testDavSnapshot/SNAP1/Something.drl" ) );
createFolderTry( webDAV,
"/snapshots/randomAss" );
createFolderTry( webDAV,
"/snapshots/testDavSnapshot/SNAPX" );
createFolderTry( webDAV,
"/snapshots/testDavSnapshot/SNAP1/Something.drl" );
createFolderTry( webDAV,
"/snapshots/testDavSnapshot/SNAP1/Another.drl" );
createResourceTry( webDAV,
"/snapshots/randomAss" );
createResourceTry( webDAV,
"/snapshots/testDavSnapshot/SNAPX" );
createResourceTry( webDAV,
"/snapshots/testDavSnapshot/SNAP1/Something.drl" );
createResourceTry( webDAV,
"/snapshots/testDavSnapshot/SNAP1/Another.drl" );
InputStream in = webDAV.getResourceContent( new TransactionMock(),
"/snapshots/testDavSnapshot/SNAP1/Something.drl" );
assertEquals( EXPECTED_CONTENT,
IOUtils.toString( in ) );
assertEquals( 0,
webDAV.getResourceLength( new TransactionMock(),
"/snapshots/testDavSnapshot/SNAP1" ) );
assertEquals( EXPECTED_CONTENT.getBytes().length,
webDAV.getResourceLength( new TransactionMock(),
"/snapshots/testDavSnapshot/SNAP1/Something.drl" ) );
assertTrue( webDAV.isFolder( "/snapshots" ) );
assertTrue( webDAV.isFolder( "/snapshots/testDavSnapshot" ) );
assertTrue( webDAV.isFolder( "/snapshots/testDavSnapshot/SNAP2" ) );
assertFalse( webDAV.isFolder( "/snapshots/testDavSnapshot/SNAP2/Something.drl" ) );
assertFalse( webDAV.isResource( "/snapshots" ) );
assertFalse( webDAV.isResource( "/snapshots/testDavSnapshot" ) );
assertFalse( webDAV.isResource( "/snapshots/testDavSnapshot/SNAP2" ) );
assertTrue( webDAV.isResource( "/snapshots/testDavSnapshot/SNAP2/Something.drl" ) );
assertFalse( webDAV.isResource( "/snapshots/testDavSnapshot/SNAP2/DoesNotExist.drl" ) );
assertTrue( webDAV.objectExists( "/snapshots" ) );
assertFalse( webDAV.objectExists( "/snapshots/testDavSnapshotXX" ) );
assertTrue( webDAV.objectExists( "/snapshots/testDavSnapshot" ) );
assertTrue( webDAV.objectExists( "/snapshots/testDavSnapshot/SNAP1" ) );
assertFalse( webDAV.objectExists( "/snapshots/testDavSnapshot/SNAPX" ) );
assertFalse( webDAV.objectExists( "/snapshots/testDavSnapshot/SNAP1/Foo.drl" ) );
assertTrue( webDAV.objectExists( "/snapshots/testDavSnapshot/SNAP1/Something.drl" ) );
assertNull( webDAV.getChildrenNames( new TransactionMock(),
"/snapshots/testDavSnapshot/SNAP1/Something.drl" ) );
try {
webDAV.removeObject( new TransactionMock(),
"/snapshots/testDavSnapshot/SNAP1/Something.drl" );
fail( "Should not delete files from snapshots" );
} catch ( Exception e ) {
assertNotNull( e.getMessage() );
}
try {
webDAV.setResourceContent( new TransactionMock(),
"/snapshots/testDavSnapshot/SNAP1/Something.drl",
null,
null,
null );
fail( "should not be allowed to update content in snapshots." );
} catch ( Exception e ) {
assertNotNull( e.getMessage() );
}
assertFalse( webDAV.objectExists( "/snapshots/defaultPackage/new file" ) );
try {
webDAV.createResource( new TransactionMock(),
"/snapshots/defaultPackage/new file" );
fail( "can't touch this" );
} catch ( UnsupportedOperationException e ) {
assertNotNull( e.getMessage() );
}
}
private void createResourceTry(WebDAVImpl webDAV,
String path) {
try {
webDAV.createResource(new TransactionMock(),
path);
fail( "Should not be allowed" );
} catch ( UnsupportedOperationException e ) {
assertNotNull( e.getMessage() );
}
}
private void createFolderTry(WebDAVImpl webDAV,
String path) {
try {
webDAV.createFolder(new TransactionMock(),
path);
fail( "should not be allowed" );
} catch ( UnsupportedOperationException e ) {
assertNotNull( e.getMessage() );
}
}
private void assertContains(String string,
String[] children) {
for ( int i = 0; i < children.length; i++ ) {
if ( children[i].equals( string ) ) {
return;
}
}
fail( "Array did not contain " + string );
}
static class TransactionMock
implements
ITransaction {
public Principal getPrincipal() {
return null;
}
}
}