package de.persosim.simulator.apdu;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import org.junit.Test;
import de.persosim.simulator.test.PersoSimTestCase;
import de.persosim.simulator.utils.HexString;
public class CommandApduTest extends PersoSimTestCase {
/**
* Creates a CommandApdu from a string representation. This string
* representation can be either a plain HexString or similar to the output
* of {@link CommandApduImpl#toString()}
*
* @param apduString
* @return
*/
private CommandApdu createApduFromString(String apduString) {
String inputStr = apduString;
inputStr = inputStr.replaceAll("\\(", "").replaceAll("\\)","");
inputStr = inputStr.replaceAll("\\[", "").replaceAll("\\]","");
inputStr = inputStr.replaceAll("\\|", "");
return new CommandApduImpl(HexString.toByteArray(inputStr));
}
/**
* Common method that implements similar check required for all APDU types.
*
* This tests default construction, toString() and toByteArray().
*
* @param apduString
* expected String representation, the required input is
* extracted from this by removing all formatting characters.
* @param isExtendedLength
* expected return value of
* {@link CommandApdu#isExtendedLength()}
* @param isNeZeroEncoded
* expected return value of {@link CommandApdu#isNeZeroEncoded()}
* @param ne
* expected return value of {@link CommandApdu#getNe()}
*/
private void createAndCheck(String apduString, boolean isExtendedLength, boolean isNeZeroEncoded, int ne) {
String inputStr = apduString;
inputStr = inputStr.replaceAll("\\(", "").replaceAll("\\)","");
inputStr = inputStr.replaceAll("\\[", "").replaceAll("\\]","");
inputStr = inputStr.replaceAll("\\|", "");
byte[] input = HexString.toByteArray(inputStr);
CommandApdu cmdApdu = createApduFromString(inputStr);
assertArrayEquals("toByteArray()", input, cmdApdu.toByteArray());
assertEquals("toString()", apduString, cmdApdu.toString());
assertEquals("isExtendedLength()", isExtendedLength, cmdApdu.isExtendedLength());
assertEquals("isNeZeroEncoded()", isNeZeroEncoded, cmdApdu.isNeZeroEncoded());
}
@Test
public void testIsoCase1() {
String apduString = "00800000";
createAndCheck(apduString, false, false, 0);
}
@Test
public void testIsoCase2() {
String apduString = "00800000|01";
createAndCheck(apduString, false, false, 1);
}
@Test
public void testIsoCase2_MsbSet() {
String apduString = "00800000|80";
createAndCheck(apduString, false, false, 128);
}
@Test
public void testIsoCase2_MsbSetMax() {
String apduString = "00800000|FF";
createAndCheck(apduString, false, false, 255);
}
@Test
public void testIsoCase2_Le00() {
String apduString = "00800000|00";
createAndCheck(apduString, false, true, 256);
}
@Test
public void testIsoCase2Extended() {
String apduString = "00800000|000001";
createAndCheck(apduString, true, false, 1);
}
@Test
public void testIsoCase2Extended_MsbSet() {
String apduString = "00800000|008000";
createAndCheck(apduString, true, false, 32768);
}
@Test
public void testIsoCase2Extended_MsbSetMax() {
String apduString = "00800000|00FFFF";
createAndCheck(apduString, true, false, 65535);
}
@Test
public void testIsoCase2Extended_Le00() {
String apduString = "00800000|000000";
createAndCheck(apduString, true, true, 65536);
}
@Test
public void testIsoCase3() {
String apduString = "00800000|01|FF";
createAndCheck(apduString, false, false, 0);
}
@Test
public void testIsoCase3Extended() {
String apduString = "00800000|000001|FF";
createAndCheck(apduString, true, false, 0);
}
@Test
public void testIsoCase4() {
String apduString = "00800000|01|FF|01";
createAndCheck(apduString, false, false, 1);
}
@Test
public void testIsoCase4_MsbSet() {
String apduString = "00800000|01|FF|80";
createAndCheck(apduString, false, false, 128);
}
@Test
public void testIsoCase4_MsbSetMax() {
String apduString = "00800000|01|FF|FF";
createAndCheck(apduString, false, false, 255);
}
@Test
public void testIsoCase4_Le00() {
String apduString = "00800000|01|FF|00";
createAndCheck(apduString, false, true, 256);
}
@Test
public void testIsoCase4Extended() {
String apduString = "00800000|000001|FF|0001";
createAndCheck(apduString, true, false, 1);
}
@Test
public void testIsoCase4Extended_MsbSet() {
String apduString = "00800000|000001|FF|8000";
createAndCheck(apduString, true, false, 32768);
}
@Test
public void testIsoCase4Extended_MsbSetMax() {
String apduString = "00800000|000001|FF|FFFF";
createAndCheck(apduString, true, false, 65535);
}
@Test
public void testIsoCase4Extended_Le00() {
String apduString = "00800000|000001|FF|0000";
createAndCheck(apduString, true, true, 65536);
}
@Test
public void testIsNeZeroEncoded_extended000100(){
CommandApdu commandApdu = createApduFromString("00800000|000100");
//call mut
assertFalse(commandApdu.isNeZeroEncoded());
}
}