return Status.Statement.valueOf( error ); case "Transaction": return Status.Transaction.valueOf( error ); case "Request": return Status.Request.valueOf( error );
@Test public void shouldHonorReallyLowSessionTimeout() throws Exception { // Given server = serverOnRandomPorts() .withProperty( ServerSettings.transaction_idle_timeout.name(), "1" ).build(); server.start(); String tx = HTTP.POST( txURI(), asList( map( "statement", "CREATE (n)" ) ) ).location(); // When Thread.sleep( 1000 * 5 ); Map<String, Object> response = HTTP.POST( tx + "/commit" ).content(); // Then @SuppressWarnings( "unchecked" ) List<Map<String, Object>> errors = (List<Map<String, Object>>) response.get( "errors" ); assertThat( errors.get( 0 ).get( "code" ), equalTo( TransactionNotFound.code().serialize() ) ); }
return Status.Statement.valueOf( error ); case "Transaction": return Status.Transaction.valueOf( error ); case "Request": return Status.Request.valueOf( error );
public static Status codeFromString( String codeStr ) { String[] parts = codeStr.split( "\\." ); if ( parts.length != 4 ) { return Status.General.UnknownFailure; } String category = parts[2]; String error = parts[3]; // Note: the input string may contain arbitrary input data, using reflection would open network attack vector switch ( category ) { case "Schema": return Status.Schema.valueOf( error ); case "LegacyIndex": return Status.LegacyIndex.valueOf( error ); case "General": return Status.General.valueOf( error ); case "Statement": return Status.Statement.valueOf( error ); case "Transaction": return Status.Transaction.valueOf( error ); case "Request": return Status.Request.valueOf( error ); case "Network": return Status.Network.valueOf( error ); default: return Status.General.UnknownFailure; } }
return Status.Statement.valueOf( error ); case "Transaction": return Status.Transaction.valueOf( error ); case "Request": return Status.Request.valueOf( error );
@Test public void shouldReturnCorrectStatusCodeOnDeadlock() throws Exception { // Given try ( Transaction tx = graphdb().beginTx() ) { graphdb().createNode( Label.label( "First" ) ); graphdb().createNode( Label.label( "Second" ) ); tx.success(); } // When I lock node:First HTTP.Response begin = http.POST( "db/data/transaction", quotedJson( "{ 'statements': [ { 'statement': 'MATCH (n:First) SET n.prop=1' } ] }" )); // and I lock node:Second, and wait for a lock on node:First in another transaction otherThread.execute( writeToFirstAndSecond() ); // and I wait for those locks to be pending assertTrue( secondNodeLocked.await( 10, TimeUnit.SECONDS ) ); Thread.sleep( 1000 ); // and I then try and lock node:Second in the first transaction HTTP.Response deadlock = http.POST( begin.location(), quotedJson( "{ 'statements': [ { 'statement': 'MATCH (n:Second) SET n.prop=1' } ] }" )); // Then assertThat( deadlock.get( "errors" ).get( 0 ).get( "code" ).getTextValue(), equalTo( DeadlockDetected.code().serialize() ) ); }
@Test public void shouldWriteFailureMessage() throws Exception { PackOutput output = mock( PackOutput.class ); Neo4jPack.Packer packer = mock( Neo4jPack.Packer.class ); BoltResponseMessageWriterV1 writer = newWriter( output, packer ); Status.Transaction errorStatus = Status.Transaction.DeadlockDetected; String errorMessage = "Hi Deadlock!"; writer.write( new FailureMessage( errorStatus, errorMessage ) ); InOrder inOrder = inOrder( output, packer ); inOrder.verify( output ).beginMessage(); inOrder.verify( packer ).pack( errorStatus.code().serialize() ); inOrder.verify( packer ).pack( errorMessage ); inOrder.verify( output ).messageSucceeded(); }