package model.asn1; import model.asn1.exceptions.ParseException; import model.asn1.parsing.BytesReader; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class PrintableStringTest { private final String ILLEGAL_CHARS_TO_TEST = "<>\\[]{}@!*&^%$#_|`~"; @Test void testAcceptedString() throws ParseException { final PrintableString string = new PrintableString(PrintableString.TAG, null, "0123456789abCdExYz '()+,-./:=?"); assertEquals("0123456789abCdExYz '()+,-./:=?", string.getString()); } @Test void testIllegalStrings() { ILLEGAL_CHARS_TO_TEST.chars() .forEach(c -> assertThrows(ParseException.class, () -> new PrintableString(PrintableString.TAG, null, Character.toString(c)), String.format("Expected failing validation by char '%c'.", c)) ); } @Test void testEncode() throws ParseException { assertArrayEquals( new Byte[] { 0x68, 0x68, 0x68 }, new PrintableString(PrintableString.TAG, null, "hhh").encodeValueDER()); assertArrayEquals( new Byte[] { 0x13, 0x02, // Tag - Length 0x68, 0x69 // Value }, new PrintableString(PrintableString.TAG, null, "hi").encodeDER()); assertArrayEquals( new Byte[] { -86, 0x05, // Parent Tag - Length 0x13, 0x03, // Inner Tag - Length 0x68, 0x69, 0x69 // Value }, new PrintableString(PrintableString.TAG, new Tag(TagClass.CONTEXT_SPECIFIC, true, 10), "hii").encodeDER()); } @Test void testParse() throws ParseException { assertEquals("123", new PrintableString(new BytesReader(new Byte[]{ 0x13, 3, '1', '2', '3' }), false) .getString()); assertEquals("", new PrintableString(new BytesReader(new Byte[]{ 0x13, 0, '1', '2', '3' }), false) .getString()); } @Test void testParseFail() { // EOF assertThrows(ParseException.class, () -> new PrintableString(new BytesReader(new Byte[]{ 0x13, 1 }), false)); // Illegal chars assertThrows(ParseException.class, () -> new PrintableString(new BytesReader(new Byte[]{ 0x13, 2, '1', '*' }), false)); assertThrows(ParseException.class, () -> new PrintableString(new BytesReader(new Byte[]{ 0x13, 2, '1', '@' }), false)); } }