package com.getsentry.raven.logback; import ch.qos.logback.classic.Level; import ch.qos.logback.core.BasicStatusManager; import ch.qos.logback.core.Context; import ch.qos.logback.core.status.OnConsoleStatusListener; import mockit.*; import com.getsentry.raven.Raven; import com.getsentry.raven.RavenFactory; import com.getsentry.raven.dsn.Dsn; import com.getsentry.raven.environment.RavenEnvironment; import com.getsentry.raven.event.Event; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class SentryAppenderFailuresTest { @Injectable private Raven mockRaven = null; @Injectable private Context mockContext = null; @SuppressWarnings("unused") @Mocked("ravenInstance") private RavenFactory mockRavenFactory; @BeforeMethod public void setUp() throws Exception { new MockUpStatusPrinter(); new NonStrictExpectations() {{ final BasicStatusManager statusManager = new BasicStatusManager(); final OnConsoleStatusListener listener = new OnConsoleStatusListener(); listener.start(); statusManager.add(listener); mockContext.getStatusManager(); result = statusManager; }}; } @Test public void testRavenFailureDoesNotPropagate() throws Exception { final SentryAppender sentryAppender = new SentryAppender(mockRaven); sentryAppender.setContext(mockContext); sentryAppender.setMinLevel("ALL"); new NonStrictExpectations() {{ mockRaven.sendEvent((Event) any); result = new UnsupportedOperationException(); }}; sentryAppender.start(); sentryAppender.append(new MockUpLoggingEvent(null, null, Level.INFO, null, null, null).getMockInstance()); new Verifications() {{ mockRaven.sendEvent((Event) any); }}; assertThat(mockContext.getStatusManager().getCount(), is(1)); } @Test public void testRavenFactoryFailureDoesNotPropagate() throws Exception { final String dsnUri = "proto://private:public@host/1"; final SentryAppender sentryAppender = new SentryAppender(); sentryAppender.setContext(mockContext); sentryAppender.setDsn(dsnUri); new Expectations() {{ RavenFactory.ravenInstance(withEqual(new Dsn(dsnUri)), anyString); result = new UnsupportedOperationException(); }}; sentryAppender.start(); sentryAppender.initRaven(); assertThat(mockContext.getStatusManager().getCount(), is(1)); } @Test public void testAppendFailIfCurrentThreadSpawnedByRaven() throws Exception { RavenEnvironment.startManagingThread(); try { final SentryAppender sentryAppender = new SentryAppender(mockRaven); sentryAppender.setContext(mockContext); sentryAppender.start(); sentryAppender.append(new MockUpLoggingEvent(null, null, Level.INFO, null, null, null).getMockInstance()); new Verifications() {{ mockRaven.sendEvent((Event) any); times = 0; }}; assertThat(mockContext.getStatusManager().getCount(), is(0)); } finally { RavenEnvironment.stopManagingThread(); } } }