@Test public void mustLogExceptions() { logMethod.log( logger, "MESSAGE", new ArithmeticException( "EXCEPTION" ) ); logProvider.assertContainsLogCallContaining( "MESSAGE" ); logProvider.assertContainsLogCallContaining( "ArithmeticException" ); logProvider.assertContainsLogCallContaining( "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 upgradeShouldGiveProgressMonitorProgressMessages() throws Exception { // Given PageCache pageCache = pageCacheRule.getPageCache( fileSystem ); UpgradableDatabase upgradableDatabase = getUpgradableDatabase( pageCache ); // When AssertableLogProvider logProvider = new AssertableLogProvider(); newUpgrader( upgradableDatabase, pageCache, allowMigrateConfig, new VisibleMigrationProgressMonitor( logProvider.getLog( "test" ) ) ).migrateIfNeeded( databaseLayout ); // Then logProvider.assertContainsLogCallContaining( "Store files" ); logProvider.assertContainsLogCallContaining( "Indexes" ); logProvider.assertContainsLogCallContaining( "Counts store" ); logProvider.assertContainsLogCallContaining( "Successfully finished" ); }
@Test public void logMessagesAboutConstraintCreation() throws SchemaKernelException, UniquePropertyValueValidationException, TransactionFailureException, IndexNotFoundKernelException { StubKernel kernel = new StubKernel(); IndexProxy indexProxy = mock( IndexProxy.class ); IndexingService indexingService = mock( IndexingService.class ); when( indexingService.getIndexProxy( INDEX_ID ) ).thenReturn( indexProxy ); when( indexingService.getIndexProxy( descriptor ) ).thenReturn( indexProxy ); when( indexProxy.getDescriptor() ).thenReturn( index.withId( INDEX_ID ).withoutCapabilities() ); NodePropertyAccessor propertyAccessor = mock( NodePropertyAccessor.class ); ConstraintIndexCreator creator = new ConstraintIndexCreator( () -> kernel, indexingService, propertyAccessor, logProvider ); KernelTransactionImplementation transaction = createTransaction(); creator.createUniquenessConstraintIndex( transaction, descriptor, "indexProviderByName-1.0" ); logProvider.assertContainsLogCallContaining( "Starting constraint creation: %s." ); logProvider.assertContainsLogCallContaining( "Constraint %s populated, starting verification." ); logProvider.assertContainsLogCallContaining( "Constraint %s verified." ); }
@Test public void scanStoreMustLogCrashPointerCleanupDuringRecovery() throws Exception { // given dirtyDatabase(); // when AssertableLogProvider logProvider = new AssertableLogProvider( true ); factory.setUserLogProvider( logProvider ); factory.setInternalLogProvider( logProvider ); startDatabase().shutdown(); // then logProvider.assertContainsLogCallContaining( "Label index cleanup job registered" ); logProvider.assertContainsLogCallContaining( "Label index cleanup job started" ); logProvider.assertContainsMessageMatching( Matchers.stringContainsInOrder( Iterables.asIterable( "Label index cleanup job finished", "Number of pages visited", "Number of cleaned crashed pointers", "Time spent" ) ) ); logProvider.assertContainsLogCallContaining( "Label index cleanup job closed" ); }
@Test void terminateExpiredTransactions() { HashSet<KernelTransactionHandle> transactions = new HashSet<>(); KernelTransactionImplementation tx1 = prepareTxMock( 3, 1, 3 ); KernelTransactionImplementation tx2 = prepareTxMock( 4, 1, 8 ); KernelTransactionImplementationHandle handle1 = new KernelTransactionImplementationHandle( tx1, fakeClock ); KernelTransactionImplementationHandle handle2 = new KernelTransactionImplementationHandle( tx2, fakeClock ); transactions.add( handle1 ); transactions.add( handle2 ); when( kernelTransactions.activeTransactions()).thenReturn( transactions ); KernelTransactionMonitor transactionMonitor = buildTransactionMonitor(); fakeClock.forward( 3, TimeUnit.MILLISECONDS ); transactionMonitor.run(); verify( tx1, never() ).markForTermination( Status.Transaction.TransactionTimedOut ); verify( tx2, never() ).markForTermination( Status.Transaction.TransactionTimedOut ); logProvider.assertNoMessagesContaining( "timeout" ); fakeClock.forward( 2, TimeUnit.MILLISECONDS ); transactionMonitor.run(); verify( tx1 ).markForTermination( EXPECTED_REUSE_COUNT, Status.Transaction.TransactionTimedOut ); verify( tx2, never() ).markForTermination( Status.Transaction.TransactionTimedOut ); logProvider.assertContainsLogCallContaining( "timeout" ); logProvider.clear(); fakeClock.forward( 10, TimeUnit.MILLISECONDS ); transactionMonitor.run(); verify( tx2 ).markForTermination( EXPECTED_REUSE_COUNT, Status.Transaction.TransactionTimedOut ); logProvider.assertContainsLogCallContaining( "timeout" ); }
@Test public void databaseWithCriticalErrorsCanNotBeHealed() { AssertableLogProvider logProvider = new AssertableLogProvider(); DatabaseHealth databaseHealth = new DatabaseHealth( mock( DatabasePanicEventGenerator.class ), logProvider.getLog( DatabaseHealth.class ) ); assertTrue( databaseHealth.isHealthy() ); IOException criticalException = new IOException( "Space exception.", new OutOfMemoryError( "Out of memory." ) ); databaseHealth.panic( criticalException ); assertFalse( databaseHealth.isHealthy() ); assertFalse( databaseHealth.healed() ); logProvider.assertNoMessagesContaining( "Database health set to OK" ); logProvider.assertContainsLogCallContaining( "Database encountered a critical error and can't be healed. Restart required." ); } }
@Test public void healDatabaseWithoutCriticalErrors() { AssertableLogProvider logProvider = new AssertableLogProvider(); DatabaseHealth databaseHealth = new DatabaseHealth( mock( DatabasePanicEventGenerator.class ), logProvider.getLog( DatabaseHealth.class ) ); assertTrue( databaseHealth.isHealthy() ); databaseHealth.panic( new IOException( "Space exception." ) ); assertFalse( databaseHealth.isHealthy() ); assertTrue( databaseHealth.healed() ); logProvider.assertContainsLogCallContaining( "Database health set to OK" ); logProvider.assertNoMessagesContaining( "Database encountered a critical error and can't be healed. Restart required." ); }
@Test public void shouldReportCorrectInitialStateIfIndexDoesntExist() { // given provider = newProvider(); // when InternalIndexState state = provider.getInitialState( descriptor() ); // then InternalIndexState expected = expectedStateOnNonExistingSubIndex(); assertEquals( expected, state ); if ( InternalIndexState.POPULATING == expected ) { logging.assertContainsLogCallContaining( "Failed to open index" ); } else { logging.assertNoLogCallContaining( "Failed to open index" ); } }
@Test public void shouldLogHelpfullyWhenPluginJarIsCorrupt() throws Exception { // given URL theJar = createJarFor( ClassWithOneProcedure.class, ClassWithAnotherProcedure.class, ClassWithNoProcedureAtAll.class ); corruptJar( theJar ); AssertableLogProvider logProvider = new AssertableLogProvider( true ); ProcedureJarLoader jarloader = new ProcedureJarLoader( new ReflectiveProcedureCompiler( new TypeMappers(), new ComponentRegistry(), registryWithUnsafeAPI(), log, procedureConfig() ), logProvider.getLog( ProcedureJarLoader.class ) ); // when try { jarloader.loadProceduresFromDir( parentDir( theJar ) ); fail( "Should have logged and thrown exception." ); } catch ( ZipException expected ) { // then logProvider.assertContainsLogCallContaining( escapeJava( String.format( "Plugin jar file: %s corrupted.", new File( theJar.toURI() ).toPath() ) ) ); } }
@Test public void shouldWorkOnPathsWithSpaces() throws Exception { // given File fileWithSpacesInName = tmpdir.newFile( new Random().nextInt() + " some spaces in the filename" + ".jar" ); URL theJar = new JarBuilder().createJarFor( fileWithSpacesInName, ClassWithOneProcedure.class ); corruptJar( theJar ); AssertableLogProvider logProvider = new AssertableLogProvider( true ); ProcedureJarLoader jarloader = new ProcedureJarLoader( new ReflectiveProcedureCompiler( new TypeMappers(), new ComponentRegistry(), registryWithUnsafeAPI(), log, procedureConfig() ), logProvider.getLog( ProcedureJarLoader.class ) ); // when try { jarloader.loadProceduresFromDir( parentDir( theJar ) ); fail( "Should have logged and thrown exception." ); } catch ( ZipException expected ) { // then logProvider.assertContainsLogCallContaining( escapeJava( String.format( "Plugin jar file: %s corrupted.", fileWithSpacesInName.toPath() ) ) ); } }
@Test public void shouldWarnWhenCreatedWithConfiguredPageCache() { // Given Config config = Config.defaults( stringMap( GraphDatabaseSettings.mapped_memory_page_size.name(), "4096", pagecache_swapper.name(), TEST_PAGESWAPPER_NAME ) ); AssertableLogProvider logProvider = new AssertableLogProvider(); Log log = logProvider.getLog( PageCache.class ); // When ConfiguringPageCacheFactory pageCacheFactory = new ConfiguringPageCacheFactory( fsRule.get(), config, PageCacheTracer.NULL, PageCursorTracerSupplier.NULL, log, EmptyVersionContextSupplier.EMPTY, jobScheduler ); // Then try ( PageCache ignore = pageCacheFactory.getOrCreatePageCache() ) { logProvider.assertContainsLogCallContaining( "The setting unsupported.dbms.memory.pagecache.pagesize does not have any effect. It is " + "deprecated and will be removed in a future version." ); } }