package com.getsentry.raven.log4j2; import mockit.*; import com.getsentry.raven.Raven; import com.getsentry.raven.RavenFactory; import com.getsentry.raven.dsn.Dsn; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class SentryAppenderCloseTest { private MockUpErrorHandler mockUpErrorHandler; @Injectable private Raven mockRaven = null; @SuppressWarnings("unused") @Mocked("ravenInstance") private RavenFactory mockRavenFactory = null; @SuppressWarnings("unused") @Mocked("dsnLookup") private Dsn mockDsn = null; @BeforeMethod public void setUp() throws Exception { mockUpErrorHandler = new MockUpErrorHandler(); } private void assertNoErrorsInErrorHandler() throws Exception { assertThat(mockUpErrorHandler.getErrorCount(), is(0)); } @Test public void testConnectionClosedWhenAppenderStopped() throws Exception { final SentryAppender sentryAppender = new SentryAppender(mockRaven); sentryAppender.setHandler(mockUpErrorHandler.getMockInstance()); sentryAppender.start(); sentryAppender.stop(); new Verifications() {{ mockRaven.closeConnection(); }}; assertNoErrorsInErrorHandler(); } @Test public void testStopIfRavenInstanceNotProvided() throws Exception { final String dsnUri = "protocol://public:private@host/1"; final SentryAppender sentryAppender = new SentryAppender(); sentryAppender.setHandler(mockUpErrorHandler.getMockInstance()); new Expectations() {{ Dsn.dsnLookup(); result = dsnUri; RavenFactory.ravenInstance(withEqual(new Dsn(dsnUri)), anyString); result = mockRaven; }}; sentryAppender.start(); sentryAppender.append(null); sentryAppender.stop(); new Verifications() {{ mockRaven.closeConnection(); }}; //One error, because of the null event. assertThat(mockUpErrorHandler.getErrorCount(), is(1)); } @Test public void testStopDoNotFailIfInitFailed() throws Exception { // This checks that even if sentry wasn't setup correctly its appender can still be closed. final SentryAppender sentryAppender = new SentryAppender(); sentryAppender.setHandler(mockUpErrorHandler.getMockInstance()); new NonStrictExpectations() {{ RavenFactory.ravenInstance((Dsn) any, anyString); result = new UnsupportedOperationException(); }}; sentryAppender.start(); sentryAppender.append(null); sentryAppender.stop(); //Two errors, one because of the exception, one because of the null event. assertThat(mockUpErrorHandler.getErrorCount(), is(2)); } @Test public void testStopDoNotFailIfNoInit() throws Exception { final SentryAppender sentryAppender = new SentryAppender(); sentryAppender.setHandler(mockUpErrorHandler.getMockInstance()); sentryAppender.stop(); assertNoErrorsInErrorHandler(); } @Test public void testStopDoNotFailWhenMultipleCalls() throws Exception { final SentryAppender sentryAppender = new SentryAppender(mockRaven); sentryAppender.setHandler(mockUpErrorHandler.getMockInstance()); sentryAppender.start(); sentryAppender.stop(); sentryAppender.stop(); new Verifications() {{ mockRaven.closeConnection(); times = 1; }}; assertNoErrorsInErrorHandler(); } }