Refine search
@Test public void shouldNotLogConnectionResetErrors() throws Exception { // Given AssertableLogProvider logProvider = new AssertableLogProvider(); HouseKeeper keeper = new HouseKeeper( null, logProvider.getLog( HouseKeeper.class ) ); Channel channel = mock( Channel.class ); when( channel.toString() ).thenReturn( "[some channel info]" ); ChannelHandlerContext ctx = mock( ChannelHandlerContext.class ); when( ctx.channel() ).thenReturn( channel ); when( ctx.executor() ).thenReturn( mock( EventExecutor.class ) ); IOException connResetError = new IOException( "Connection reset by peer" ); // When keeper.exceptionCaught( ctx, connResetError ); // Then logProvider.assertExactly( AssertableLogProvider.inLog( HouseKeeper.class ).warn( "Fatal error occurred when handling a client connection, " + "remote peer unexpectedly closed connection: %s", channel ) ); }
@Test( expected = InvalidTransactionId.class ) public void gettingInterruptHandlerForUnknownIdShouldThrowErrorInvalidTransactionId() throws TransactionLifecycleException { // Given AssertableLogProvider logProvider = new AssertableLogProvider(); FakeClock clock = Clocks.fakeClock(); int timeoutLength = 123; TransactionHandleRegistry registry = new TransactionHandleRegistry( clock, timeoutLength, logProvider ); // When registry.terminate( 456 ); } }
@Test public void shouldPrintDiskUsage() { // Not sure how to get around this w/o spying. The method that we're unit testing will construct // other File instances with this guy as parent and internally the File constructor uses the field 'path' // which, if purely mocked, won't be assigned. At the same time we want to control the total/free space methods // and what they return... a tough one. File storeDir = Mockito.spy( new File( "storeDir" ) ); DatabaseLayout layout = mock( DatabaseLayout.class ); when( layout.databaseDirectory() ).thenReturn( storeDir ); when( storeDir.getTotalSpace() ).thenReturn( 100L ); when( storeDir.getFreeSpace() ).thenReturn( 40L ); AssertableLogProvider logProvider = new AssertableLogProvider(); KernelDiagnostics.StoreFiles storeFiles = new KernelDiagnostics.StoreFiles( layout ); storeFiles.dump( logProvider.getLog( getClass() ).debugLogger() ); logProvider.assertContainsMessageContaining( "100 / 40 / 40" ); }
@Test public void shouldProvideInterruptHandlerForActiveTransaction() throws TransactionLifecycleException { // Given AssertableLogProvider logProvider = new AssertableLogProvider(); FakeClock clock = Clocks.fakeClock(); int timeoutLength = 123; TransactionHandleRegistry registry = new TransactionHandleRegistry( clock, timeoutLength, logProvider ); TransactionHandle handle = mock( TransactionHandle.class ); // Active Tx in Registry long id = registry.begin( handle ); // When registry.terminate( id ); // Then verify( handle, times( 1 ) ).terminate(); verifyNoMoreInteractions( handle ); }
@Test public void shouldLogOnUnexpectedExceptionsAndClosesContext() throws Throwable { // Given ChannelHandlerContext context = channelHandlerContextMock(); AssertableLogProvider logging = new AssertableLogProvider(); TransportSelectionHandler handler = new TransportSelectionHandler( null, null, false, false, logging, null ); // When Throwable cause = new Throwable( "Oh no!" ); handler.exceptionCaught( context, cause ); // Then verify( context ).close(); logging.assertExactly( inLog( TransportSelectionHandler.class ) .error( equalTo( "Fatal error occurred when initialising pipeline: " + context.channel() ), sameInstance( cause ) ) ); }
@Test public void shouldLogConnectionResetErrorsAtWarningLevelAndClosesContext() throws Exception { // Given ChannelHandlerContext context = channelHandlerContextMock(); AssertableLogProvider logging = new AssertableLogProvider(); TransportSelectionHandler handler = new TransportSelectionHandler( null, null, false, false, logging, null ); IOException connResetError = new IOException( "Connection reset by peer" ); // When handler.exceptionCaught( context, connResetError ); // Then verify( context ).close(); logging.assertExactly( inLog( TransportSelectionHandler.class ) .warn( "Fatal error occurred when initialising pipeline, " + "remote peer unexpectedly closed connection: %s", context.channel() ) ); }
@Test public void noNotificationForTransactionLogs() { AssertableLogProvider internalLogProvider = new AssertableLogProvider( false ); DefaultFileDeletionEventListener listener = buildListener( internalLogProvider ); listener.fileDeleted( TransactionLogFiles.DEFAULT_NAME + ".0" ); listener.fileDeleted( TransactionLogFiles.DEFAULT_NAME + ".1" ); internalLogProvider.assertNoLoggingOccurred(); }
@Test public void shouldAbbreviateWellKnownIOErrors() { // given OutputStream output = mock( OutputStream.class, new ThrowsException( new IOException( "Broken pipe" ) ) ); AssertableLogProvider logProvider = new AssertableLogProvider(); ExecutionResultSerializer serializer = getSerializerWith( output, null, logProvider ); // when serializer.finish(); // then logProvider.assertExactly( AssertableLogProvider.inLog( ExecutionResultSerializer.class ) .error( "Unable to reply to request, because the client has closed the connection (Broken pipe)." ) ); }
@Test public void shouldProvideInterruptHandlerForSuspendedTransaction() throws TransactionLifecycleException { // Given AssertableLogProvider logProvider = new AssertableLogProvider(); FakeClock clock = Clocks.fakeClock(); int timeoutLength = 123; TransactionHandleRegistry registry = new TransactionHandleRegistry( clock, timeoutLength, logProvider ); TransactionHandle handle = mock( TransactionHandle.class ); // Suspended Tx in Registry long id = registry.begin( handle ); registry.release( id, handle ); // When registry.terminate( id ); // Then verify( handle, times( 1 ) ).terminate(); verifyNoMoreInteractions( handle ); }
@Test public void shouldLogCorrectTransactionLogDiagnosticsForNoTransactionLogs() { // GIVEN NeoStoreDataSource dataSource = neoStoreDataSourceWithLogFilesContainingLowestTxId( noLogs() ); AssertableLogProvider logProvider = new AssertableLogProvider(); Logger logger = logProvider.getLog( getClass() ).infoLogger(); // WHEN DataSourceDiagnostics.TRANSACTION_RANGE.dump( dataSource, logger ); // THEN logProvider.assertContainsMessageContaining( "No transactions" ); }
@Test public void progressNeverReportMoreThenHundredPercent() { AssertableLogProvider logProvider = new AssertableLogProvider(); Log log = logProvider.getLog( getClass() ); VisibleMigrationProgressMonitor monitor = new VisibleMigrationProgressMonitor( log ); monitor.started( 1 ); monitorSection( monitor, "First", 100, 1, 10, 99, 170 ); monitor.completed(); verifySectionReportedCorrectly( logProvider ); }
@Test public void shouldLogIOErrors() { // given IOException failure = new IOException(); OutputStream output = mock( OutputStream.class, new ThrowsException( failure ) ); AssertableLogProvider logProvider = new AssertableLogProvider(); ExecutionResultSerializer serializer = getSerializerWith( output, null, logProvider ); // when serializer.finish(); // then logProvider.assertExactly( AssertableLogProvider.inLog( ExecutionResultSerializer.class ).error( is( "Failed to generate JSON output." ), sameInstance( failure ) ) ); }
@Test public void notificationInLogAboutFileDeletion() { AssertableLogProvider internalLogProvider = new AssertableLogProvider( false ); DefaultFileDeletionEventListener listener = buildListener( internalLogProvider ); listener.fileDeleted( "testFile.db" ); listener.fileDeleted( "anotherDirectory" ); internalLogProvider.assertContainsMessageContaining( "'testFile.db' which belongs to the store was deleted while database was running." ); internalLogProvider.assertContainsMessageContaining( "'anotherDirectory' which belongs to the store was deleted while database was running." ); }
@Test public void shouldGenerateTransactionId() { // given AssertableLogProvider logProvider = new AssertableLogProvider(); TransactionHandleRegistry registry = new TransactionHandleRegistry( Clocks.fakeClock(), 0, logProvider ); TransactionHandle handle = mock( TransactionHandle.class ); // when long id1 = registry.begin( handle ); long id2 = registry.begin( handle ); // then assertNotEquals( id1, id2 ); logProvider.assertNoLoggingOccurred(); }
@Test public void onlyDatabaseErrorsAreLogged() { AssertableLogProvider userLog = new AssertableLogProvider(); AssertableLogProvider internalLog = new AssertableLogProvider(); ErrorReporter reporter = newErrorReporter( userLog, internalLog ); for ( Status.Classification classification : Status.Classification.values() ) { if ( classification != Status.Classification.DatabaseError ) { Status.Code code = newStatusCode( classification ); Neo4jError error = Neo4jError.from( () -> code, "Database error" ); reporter.report( error ); userLog.assertNoLoggingOccurred(); internalLog.assertNoLoggingOccurred(); } } }
@Test public void shouldReportAllPercentageSteps() { // GIVEN AssertableLogProvider logProvider = new AssertableLogProvider(); Log log = logProvider.getLog( getClass() ); VisibleMigrationProgressMonitor monitor = new VisibleMigrationProgressMonitor( log ); monitor.started( 1 ); // WHEN monitorSection( monitor, "First", 100, 40, 25, 23 /*these are too far*/ , 10, 50 ); monitor.completed(); // THEN verifySectionReportedCorrectly( logProvider ); }
@Test public void shouldLogExceptionOnExceptionCaught() { AssertableLogProvider logProvider = new AssertableLogProvider(); BoltConnection connection = mock( BoltConnection.class ); channel = new EmbeddedChannel( new HouseKeeper( connection, logProvider.getLog( HouseKeeper.class ) ) ); RuntimeException exception = new RuntimeException( "some exception" ); channel.pipeline().fireExceptionCaught( exception ); verify( connection ).stop(); logProvider.assertExactly( inLog( HouseKeeper.class ).error( startsWith( "Fatal error occurred when handling a client connection" ), equalTo( exception ) ) ); }
@Test public void databaseErrorShouldLogFullMessageInDebugLogAndHelpfulPointerInUserLog() { // given AssertableLogProvider userLog = new AssertableLogProvider(); AssertableLogProvider internalLog = new AssertableLogProvider(); ErrorReporter reporter = newErrorReporter( userLog, internalLog ); Neo4jError error = Neo4jError.fatalFrom( new TestDatabaseError() ); UUID reference = error.reference(); // when reporter.report( error ); // then userLog.assertContainsLogCallContaining( "Client triggered an unexpected error" ); userLog.assertContainsLogCallContaining( reference.toString() ); userLog.assertContainsLogCallContaining( "Database error" ); internalLog.assertContainsLogCallContaining( reference.toString() ); internalLog.assertContainsLogCallContaining( "Database error" ); }
@Test public void shouldLogJobFailure() throws Exception { // Given createNode( map( name, "irrelephant" ), FIRST ); AssertableLogProvider logProvider = new AssertableLogProvider(); FlippableIndexProxy index = mock( FlippableIndexProxy.class ); IndexPopulator populator = spy( indexPopulator( false ) ); IndexPopulationJob job = newIndexPopulationJob( populator, index, indexStoreView, logProvider, EntityType.NODE, indexDescriptor( FIRST, name, false ) ); Throwable failure = new IllegalStateException( "not successful" ); doThrow( failure ).when( populator ).create(); // When job.run(); // Then LogMatcherBuilder match = inLog( IndexPopulationJob.class ); logProvider.assertAtLeastOnce( match.error( is( "Failed to populate index: [:FIRST(name)]" ), sameInstance( failure ) ) ); }
@Test public void shouldLogFailedRule() { AssertableLogProvider logProvider = new AssertableLogProvider(); PreFlightTasks check = new PreFlightTasks( logProvider, getWithOneFailingRule() ); check.run(); logProvider.assertExactly( inLog( PreFlightTasks.class ).error( "blah blah" ) ); }