diff --git a/.github/workflows/merge.yml b/.github/workflows/merge.yml index ecb443b8..2a1277ea 100644 --- a/.github/workflows/merge.yml +++ b/.github/workflows/merge.yml @@ -32,7 +32,7 @@ jobs: server-password: ${{ secrets.OSSRH_PASSWORD }} - name: Cache local Maven repository - uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c + uses: actions/cache@a2ed59d39b352305bdd2f628719a53b2cc4f9613 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} @@ -49,7 +49,7 @@ jobs: run: mvn --batch-mode --update-snapshots verify - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3.1.4 + uses: codecov/codecov-action@v4.0.1 with: token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos flags: unittests # optional diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml index e47bb931..99d8c2cf 100644 --- a/.github/workflows/pullrequest.yml +++ b/.github/workflows/pullrequest.yml @@ -20,12 +20,12 @@ jobs: cache: maven - name: Initialize CodeQL - uses: github/codeql-action/init@96531062ba46eb11dee25758db76518ad30ee4cf + uses: github/codeql-action/init@4075abfb065d705660b25161b8db80d9181f0f9a with: languages: java - name: Cache local Maven repository - uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c + uses: actions/cache@a2ed59d39b352305bdd2f628719a53b2cc4f9613 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} @@ -36,7 +36,7 @@ jobs: run: mvn --batch-mode --update-snapshots --activate-profiles e2e verify - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3.1.4 + uses: codecov/codecov-action@v4.0.1 with: token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos flags: unittests # optional @@ -45,4 +45,4 @@ jobs: verbose: true # optional (default = false) - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@96531062ba46eb11dee25758db76518ad30ee4cf + uses: github/codeql-action/analyze@4075abfb065d705660b25161b8db80d9181f0f9a diff --git a/.github/workflows/static-code-scanning.yaml b/.github/workflows/static-code-scanning.yaml index c5754d44..aeaaa5c6 100644 --- a/.github/workflows/static-code-scanning.yaml +++ b/.github/workflows/static-code-scanning.yaml @@ -33,12 +33,12 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@96531062ba46eb11dee25758db76518ad30ee4cf + uses: github/codeql-action/init@4075abfb065d705660b25161b8db80d9181f0f9a with: languages: java - name: Autobuild - uses: github/codeql-action/autobuild@96531062ba46eb11dee25758db76518ad30ee4cf + uses: github/codeql-action/autobuild@4075abfb065d705660b25161b8db80d9181f0f9a - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@96531062ba46eb11dee25758db76518ad30ee4cf + uses: github/codeql-action/analyze@4075abfb065d705660b25161b8db80d9181f0f9a diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 0dec4881..badb68b8 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1 +1 @@ -{".":"1.7.3"} \ No newline at end of file +{".":"1.7.4"} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index acb6ff20..1deb943c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,49 @@ # Changelog +## [1.7.4](https://github.com/open-feature/java-sdk/compare/v1.7.3...v1.7.4) (2024-02-13) + + +### ๐Ÿ› Bug Fixes + +* **deps:** update dependency org.slf4j:slf4j-api to v2.0.12 ([#792](https://github.com/open-feature/java-sdk/issues/792)) ([202e7dd](https://github.com/open-feature/java-sdk/commit/202e7dd82f1c21007cdd1949947652bdf3364948)) +* **deps:** update junit5 monorepo ([#790](https://github.com/open-feature/java-sdk/issues/790)) ([1fb6712](https://github.com/open-feature/java-sdk/commit/1fb67125ce334ccd4f650b37b77c2cd3df11c380)) +* setProviderAndWait must throw ([#794](https://github.com/open-feature/java-sdk/issues/794)) ([da47b7f](https://github.com/open-feature/java-sdk/commit/da47b7f9c05372f92dac22823c41ebb4e17cb0df)) + + +### ๐Ÿงน Chore + +* **deps:** update actions/cache digest to 13aacd8 ([#770](https://github.com/open-feature/java-sdk/issues/770)) ([877fa07](https://github.com/open-feature/java-sdk/commit/877fa07e5f8323711fbd57acc145fd9afb1be61d)) +* **deps:** update actions/cache digest to a2ed59d ([#772](https://github.com/open-feature/java-sdk/issues/772)) ([4da6edd](https://github.com/open-feature/java-sdk/commit/4da6edd3b0e387d727a891f6b285a7caf8d84f7e)) +* **deps:** update codecov/codecov-action action to v3.1.5 ([#779](https://github.com/open-feature/java-sdk/issues/779)) ([2ccc855](https://github.com/open-feature/java-sdk/commit/2ccc8557fa7fb805c885d0b51315095d5d408cd1)) +* **deps:** update codecov/codecov-action action to v3.1.6 ([#783](https://github.com/open-feature/java-sdk/issues/783)) ([bab83ae](https://github.com/open-feature/java-sdk/commit/bab83aeaa957e49ad416d9b02c5c8c764ad038c5)) +* **deps:** update codecov/codecov-action action to v4 ([#784](https://github.com/open-feature/java-sdk/issues/784)) ([d2b380f](https://github.com/open-feature/java-sdk/commit/d2b380f9f49e95e58a9c6dfbcac06e278c2305c7)) +* **deps:** update codecov/codecov-action action to v4.0.1 ([#787](https://github.com/open-feature/java-sdk/issues/787)) ([8d6e33f](https://github.com/open-feature/java-sdk/commit/8d6e33f3344730fabe40adbbe0afff218d9c4b6b)) +* **deps:** update dependency com.github.spotbugs:spotbugs-maven-plugin to v4.8.3.0 ([#766](https://github.com/open-feature/java-sdk/issues/766)) ([92f8e99](https://github.com/open-feature/java-sdk/commit/92f8e9908cbf94d91dbcbd9403b071aee1be2867)) +* **deps:** update dependency com.github.spotbugs:spotbugs-maven-plugin to v4.8.3.1 ([#799](https://github.com/open-feature/java-sdk/issues/799)) ([0291a11](https://github.com/open-feature/java-sdk/commit/0291a11d91dfc107a0b70f63bcbe79d5effef50d)) +* **deps:** update dependency com.google.guava:guava to v33 ([#738](https://github.com/open-feature/java-sdk/issues/738)) ([8c9aa70](https://github.com/open-feature/java-sdk/commit/8c9aa707b81018a5c626a38acc90ea5b282e5d4d)) +* **deps:** update dependency org.assertj:assertj-core to v3.25.2 ([#777](https://github.com/open-feature/java-sdk/issues/777)) ([70a7abe](https://github.com/open-feature/java-sdk/commit/70a7abecc9b0c122b23950f6ab6dfbb42c24f89d)) +* **deps:** update dependency org.assertj:assertj-core to v3.25.3 ([#791](https://github.com/open-feature/java-sdk/issues/791)) ([1374a88](https://github.com/open-feature/java-sdk/commit/1374a880066e07ea8660675b80901d2580df4db1)) +* **deps:** update dependency org.cyclonedx:cyclonedx-maven-plugin to v2.7.11 ([#768](https://github.com/open-feature/java-sdk/issues/768)) ([27a9ac6](https://github.com/open-feature/java-sdk/commit/27a9ac68f5d64bd03ed002ec3a94e4d4bc94d7cc)) +* **deps:** update github/codeql-action digest to 1515e2b ([#796](https://github.com/open-feature/java-sdk/issues/796)) ([5159947](https://github.com/open-feature/java-sdk/commit/51599474cdcf5b58ff81a132bdd542ef1d0693f5)) +* **deps:** update github/codeql-action digest to 1615032 ([#778](https://github.com/open-feature/java-sdk/issues/778)) ([ae511d0](https://github.com/open-feature/java-sdk/commit/ae511d09a3c695cce1596fb28440b2079711c255)) +* **deps:** update github/codeql-action digest to 25f779c ([#780](https://github.com/open-feature/java-sdk/issues/780)) ([fa5ae68](https://github.com/open-feature/java-sdk/commit/fa5ae68e3065adff4f3faec6150bc7fcdd0c3e87)) +* **deps:** update github/codeql-action digest to 2eaf014 ([#774](https://github.com/open-feature/java-sdk/issues/774)) ([c028fa3](https://github.com/open-feature/java-sdk/commit/c028fa3c152b0df4c407f4c4fca3313f66ec4f6b)) +* **deps:** update github/codeql-action digest to 39cc02b ([#789](https://github.com/open-feature/java-sdk/issues/789)) ([74352ba](https://github.com/open-feature/java-sdk/commit/74352ba7206d2a86d401180fe387d7f7f78711e8)) +* **deps:** update github/codeql-action digest to 3ab1d29 ([#798](https://github.com/open-feature/java-sdk/issues/798)) ([77446c9](https://github.com/open-feature/java-sdk/commit/77446c973e1445925abcac3b1f9f659a60f85ebd)) +* **deps:** update github/codeql-action digest to 4075abf ([#800](https://github.com/open-feature/java-sdk/issues/800)) ([69f95b1](https://github.com/open-feature/java-sdk/commit/69f95b1bfdb9462d83b280037292242aa85be081)) +* **deps:** update github/codeql-action digest to 483bef1 ([#786](https://github.com/open-feature/java-sdk/issues/786)) ([9c2cbe3](https://github.com/open-feature/java-sdk/commit/9c2cbe3d5d7de6d908f18f170e424e114b6a2fa1)) +* **deps:** update github/codeql-action digest to 4d75a10 ([#769](https://github.com/open-feature/java-sdk/issues/769)) ([1eba495](https://github.com/open-feature/java-sdk/commit/1eba495acea6bc93a737ca0fc9afc2c1ae6dedbf)) +* **deps:** update github/codeql-action digest to 65c7496 ([#775](https://github.com/open-feature/java-sdk/issues/775)) ([0f5ee65](https://github.com/open-feature/java-sdk/commit/0f5ee6556ad1108da57a8969b46b191309ebb3b1)) +* **deps:** update github/codeql-action digest to 81eb6b2 ([#788](https://github.com/open-feature/java-sdk/issues/788)) ([993c4ba](https://github.com/open-feature/java-sdk/commit/993c4ba67be3d9c7482d617f9c82a789d44bea5e)) +* **deps:** update github/codeql-action digest to 932a7d5 ([#795](https://github.com/open-feature/java-sdk/issues/795)) ([d5a0620](https://github.com/open-feature/java-sdk/commit/d5a0620f590c4fb51b74fe802aefb1e282e135eb)) +* **deps:** update github/codeql-action digest to bd67d8d ([#776](https://github.com/open-feature/java-sdk/issues/776)) ([9d9ad85](https://github.com/open-feature/java-sdk/commit/9d9ad85e1f9e9b0cc4a380680a22b9cd43f3432d)) +* **deps:** update github/codeql-action digest to cf7e9f2 ([#793](https://github.com/open-feature/java-sdk/issues/793)) ([302f168](https://github.com/open-feature/java-sdk/commit/302f1688b32eff62754b0a2c5d97c261315b2e18)) +* **deps:** update github/codeql-action digest to d0c8484 ([#773](https://github.com/open-feature/java-sdk/issues/773)) ([c894337](https://github.com/open-feature/java-sdk/commit/c894337c8e6d8bec16f41cad63ec4bb1542501f2)) +* **deps:** update github/codeql-action digest to e345133 ([#785](https://github.com/open-feature/java-sdk/issues/785)) ([8e9ff90](https://github.com/open-feature/java-sdk/commit/8e9ff90985c713d7c2157ef2b19cc758f3dcbb4c)) +* **deps:** update github/codeql-action digest to eab49d7 ([#781](https://github.com/open-feature/java-sdk/issues/781)) ([d8f77e6](https://github.com/open-feature/java-sdk/commit/d8f77e6ce02a3fcc423e9f80abb9c30191618348)) +* **deps:** update github/codeql-action digest to f65ecd0 ([#771](https://github.com/open-feature/java-sdk/issues/771)) ([6926530](https://github.com/open-feature/java-sdk/commit/692653035a94ab750cfcf37872f26d1b7861aff7)) +* various improvements as suggested by sonar ([#797](https://github.com/open-feature/java-sdk/issues/797)) ([6c8657d](https://github.com/open-feature/java-sdk/commit/6c8657d5205c6d8181ecaa14fc52ee2c753d3d01)) + ## [1.7.3](https://github.com/open-feature/java-sdk/compare/v1.7.2...v1.7.3) (2024-01-12) diff --git a/README.md b/README.md index 60e73fcc..5b31fa19 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ - - Release + + Release @@ -59,7 +59,7 @@ Note that this library is intended to be used in server-side contexts and has no dev.openfeature sdk - 1.7.3 + 1.7.4 ``` @@ -84,7 +84,7 @@ If you would like snapshot builds, this is the relevant repository information: ```groovy dependencies { - implementation 'dev.openfeature:sdk:1.7.3' + implementation 'dev.openfeature:sdk:1.7.4' } ``` diff --git a/pom.xml b/pom.xml index a5280ace..36438654 100644 --- a/pom.xml +++ b/pom.xml @@ -4,13 +4,13 @@ dev.openfeature sdk - 1.7.3 + 1.7.4 UTF-8 1.8 ${maven.compiler.source} - 5.10.1 + 5.10.2 **/e2e/*.java ${groupId}.${artifactId} @@ -60,7 +60,7 @@ org.slf4j slf4j-api - 2.0.11 + 2.0.12 @@ -74,7 +74,7 @@ org.assertj assertj-core - 3.25.1 + 3.25.3 test @@ -109,7 +109,7 @@ org.junit.platform junit-platform-suite - 1.10.1 + 1.10.2 test @@ -135,7 +135,7 @@ com.google.guava guava - 32.1.3-jre + 33.0.0-jre test @@ -162,7 +162,7 @@ org.junit junit-bom - 5.10.1 + 5.10.2 pom import @@ -175,7 +175,7 @@ org.cyclonedx cyclonedx-maven-plugin - 2.7.10 + 2.7.11 library 1.3 @@ -349,7 +349,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.8.2.0 + 4.8.3.1 spotbugs-exclusions.xml diff --git a/src/main/java/dev/openfeature/sdk/EventSupport.java b/src/main/java/dev/openfeature/sdk/EventSupport.java index 7f616554..f9bb67dd 100644 --- a/src/main/java/dev/openfeature/sdk/EventSupport.java +++ b/src/main/java/dev/openfeature/sdk/EventSupport.java @@ -163,8 +163,8 @@ static class HandlerStore { private final Map>> handlerMap; - { - handlerMap = new ConcurrentHashMap>>(); + HandlerStore() { + handlerMap = new ConcurrentHashMap<>(); handlerMap.put(ProviderEvent.PROVIDER_READY, new ArrayList<>()); handlerMap.put(ProviderEvent.PROVIDER_CONFIGURATION_CHANGED, new ArrayList<>()); handlerMap.put(ProviderEvent.PROVIDER_ERROR, new ArrayList<>()); diff --git a/src/main/java/dev/openfeature/sdk/ImmutableStructure.java b/src/main/java/dev/openfeature/sdk/ImmutableStructure.java index 7ea1ef65..d70a0163 100644 --- a/src/main/java/dev/openfeature/sdk/ImmutableStructure.java +++ b/src/main/java/dev/openfeature/sdk/ImmutableStructure.java @@ -40,7 +40,7 @@ public ImmutableStructure(Map attributes) { .collect(HashMap::new, (accumulated, entry) -> accumulated.put(entry.getKey(), Optional.ofNullable(entry.getValue()) - .map(e -> e.clone()) + .map(Value::clone) .orElse(null)), HashMap::putAll))); } @@ -70,7 +70,7 @@ public Map asMap() { .collect(HashMap::new, (accumulated, entry) -> accumulated.put(entry.getKey(), Optional.ofNullable(entry.getValue()) - .map(e -> e.clone()) + .map(Value::clone) .orElse(null)), HashMap::putAll); } diff --git a/src/main/java/dev/openfeature/sdk/MutableContext.java b/src/main/java/dev/openfeature/sdk/MutableContext.java index 9e7069ca..42fc90f5 100644 --- a/src/main/java/dev/openfeature/sdk/MutableContext.java +++ b/src/main/java/dev/openfeature/sdk/MutableContext.java @@ -145,7 +145,7 @@ public MutableStructure add(String ignoredKey, List ignoredValue) { return null; } - public MutableStructure add(String ignoredKey, MutableStructure ignoredValue) { + public MutableStructure add(String ignoredKey, Structure ignoredValue) { return null; } diff --git a/src/main/java/dev/openfeature/sdk/MutableStructure.java b/src/main/java/dev/openfeature/sdk/MutableStructure.java index 3c4f34dd..fadd6805 100644 --- a/src/main/java/dev/openfeature/sdk/MutableStructure.java +++ b/src/main/java/dev/openfeature/sdk/MutableStructure.java @@ -75,7 +75,7 @@ public MutableStructure add(String key, Structure value) { return this; } - public MutableStructure add(String key, List value) { + public MutableStructure add(String key, List value) { attributes.put(key, new Value(value)); return this; } diff --git a/src/main/java/dev/openfeature/sdk/NoOpProvider.java b/src/main/java/dev/openfeature/sdk/NoOpProvider.java index d3d9ca21..ef8cf1f8 100644 --- a/src/main/java/dev/openfeature/sdk/NoOpProvider.java +++ b/src/main/java/dev/openfeature/sdk/NoOpProvider.java @@ -18,12 +18,7 @@ public ProviderState getState() { @Override public Metadata getMetadata() { - return new Metadata() { - @Override - public String getName() { - return name; - } - }; + return () -> name; } @Override diff --git a/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java b/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java index 7448ad78..a7ba42b3 100644 --- a/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java +++ b/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java @@ -9,6 +9,7 @@ import javax.annotation.Nullable; +import dev.openfeature.sdk.exceptions.OpenFeatureError; import dev.openfeature.sdk.internal.AutoCloseableLock; import dev.openfeature.sdk.internal.AutoCloseableReentrantReadWriteLock; import lombok.extern.slf4j.Slf4j; @@ -131,14 +132,14 @@ public void setProvider(String clientName, FeatureProvider provider) { /** * Set the default provider and wait for initialization to finish. */ - public void setProviderAndWait(FeatureProvider provider) { + public void setProviderAndWait(FeatureProvider provider) throws OpenFeatureError { try (AutoCloseableLock __ = lock.writeLockAutoCloseable()) { providerRepository.setProvider( provider, this::attachEventProvider, this::emitReady, this::detachEventProvider, - this::emitError, + this::emitErrorAndThrow, true); } } @@ -149,14 +150,14 @@ public void setProviderAndWait(FeatureProvider provider) { * @param clientName The name of the client. * @param provider The provider to set. */ - public void setProviderAndWait(String clientName, FeatureProvider provider) { + public void setProviderAndWait(String clientName, FeatureProvider provider) throws OpenFeatureError { try (AutoCloseableLock __ = lock.writeLockAutoCloseable()) { providerRepository.setProvider(clientName, provider, this::attachEventProvider, this::emitReady, this::detachEventProvider, - this::emitError, + this::emitErrorAndThrow, true); } } @@ -179,9 +180,14 @@ private void detachEventProvider(FeatureProvider provider) { } } - private void emitError(FeatureProvider provider, String message) { + private void emitError(FeatureProvider provider, OpenFeatureError exception) { runHandlersForProvider(provider, ProviderEvent.PROVIDER_ERROR, - ProviderEventDetails.builder().message(message).build()); + ProviderEventDetails.builder().message(exception.getMessage()).build()); + } + + private void emitErrorAndThrow(FeatureProvider provider, OpenFeatureError exception) throws OpenFeatureError { + this.emitError(provider, exception); + throw exception; } /** diff --git a/src/main/java/dev/openfeature/sdk/ProviderRepository.java b/src/main/java/dev/openfeature/sdk/ProviderRepository.java index cea835e8..8dee0a6f 100644 --- a/src/main/java/dev/openfeature/sdk/ProviderRepository.java +++ b/src/main/java/dev/openfeature/sdk/ProviderRepository.java @@ -15,6 +15,8 @@ import javax.annotation.Nullable; +import dev.openfeature.sdk.exceptions.GeneralError; +import dev.openfeature.sdk.exceptions.OpenFeatureError; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -66,7 +68,7 @@ public void setProvider(FeatureProvider provider, Consumer afterSet, Consumer afterInit, Consumer afterShutdown, - BiConsumer afterError, + BiConsumer afterError, boolean waitForInit) { if (provider == null) { throw new IllegalArgumentException("Provider cannot be null"); @@ -83,12 +85,12 @@ public void setProvider(FeatureProvider provider, * Otherwise, initialization happens in the background. */ public void setProvider(String clientName, - FeatureProvider provider, - Consumer afterSet, - Consumer afterInit, - Consumer afterShutdown, - BiConsumer afterError, - boolean waitForInit) { + FeatureProvider provider, + Consumer afterSet, + Consumer afterInit, + Consumer afterShutdown, + BiConsumer afterError, + boolean waitForInit) { if (provider == null) { throw new IllegalArgumentException("Provider cannot be null"); } @@ -103,7 +105,7 @@ private void prepareAndInitializeProvider(@Nullable String clientName, Consumer afterSet, Consumer afterInit, Consumer afterShutdown, - BiConsumer afterError, + BiConsumer afterError, boolean waitForInit) { if (!isProviderRegistered(newProvider)) { @@ -129,7 +131,7 @@ private void prepareAndInitializeProvider(@Nullable String clientName, private void initializeProvider(FeatureProvider newProvider, Consumer afterInit, Consumer afterShutdown, - BiConsumer afterError, + BiConsumer afterError, FeatureProvider oldProvider) { try { if (ProviderState.NOT_READY.equals(newProvider.getState())) { @@ -137,9 +139,12 @@ private void initializeProvider(FeatureProvider newProvider, afterInit.accept(newProvider); } shutDownOld(oldProvider, afterShutdown); + } catch (OpenFeatureError e) { + log.error("Exception when initializing feature provider {}", newProvider.getClass().getName(), e); + afterError.accept(newProvider, e); } catch (Exception e) { log.error("Exception when initializing feature provider {}", newProvider.getClass().getName(), e); - afterError.accept(newProvider, e.getMessage()); + afterError.accept(newProvider, new GeneralError(e)); } } @@ -163,7 +168,6 @@ private boolean isProviderRegistered(FeatureProvider provider) { private void shutdownProvider(FeatureProvider provider) { taskExecutor.submit(() -> { try { - // detachProviderEvents(provider); provider.shutdown(); } catch (Exception e) { log.error("Exception when shutting down feature provider {}", provider.getClass().getName(), e); diff --git a/src/main/java/dev/openfeature/sdk/Value.java b/src/main/java/dev/openfeature/sdk/Value.java index 59e4a9cf..f0fdc8d4 100644 --- a/src/main/java/dev/openfeature/sdk/Value.java +++ b/src/main/java/dev/openfeature/sdk/Value.java @@ -266,7 +266,6 @@ public Instant asInstant() { * * @return Value */ - @SneakyThrows @Override protected Value clone() { diff --git a/src/main/java/dev/openfeature/sdk/providers/memory/InMemoryProvider.java b/src/main/java/dev/openfeature/sdk/providers/memory/InMemoryProvider.java index f71e9e36..8cd9fc8d 100644 --- a/src/main/java/dev/openfeature/sdk/providers/memory/InMemoryProvider.java +++ b/src/main/java/dev/openfeature/sdk/providers/memory/InMemoryProvider.java @@ -52,6 +52,7 @@ public InMemoryProvider(Map> flags) { * @param evaluationContext evaluation context * @throws Exception on error */ + @Override public void initialize(EvaluationContext evaluationContext) throws Exception { super.initialize(evaluationContext); state = ProviderState.READY; diff --git a/src/test/java/dev/openfeature/sdk/FlagEvaluationSpecTest.java b/src/test/java/dev/openfeature/sdk/FlagEvaluationSpecTest.java index 52c36dc5..e2e00881 100644 --- a/src/test/java/dev/openfeature/sdk/FlagEvaluationSpecTest.java +++ b/src/test/java/dev/openfeature/sdk/FlagEvaluationSpecTest.java @@ -8,6 +8,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; @@ -18,9 +19,6 @@ import java.util.List; import java.util.Map; -import dev.openfeature.sdk.providers.memory.InMemoryProvider; -import dev.openfeature.sdk.testutils.TestEventsProvider; -import lombok.SneakyThrows; import org.awaitility.Awaitility; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -31,8 +29,12 @@ import org.slf4j.Logger; import dev.openfeature.sdk.exceptions.FlagNotFoundError; +import dev.openfeature.sdk.exceptions.GeneralError; import dev.openfeature.sdk.fixtures.HookFixtures; +import dev.openfeature.sdk.providers.memory.InMemoryProvider; import dev.openfeature.sdk.testutils.FeatureProviderTestUtils; +import dev.openfeature.sdk.testutils.TestEventsProvider; +import lombok.SneakyThrows; class FlagEvaluationSpecTest implements HookFixtures { @@ -87,6 +89,17 @@ void getApiInstance() { assertThat(api.getProvider(providerName).getState()).isEqualTo(ProviderState.READY); } + @SneakyThrows + @Specification(number="1.1.8", text="The API SHOULD provide functions to set a provider and wait for the initialize function to return or throw.") + @Test void providerAndWaitError() { + FeatureProvider provider1 = new TestEventsProvider(500, true, "fake error"); + assertThrows(GeneralError.class, () -> api.setProviderAndWait(provider1)); + + FeatureProvider provider2 = new TestEventsProvider(500, true, "fake error"); + String providerName = "providerAndWaitError"; + assertThrows(GeneralError.class, () -> api.setProviderAndWait(providerName, provider2)); + } + @Specification(number="2.4.5", text="The provider SHOULD indicate an error if flag resolution is attempted before the provider is ready.") @Test void shouldReturnNotReadyIfNotInitialized() { FeatureProvider provider = new InMemoryProvider(new HashMap<>()) { diff --git a/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java b/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java index 3b0e8956..e19a10ae 100644 --- a/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java +++ b/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java @@ -1,16 +1,17 @@ package dev.openfeature.sdk; -import dev.openfeature.sdk.providers.memory.InMemoryProvider; -import dev.openfeature.sdk.testutils.FeatureProviderTestUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.Collections; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.Collections; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import dev.openfeature.sdk.providers.memory.InMemoryProvider; +import dev.openfeature.sdk.testutils.FeatureProviderTestUtils; + class OpenFeatureAPITest { private static final String CLIENT_NAME = "client name"; @@ -45,7 +46,7 @@ void namedProviderOverwrittenTest() { } @Test - void providerToMultipleNames() { + void providerToMultipleNames() throws Exception { FeatureProvider inMemAsEventingProvider = new InMemoryProvider(Collections.EMPTY_MAP); FeatureProvider noOpAsNonEventingProvider = new NoOpProvider(); diff --git a/src/test/java/dev/openfeature/sdk/ProviderRepositoryTest.java b/src/test/java/dev/openfeature/sdk/ProviderRepositoryTest.java index b78d0afb..20da47ed 100644 --- a/src/test/java/dev/openfeature/sdk/ProviderRepositoryTest.java +++ b/src/test/java/dev/openfeature/sdk/ProviderRepositoryTest.java @@ -9,7 +9,6 @@ import static org.awaitility.Awaitility.await; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.atMostOnce; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -29,6 +28,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import dev.openfeature.sdk.exceptions.OpenFeatureError; import dev.openfeature.sdk.testutils.exception.TestException; class ProviderRepositoryTest { @@ -253,7 +253,7 @@ void shouldRunLambdasOnSuccessful() { Consumer afterSet = mock(Consumer.class); Consumer afterInit = mock(Consumer.class); Consumer afterShutdown = mock(Consumer.class); - BiConsumer afterError = mock(BiConsumer.class); + BiConsumer afterError = mock(BiConsumer.class); FeatureProvider oldProvider = providerRepository.getProvider(); FeatureProvider featureProvider1 = createMockedProvider(); @@ -274,7 +274,7 @@ void shouldRunLambdasOnError() throws Exception { Consumer afterSet = mock(Consumer.class); Consumer afterInit = mock(Consumer.class); Consumer afterShutdown = mock(Consumer.class); - BiConsumer afterError = mock(BiConsumer.class); + BiConsumer afterError = mock(BiConsumer.class); FeatureProvider errorFeatureProvider = createMockedErrorProvider(); @@ -310,7 +310,7 @@ private void setFeatureProvider(FeatureProvider provider) { private void setFeatureProvider(FeatureProvider provider, Consumer afterSet, Consumer afterInit, Consumer afterShutdown, - BiConsumer afterError) { + BiConsumer afterError) { providerRepository.setProvider(provider, afterSet, afterInit, afterShutdown, afterError, false); waitForSettingProviderHasBeenCompleted(ProviderRepository::getProvider, provider); @@ -348,8 +348,8 @@ private Consumer mockAfterShutdown() { }; } - private BiConsumer mockAfterError() { - return (fp, message) -> { + private BiConsumer mockAfterError() { + return (fp, ex) -> { }; } diff --git a/src/test/java/dev/openfeature/sdk/testutils/TestEventsProvider.java b/src/test/java/dev/openfeature/sdk/testutils/TestEventsProvider.java index af239644..b0e5eb78 100644 --- a/src/test/java/dev/openfeature/sdk/testutils/TestEventsProvider.java +++ b/src/test/java/dev/openfeature/sdk/testutils/TestEventsProvider.java @@ -8,6 +8,7 @@ import dev.openfeature.sdk.ProviderEventDetails; import dev.openfeature.sdk.ProviderState; import dev.openfeature.sdk.Value; +import dev.openfeature.sdk.exceptions.GeneralError; public class TestEventsProvider extends EventProvider { @@ -63,7 +64,7 @@ public void initialize(EvaluationContext evaluationContext) throws Exception { Thread.sleep(initTimeoutMs); if (this.initError) { this.state = ProviderState.ERROR; - throw new Exception(initErrorMessage); + throw new GeneralError(initErrorMessage); } this.state = ProviderState.READY; } diff --git a/version.txt b/version.txt index 661e7aea..10c08801 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.7.3 +1.7.4