/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.content;
import java.util.Iterator;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.authorize.AuthorizeManager;
import mockit.NonStrictExpectations;
import java.io.FileInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.log4j.Logger;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.ResourcePolicy;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
/**
* Units tests for class Bundle
* @author pvillega
*/
public class BundleTest extends AbstractDSpaceObjectTest
{
/** log4j category */
private static final Logger log = Logger.getLogger(BundleTest.class);
/**
* Bundle instance for the tests
*/
private Bundle b;
/**
* This method will be run before every test as per @Before. It will
* initialize resources required for the tests.
*
* Other methods can be annotated with @Before here or in subclasses
* but no execution order is guaranteed
*/
@Before
@Override
public void init()
{
super.init();
try
{
this.b = Bundle.create(context);
this.dspaceObject = b;
//we need to commit the changes so we don't block the table for testing
context.commit();
}
catch (SQLException ex)
{
log.error("SQL Error in init", ex);
fail("SQL Error in init: " + ex.getMessage());
}
}
/**
* This method will be run after every test as per @After. It will
* clean resources initialized by the @Before methods.
*
* Other methods can be annotated with @After here or in subclasses
* but no execution order is guaranteed
*/
@After
@Override
public void destroy()
{
b = null;
super.destroy();
}
/**
* Test of find method, of class Bundle.
*/
@Test
public void testBundleFind() throws SQLException
{
int id = b.getID();
Bundle found = Bundle.find(context, id);
assertThat("testBundleFind 0", found, notNullValue());
assertThat("testBundleFind 1", found.getID(), equalTo(id));
}
/**
* Test of create method, of class Bundle.
*/
@Test
public void testCreate() throws SQLException
{
Bundle created = Bundle.create(context);
//the item created by default has no name nor type set
assertThat("testCreate 0", created, notNullValue());
assertTrue("testCreate 1", created.getID() >= 0);
assertTrue("testCreate 2", created.getBitstreams().length == 0);
assertThat("testCreate 3", created.getName(), nullValue());
}
/**
* Test of getID method, of class Bundle.
*/
@Test
public void testGetID()
{
assertTrue("testGetID 0", b.getID() >= 0);
}
/**
* Test of getName method, of class Bundle.
*/
@Test
public void testGetName()
{
//created bundle has no name
assertThat("testGetName 0", b.getName(), nullValue());
}
/**
* Test of setName method, of class Bundle.
*/
@Test
public void testSetName()
{
String name = "new name";
b.setName(name);
assertThat("testSetName 0", b.getName(), notNullValue());
assertThat("testSetName 1", b.getName(), not(equalTo("")));
assertThat("testSetName 2", b.getName(), equalTo(name));
}
/**
* Test of getPrimaryBitstreamID method, of class Bundle.
*/
@Test
public void testGetPrimaryBitstreamID()
{
//is -1 when not set
assertThat("testGetPrimaryBitstreamID 0", b.getPrimaryBitstreamID(), equalTo(-1));
}
/**
* Test of setPrimaryBitstreamID method, of class Bundle.
*/
@Test
public void testSetPrimaryBitstreamID()
{
int id = 1;
b.setPrimaryBitstreamID(id);
assertThat("testSetPrimaryBitstreamID 0", b.getPrimaryBitstreamID(), equalTo(id));
}
/**
* Test of unsetPrimaryBitstreamID method, of class Bundle.
*/
@Test
public void testUnsetPrimaryBitstreamID()
{
//set a value different than default
int id = 6;
b.setPrimaryBitstreamID(id);
//unset
b.unsetPrimaryBitstreamID();
//is -1 when not set
assertThat("testUnsetPrimaryBitstreamID 0", b.getPrimaryBitstreamID(), equalTo(-1));
}
/**
* Test of getHandle method, of class Bundle.
*/
@Test
public void testGetHandle()
{
//no handle for bundles
assertThat("testGetHandle 0", b.getHandle(), nullValue());
}
/**
* Test of getBitstreamByName method, of class Bundle.
*/
@Test
public void testGetBitstreamByName() throws FileNotFoundException, SQLException, IOException, AuthorizeException
{
new NonStrictExpectations(AuthorizeManager.class)
{{
// Allow Bundle ADD perms
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.ADD); result = null;
}};
String name = "name";
//by default there is no bitstream
assertThat("testGetHandle 0", b.getBitstreamByName(name), nullValue());
//let's add a bitstream
File f = new File(testProps.get("test.bitstream").toString());
Bitstream bs = Bitstream.create(context, new FileInputStream(f));
bs.setName(name);
b.addBitstream(bs);
assertThat("testGetHandle 1", b.getBitstreamByName(name), notNullValue());
assertThat("testGetHandle 2", b.getBitstreamByName(name), equalTo(bs));
assertThat("testGetHandle 3", b.getBitstreamByName(name).getName(), equalTo(name));
context.commit();
}
/**
* Test of getBitstreams method, of class Bundle.
*/
@Test
public void testGetBitstreams() throws FileNotFoundException, SQLException, IOException, AuthorizeException
{
new NonStrictExpectations(AuthorizeManager.class)
{{
// Allow Bundle ADD perms
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.ADD); result = null;
}};
//default bundle has no bitstreams
assertThat("testGetBitstreams 0", b.getBitstreams(), notNullValue());
assertThat("testGetBitstreams 1", b.getBitstreams().length, equalTo(0));
//let's add a bitstream
String name = "name";
File f = new File(testProps.get("test.bitstream").toString());
Bitstream bs = Bitstream.create(context, new FileInputStream(f));
bs.setName(name);
b.addBitstream(bs);
assertThat("testGetBitstreams 2", b.getBitstreams(), notNullValue());
assertThat("testGetBitstreams 3", b.getBitstreams().length, equalTo(1));
assertThat("testGetBitstreams 4", b.getBitstreams()[0].getName(), equalTo(name));
context.commit();
}
/**
* Test of getItems method, of class Bundle.
*/
@Test
public void testGetItems() throws SQLException
{
//by default this bundle belong to no item
assertThat("testGetItems 0", b.getItems(), notNullValue());
assertThat("testGetItems 1", b.getItems().length, equalTo(0));
}
/**
* Test of createBitstream method, of class Bundle.
*/
@Test(expected=AuthorizeException.class)
public void testCreateBitstreamNoAuth() throws FileNotFoundException, AuthorizeException, SQLException, IOException
{
new NonStrictExpectations(AuthorizeManager.class)
{{
// Disallow Bundle ADD perms
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.ADD); result = new AuthorizeException();
}};
File f = new File(testProps.get("test.bitstream").toString());
Bitstream bs = b.createBitstream(new FileInputStream(f));
fail("Exception should be thrown");
}
/**
* Test of createBitstream method, of class Bundle.
*/
@Test
public void testCreateBitstreamAuth() throws FileNotFoundException, AuthorizeException, SQLException, IOException
{
new NonStrictExpectations(AuthorizeManager.class)
{{
// Allow Bundle ADD perms
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.ADD); result = null;
}};
String name = "name";
File f = new File(testProps.get("test.bitstream").toString());
Bitstream bs = b.createBitstream(new FileInputStream(f));
bs.setName(name);
assertThat("testCreateBitstreamAuth 0", b.getBitstreamByName(name), notNullValue());
assertThat("testCreateBitstreamAuth 1", b.getBitstreamByName(name), equalTo(bs));
assertThat("testCreateBitstreamAuth 2", b.getBitstreamByName(name).getName(), equalTo(name));
}
/**
* Test of registerBitstream method, of class Bundle.
*/
@Test(expected=AuthorizeException.class)
public void testRegisterBitstreamNoAuth() throws AuthorizeException, IOException, SQLException
{
new NonStrictExpectations(AuthorizeManager.class)
{{
// Disallow Bundle ADD perms
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.ADD); result = new AuthorizeException();
}};
int assetstore = 0; //default assetstore
File f = new File(testProps.get("test.bitstream").toString());
Bitstream bs = b.registerBitstream(assetstore, f.getAbsolutePath());
fail("Exception should be thrown");
}
/**
* Test of registerBitstream method, of class Bundle.
*/
@Test
public void testRegisterBitstreamAuth() throws AuthorizeException, IOException, SQLException
{
new NonStrictExpectations(AuthorizeManager.class)
{{
// Allow Bundle ADD perms
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.ADD); result = null;
}};
int assetstore = 0; //default assetstore
String name = "name bitstream";
File f = new File(testProps.get("test.bitstream").toString());
Bitstream bs = b.registerBitstream(assetstore, f.getName());
bs.setName(name);
assertThat("testRegisterBitstream 0", b.getBitstreamByName(name), notNullValue());
assertThat("testRegisterBitstream 1", b.getBitstreamByName(name), equalTo(bs));
assertThat("testRegisterBitstream 2", b.getBitstreamByName(name).getName(), equalTo(name));
}
/**
* Test of addBitstream method, of class Bundle.
*/
@Test(expected=AuthorizeException.class)
public void testAddBitstreamNoAuth() throws SQLException, AuthorizeException, IOException
{
new NonStrictExpectations(AuthorizeManager.class)
{{
// Disallow Bundle ADD perms
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.ADD); result = new AuthorizeException();
}};
// create a new Bitstream to add to Bundle
File f = new File(testProps.get("test.bitstream").toString());
Bitstream bs = Bitstream.create(context, new FileInputStream(f));
bs.setName("name");
b.addBitstream(bs);
fail("Exception should have been thrown");
}
/**
* Test of addBitstream method, of class Bundle.
*/
@Test
public void testAddBitstreamAuth() throws SQLException, AuthorizeException, FileNotFoundException, IOException
{
new NonStrictExpectations(AuthorizeManager.class)
{{
// Allow Bundle ADD perms
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.ADD); result = null;
}};
File f = new File(testProps.get("test.bitstream").toString());
Bitstream bs = Bitstream.create(context, new FileInputStream(f));
bs.setName("name");
b.addBitstream(bs);
assertThat("testAddBitstreamAuth 0", b.getBitstreamByName(bs.getName()), notNullValue());
assertThat("testAddBitstreamAuth 1", b.getBitstreamByName(bs.getName()), equalTo(bs));
assertThat("testAddBitstreamAuth 2", b.getBitstreamByName(bs.getName()).getName(), equalTo(bs.getName()));
}
/**
* Test of removeBitstream method, of class Bundle.
*/
@Test(expected=AuthorizeException.class)
public void testRemoveBitstreamNoAuth() throws SQLException, AuthorizeException, IOException
{
new NonStrictExpectations(AuthorizeManager.class)
{{
// Disallow Bundle REMOVE perms
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.REMOVE); result = new AuthorizeException();
}};
File f = new File(testProps.get("test.bitstream").toString());
Bitstream bs = Bitstream.create(context, new FileInputStream(f));
bs.setName("name");
b.removeBitstream(bs);
fail("Exception should have been thrown");
}
/**
* Test of removeBitstream method, of class Bundle.
*/
@Test
public void testRemoveBitstreamAuth() throws SQLException, AuthorizeException, IOException
{
new NonStrictExpectations(AuthorizeManager.class)
{{
// Allow Bundle ADD perms (to create a new Bitstream and add it)
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.ADD); result = null;
// Allow Bundle REMOVE perms (to test remove)
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.REMOVE); result = null;
}};
// Create a new Bitstream to test with
File f = new File(testProps.get("test.bitstream").toString());
Bitstream bs = Bitstream.create(context, new FileInputStream(f));
b.addBitstream(bs);
context.commit();
b.removeBitstream(bs);
assertThat("testRemoveBitstreamAuth 0", b.getBitstreamByName(bs.getName()), nullValue());
}
/**
* Test of update method, of class Bundle.
*/
@Test
public void testUpdate() throws SQLException, AuthorizeException
{
//TODO: we only check for sql errors
//TODO: note that update can't throw authorize exception!!
b.update();
}
/**
* Test of delete method, of class Bundle.
*/
@Test
public void testDelete() throws SQLException, AuthorizeException, IOException
{
new NonStrictExpectations(AuthorizeManager.class)
{{
// Allow Bundle ADD perms (to create a new Bitstream and add it)
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.ADD); result = null;
// Allow Bundle REMOVE perms (to test remove)
AuthorizeManager.authorizeAction((Context) any, (Bundle) any,
Constants.REMOVE); result = null;
}};
// Create a new Bundle to be deleted
Bundle created = Bundle.create(context);
//let's add a bitstream
File f = new File(testProps.get("test.bitstream").toString());
Bitstream bs = Bitstream.create(context, new FileInputStream(f));
created.addBitstream(bs);
// Ensure both are saved to context
context.commit();
// Now, delete the newly added Bundle and Bitstream
int id = created.getID();
created.delete();
// Bundle should not exist anymore
assertThat("testDelete 0", Bundle.find(context, id), nullValue());
}
/**
* Test of getType method, of class Bundle.
*/
@Test
public void testGetType()
{
assertThat("testGetType 0", b.getType(), equalTo(Constants.BUNDLE));
}
/**
* Test of inheritCollectionDefaultPolicies method, of class Bundle.
*/
@Test
public void testInheritCollectionDefaultPolicies() throws AuthorizeException, SQLException
{
Collection c = Collection.create(context);
//TODO: we would need a method to get policies from collection, probably better!
List<ResourcePolicy> newpolicies = AuthorizeManager.getPoliciesActionFilter(context, c,
Constants.DEFAULT_BITSTREAM_READ);
Iterator<ResourcePolicy> it = newpolicies.iterator();
while (it.hasNext())
{
ResourcePolicy rp = (ResourcePolicy) it.next();
rp.setAction(Constants.READ);
}
b.inheritCollectionDefaultPolicies(c);
List<ResourcePolicy> bspolicies = b.getBundlePolicies();
assertTrue("testInheritCollectionDefaultPolicies 0", newpolicies.size() == bspolicies.size());
boolean equals = true;
for(int i=0; i < newpolicies.size() && equals; i++)
{
if(!newpolicies.contains(bspolicies.get(i)))
{
equals = false;
}
}
assertTrue("testInheritCollectionDefaultPolicies 1", equals);
bspolicies = b.getBitstreamPolicies();
boolean exists = true;
for(int i=0; bspolicies.size() > 0 && i < newpolicies.size() && exists; i++)
{
if(!bspolicies.contains(newpolicies.get(i)))
{
exists = false;
}
}
assertTrue("testInheritCollectionDefaultPolicies 2", exists);
}
/**
* Test of replaceAllBitstreamPolicies method, of class Bundle.
*/
@Test
public void testReplaceAllBitstreamPolicies() throws SQLException, AuthorizeException
{
List<ResourcePolicy> newpolicies = new ArrayList<ResourcePolicy>();
newpolicies.add(ResourcePolicy.create(context));
newpolicies.add(ResourcePolicy.create(context));
newpolicies.add(ResourcePolicy.create(context));
b.replaceAllBitstreamPolicies(newpolicies);
List<ResourcePolicy> bspolicies = b.getBundlePolicies();
assertTrue("testReplaceAllBitstreamPolicies 0", newpolicies.size() == bspolicies.size());
boolean equals = true;
for(int i=0; i < newpolicies.size() && equals; i++)
{
if(!newpolicies.contains(bspolicies.get(i)))
{
equals = false;
}
}
assertTrue("testReplaceAllBitstreamPolicies 1", equals);
bspolicies = b.getBitstreamPolicies();
boolean exists = true;
for(int i=0; bspolicies.size() > 0 && i < newpolicies.size() && exists; i++)
{
if(!bspolicies.contains(newpolicies.get(i)))
{
exists = false;
}
}
assertTrue("testReplaceAllBitstreamPolicies 2", exists);
}
/**
* Test of getBundlePolicies method, of class Bundle.
*/
@Test
public void testGetBundlePolicies() throws SQLException
{
//empty by default
List<ResourcePolicy> bspolicies = b.getBundlePolicies();
assertTrue("testGetBundlePolicies 0", bspolicies.isEmpty());
}
/**
* Test of getBundlePolicies method, of class Bundle.
*/
@Test
public void testGetBitstreamPolicies() throws SQLException
{
//empty by default
List<ResourcePolicy> bspolicies = b.getBitstreamPolicies();
assertTrue("testGetBitstreamPolicies 0", bspolicies.isEmpty());
}
/**
* Test of getAdminObject method, of class Bundle.
*/
@Test
@Override
public void testGetAdminObject() throws SQLException
{
//default bundle has no admin object
assertThat("testGetAdminObject 0", b.getAdminObject(Constants.REMOVE), nullValue());
assertThat("testGetAdminObject 1", b.getAdminObject(Constants.ADD), nullValue());
}
/**
* Test of getParentObject method, of class Bundle.
*/
@Test
@Override
public void testGetParentObject() throws SQLException
{
//default bundle has no parent
assertThat("testGetParentObject 0", b.getParentObject(), nullValue());
}
}