diff --git a/bugsnag/src/main/java/com/bugsnag/Bugsnag.java b/bugsnag/src/main/java/com/bugsnag/Bugsnag.java index ac705502..59d9329c 100644 --- a/bugsnag/src/main/java/com/bugsnag/Bugsnag.java +++ b/bugsnag/src/main/java/com/bugsnag/Bugsnag.java @@ -318,43 +318,10 @@ public void setSendThreads(ThreadSendPolicy sendThreads) { config.setSendThreads(sendThreads); } - /** - * Set a timeout (in ms) to use when delivering Bugsnag error reports and - * sessions. - * This is a convenient shorthand for bugsnag.getDelivery().setTimeout(); - * - * @param timeout the timeout to set (in ms) - * @see #setDelivery - */ - public void setTimeout(int timeout) { - Delivery delivery = config.getDelivery(); - if (delivery instanceof HttpDelivery) { - ((HttpDelivery) delivery).setTimeout(timeout); - } - - Delivery sessionDelivery = config.getSessionDelivery(); - if (sessionDelivery instanceof HttpDelivery) { - ((HttpDelivery) sessionDelivery).setTimeout(timeout); - } - } - // // Notification // - /** - * Build an Report object to send to Bugsnag. - * - * @param throwable the exception to send to Bugsnag - * @return the report object - * @see BugsnagEvent - * @see #notify(BugsnagEvent) - */ - public BugsnagEvent buildReport(Throwable throwable) { - HandledState handledState = HandledState.newInstance( - HandledState.SeverityReasonType.REASON_HANDLED_EXCEPTION); - return new BugsnagEvent(config, throwable, handledState, Thread.currentThread(), featureFlagStore); - } /** * Notify Bugsnag of a handled exception. @@ -363,7 +330,11 @@ public BugsnagEvent buildReport(Throwable throwable) { * @return true unless the error report was ignored */ public boolean notify(Throwable throwable) { - return notify(buildReport(throwable)); + HandledState handledState = HandledState.newInstance( + HandledState.SeverityReasonType.REASON_HANDLED_EXCEPTION); + BugsnagEvent event = new BugsnagEvent(config, throwable, handledState, + Thread.currentThread(), featureFlagStore); + return notify(event); } /** @@ -374,7 +345,11 @@ public boolean notify(Throwable throwable) { * @return true unless the error report was ignored */ public boolean notify(Throwable throwable, OnErrorCallback callback) { - return notify(buildReport(throwable), callback); + HandledState handledState = HandledState.newInstance( + HandledState.SeverityReasonType.REASON_HANDLED_EXCEPTION); + BugsnagEvent event = new BugsnagEvent(config, throwable, handledState, + Thread.currentThread(), featureFlagStore); + return notify(event, callback); } /** @@ -429,7 +404,6 @@ public boolean notify(Throwable throwable, Severity severity, OnErrorCallback ca * @param event the {@link BugsnagEvent} object to send to Bugsnag * @return true unless the error report was ignored * @see BugsnagEvent - * @see #buildReport */ public boolean notify(BugsnagEvent event) { return notify(event, null); @@ -448,7 +422,6 @@ boolean notify(Throwable throwable, HandledState handledState, Thread currentThr * @param reportCallback the {@link OnErrorCallback} object to run for this Report * @return false if the error report was ignored * @see BugsnagEvent - * @see #buildReport */ public boolean notify(BugsnagEvent event, OnErrorCallback reportCallback) { if (event == null) { @@ -748,4 +721,13 @@ public void clearFeatureFlags() { FeatureFlagStore copyFeatureFlagStore() { return featureFlagStore.copy(); } + + /** + * Get a copy of the feature flag store (package-private for testing). + * + * @return a copy of the feature flag store + */ + FeatureFlagStore getFeatureFlagStoreCopy() { + return featureFlagStore.copy(); + } } diff --git a/bugsnag/src/main/java/com/bugsnag/BugsnagAppender.java b/bugsnag/src/main/java/com/bugsnag/BugsnagAppender.java index 9947cc88..ce6f41dd 100644 --- a/bugsnag/src/main/java/com/bugsnag/BugsnagAppender.java +++ b/bugsnag/src/main/java/com/bugsnag/BugsnagAppender.java @@ -71,8 +71,6 @@ public class BugsnagAppender extends UnsynchronizedAppenderBase { /** Whether thread state should be sent to Bugsnag. */ private ThreadSendPolicy sendThreads = ThreadSendPolicy.NEVER; - /** Bugsnag API request timeout. */ - private int timeout; /** Application version. */ private String appVersion; @@ -258,9 +256,6 @@ private Bugsnag createBugsnag() { bugsnag.setReleaseStage(releaseStage); } - if (timeout > 0) { - bugsnag.setTimeout(timeout); - } if (!redactedKeys.isEmpty()) { bugsnag.setRedactedKeys(redactedKeys.toArray(new String[0])); @@ -537,16 +532,6 @@ public void setSendThreads(ThreadSendPolicy sendThreads) { } } - /** - * @see Bugsnag#setTimeout(int) - */ - public void setTimeout(int timeout) { - this.timeout = timeout; - - if (bugsnag != null) { - bugsnag.setTimeout(timeout); - } - } /** * @see Bugsnag#setAppVersion(String) diff --git a/bugsnag/src/main/java/com/bugsnag/EndpointConfiguration.java b/bugsnag/src/main/java/com/bugsnag/EndpointConfiguration.java index d129028d..60e8582a 100644 --- a/bugsnag/src/main/java/com/bugsnag/EndpointConfiguration.java +++ b/bugsnag/src/main/java/com/bugsnag/EndpointConfiguration.java @@ -4,9 +4,9 @@ public class EndpointConfiguration { private static final String DEFAULT_NOTIFY_ENDPOINT = "https://notify.bugsnag.com"; private static final String DEFAULT_SESSION_ENDPOINT = "https://sessions.bugsnag.com"; - private static final String HUB_NOTIFY_ENDPOINT = "https://notify.insighthub.smartbear.com"; - private static final String HUB_SESSION_ENDPOINT = "https://sessions.insighthub.smartbear.com"; - private static final String HUB_KEY_PREFIX = "00000"; + private static final String SECONDARY_NOTIFY_ENDPOINT = "https://notify.bugsnag.smartbear.com"; + private static final String SECONDARY_SESSION_ENDPOINT = "https://sessions.bugsnag.smartbear.com"; + private static final String SECONDARY_KEY_PREFIX = "00000"; private final String notifyEndpoint; private final String sessionEndpoint; @@ -30,8 +30,8 @@ public EndpointConfiguration(String notify, String sessions) { * Constructs an EndpointConfiguration with default notify and session endpoints. */ public static EndpointConfiguration fromApiKey(String apiKey) { - if (apiKey != null && apiKey.startsWith(HUB_KEY_PREFIX)) { - return new EndpointConfiguration(HUB_NOTIFY_ENDPOINT, HUB_SESSION_ENDPOINT); + if (apiKey != null && apiKey.startsWith(SECONDARY_KEY_PREFIX)) { + return new EndpointConfiguration(SECONDARY_NOTIFY_ENDPOINT, SECONDARY_SESSION_ENDPOINT); } else { return new EndpointConfiguration(DEFAULT_NOTIFY_ENDPOINT, DEFAULT_SESSION_ENDPOINT); } diff --git a/bugsnag/src/test/java/com/bugsnag/BugsnagFeatureFlagTest.java b/bugsnag/src/test/java/com/bugsnag/BugsnagFeatureFlagTest.java index 20ab1404..bb631f00 100644 --- a/bugsnag/src/test/java/com/bugsnag/BugsnagFeatureFlagTest.java +++ b/bugsnag/src/test/java/com/bugsnag/BugsnagFeatureFlagTest.java @@ -26,11 +26,18 @@ public void tearDown() { bugsnag.close(); } + private BugsnagEvent createEvent(Bugsnag client, Exception exception) { + HandledState handledState = HandledState.newInstance( + HandledState.SeverityReasonType.REASON_HANDLED_EXCEPTION); + return new BugsnagEvent(client.getConfig(), exception, handledState, + Thread.currentThread(), client.getFeatureFlagStoreCopy()); + } + @Test public void testAddFeatureFlag() { bugsnag.addFeatureFlag("flag1", "variant-a"); - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); List flags = event.getFeatureFlags(); assertEquals(1, flags.size()); @@ -42,7 +49,7 @@ public void testAddFeatureFlag() { public void testAddFeatureFlagWithoutVariant() { bugsnag.addFeatureFlag("flag1"); - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); List flags = event.getFeatureFlags(); assertEquals(1, flags.size()); @@ -58,7 +65,7 @@ public void testAddFeatureFlags() { bugsnag.addFeatureFlags(flagsToAdd); - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); List flags = event.getFeatureFlags(); assertEquals(2, flags.size()); @@ -72,7 +79,7 @@ public void testClearFeatureFlag() { bugsnag.addFeatureFlag("flag2", "variant-b"); bugsnag.clearFeatureFlag("flag1"); - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); List flags = event.getFeatureFlags(); assertEquals(1, flags.size()); @@ -85,7 +92,7 @@ public void testClearFeatureFlags() { bugsnag.addFeatureFlag("flag2", "variant-b"); bugsnag.clearFeatureFlags(); - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); List flags = event.getFeatureFlags(); assertEquals(0, flags.size()); @@ -99,7 +106,7 @@ public void testClientFlagsInheritFromConfiguration() { Bugsnag client = new Bugsnag("api-key", false); client.getConfig().addFeatureFlag("config-flag", "config-variant"); - BugsnagEvent event = client.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(client, new RuntimeException("Test")); List flags = event.getFeatureFlags(); assertEquals(1, flags.size()); @@ -118,7 +125,7 @@ public void testClientFlagsOverrideConfigurationFlags() { client.getConfig().addFeatureFlag("flag1", "config-variant"); client.addFeatureFlag("flag1", "client-variant"); - BugsnagEvent event = client.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(client, new RuntimeException("Test")); List flags = event.getFeatureFlags(); assertEquals(1, flags.size()); @@ -139,7 +146,7 @@ public void testFeatureFlagOrderPreservedAcrossScopes() { client.getConfig().addFeatureFlag("flag2", "config-variant"); client.addFeatureFlag("flag3", "client-variant"); - BugsnagEvent event = client.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(client, new RuntimeException("Test")); List flags = event.getFeatureFlags(); assertEquals(3, flags.size()); diff --git a/bugsnag/src/test/java/com/bugsnag/ConfigurationTest.java b/bugsnag/src/test/java/com/bugsnag/ConfigurationTest.java index 068c7567..7e08b0d4 100644 --- a/bugsnag/src/test/java/com/bugsnag/ConfigurationTest.java +++ b/bugsnag/src/test/java/com/bugsnag/ConfigurationTest.java @@ -26,7 +26,7 @@ public class ConfigurationTest { - private static final String HUB_KEY = "00000aaaaaaaaaaaaaaaaaaaaaaaaaaa"; + private static final String SECONDARY_KEY = "00000aaaaaaaaaaaaaaaaaaaaaaaaaaa"; private static final String CLASSIC_KEY = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; private Configuration config; @@ -176,14 +176,14 @@ public void testStaticEndpointHelpers() { assertEquals(defaultSessionEndpoint, normalConfig.getSessionEndpoint()); - String hubNotifyEndpoint = "https://notify.insighthub.smartbear.com"; - String hubSessionEndpoint = "https://sessions.insighthub.smartbear.com"; - EndpointConfiguration hubConfig = EndpointConfiguration.fromApiKey(HUB_KEY); + String secondaryNotifyEndpoint = "https://notify.bugsnag.smartbear.com"; + String secondarySessionEndpoint = "https://sessions.bugsnag.smartbear.com"; + EndpointConfiguration secondaryConfig = EndpointConfiguration.fromApiKey(SECONDARY_KEY); - assertEquals(hubNotifyEndpoint, - hubConfig.getNotifyEndpoint()); - assertEquals(hubSessionEndpoint, - hubConfig.getSessionEndpoint()); + assertEquals(secondaryNotifyEndpoint, + secondaryConfig.getNotifyEndpoint()); + assertEquals(secondarySessionEndpoint, + secondaryConfig.getSessionEndpoint()); } diff --git a/bugsnag/src/test/java/com/bugsnag/EventFeatureFlagTest.java b/bugsnag/src/test/java/com/bugsnag/EventFeatureFlagTest.java index 52287070..98abc148 100644 --- a/bugsnag/src/test/java/com/bugsnag/EventFeatureFlagTest.java +++ b/bugsnag/src/test/java/com/bugsnag/EventFeatureFlagTest.java @@ -1,6 +1,7 @@ package com.bugsnag; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import org.junit.After; import org.junit.Before; @@ -26,9 +27,16 @@ public void tearDown() { bugsnag.close(); } + private BugsnagEvent createEvent(Bugsnag client, Exception exception) { + HandledState handledState = HandledState.newInstance( + HandledState.SeverityReasonType.REASON_HANDLED_EXCEPTION); + return new BugsnagEvent(client.getConfig(), exception, handledState, + Thread.currentThread(), client.getFeatureFlagStoreCopy()); + } + @Test public void testAddFeatureFlagOnReport() { - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); event.addFeatureFlag("report-flag", "report-variant"); List flags = event.getFeatureFlags(); @@ -40,23 +48,23 @@ public void testAddFeatureFlagOnReport() { @Test public void testAddFeatureFlagWithoutVariant() { - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); event.addFeatureFlag("report-flag"); List flags = event.getFeatureFlags(); assertEquals(1, flags.size()); assertEquals("report-flag", flags.get(0).getName()); - assertEquals(null, flags.get(0).getVariant()); + assertNull(flags.get(0).getVariant()); } @Test public void testAddFeatureFlags() { - List flagsToAdd = new ArrayList(); + List flagsToAdd = new ArrayList<>(); flagsToAdd.add(FeatureFlag.of("flag1", "variant-a")); flagsToAdd.add(FeatureFlag.of("flag2", "variant-b")); - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); event.addFeatureFlags(flagsToAdd); List flags = event.getFeatureFlags(); @@ -68,7 +76,7 @@ public void testAddFeatureFlags() { @Test public void testClearFeatureFlag() { - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); event.addFeatureFlag("flag1", "variant-a"); event.addFeatureFlag("flag2", "variant-b"); event.clearFeatureFlag("flag1"); @@ -81,7 +89,7 @@ public void testClearFeatureFlag() { @Test public void testClearFeatureFlags() { - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); event.addFeatureFlag("flag1", "variant-a"); event.addFeatureFlag("flag2", "variant-b"); event.clearFeatureFlags(); @@ -95,7 +103,7 @@ public void testClearFeatureFlags() { public void testReportFlagsInheritFromClient() { bugsnag.addFeatureFlag("client-flag", "client-variant"); - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); List flags = event.getFeatureFlags(); assertEquals(1, flags.size()); @@ -107,7 +115,7 @@ public void testReportFlagsInheritFromClient() { public void testReportFlagsOverrideClientFlags() { bugsnag.addFeatureFlag("flag1", "client-variant"); - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); event.addFeatureFlag("flag1", "report-variant"); List flags = event.getFeatureFlags(); @@ -128,7 +136,7 @@ public void testFeatureFlagOrderAcrossAllScopes() { bugsnag.addFeatureFlag("flag3", "client-variant"); // Add flags to report (one new, one override) - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); event.addFeatureFlag("flag3", "report-variant"); event.addFeatureFlag("flag4", "report-variant"); @@ -152,7 +160,7 @@ public void testClearAndReAddChangesPosition() { bugsnag.getConfig().addFeatureFlag("flag2", "value2"); bugsnag.getConfig().clearFeatureFlag("flag1"); - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); event.addFeatureFlag("flag1", "value1-readded"); List flags = event.getFeatureFlags(); @@ -166,7 +174,7 @@ public void testClearAndReAddChangesPosition() { @Test public void testFeatureFlagChaining() { - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); event.addFeatureFlag("flag1", "variant-a") .addFeatureFlag("flag2", "variant-b") @@ -192,7 +200,7 @@ public void testMultipleScopesMaintainInsertionOrder() { // Report adds flag1 with updated value (overrides config value but keeps position) // and adds flag2 with updated value - BugsnagEvent event = bugsnag.buildReport(new RuntimeException("Test")); + BugsnagEvent event = createEvent(bugsnag, new RuntimeException("Test")); event.addFeatureFlag("flag1", "value1-updated"); event.addFeatureFlag("flag2", "value2-updated"); diff --git a/bugsnag/src/test/java/com/bugsnag/JakartaServletCallbackTest.java b/bugsnag/src/test/java/com/bugsnag/JakartaServletCallbackTest.java index d1702d24..3725472f 100644 --- a/bugsnag/src/test/java/com/bugsnag/JakartaServletCallbackTest.java +++ b/bugsnag/src/test/java/com/bugsnag/JakartaServletCallbackTest.java @@ -81,7 +81,8 @@ public void closeBugsnag() { @SuppressWarnings("unchecked") @Test public void testRequestMetadataAdded() { - BugsnagEvent event = generateReport(new java.lang.Exception("Spline reticulation failed")); + BugsnagEvent event = new BugsnagEvent(bugsnag.getConfig(), + new java.lang.Exception("Spline reticulation failed")); JakartaServletCallback callback = new JakartaServletCallback(); callback.onError(event); @@ -118,7 +119,8 @@ public void testRequestMetadataAdded() { @Test public void testRequestContextSet() { - BugsnagEvent event = generateReport(new java.lang.Exception("Spline reticulation failed")); + BugsnagEvent event = new BugsnagEvent(bugsnag.getConfig(), + new java.lang.Exception("Spline reticulation failed")); JakartaServletCallback callback = new JakartaServletCallback(); callback.onError(event); @@ -127,7 +129,8 @@ public void testRequestContextSet() { @Test public void testExistingContextNotOverridden() { - BugsnagEvent event = generateReport(new java.lang.Exception("Spline reticulation failed")); + BugsnagEvent event = new BugsnagEvent(bugsnag.getConfig(), + new java.lang.Exception("Spline reticulation failed")); event.setContext("Honey nut corn flakes"); JakartaServletCallback callback = new JakartaServletCallback(); callback.onError(event); @@ -135,10 +138,6 @@ public void testExistingContextNotOverridden() { assertEquals("Honey nut corn flakes", event.getContext()); } - private BugsnagEvent generateReport(java.lang.Exception exception) { - return bugsnag.buildReport(exception); - } - private Enumeration stringsToEnumeration(String... strings) { return Collections.enumeration(Arrays.asList(strings)); }