package org.stagemonitor.tracing; import org.junit.Before; import org.junit.Test; import org.stagemonitor.configuration.ConfigurationRegistry; import org.stagemonitor.core.CorePlugin; import org.stagemonitor.tracing.anonymization.AnonymizingSpanEventListener; import org.stagemonitor.tracing.utils.SpanUtils; import org.stagemonitor.tracing.wrapper.SpanWrapper; import java.util.Collections; import io.opentracing.Span; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class AnonymisationTest { private TracingPlugin tracingPlugin; @Before public void setUp() throws Exception { tracingPlugin = mock(TracingPlugin.class); final ConfigurationRegistry configuration = mock(ConfigurationRegistry.class); final CorePlugin corePlugin = mock(CorePlugin.class); when(configuration.getConfig(TracingPlugin.class)).thenReturn(tracingPlugin); when(configuration.getConfig(CorePlugin.class)).thenReturn(corePlugin); when(tracingPlugin.isPseudonymizeUserNames()).thenReturn(true); when(tracingPlugin.isAnonymizeIPs()).thenReturn(true); when(tracingPlugin.getDiscloseUsers()).thenReturn(Collections.emptySet()); when(corePlugin.getThreadPoolQueueCapacityLimit()).thenReturn(1000); } @Test public void testAnonymizeUserNameAndIp() throws Exception { when(tracingPlugin.isPseudonymizeUserNames()).thenReturn(true); when(tracingPlugin.isAnonymizeIPs()).thenReturn(true); final Span span = createSpan(); verify(span).setTag("username", "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3"); verify(span, times(0)).setTag(eq("username_disclosed"), anyString()); verify(span).setTag(SpanUtils.IPV4_STRING, "123.123.123.0"); } @Test public void testAnonymizeIp() throws Exception { when(tracingPlugin.isPseudonymizeUserNames()).thenReturn(false); when(tracingPlugin.isAnonymizeIPs()).thenReturn(true); final Span span = createSpan(); verify(span).setTag("username", "test"); verify(span, times(0)).setTag(eq("username_disclosed"), anyString()); verify(span).setTag(SpanUtils.IPV4_STRING, "123.123.123.0"); } @Test public void testDiscloseUserNameAndIp() throws Exception { when(tracingPlugin.isPseudonymizeUserNames()).thenReturn(true); when(tracingPlugin.isAnonymizeIPs()).thenReturn(true); when(tracingPlugin.getDiscloseUsers()).thenReturn(Collections.singleton("a94a8fe5ccb19ba61c4c0873d391e987982fbbd3")); final Span span = createSpan(); verify(span).setTag("username", "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3"); verify(span).setTag("username_disclosed", "test"); verify(span).setTag(SpanUtils.IPV4_STRING, "123.123.123.123"); } @Test public void testDiscloseIp() throws Exception { when(tracingPlugin.isPseudonymizeUserNames()).thenReturn(false); when(tracingPlugin.isAnonymizeIPs()).thenReturn(true); when(tracingPlugin.getDiscloseUsers()).thenReturn(Collections.singleton("test")); final Span span = createSpan(); verify(span).setTag("username", "test"); verify(span).setTag("username_disclosed", "test"); verify(span).setTag(SpanUtils.IPV4_STRING, "123.123.123.123"); } @Test public void testNull() throws Exception { when(tracingPlugin.isPseudonymizeUserNames()).thenReturn(true); when(tracingPlugin.isAnonymizeIPs()).thenReturn(true); final Span span = createSpan(null, null); verify(span, atLeastOnce()).setTag("username", (String) null); verify(span, times(0)).setTag(eq("username_disclosed"), anyString()); verify(span, times(0)).setTag(eq(SpanUtils.IPV4_STRING), anyString()); } @Test public void testNullUser() throws Exception { when(tracingPlugin.isPseudonymizeUserNames()).thenReturn(true); when(tracingPlugin.isAnonymizeIPs()).thenReturn(true); final Span span = createSpan(null, "123.123.123.123"); verify(span, atLeastOnce()).setTag("username", (String) null); verify(span, times(0)).setTag(eq("username_disclosed"), anyString()); verify(span).setTag(SpanUtils.IPV4_STRING, "123.123.123.0"); } @Test public void testNullIp() throws Exception { when(tracingPlugin.isPseudonymizeUserNames()).thenReturn(true); when(tracingPlugin.isAnonymizeIPs()).thenReturn(true); final Span span = createSpan("test", null); verify(span).setTag("username", "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3"); verify(span, times(0)).setTag(eq("username_disclosed"), anyString()); verify(span, times(0)).setTag(eq(SpanUtils.IPV4_STRING), anyString()); } @Test public void testDontAnonymize() throws Exception { when(tracingPlugin.isPseudonymizeUserNames()).thenReturn(false); when(tracingPlugin.isAnonymizeIPs()).thenReturn(false); final Span span = createSpan(); verify(span).setTag("username", "test"); verify(span, times(0)).setTag(eq("username_disclosed"), anyString()); verify(span).setTag(SpanUtils.IPV4_STRING, "123.123.123.123"); } private Span createSpan() { return createSpan("test", "123.123.123.123"); } private Span createSpan(String username, String ip) { final Span span = new SpanWrapper(spy(NoopSpan.INSTANCE), "", 0, 0, Collections.singletonList(new AnonymizingSpanEventListener(tracingPlugin))); span.setTag(SpanUtils.USERNAME, username); SpanUtils.setClientIp(span, ip); final Span mockSpan = ((SpanWrapper) span).getDelegate(); span.finish(); return mockSpan; } }