package de.persosim.simulator.apdumatching;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import de.persosim.simulator.test.PersoSimTestCase;
import de.persosim.simulator.tlv.ConstructedTlvDataObject;
import de.persosim.simulator.tlv.PrimitiveTlvDataObject;
import de.persosim.simulator.tlv.TlvConstants;
import de.persosim.simulator.tlv.TlvDataObjectContainer;
import de.persosim.simulator.tlv.TlvTag;
public class TlvSpecificationContainerTest extends PersoSimTestCase implements ApduSpecificationConstants {
TlvTag tagPrimitive01 = new TlvTag((byte) 0x01);
TlvTag tagPrimitive02 = new TlvTag((byte) 0x02);
TlvTag tagPrimitive03 = new TlvTag((byte) 0x03);
TlvTag tagConstructed21 = new TlvTag((byte) 0x21);
TlvTag tagConstructed22 = new TlvTag((byte) 0x22);
/**
* Positive test case: test matching of empty TLV data object container against empty TLV specification.
*/
@Test
public void testMatches_EmptySpec() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
assertTrue(containerSpec.matches(containerTlv));
}
/**
* Positive test case: test matching of TLV data object container with primitive/empty TLV data object against specification expecting object to be present.
*/
@Test
public void testMatches_PresentRequired() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
containerSpec.add(new TlvSpecification(TlvConstants.TAG_06, REQ_MATCH));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(TlvConstants.TAG_06));
assertTrue(containerSpec.matches(containerTlv));
}
/**
* Negative test case: test matching of empty TLV data object container against specification expecting object to be present.
*/
@Test
public void testMatches_AbsentRequired() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
containerSpec.add(new TlvSpecification(TlvConstants.TAG_06, REQ_MATCH));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
assertFalse(containerSpec.matches(containerTlv));
}
/**
* Positive test case: test matching of TLV data object container with single primitive/empty TLV data object against specification expecting object to be optional.
*/
@Test
public void testMatches_PresentOptional() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
containerSpec.add(new TlvSpecification(tagPrimitive01, REQ_OPTIONAL));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive01));
assertTrue(containerSpec.matches(containerTlv));
}
/**
* Positive test case: test matching of empty TLV data object container against specification expecting object to be optional.
*/
@Test
public void testMatches_AbsentOptional() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
containerSpec.add(new TlvSpecification(tagPrimitive01, REQ_OPTIONAL));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
assertTrue(containerSpec.matches(containerTlv));
}
/**
* Positive test case: test matching of TLV data object container with single primitive/empty TLV data object against specification requiring object to be absent.
*/
@Test
public void testMatches_PresentForbidden() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
containerSpec.add(new TlvSpecification(TlvConstants.TAG_06, REQ_MISMATCH));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(TlvConstants.TAG_06));
assertFalse(containerSpec.matches(containerTlv));
}
/**
* Positive test case: test matching of primitive/empty TLV data object container against specification requiring object to be absent.
*/
@Test
public void testMatches_AbsentForbidden() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
containerSpec.add(new TlvSpecification(TlvConstants.TAG_06, REQ_MISMATCH));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
assertTrue(containerSpec.matches(containerTlv));
}
/**
* Positive test case: test matching of TLV data object container with multiple primitive/empty TLV data objects against specification requiring all objects to appear in fixed order.
*/
@Test
public void testMatches_ComplyingStrictOrder() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
containerSpec.add(new TlvSpecification(tagPrimitive01, REQ_MATCH));
containerSpec.add(new TlvSpecification(tagPrimitive02, REQ_MATCH));
containerSpec.add(new TlvSpecification(tagPrimitive03, REQ_MATCH));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive01));
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive02));
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive03));
assertTrue(containerSpec.matches(containerTlv));
}
/**
* Negative test case: test matching of TLV data object container with multiple primitive/empty TLV data objects against specification requiring all objects to appear in different order.
*/
@Test
public void testMatches_FailingStrictOrder() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
containerSpec.add(new TlvSpecification(tagPrimitive01, REQ_MATCH));
containerSpec.add(new TlvSpecification(tagPrimitive02, REQ_MATCH));
containerSpec.add(new TlvSpecification(tagPrimitive03, REQ_MATCH));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive02));
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive01));
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive03));
assertFalse(containerSpec.matches(containerTlv));
}
/**
* Positive test case: test matching of TLV data object container with multiple primitive/empty TLV data objects against specification requiring all objects to appear in arbitrary order.
*/
@Test
public void testMatches_ComplyingArbitraryOrder() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, ARBITRARY_ORDER);
containerSpec.add(new TlvSpecification(tagPrimitive01, REQ_MATCH));
containerSpec.add(new TlvSpecification(tagPrimitive02, REQ_MATCH));
containerSpec.add(new TlvSpecification(tagPrimitive03, REQ_MATCH));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive02));
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive01));
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive03));
assertTrue(containerSpec.matches(containerTlv));
}
/**
* Negative test case: test matching of TLV data object container with multiple primitive/empty TLV data objects against specification requiring only some objects in arbitrary order.
*/
@Test
public void testMatches_MultiplePrimitiveMixedOrderWithUnallowed() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, ARBITRARY_ORDER);
containerSpec.add(new TlvSpecification(tagPrimitive01, REQ_MATCH));
containerSpec.add(new TlvSpecification(tagPrimitive02, REQ_MATCH));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive02));
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive01));
containerTlv.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive03));
assertFalse(containerSpec.matches(containerTlv));
}
/**
* Negative test case: test matching of TLV data object container with empty constructed TLV data object against specification requiring missing nested object.
*
* expected: 21(01)
* received: 21()
*/
@Test
public void testMatches_AbsentRequiredNested() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
TlvSpecification constructedTlvSpecification1 = new TlvSpecification(tagConstructed21, DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER, REQ_MATCH);
containerSpec.add(constructedTlvSpecification1);
constructedTlvSpecification1.add(new TlvSpecification(tagPrimitive01, REQ_MATCH));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
containerTlv.addTlvDataObject(new ConstructedTlvDataObject(tagConstructed21));
assertFalse(containerSpec.matches(containerTlv));
}
/**
* Negative test case: test matching of TLV data object container with single simply nested constructed TLV data object against specification not expecting nested object.
*
* expected: 21()
* received: 21(01)
*/
@Test
public void testMatches_PresentRequiredConstructedUnexpectedNested() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
containerSpec.add(new TlvSpecification(tagConstructed21, DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER, REQ_MATCH));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
ConstructedTlvDataObject constructedTlvDataObject = new ConstructedTlvDataObject(tagConstructed21);
containerTlv.addTlvDataObject(constructedTlvDataObject);
constructedTlvDataObject.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive01));
assertFalse(containerSpec.matches(containerTlv));
}
/**
* Negative test case: test matching of TLV data object container with single simply nested constructed TLV data object against specification expecting nested object to be absent.
*
* expected: 21(!01)
* received: 21(01)
*/
@Test
public void testMatches_PresentRequiredConstructedPresentForbiddenNested() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
TlvSpecification constructedTlvSpecification1 = new TlvSpecification(tagConstructed21, DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER, REQ_MATCH);
containerSpec.add(constructedTlvSpecification1);
constructedTlvSpecification1.add(new TlvSpecification(tagPrimitive01, REQ_MISMATCH));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
ConstructedTlvDataObject constructedTlvDataObject = new ConstructedTlvDataObject(tagConstructed21);
containerTlv.addTlvDataObject(constructedTlvDataObject);
constructedTlvDataObject.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive01));
assertFalse(containerSpec.matches(containerTlv));
}
/**
* Positive test case: test matching of TLV data object container with multiple nested constructed TLV data object against specification requiring all (nested) objects.
*
* expected: 21(22(01))
* received: 21(22(01))
*/
@Test
public void testMatches_PresentRequiredConstructedMultipleNested() {
TlvSpecificationContainer containerSpec = new TlvSpecificationContainer(DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER);
TlvSpecification constructedTlvSpecification1 = new TlvSpecification(tagConstructed21, DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER, REQ_MATCH);
containerSpec.add(constructedTlvSpecification1);
TlvSpecification constructedTlvSpecification2 = new TlvSpecification(tagConstructed22, DO_NOT_ALLOW_FURTHER_TAGS, STRICT_ORDER, REQ_MATCH);
constructedTlvSpecification1.add(constructedTlvSpecification2);
constructedTlvSpecification2.add(new TlvSpecification(tagPrimitive01, REQ_MATCH));
TlvDataObjectContainer containerTlv = new TlvDataObjectContainer();
ConstructedTlvDataObject constructedTlvDataObject1 = new ConstructedTlvDataObject(tagConstructed21);
containerTlv.addTlvDataObject(constructedTlvDataObject1);
ConstructedTlvDataObject constructedTlvDataObject2 = new ConstructedTlvDataObject(tagConstructed22);
constructedTlvDataObject1.addTlvDataObject(constructedTlvDataObject2);
constructedTlvDataObject2.addTlvDataObject(new PrimitiveTlvDataObject(tagPrimitive01));
assertTrue(containerSpec.matches(containerTlv));
}
}