From 703f03b6d7015d6627f4e25e7b955b3f7db4d0b7 Mon Sep 17 00:00:00 2001 From: marcozabel Date: Mon, 24 Nov 2025 17:23:41 +0100 Subject: [PATCH 1/4] Use flagd sync port over flagd port Signed-off-by: marcozabel --- .../src/e2e/step-definitions/providerSteps.ts | 15 ++++++++++++++ .../flagd/src/e2e/step-definitions/utils.ts | 2 ++ .../flagd/src/e2e/tests/in-process.spec.ts | 2 +- .../flagd/src/lib/configuration.spec.ts | 20 +++++++++++++++++++ libs/providers/flagd/src/lib/configuration.ts | 4 ++++ libs/shared/flagd-core/test-harness | 2 +- 6 files changed, 43 insertions(+), 2 deletions(-) diff --git a/libs/providers/flagd/src/e2e/step-definitions/providerSteps.ts b/libs/providers/flagd/src/e2e/step-definitions/providerSteps.ts index 65963e9b3..ed0dd2a4f 100644 --- a/libs/providers/flagd/src/e2e/step-definitions/providerSteps.ts +++ b/libs/providers/flagd/src/e2e/step-definitions/providerSteps.ts @@ -3,6 +3,7 @@ import { FlagdContainer } from '../tests/flagdContainer'; import type { State, Steps } from './state'; import { FlagdProvider } from '../../lib/flagd-provider'; import type { FlagdProviderOptions } from '../../lib/configuration'; +import { ProviderStatus } from '@openfeature/server-sdk'; export const providerSteps: Steps = (state: State) => @@ -67,6 +68,20 @@ export const providerSteps: Steps = state.providerType = providerType; }); + function mapProviderState(state: string): ProviderStatus { + const key = state.toUpperCase().replace('-', '_') as keyof typeof ProviderStatus; + + if (!(key in ProviderStatus)) { + throw new Error('Unknown provider status'); + } + + return ProviderStatus[key]; + } + + then(/^the client should be in (.*) state/, (providerState: string) => { + expect(state.client?.providerStatus).toBe(mapProviderState(providerState)); + }); + when(/^the connection is lost for (\d+)s$/, async (time) => { console.log('stopping flagd'); await fetch('http://' + container.getLaunchpadUrl() + '/restart?seconds=' + time); diff --git a/libs/providers/flagd/src/e2e/step-definitions/utils.ts b/libs/providers/flagd/src/e2e/step-definitions/utils.ts index 44eaf3cb1..059e05fee 100644 --- a/libs/providers/flagd/src/e2e/step-definitions/utils.ts +++ b/libs/providers/flagd/src/e2e/step-definitions/utils.ts @@ -19,6 +19,8 @@ export function mapValueToType(value: string, type: string): any { return value.toLowerCase() as ResolverType; case 'CacheType': return value as CacheOption; + case 'StringList': + return value.split(',').map((item) => item.trim()); case 'Object': if (value == 'null') { return undefined; diff --git a/libs/providers/flagd/src/e2e/tests/in-process.spec.ts b/libs/providers/flagd/src/e2e/tests/in-process.spec.ts index 04058600f..efa55e9ae 100644 --- a/libs/providers/flagd/src/e2e/tests/in-process.spec.ts +++ b/libs/providers/flagd/src/e2e/tests/in-process.spec.ts @@ -22,7 +22,7 @@ describe('in-process', () => { // remove filters as we add support for features // see: https://github.com/open-feature/js-sdk-contrib/issues/1096 and child issues tagFilter: - '@in-process and not @targetURI and not @customCert and not @events and not @sync and not @grace and not @metadata and not @contextEnrichment', + '@in-process and not @targetURI and not @forbidden and not @customCert and not @events and not @sync and not @grace and not @metadata and not @unixsocket and not @sync-payload and not @contextEnrichment', scenarioNameTemplate: (vars) => { return `${vars.scenarioTitle} (${vars.scenarioTags.join(',')} ${vars.featureTags.join(',')})`; }, diff --git a/libs/providers/flagd/src/lib/configuration.spec.ts b/libs/providers/flagd/src/lib/configuration.spec.ts index c13fe11e8..4af437d58 100644 --- a/libs/providers/flagd/src/lib/configuration.spec.ts +++ b/libs/providers/flagd/src/lib/configuration.spec.ts @@ -61,6 +61,20 @@ describe('Configuration', () => { }); }); + it('should use flagd sync port over flagd port environment option', () => { + const port = 8080; + const syncPort = 9090; + + process.env['FLAGD_PORT'] = `${port}`; + process.env['FLAGD_SYNC_PORT'] = `${syncPort}`; + + expect(getConfig()).toStrictEqual( + expect.objectContaining({ + port: syncPort, + }), + ); + }); + it('should use incoming options over defaults and environment variable', () => { const options: FlagdProviderOptions = { host: 'test', @@ -76,6 +90,7 @@ describe('Configuration', () => { process.env['FLAGD_HOST'] = 'override'; process.env['FLAGD_PORT'] = '8080'; + process.env['FLAGD_SYNC_PORT'] = '9090'; process.env['FLAGD_TLS'] = 'false'; process.env['FLAGD_DEFAULT_AUTHORITY'] = 'test-authority-override'; @@ -87,6 +102,11 @@ describe('Configuration', () => { expect(getConfig()).toStrictEqual(expect.objectContaining({ port: 8013 })); }); + it('should ignore an valid sync port set as an environment variable', () => { + process.env['FLAGD_SYNC_PORT'] = 'invalid number'; + expect(getConfig()).toStrictEqual(expect.objectContaining({ port: 8013 })); + }); + describe('port handling', () => { describe('for "in-process" evaluation', () => { const resolverType = 'in-process'; diff --git a/libs/providers/flagd/src/lib/configuration.ts b/libs/providers/flagd/src/lib/configuration.ts index d9076c846..2b8ca970e 100644 --- a/libs/providers/flagd/src/lib/configuration.ts +++ b/libs/providers/flagd/src/lib/configuration.ts @@ -101,6 +101,7 @@ const DEFAULT_IN_PROCESS_CONFIG: Config = { ...DEFAULT_CONFIG, resolverType: 'in enum ENV_VAR { FLAGD_HOST = 'FLAGD_HOST', FLAGD_PORT = 'FLAGD_PORT', + FLAGD_SYNC_PORT = 'FLAGD_SYNC_PORT', FLAGD_DEADLINE_MS = 'FLAGD_DEADLINE_MS', FLAGD_TLS = 'FLAGD_TLS', FLAGD_SOCKET_PATH = 'FLAGD_SOCKET_PATH', @@ -137,6 +138,9 @@ const getEnvVarConfig = (): Partial => { ...(Number(process.env[ENV_VAR.FLAGD_PORT]) && { port: Number(process.env[ENV_VAR.FLAGD_PORT]), }), + ...(Number(process.env[ENV_VAR.FLAGD_SYNC_PORT]) && { + port: Number(process.env[ENV_VAR.FLAGD_SYNC_PORT]), + }), ...(Number(process.env[ENV_VAR.FLAGD_DEADLINE_MS]) && { deadlineMs: Number(process.env[ENV_VAR.FLAGD_DEADLINE_MS]), }), diff --git a/libs/shared/flagd-core/test-harness b/libs/shared/flagd-core/test-harness index 59c3c3ccf..6948dcbab 160000 --- a/libs/shared/flagd-core/test-harness +++ b/libs/shared/flagd-core/test-harness @@ -1 +1 @@ -Subproject commit 59c3c3ccfb018db82281684d231067e332c8103d +Subproject commit 6948dcbabef284fae4a4c1d03ce5e0bd9ea34c17 From 8a5a75aab43428cf3e8533b7743f3357facfaceb Mon Sep 17 00:00:00 2001 From: Marco Zabel <49674991+marcozabel@users.noreply.github.com> Date: Mon, 24 Nov 2025 17:33:01 +0100 Subject: [PATCH 2/4] Update libs/providers/flagd/src/lib/configuration.spec.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Marco Zabel <49674991+marcozabel@users.noreply.github.com> --- libs/providers/flagd/src/lib/configuration.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/providers/flagd/src/lib/configuration.spec.ts b/libs/providers/flagd/src/lib/configuration.spec.ts index 4af437d58..d10a8f512 100644 --- a/libs/providers/flagd/src/lib/configuration.spec.ts +++ b/libs/providers/flagd/src/lib/configuration.spec.ts @@ -102,7 +102,7 @@ describe('Configuration', () => { expect(getConfig()).toStrictEqual(expect.objectContaining({ port: 8013 })); }); - it('should ignore an valid sync port set as an environment variable', () => { + it('should ignore an invalid sync port set as an environment variable', () => { process.env['FLAGD_SYNC_PORT'] = 'invalid number'; expect(getConfig()).toStrictEqual(expect.objectContaining({ port: 8013 })); }); From c1025a06794f532a2308301fb6ea9422e7bea155 Mon Sep 17 00:00:00 2001 From: Marco Zabel <49674991+marcozabel@users.noreply.github.com> Date: Mon, 24 Nov 2025 17:34:24 +0100 Subject: [PATCH 3/4] Update libs/providers/flagd/src/e2e/step-definitions/providerSteps.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Marco Zabel <49674991+marcozabel@users.noreply.github.com> --- .../flagd/src/e2e/step-definitions/providerSteps.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libs/providers/flagd/src/e2e/step-definitions/providerSteps.ts b/libs/providers/flagd/src/e2e/step-definitions/providerSteps.ts index ed0dd2a4f..0d9b9cc98 100644 --- a/libs/providers/flagd/src/e2e/step-definitions/providerSteps.ts +++ b/libs/providers/flagd/src/e2e/step-definitions/providerSteps.ts @@ -69,13 +69,14 @@ export const providerSteps: Steps = }); function mapProviderState(state: string): ProviderStatus { - const key = state.toUpperCase().replace('-', '_') as keyof typeof ProviderStatus; + const mappedState = state.toUpperCase().replace('-', '_'); + const status = Object.values(ProviderStatus).find((s) => s === mappedState); - if (!(key in ProviderStatus)) { - throw new Error('Unknown provider status'); + if (!status) { + throw new Error(`Unknown provider status: ${state}`); } - return ProviderStatus[key]; + return status; } then(/^the client should be in (.*) state/, (providerState: string) => { From b5ca3478000f7d5e7ada7bdee8b4c679b1f562d0 Mon Sep 17 00:00:00 2001 From: marcozabel Date: Mon, 24 Nov 2025 17:49:35 +0100 Subject: [PATCH 4/4] Update rpc e2e tests Signed-off-by: marcozabel --- libs/providers/flagd/src/e2e/tests/rpc.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/providers/flagd/src/e2e/tests/rpc.spec.ts b/libs/providers/flagd/src/e2e/tests/rpc.spec.ts index e6b10f327..3541fc599 100644 --- a/libs/providers/flagd/src/e2e/tests/rpc.spec.ts +++ b/libs/providers/flagd/src/e2e/tests/rpc.spec.ts @@ -23,7 +23,7 @@ describe('rpc', () => { tagFilter: // remove filters as we add support for features // see: https://github.com/open-feature/js-sdk-contrib/issues/1096 and child issues - '@rpc and not @targetURI and not @customCert and not @events and not @stream and not @grace and not @metadata and not @contextEnrichment and not @caching', + '@rpc and not @targetURI and not @customCert and not @forbidden and not @events and not @stream and not @grace and not @metadata and not @contextEnrichment and not @caching', scenarioNameTemplate: (vars) => { return `${vars.scenarioTitle} (${vars.scenarioTags.join(',')} ${vars.featureTags.join(',')})`; },