Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions providers/openfeature-provider-flagd/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ dev = [
"coverage[toml]>=7.10.0,<8.0.0",
"grpcio-health-checking>=1.82.1,<2.0.0",
"mypy>=1.18.0,<2.0.0",
# The tests call `api.set_provider_and_wait`, which arrived in 0.10.0. The
# runtime floor stays at 0.8.2 because the provider itself needs nothing newer.
"openfeature-sdk>=0.10.0",
"poethepoet>=0.37.0",
"pytest>=9.0.0,<10.0.0",
"pytest-bdd>=8.1.0,<9.0.0",
Expand Down
35 changes: 17 additions & 18 deletions providers/openfeature-provider-flagd/tests/test_errors.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import contextlib
import os
import time

Expand All @@ -7,13 +8,19 @@
from openfeature.contrib.provider.flagd import FlagdProvider
from openfeature.contrib.provider.flagd.config import ResolverType
from openfeature.evaluation_context import EvaluationContext
from openfeature.event import ProviderEvent
from openfeature.exception import ErrorCode
from openfeature.exception import (
ErrorCode,
OpenFeatureError,
ProviderNotReadyError,
)
from openfeature.flag_evaluation import Reason


def create_client(provider: FlagdProvider):
api.set_provider(provider)
# These flag files are deliberately broken, so init may fail; what the
# evaluation returns afterwards is the assertion.
with contextlib.suppress(OpenFeatureError):
api.set_provider_and_wait(provider)
return api.get_client()


Expand Down Expand Up @@ -119,23 +126,15 @@ def test_flag_disabled():

@pytest.mark.parametrize("wait", (500, 250))
def test_grpc_sync_fail_deadline(wait: int):
init_failed = False

def fail(*args, **kwargs):
nonlocal init_failed
init_failed = True

api.get_client().add_handler(ProviderEvent.PROVIDER_ERROR, fail)

t = time.time()
api.set_provider(
FlagdProvider(
resolver_type=ResolverType.IN_PROCESS,
port=99999, # dead port to test failure
deadline_ms=wait,
with pytest.raises(ProviderNotReadyError):
api.set_provider_and_wait(
FlagdProvider(
resolver_type=ResolverType.IN_PROCESS,
port=99999, # dead port to test failure
deadline_ms=wait,
)
)
)

elapsed = time.time() - t
assert abs(elapsed - wait * 0.001) < 0.17
assert init_failed
8 changes: 6 additions & 2 deletions providers/openfeature-provider-flagd/tests/test_metadata.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import contextlib
import os
import time
from time import sleep
Expand All @@ -11,7 +12,7 @@
_validate_metadata,
)
from openfeature.event import EventDetails, ProviderEvent
from openfeature.exception import ErrorCode, ParseError
from openfeature.exception import ErrorCode, OpenFeatureError, ParseError


def create_client(file_name):
Expand All @@ -21,7 +22,10 @@ def create_client(file_name):
offline_flag_source_path=f"{path}/{file_name}",
)

api.set_provider(provider)
# Some of these flag files are deliberately broken, so init may fail; what
# the evaluation returns afterwards is the assertion.
with contextlib.suppress(OpenFeatureError):
api.set_provider_and_wait(provider)
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
return api.get_client()


Expand Down
10 changes: 6 additions & 4 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading