package com.github.kpavlov.jreactive8583.netty.pipeline;
import com.solab.iso8583.IsoMessage;
import com.solab.iso8583.IsoType;
import com.solab.iso8583.MessageFactory;
import com.solab.iso8583.parse.ConfigParser;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.local.LocalChannel;
import io.netty.handler.logging.LogLevel;
import org.hamcrest.CoreMatchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric;
import static org.apache.commons.lang3.RandomStringUtils.randomNumeric;
import static org.hamcrest.core.IsNot.not;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class IsoMessageLoggingHandlerTest {
private IsoMessageLoggingHandler handler;
private String pan;
private String cvv;
private String track1;
private String track2;
private String track3;
private IsoMessage message;
@Mock
private ChannelHandlerContext ctx;
@Before
public void setUp() throws Exception {
when(ctx.channel()).thenReturn(new LocalChannel());
MessageFactory messageFactory = ConfigParser.createDefault();
message = messageFactory.newMessage(0x0200);
pan = randomNumeric(19);
cvv = randomAlphanumeric(3);
track1 = randomAlphanumeric(10);
track2 = randomAlphanumeric(20);
track3 = randomAlphanumeric(30);
message.setValue(2, pan, IsoType.NUMERIC, pan.length());
message.setValue(112, cvv, IsoType.NUMERIC, 3);
message.setValue(35, track2, IsoType.LLLVAR, 37);
message.setValue(36, track3, IsoType.LLLVAR, 106);
message.setValue(45, track1, IsoType.LLLVAR, 76);
}
@Test
public void testMaskSensitiveData() {
handler = new IsoMessageLoggingHandler(LogLevel.DEBUG, false, true, 34, 35, 36, 45, 112);
final String result = handler.format(ctx, "someEvent", message);
assertThat(result, not(CoreMatchers.containsString(pan)));
assertThat(result, not(CoreMatchers.containsString(cvv)));
assertThat(result, not(CoreMatchers.containsString(track1)));
assertThat(result, not(CoreMatchers.containsString(track2)));
assertThat(result, not(CoreMatchers.containsString(track3)));
}
@Test
public void testMaskDefaultSensitiveData() {
handler = new IsoMessageLoggingHandler(LogLevel.DEBUG, false, true);
final String result = handler.format(ctx, "someEvent", message);
assertThat(result, not(CoreMatchers.containsString(pan)));
assertThat("track1",result, not(CoreMatchers.containsString(track1)));
assertThat("track2",result, not(CoreMatchers.containsString(track2)));
assertThat("track3",result, not(CoreMatchers.containsString(track3)));
// there is no standard field for CVV, so it's not masked by default
assertThat(result, CoreMatchers.containsString(cvv));
}
@Test
public void testPrintSensitiveData() {
handler = new IsoMessageLoggingHandler(LogLevel.DEBUG);
final String result = handler.format(ctx, "someEvent", message);
assertThat(result, CoreMatchers.containsString(pan));
assertThat(result, CoreMatchers.containsString(cvv));
assertThat(result, CoreMatchers.containsString(track1));
assertThat(result, CoreMatchers.containsString(track2));
assertThat(result, CoreMatchers.containsString(track3));
}
@Test
public void testHideFieldDescriptions() {
handler = new IsoMessageLoggingHandler(LogLevel.DEBUG, false, false);
final String result = handler.format(ctx, "someEvent", message);
assertThat(result, not(CoreMatchers.containsString("Primary account number (PAN)")));
}
@Test
public void testShowFieldDescriptions() {
handler = new IsoMessageLoggingHandler(LogLevel.DEBUG, false, true);
final String result = handler.format(ctx, "someEvent", message);
assertThat(result, CoreMatchers.containsString("Primary account number (PAN)"));
}
}