From dd3f67a52f7488cdd2c482cfb2ddde6524f0c410 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 30 Sep 2026 14:44:22 +0000 Subject: [PATCH] fix: Include an error code in provider error events Co-Authored-By: rlamb@launchdarkly.com <4955475+kinyoklion@users.noreply.github.com> --- .../openfeature/serverprovider/Provider.java | 2 +- .../serverprovider/LifeCycleTest.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/launchdarkly/openfeature/serverprovider/Provider.java b/src/main/java/com/launchdarkly/openfeature/serverprovider/Provider.java index b83e3d9..987bda5 100644 --- a/src/main/java/com/launchdarkly/openfeature/serverprovider/Provider.java +++ b/src/main/java/com/launchdarkly/openfeature/serverprovider/Provider.java @@ -227,7 +227,7 @@ private void handleDataSourceStatus(DataSourceStatusProvider.Status res, Complet var message = res.getLastError() != null ? res.getLastError().toString() : "the provider has encountered a permanent error or has been shutdown"; - emitProviderError(ProviderEventDetails.builder().message(message).build()); + emitProviderError(ProviderEventDetails.builder().message(message).errorCode(ErrorCode.GENERAL).build()); } } } diff --git a/src/test/java/com/launchdarkly/openfeature/serverprovider/LifeCycleTest.java b/src/test/java/com/launchdarkly/openfeature/serverprovider/LifeCycleTest.java index 929b204..a0e8dd5 100644 --- a/src/test/java/com/launchdarkly/openfeature/serverprovider/LifeCycleTest.java +++ b/src/test/java/com/launchdarkly/openfeature/serverprovider/LifeCycleTest.java @@ -7,6 +7,7 @@ import com.launchdarkly.sdk.server.subsystems.ComponentConfigurer; import com.launchdarkly.sdk.server.subsystems.DataSource; import com.launchdarkly.sdk.server.subsystems.DataSourceUpdateSink; +import dev.openfeature.sdk.ErrorCode; import dev.openfeature.sdk.ImmutableContext; import dev.openfeature.sdk.OpenFeatureAPI; import dev.openfeature.sdk.ProviderEvent; @@ -357,6 +358,25 @@ public void itIncludesTheDataSourceErrorInErrorEvents() throws Exception { assertTrue(message.contains("bad")); } + @Test + public void itIncludesAnErrorCodeInErrorEvents() throws Exception { + var config = new LDConfig.Builder() + .startWait(Duration.ZERO) + .dataSource(new DelayedDataSourceFactory(Duration.ofMillis(100), false, true)) + .events(Components.noEvents()) + .build(); + var provider = new Provider("fake-key", config); + CompletableFuture errorCode = new CompletableFuture<>(); + + OpenFeatureAPI.getInstance().on(ProviderEvent.PROVIDER_ERROR, (detail) -> { + errorCode.complete(detail.getErrorCode()); + }); + + OpenFeatureAPI.getInstance().setProviderAndWait(provider); + + assertEquals(ErrorCode.GENERAL, errorCode.get(1000, TimeUnit.MILLISECONDS)); + } + @Test public void itIncludesHttpDataSourceErrorInErrorEvents() throws Exception { var config = new LDConfig.Builder()