@@ -237,6 +237,64 @@ void testInProcessProvider_syncPortTakesPrecedenceOverFlagdPort() {
237237 assertThat (flagdOptions .getPort ()).isEqualTo (9999 );
238238 }
239239
240+ @ Test
241+ @ SetEnvironmentVariable (key = RESOLVER_ENV_VAR , value = RESOLVER_IN_PROCESS )
242+ @ SetEnvironmentVariable (key = PORT_ENV_VAR_NAME , value = "8888" )
243+ @ SetEnvironmentVariable (key = SYNC_PORT_ENV_VAR_NAME , value = "tcp://10.0.0.1:8015" )
244+ void testInProcessProvider_invalidSyncPortFallsBackToFlagdPort () {
245+ // Kubernetes service-link injection populates FLAGD_SYNC_PORT with a URL like
246+ // tcp://<clusterIP>:<port> when a Service named flagd-sync shares the pod's
247+ // namespace. The SDK must not fail on this; it should fall back to FLAGD_PORT.
248+ FlagdOptions flagdOptions = FlagdOptions .builder ().build ();
249+
250+ assertThat (flagdOptions .getResolverType ()).isEqualTo (Resolver .IN_PROCESS );
251+ assertThat (flagdOptions .getPort ()).isEqualTo (8888 );
252+ }
253+
254+ @ Test
255+ @ SetEnvironmentVariable (key = RESOLVER_ENV_VAR , value = RESOLVER_IN_PROCESS )
256+ @ SetEnvironmentVariable (key = SYNC_PORT_ENV_VAR_NAME , value = "tcp://10.0.0.1:8015" )
257+ void testInProcessProvider_invalidSyncPortWithNoFlagdPortUsesDefault () {
258+ FlagdOptions flagdOptions = FlagdOptions .builder ().build ();
259+
260+ assertThat (flagdOptions .getResolverType ()).isEqualTo (Resolver .IN_PROCESS );
261+ assertThat (flagdOptions .getPort ()).isEqualTo (Integer .parseInt (DEFAULT_IN_PROCESS_PORT ));
262+ }
263+
264+ @ Test
265+ @ SetEnvironmentVariable (key = RESOLVER_ENV_VAR , value = RESOLVER_IN_PROCESS )
266+ @ SetEnvironmentVariable (key = PORT_ENV_VAR_NAME , value = "8888" )
267+ @ SetEnvironmentVariable (key = SYNC_PORT_ENV_VAR_NAME , value = "99999" )
268+ void testInProcessProvider_outOfRangeSyncPortFallsBackToFlagdPort () {
269+ FlagdOptions flagdOptions = FlagdOptions .builder ().build ();
270+
271+ assertThat (flagdOptions .getResolverType ()).isEqualTo (Resolver .IN_PROCESS );
272+ assertThat (flagdOptions .getPort ()).isEqualTo (8888 );
273+ }
274+
275+ @ Test
276+ @ SetEnvironmentVariable (key = RESOLVER_ENV_VAR , value = RESOLVER_RPC )
277+ @ SetEnvironmentVariable (key = PORT_ENV_VAR_NAME , value = "tcp://10.0.0.1:8013" )
278+ void testRpcProvider_invalidFlagdPortFallsBackToDefault () {
279+ // RPC-mode equivalent of the in-process collision: if a Service named `flagd`
280+ // shares the pod's namespace, kubelet injects FLAGD_PORT=tcp://<clusterIP>:8013.
281+ FlagdOptions flagdOptions = FlagdOptions .builder ().build ();
282+
283+ assertThat (flagdOptions .getResolverType ()).isEqualTo (Resolver .RPC );
284+ assertThat (flagdOptions .getPort ()).isEqualTo (Integer .parseInt (DEFAULT_RPC_PORT ));
285+ }
286+
287+ @ Test
288+ @ SetEnvironmentVariable (key = RESOLVER_ENV_VAR , value = RESOLVER_IN_PROCESS )
289+ @ SetEnvironmentVariable (key = PORT_ENV_VAR_NAME , value = "tcp://10.0.0.1:8013" )
290+ @ SetEnvironmentVariable (key = SYNC_PORT_ENV_VAR_NAME , value = "tcp://10.0.0.1:8015" )
291+ void testInProcessProvider_bothPortEnvsInvalidFallsBackToDefault () {
292+ FlagdOptions flagdOptions = FlagdOptions .builder ().build ();
293+
294+ assertThat (flagdOptions .getResolverType ()).isEqualTo (Resolver .IN_PROCESS );
295+ assertThat (flagdOptions .getPort ()).isEqualTo (Integer .parseInt (DEFAULT_IN_PROCESS_PORT ));
296+ }
297+
240298 @ Test
241299 @ SetEnvironmentVariable (key = RESOLVER_ENV_VAR , value = RESOLVER_RPC )
242300 void testRpcProviderFromEnv_noPortConfigured_defaultsToCorrectPort () {
0 commit comments