diff --git a/libs/providers/flagd/src/e2e/step-definitions/providerSteps.ts b/libs/providers/flagd/src/e2e/step-definitions/providerSteps.ts index 65963e9b3..0d9b9cc98 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,21 @@ export const providerSteps: Steps = state.providerType = providerType; }); + function mapProviderState(state: string): ProviderStatus { + const mappedState = state.toUpperCase().replace('-', '_'); + const status = Object.values(ProviderStatus).find((s) => s === mappedState); + + if (!status) { + throw new Error(`Unknown provider status: ${state}`); + } + + return status; + } + + 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/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(',')})`; }, diff --git a/libs/providers/flagd/src/lib/configuration.spec.ts b/libs/providers/flagd/src/lib/configuration.spec.ts index c13fe11e8..d10a8f512 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 invalid 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