Skip to content

Commit

Permalink
Fix after review
Browse files Browse the repository at this point in the history
  • Loading branch information
Zhen Li authored and lutovich committed Jul 5, 2018
1 parent 20657cc commit 02839c4
Show file tree
Hide file tree
Showing 10 changed files with 248 additions and 20 deletions.
Expand Up @@ -44,7 +44,6 @@
import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.logging.Log; import org.neo4j.logging.Log;


import static java.lang.Integer.toHexString;
import static java.lang.String.format; import static java.lang.String.format;


/** /**
Expand All @@ -55,7 +54,7 @@ public class BoltResponseMessageWriterV1 implements BoltResponseMessageWriter
private final PackOutput output; private final PackOutput output;
private final Neo4jPack.Packer packer; private final Neo4jPack.Packer packer;
private final Log log; private final Log log;
private final Map<Byte,ResponseMessageEncoder> encoders; private final Map<Byte,ResponseMessageEncoder<ResponseMessage>> encoders;


public BoltResponseMessageWriterV1( PackProvider packerProvider, PackOutput output, LogService logService, public BoltResponseMessageWriterV1( PackProvider packerProvider, PackOutput output, LogService logService,
BoltMessageLogger messageLogger ) BoltMessageLogger messageLogger )
Expand All @@ -66,14 +65,14 @@ public BoltResponseMessageWriterV1( PackProvider packerProvider, PackOutput outp
this.encoders = registerEncoders( messageLogger ); this.encoders = registerEncoders( messageLogger );
} }


private Map<Byte,ResponseMessageEncoder> registerEncoders( BoltMessageLogger messageLogger ) private Map<Byte,ResponseMessageEncoder<ResponseMessage>> registerEncoders( BoltMessageLogger messageLogger )
{ {
Map<Byte,ResponseMessageEncoder> encoders = new HashMap<>(); Map<Byte,ResponseMessageEncoder<?>> encoders = new HashMap<>();
encoders.put( SuccessMessage.SIGNATURE, new SuccessMessageEncoder( messageLogger ) ); encoders.put( SuccessMessage.SIGNATURE, new SuccessMessageEncoder( messageLogger ) );
encoders.put( RecordMessage.SIGNATURE, new RecordMessageEncoder() ); encoders.put( RecordMessage.SIGNATURE, new RecordMessageEncoder() );
encoders.put( IgnoredMessage.SIGNATURE, new IgnoredMessageEncoder( messageLogger ) ); encoders.put( IgnoredMessage.SIGNATURE, new IgnoredMessageEncoder( messageLogger ) );
encoders.put( FailureMessage.SIGNATURE, new FailureMessageEncoder( messageLogger ) ); encoders.put( FailureMessage.SIGNATURE, new FailureMessageEncoder( messageLogger ) );
return encoders; return (Map)encoders;
} }


@Override @Override
Expand All @@ -97,11 +96,11 @@ private void packCompleteMessageOrFail( ResponseMessage message ) throws IOExcep
output.beginMessage(); output.beginMessage();
try try
{ {
ResponseMessageEncoder encoder = encoders.get( message.signature() ); ResponseMessageEncoder<ResponseMessage> encoder = encoders.get( message.signature() );
if ( encoder == null ) if ( encoder == null )
{ {
throw new BoltIOException( Status.Request.InvalidFormat, throw new BoltIOException( Status.Request.InvalidFormat,
format( "Message signature %s is not supported in this protocol version.", toHexString( message.signature() ) ) ); format( "Message %s is not supported in this protocol version.", message ) );
} }
encoder.encode( packer, message ); encoder.encode( packer, message );
packingFailed = false; packingFailed = false;
Expand All @@ -114,7 +113,7 @@ private void packCompleteMessageOrFail( ResponseMessage message ) throws IOExcep
// packing failed, there might be some half-written data in the output buffer right now // packing failed, there might be some half-written data in the output buffer right now
// notify output about the failure so that it cleans up the buffer // notify output about the failure so that it cleans up the buffer
output.messageFailed(); output.messageFailed();
log.error( "Failed to write full %s message because: %s", message.signature(), error.getMessage() ); log.error( "Failed to write full %s message because: %s", message, error.getMessage() );
} }
throw error; throw error;
} }
Expand Down
Expand Up @@ -79,10 +79,7 @@ public int hashCode()
@Override @Override
public String toString() public String toString()
{ {
return "FailureMessage{" + return "FAILURE " + status + " " + message;
"status=" + status +
", message='" + message + '\'' +
'}';
} }


} }
Expand Up @@ -51,6 +51,6 @@ public int hashCode()
@Override @Override
public String toString() public String toString()
{ {
return "IgnoredMessage{}"; return "IGNORED";
} }
} }
Expand Up @@ -65,9 +65,7 @@ public int hashCode()
@Override @Override
public String toString() public String toString()
{ {
return "ItemMessage{" + return "RECORD " + value;
"datas=" + value +
'}';
} }


public QueryResult.Record record() public QueryResult.Record record()
Expand Down
Expand Up @@ -65,9 +65,7 @@ public int hashCode()
@Override @Override
public String toString() public String toString()
{ {
return "SuccessMessage{" + return "SUCCESS " + metadata;
"metadata=" + metadata +
'}';
} }


public MapValue meta() public MapValue meta()
Expand Down
Expand Up @@ -24,6 +24,7 @@
import org.neo4j.bolt.runtime.BoltConnection; import org.neo4j.bolt.runtime.BoltConnection;
import org.neo4j.bolt.runtime.Neo4jError; import org.neo4j.bolt.runtime.Neo4jError;
import org.neo4j.bolt.messaging.BoltResponseMessageWriter; import org.neo4j.bolt.messaging.BoltResponseMessageWriter;
import org.neo4j.bolt.v1.messaging.response.FailureMessage;
import org.neo4j.bolt.v1.messaging.response.SuccessMessage; import org.neo4j.bolt.v1.messaging.response.SuccessMessage;
import org.neo4j.bolt.v1.packstream.PackOutputClosedException; import org.neo4j.bolt.v1.packstream.PackOutputClosedException;
import org.neo4j.graphdb.TransactionTerminatedException; import org.neo4j.graphdb.TransactionTerminatedException;
Expand Down Expand Up @@ -148,7 +149,7 @@ private static BoltResponseMessageWriter newResponseHandlerMock( boolean fatalEr
{ {
BoltResponseMessageWriter handler = newResponseHandlerMock(); BoltResponseMessageWriter handler = newResponseHandlerMock();


doThrow( error ).when( handler ).write( any( org.neo4j.bolt.v1.messaging.response.FailureMessage.class ) ); doThrow( error ).when( handler ).write( any( FailureMessage.class ) );
return handler; return handler;
} }


Expand Down
@@ -0,0 +1,82 @@
/*
* Copyright (c) 2002-2018 "Neo4j,"
* Neo4j Sweden AB [http://neo4j.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.bolt.v1.messaging.encoder;

import org.junit.jupiter.api.Test;

import org.neo4j.bolt.logging.BoltMessageLogger;
import org.neo4j.bolt.messaging.Neo4jPack;
import org.neo4j.bolt.v1.messaging.response.FailureMessage;
import org.neo4j.bolt.v1.messaging.response.FatalFailureMessage;
import org.neo4j.cypher.result.QueryResult;
import org.neo4j.kernel.api.exceptions.Status;
import org.neo4j.values.AnyValue;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

class FailureMessageEncoderTest
{
@Test
void shouldEncodeFailureMessage() throws Throwable
{
// Given
Neo4jPack.Packer packer = mock( Neo4jPack.Packer.class );
BoltMessageLogger logger = mock( BoltMessageLogger.class );
FailureMessageEncoder encoder = new FailureMessageEncoder( logger );

// When
QueryResult.Record value = mock( QueryResult.Record.class );
when( value.fields() ).thenReturn( new AnyValue[0] );
encoder.encode( packer, new FailureMessage( Status.General.UnknownError, "I am an error message" ) );

// Then
verify( logger, never() ).serverError( anyString(), any( Status.class ) );
verify( logger ).logFailure( Status.General.UnknownError );

verify( packer ).packStructHeader( anyInt(), eq( FailureMessage.SIGNATURE ) );
verify( packer ).packMapHeader( 2 );
verify( packer ).pack( "code" );
verify( packer ).pack( "message" );
}

@Test
void shouldLogErrorIfIsFatalError() throws Throwable
{
Neo4jPack.Packer packer = mock( Neo4jPack.Packer.class );
BoltMessageLogger logger = mock( BoltMessageLogger.class );
FailureMessageEncoder encoder = new FailureMessageEncoder( logger );

// When
QueryResult.Record value = mock( QueryResult.Record.class );
when( value.fields() ).thenReturn( new AnyValue[0] );
encoder.encode( packer, new FatalFailureMessage( Status.General.UnknownError, "I am an error message" ) );

// Then
verify( logger ).serverError( "FATAL", Status.General.UnknownError );
verify( logger ).logFailure( Status.General.UnknownError );
}
}
@@ -0,0 +1,49 @@
/*
* Copyright (c) 2002-2018 "Neo4j,"
* Neo4j Sweden AB [http://neo4j.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.bolt.v1.messaging.encoder;

import org.junit.jupiter.api.Test;

import org.neo4j.bolt.logging.BoltMessageLogger;
import org.neo4j.bolt.messaging.Neo4jPack;
import org.neo4j.bolt.v1.messaging.response.IgnoredMessage;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.neo4j.bolt.v1.messaging.response.IgnoredMessage.IGNORED_MESSAGE;

class IgnoredMessageEncoderTest
{
@Test
void shouldEncodeIgnoredMessage() throws Throwable
{
// Given
Neo4jPack.Packer packer = mock( Neo4jPack.Packer.class );
IgnoredMessageEncoder encoder = new IgnoredMessageEncoder( mock( BoltMessageLogger.class ) );

// When
encoder.encode( packer, IGNORED_MESSAGE );

// Then
verify( packer ).packStructHeader( anyInt(), eq( IgnoredMessage.SIGNATURE ) );
}
}
@@ -0,0 +1,53 @@
/*
* Copyright (c) 2002-2018 "Neo4j,"
* Neo4j Sweden AB [http://neo4j.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.bolt.v1.messaging.encoder;

import org.junit.jupiter.api.Test;

import org.neo4j.bolt.messaging.Neo4jPack;
import org.neo4j.bolt.v1.messaging.response.RecordMessage;
import org.neo4j.cypher.result.QueryResult;
import org.neo4j.values.AnyValue;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

class RecordMessageEncoderTest
{
@Test
void shouldEncodeRecordMessage() throws Throwable
{
// Given
Neo4jPack.Packer packer = mock( Neo4jPack.Packer.class );
RecordMessageEncoder encoder = new RecordMessageEncoder();

// When
QueryResult.Record value = mock( QueryResult.Record.class );
when( value.fields() ).thenReturn( new AnyValue[0] );
encoder.encode( packer, new RecordMessage( value ) );

// Then
verify( packer ).packStructHeader( anyInt(), eq( RecordMessage.SIGNATURE ) );
verify( packer ).packListHeader( 0 );
}
}
@@ -0,0 +1,51 @@
/*
* Copyright (c) 2002-2018 "Neo4j,"
* Neo4j Sweden AB [http://neo4j.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.bolt.v1.messaging.encoder;

import org.junit.jupiter.api.Test;

import org.neo4j.bolt.logging.BoltMessageLogger;
import org.neo4j.bolt.messaging.Neo4jPack;
import org.neo4j.bolt.v1.messaging.response.SuccessMessage;
import org.neo4j.values.virtual.MapValue;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

class SuccessMessageEncoderTest
{
@Test
void shouldEncodeSuccessMessage() throws Throwable
{
// Given
Neo4jPack.Packer packer = mock( Neo4jPack.Packer.class );
SuccessMessageEncoder encoder = new SuccessMessageEncoder( mock( BoltMessageLogger.class ) );

// When
MapValue meta = mock( MapValue.class );
encoder.encode( packer, new SuccessMessage( meta ) );

// Then
verify( packer ).packStructHeader( anyInt(), eq( SuccessMessage.SIGNATURE ) );
verify( packer ).pack( meta );
}
}

0 comments on commit 02839c4

Please sign in to comment.