package com.spotify.heroic.querylogging; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.spotify.heroic.Query; import com.spotify.heroic.common.Statistics; import com.spotify.heroic.metric.FullQuery; import com.spotify.heroic.metric.QueryMetrics; import com.spotify.heroic.metric.QueryMetricsResponse; import com.spotify.heroic.metric.QueryTrace; import com.spotify.heroic.metric.ResultLimits; import java.util.ArrayList; import java.util.function.Consumer; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class Slf4jQueryLoggerTest { @Mock public Consumer<String> logger; private static final JsonNode EMPTY = JsonNodeFactory.instance.nullNode(); private ObjectMapper mapper; private Slf4jQueryLogger slf4jQueryLogger; private QueryContext queryContext; @Before public void setup() { mapper = mock(ObjectMapper.class); try { when(mapper.writeValueAsString(any())).thenReturn(""); when(mapper.valueToTree(any())).thenReturn(EMPTY); } catch (JsonProcessingException e) { throw new RuntimeException(e); } final String component = "<component>"; slf4jQueryLogger = new Slf4jQueryLogger(logger, mapper, component); final Slf4jQueryLoggerFactory queryLoggerFactory = mock(Slf4jQueryLoggerFactory.class); when(queryLoggerFactory.create(any())).thenReturn(slf4jQueryLogger); queryContext = mock(QueryContext.class); } @Test public void testHttpTextQuery() { slf4jQueryLogger.logHttpQueryText(queryContext, ""); verify(logger, times(1)).accept(any(String.class)); } @Test public void testHttpJsonQuery() { final QueryMetrics queryMetrics = mock(QueryMetrics.class); slf4jQueryLogger.logHttpQueryJson(queryContext, queryMetrics); verify(logger, times(1)).accept(any(String.class)); } @Test public void testQuery() { final Query query = mock(Query.class); slf4jQueryLogger.logQuery(queryContext, query); verify(logger, times(1)).accept(any(String.class)); } @Test public void testOutgoingRequestsToShards() { final FullQuery.Request request = mock(FullQuery.Request.class); slf4jQueryLogger.logOutgoingRequestToShards(queryContext, request); verify(logger, times(1)).accept(any(String.class)); } @Test public void testIncomingRequestAtNode() { final FullQuery.Request request = mock(FullQuery.Request.class); slf4jQueryLogger.logIncomingRequestAtNode(queryContext, request); verify(logger, times(1)).accept(any(String.class)); } @Test public void testOutgoingResponseAtNode() { final FullQuery response = new FullQuery(QueryTrace.of(QueryTrace.identifier("test"), 0L), new ArrayList<>(), new ArrayList<>(), Statistics.empty(), ResultLimits.of()); slf4jQueryLogger.logOutgoingResponseAtNode(queryContext, response); verify(logger, times(1)).accept(any(String.class)); } @Test public void testIncomingResponseFromShard() { final FullQuery response = new FullQuery(QueryTrace.of(QueryTrace.identifier("test"), 0L), new ArrayList<>(), new ArrayList<>(), Statistics.empty(), ResultLimits.of()); slf4jQueryLogger.logIncomingResponseFromShard(queryContext, response); verify(logger, times(1)).accept(any(String.class)); } @Test public void testFinalResponse() { final QueryMetricsResponse queryMetricsResponse = mock(QueryMetricsResponse.class); slf4jQueryLogger.logFinalResponse(queryContext, queryMetricsResponse); verify(logger, times(1)).accept(any(String.class)); } }