package hu.sch.api.filter; import java.nio.charset.StandardCharsets; import java.util.Calendar; import java.util.TimeZone; import org.junit.Test; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.rules.ExpectedException; /** * * @author tomi */ public class RequestSignatureTest { private static final String PATH = "/foo"; private static final String SECRET = "secret"; private static final byte[] BODY = "body".getBytes(StandardCharsets.UTF_8); private Calendar cal; private final Signature signature = new Signature(SECRET); @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void secretCannotBeEmpty() { thrown.expect(IllegalArgumentException.class); new RequestSignature(null, null, null, 0L, null); } @Test public void nullSignatureYieldsMissingResult() { RequestSignature sig = new RequestSignature(null, null, null, 0L, SECRET); assertEquals(RequestSignatureResult.MISSING, sig.checkSignature()); } @Test public void emptySignatureYieldsMissingResult() { RequestSignature sig = new RequestSignature(null, null, "", 0L, SECRET); assertEquals(RequestSignatureResult.MISSING, sig.checkSignature()); } @Test public void timestampMustNotBeOlderThan5Seconds() { cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); // 6 seconds ago cal.add(Calendar.SECOND, -6); long timestamp = cal.getTimeInMillis() / 1000L; RequestSignature sig = new RequestSignature(null, null, "dummy", timestamp, SECRET); assertEquals(RequestSignatureResult.STALE, sig.checkSignature()); } @Test public void rejectTimestampsFromTheFuture() { cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); // 6 seconds from now cal.add(Calendar.SECOND, 6); long timestamp = cal.getTimeInMillis() / 1000L; RequestSignature sig = new RequestSignature(null, null, "dummy", timestamp, SECRET); assertEquals(RequestSignatureResult.STALE, sig.checkSignature()); } @Test public void invalidSignature() { RequestSignature sig = new RequestSignature(PATH, null, "dummy signature", createTimestamp(), SECRET); assertEquals(RequestSignatureResult.INVALID, sig.checkSignature()); } @Test public void validSignature() { final long timestamp = createTimestamp(); RequestSignature sig = new RequestSignature(PATH, BODY, signature.calculateHex(PATH, timestamp, BODY), timestamp, SECRET); assertEquals(RequestSignatureResult.OK, sig.checkSignature()); } @Test public void validSignatureWithoutBody() { final long timestamp = createTimestamp(); final byte[] emptyBody = "".getBytes(StandardCharsets.UTF_8); RequestSignature sig1 = new RequestSignature(PATH, null, signature.calculateHex(PATH, timestamp, null), timestamp, SECRET); RequestSignature sig2 = new RequestSignature(PATH, emptyBody, signature.calculateHex(PATH, timestamp, emptyBody), timestamp, SECRET); assertEquals(RequestSignatureResult.OK, sig1.checkSignature()); assertEquals(RequestSignatureResult.OK, sig2.checkSignature()); } private long createTimestamp() { return System.currentTimeMillis() / 1000L; } }