/* * Copyright (c) 2002-2017 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This file is part of Neo4j. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.neo4j.driver.internal.net; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import java.util.Arrays; import java.util.HashMap; import org.neo4j.driver.internal.messaging.DiscardAllMessage; import org.neo4j.driver.internal.messaging.FailureMessage; import org.neo4j.driver.internal.messaging.IgnoredMessage; import org.neo4j.driver.internal.messaging.InitMessage; import org.neo4j.driver.internal.messaging.Message; import org.neo4j.driver.internal.messaging.PullAllMessage; import org.neo4j.driver.internal.messaging.RecordMessage; import org.neo4j.driver.internal.messaging.ResetMessage; import org.neo4j.driver.internal.messaging.RunMessage; import org.neo4j.driver.internal.messaging.SuccessMessage; import org.neo4j.driver.internal.spi.Collector; import org.neo4j.driver.v1.Logger; import org.neo4j.driver.v1.Value; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.anyVararg; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.neo4j.driver.v1.Values.ofValue; import static org.neo4j.driver.v1.Values.parameters; public class LoggingResponseHandlerTest { private String log; private Logger debugLogger = newCapturingLogger(); @Rule public ExpectedException exception = ExpectedException.none(); private LoggingResponseHandler handler = new LoggingResponseHandler( debugLogger ); @Test public void shouldLogInitMessage() throws Throwable { // When handler.handleInitMessage( "client", parameters().asMap( ofValue())); // Then assertEquals( "S: INIT \"client\" {...}", log ); assertEquals( format( new InitMessage( "client", parameters().asMap( ofValue()) ) ), log ); } @Test public void shouldLogRunMessage() throws Throwable { // When handler.handleRunMessage( "stat", parameters( "value", new String[]{"cat", "cat", "cat"} ).asMap( ofValue()) ); // Then assertEquals( "S: RUN \"stat\" {value=[\"cat\", \"cat\", \"cat\"]}", log ); assertEquals( format( new RunMessage( "stat", parameters( "value", new String[]{"cat", "cat", "cat"} ).asMap( ofValue()) ) ), log ); } @Test public void shouldLogPullAllMessage() throws Throwable { // When handler.handlePullAllMessage(); // Then assertEquals( "S: PULL_ALL", log ); assertEquals( format( new PullAllMessage() ), log ); } @Test public void shouldLogDiscardAllMessage() throws Throwable { // When handler.handleDiscardAllMessage(); // Then assertEquals( "S: DISCARD_ALL", log ); assertEquals( format( new DiscardAllMessage() ), log ); } @Test public void shouldLogAckFailureMessage() throws Throwable { // When handler.handleResetMessage(); // Then assertEquals( "S: RESET", log ); assertEquals( format( new ResetMessage() ), log ); } @Test public void shouldLogSuccessMessage() throws Throwable { // When handler.appendResultCollector( Collector.NO_OP ); handler.handleSuccessMessage( new HashMap<String,Value>() ); // Then assertEquals( "S: SUCCESS {}", log ); assertEquals( format( new SuccessMessage( new HashMap<String,Value>() ) ), log ); } @Test public void shouldLogRecordMessage() throws Throwable { // When handler.appendResultCollector( Collector.NO_OP ); handler.handleRecordMessage( new Value[]{} ); // Then assertEquals( "S: RECORD []", log ); assertEquals( format( new RecordMessage( new Value[]{} ) ), log ); } @Test public void shouldLogFailureMessage() throws Throwable { // When handler.appendResultCollector( Collector.NO_OP ); handler.handleFailureMessage( "code.error", "message" ); // Then assertEquals( "S: FAILURE code.error \"message\"", log ); assertEquals( format( new FailureMessage( "code.error", "message" ) ), log ); } @Test public void shouldLogIgnoredMessage() throws Throwable { // When handler.appendResultCollector( Collector.NO_OP ); handler.handleIgnoredMessage(); // Then assertEquals( "S: IGNORED {}", log ); assertEquals( format( new IgnoredMessage() ), log ); } @Test public void shouldLogMessageWhenHandleMessageThrowsError() throws Throwable { // Given SocketResponseHandler handler = new LoggingResponseHandler( debugLogger ) { @Override public void handleIgnoredMessage() { throw new RuntimeException( "This will not stop logging" ); } }; // When exception.expect( RuntimeException.class ); exception.expectMessage( "This will not stop logging" ); handler.handleIgnoredMessage(); // Then assertEquals( "S: [IGNORED]", log ); } private String format( Message message ) { return String.format( "S: %s", message ); } private Logger newCapturingLogger() { Logger logger = mock( Logger.class ); doAnswer( new Answer<Void>() { @Override public Void answer( InvocationOnMock invocation ) throws Throwable { Object[] arguments = invocation.getArguments(); String message = ((String) arguments[0]); Object[] params = Arrays.copyOfRange( arguments, 1, arguments.length ); LoggingResponseHandlerTest.this.log = String.format( message, params ); return null; } } ).when( logger ).debug( anyString(), anyVararg() ); return logger; } }