package de.persosim.simulator.protocols.file;
import static org.junit.Assert.assertEquals;
import java.io.FileNotFoundException;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import de.persosim.simulator.cardobjects.CardObject;
import de.persosim.simulator.cardobjects.DedicatedFile;
import de.persosim.simulator.cardobjects.ElementaryFile;
import de.persosim.simulator.cardobjects.FileIdentifier;
import de.persosim.simulator.cardobjects.MasterFile;
import de.persosim.simulator.exception.AccessDeniedException;
import de.persosim.simulator.platform.CardStateAccessor;
import de.persosim.simulator.secstatus.SecMechanism;
import de.persosim.simulator.secstatus.SecStatus;
import de.persosim.simulator.secstatus.SecStatus.SecContext;
import de.persosim.simulator.secstatus.SecStatusMechanismUpdatePropagation;
import de.persosim.simulator.test.PersoSimTestCase;
/**
* Unit tests for the file management protocol.
*
* @author mboonk
*
*/
public class CurrentFileHandlerTest extends PersoSimTestCase {
CardStateAccessor cardStateAccessor;
SecStatus secStatus;
MasterFile masterFile;
ElementaryFile ef1, ef2;
DedicatedFile df;
/**
* Create the test environment containing an elementary file and the mocked
* object store.
* @throws ReflectiveOperationException
* @throws AccessDeniedException
*/
@Before
public void setUp() throws ReflectiveOperationException, AccessDeniedException {
secStatus = new SecStatus();
masterFile = new MasterFile();
ef1 = new ElementaryFile(new FileIdentifier(0x0101), new byte[] { 0x01, 0x01 }, null, null, null, null);
ef2 = new ElementaryFile(new FileIdentifier(0x0102), new byte[] { 0x01, 0x02 }, null, null, null, null);
df = new DedicatedFile(new FileIdentifier(0x0200), null, null);
cardStateAccessor = new CardStateAccessor(){
@Override
public MasterFile getMasterFile() {
return masterFile;
}
@Override
public Collection<SecMechanism> getCurrentMechanisms(SecContext context,
Collection<Class<? extends SecMechanism>> wantedMechanisms) {
return secStatus.getCurrentMechanisms(context, wantedMechanisms);
}
};
}
/**
* Test method getCurrentFile if the SecStatus does not contain a CurrentFileSecMechanism
*/
@Test
public void testGetCurrentFile_noCurrentFileSecMechanism() {
// call mut
CardObject result = CurrentFileHandler.getCurrentFile(cardStateAccessor);
// check results
assertEquals(masterFile, result);
}
/**
* Test method getCurrentFile if the SecStatus does contain a CurrentFileSecMechanism referring to the MasterFile
*
* @throws Exception
*/
@Test
public void testGetCurrentFile_masterFileInSecMechanism() throws FileNotFoundException {
//prepare test data
secStatus.updateMechanisms(
new SecStatusMechanismUpdatePropagation(SecContext.GLOBAL, new CurrentFileSecMechanism(masterFile)));
// call mut
CardObject result = CurrentFileHandler.getCurrentFile(cardStateAccessor);
// check results
assertEquals(masterFile, result);
}
/**
* Test method getCurrentFile if the SecStatus does contain a CurrentFileSecMechanism referring to an ElementaryFile
*
* @throws Exception
*/
@Test
public void testGetCurrentFile_elementaryFileInSecMechanism() throws Exception {
//prepare test data
masterFile.addChild(ef1);
secStatus.updateMechanisms(
new SecStatusMechanismUpdatePropagation(SecContext.GLOBAL, new CurrentFileSecMechanism(ef1)));
// call mut
CardObject result = CurrentFileHandler.getCurrentFile(cardStateAccessor);
// check results
assertEquals(ef1, result);
}
/**
* Test method getCurrentFile if the SecStatus does contain a CurrentFileSecMechanism referring to an ElementaryFile that is not part of the object tree
*
* @throws Exception
*/
@Test
public void testGetCurrentFile_elementaryFileInSecMechanismButNotInTree() throws Exception {
//prepare test data
secStatus.updateMechanisms(
new SecStatusMechanismUpdatePropagation(SecContext.GLOBAL, new CurrentFileSecMechanism(ef1)));
// call mut
CardObject result = CurrentFileHandler.getCurrentFile(cardStateAccessor);
// check results
assertEquals(masterFile, result);
}
/**
* Test method getCurrentFile if the SecStatus does contain a CurrentFileSecMechanism referring to a DedicatedFile
*
* @throws Exception
*/
@Test
public void testGetCurrentDedicatedFile_dedicatedFileInSecMechanism() throws Exception {
//prepare test data
masterFile.addChild(df);
df.addChild(ef1);
secStatus.updateMechanisms(
new SecStatusMechanismUpdatePropagation(SecContext.GLOBAL, new CurrentFileSecMechanism(df)));
// call mut
CardObject result = CurrentFileHandler.getCurrentDedicatedFile(cardStateAccessor);
// check results
assertEquals(df, result);
}
/**
* Test method getCurrentFile if the SecStatus does contain a CurrentFileSecMechanism referring to an ElementaryFile in a DedicatedFile
*
* @throws Exception
*/
@Test
public void testGetCurrentDedicatedFile_elementaryFileInSecMechanism() throws Exception {
//prepare test data
masterFile.addChild(df);
df.addChild(ef1);
secStatus.updateMechanisms(
new SecStatusMechanismUpdatePropagation(SecContext.GLOBAL, new CurrentFileSecMechanism(ef1)));
// call mut
CardObject result = CurrentFileHandler.getCurrentDedicatedFile(cardStateAccessor);
// check results
assertEquals(df, result);
}
/**
* Test method getCurrentFile if the SecStatus does contain a CurrentFileSecMechanism referring to an ElementaryFile within MasterFile next to a DedicatedFile
*
* @throws Exception
*/
@Test
public void testGetCurrentDedicatedFile_elementaryNextToDfInSecMechanism() throws Exception {
//prepare test data
masterFile.addChild(df);
masterFile.addChild(ef1);
secStatus.updateMechanisms(
new SecStatusMechanismUpdatePropagation(SecContext.GLOBAL, new CurrentFileSecMechanism(ef1)));
// call mut
CardObject result = CurrentFileHandler.getCurrentDedicatedFile(cardStateAccessor);
// check results
assertEquals(masterFile, result);
}
}