Skip to content

Commit ec263ac

Browse files
feat: [flagd] Default port to 8015 if in-process resolver is used.
closes: open-feature#809 Signed-off-by: Daniel Zehetner <[email protected]> Co-authored-by: Alexandra Oberaigner <[email protected]> Signed-off-by: Daniel Zehetner <[email protected]>
1 parent e1a4b26 commit ec263ac

File tree

3 files changed

+115
-48
lines changed

3 files changed

+115
-48
lines changed

providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/Config.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@
1111
@Slf4j
1212
public final class Config {
1313
static final Resolver DEFAULT_RESOLVER_TYPE = Resolver.RPC;
14-
static final String DEFAULT_PORT = "8013";
14+
static final String DEFAULT_RPC_PORT = "8013";
15+
/**
16+
* @deprecated Use {@link Config#DEFAULT_RPC_PORT} or {@link Config#DEFAULT_IN_PROCESS_PORT}
17+
*/
18+
@Deprecated
19+
static final String DEFAULT_PORT = DEFAULT_RPC_PORT;
20+
static final String DEFAULT_IN_PROCESS_PORT = "8015";
1521
static final String DEFAULT_TLS = "false";
1622
static final String DEFAULT_HOST = "localhost";
1723

providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,8 @@
55
import lombok.Builder;
66
import lombok.Getter;
77

8-
import static dev.openfeature.contrib.providers.flagd.Config.BASE_EVENT_STREAM_RETRY_BACKOFF_MS;
9-
import static dev.openfeature.contrib.providers.flagd.Config.BASE_EVENT_STREAM_RETRY_BACKOFF_MS_ENV_VAR_NAME;
10-
import static dev.openfeature.contrib.providers.flagd.Config.CACHE_ENV_VAR_NAME;
11-
import static dev.openfeature.contrib.providers.flagd.Config.DEADLINE_MS_ENV_VAR_NAME;
12-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_CACHE;
13-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_DEADLINE;
14-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_HOST;
15-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_MAX_CACHE_SIZE;
16-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_MAX_EVENT_STREAM_RETRIES;
17-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_PORT;
18-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_TLS;
19-
import static dev.openfeature.contrib.providers.flagd.Config.HOST_ENV_VAR_NAME;
20-
import static dev.openfeature.contrib.providers.flagd.Config.MAX_CACHE_SIZE_ENV_VAR_NAME;
21-
import static dev.openfeature.contrib.providers.flagd.Config.MAX_EVENT_STREAM_RETRIES_ENV_VAR_NAME;
22-
import static dev.openfeature.contrib.providers.flagd.Config.OFFLINE_SOURCE_PATH;
23-
import static dev.openfeature.contrib.providers.flagd.Config.PORT_ENV_VAR_NAME;
24-
import static dev.openfeature.contrib.providers.flagd.Config.SERVER_CERT_PATH_ENV_VAR_NAME;
25-
import static dev.openfeature.contrib.providers.flagd.Config.SOCKET_PATH_ENV_VAR_NAME;
26-
import static dev.openfeature.contrib.providers.flagd.Config.SOURCE_SELECTOR_ENV_VAR_NAME;
27-
import static dev.openfeature.contrib.providers.flagd.Config.TLS_ENV_VAR_NAME;
8+
import static dev.openfeature.contrib.providers.flagd.Config.*;
289
import static dev.openfeature.contrib.providers.flagd.Config.fallBackToEnvOrDefault;
29-
import static dev.openfeature.contrib.providers.flagd.Config.fromValueProvider;
3010

3111
/**
3212
* FlagdOptions is a builder to build flagd provider options.
@@ -39,8 +19,7 @@ public class FlagdOptions {
3919
/**
4020
* flagd resolving type.
4121
*/
42-
@Builder.Default
43-
private Config.EvaluatorType resolverType = fromValueProvider(System::getenv);
22+
private Config.EvaluatorType resolverType;
4423

4524
/**
4625
* flagd connection host.
@@ -51,8 +30,7 @@ public class FlagdOptions {
5130
/**
5231
* flagd connection port.
5332
*/
54-
@Builder.Default
55-
private int port = Integer.parseInt(fallBackToEnvOrDefault(PORT_ENV_VAR_NAME, DEFAULT_PORT));
33+
private int port;
5634

5735
/**
5836
* Use TLS connectivity.
@@ -126,6 +104,17 @@ public class FlagdOptions {
126104
*/
127105
private OpenTelemetry openTelemetry;
128106

107+
108+
public static FlagdOptionsBuilder builder() {
109+
return new FlagdOptionsBuilder() {
110+
@Override
111+
public FlagdOptions build() {
112+
prebuild();
113+
return super.build();
114+
}
115+
};
116+
}
117+
129118
/**
130119
* Overload default lombok builder.
131120
*/
@@ -140,5 +129,22 @@ public FlagdOptionsBuilder withGlobalTelemetry(final boolean b) {
140129
}
141130
return this;
142131
}
132+
133+
void prebuild() {
134+
if (resolverType == null) {
135+
resolverType = fromValueProvider(System::getenv);
136+
}
137+
138+
if (port == 0) {
139+
port = Integer.parseInt(fallBackToEnvOrDefault(PORT_ENV_VAR_NAME, determineDefaultPortForResolver()));
140+
}
141+
}
142+
143+
private String determineDefaultPortForResolver() {
144+
if (resolverType.equals(Config.Resolver.RPC)) {
145+
return Config.DEFAULT_RPC_PORT;
146+
}
147+
return Config.DEFAULT_IN_PROCESS_PORT;
148+
}
143149
}
144150
}
Lines changed: 77 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,24 @@
11
package dev.openfeature.contrib.providers.flagd;
22

33
import io.opentelemetry.api.OpenTelemetry;
4+
import org.junit.jupiter.api.Disabled;
45
import org.junit.jupiter.api.Test;
56
import org.mockito.Mockito;
67

78
import java.util.function.Function;
89

9-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_CACHE;
10-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_HOST;
11-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_MAX_CACHE_SIZE;
12-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_MAX_EVENT_STREAM_RETRIES;
13-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_PORT;
14-
import static org.junit.jupiter.api.Assertions.assertEquals;
15-
import static org.junit.jupiter.api.Assertions.assertFalse;
16-
import static org.junit.jupiter.api.Assertions.assertNull;
17-
import static org.junit.jupiter.api.Assertions.assertTrue;
10+
import static dev.openfeature.contrib.providers.flagd.Config.*;
11+
import static org.assertj.core.api.Assertions.assertThat;
12+
import static org.junit.jupiter.api.Assertions.*;
1813

19-
public class FlagdOptionsTest {
14+
class FlagdOptionsTest {
2015

2116
@Test
22-
public void TestDefaults() {
17+
void TestDefaults() {
2318
final FlagdOptions builder = FlagdOptions.builder().build();
2419

2520
assertEquals(DEFAULT_HOST, builder.getHost());
26-
assertEquals(DEFAULT_PORT, Integer.toString(builder.getPort()));
21+
assertEquals(DEFAULT_RPC_PORT, Integer.toString(builder.getPort()));
2722
assertFalse(builder.isTls());
2823
assertNull(builder.getCertPath());
2924
assertNull(builder.getSocketPath());
@@ -33,11 +28,11 @@ public void TestDefaults() {
3328
assertNull(builder.getSelector());
3429
assertNull(builder.getOpenTelemetry());
3530
assertNull(builder.getOfflineFlagSourcePath());
36-
assertEquals(Config.Resolver.RPC, builder.getResolverType());
31+
assertEquals(Resolver.RPC, builder.getResolverType());
3732
}
3833

3934
@Test
40-
public void TestBuilderOptions() {
35+
void TestBuilderOptions() {
4136
OpenTelemetry openTelemetry = Mockito.mock(OpenTelemetry.class);
4237

4338
FlagdOptions flagdOptions = FlagdOptions.builder()
@@ -51,7 +46,7 @@ public void TestBuilderOptions() {
5146
.selector("app=weatherApp")
5247
.offlineFlagSourcePath("some-path")
5348
.openTelemetry(openTelemetry)
54-
.resolverType(Config.Resolver.IN_PROCESS)
49+
.resolverType(Resolver.IN_PROCESS)
5550
.build();
5651

5752
assertEquals("https://hosted-flagd", flagdOptions.getHost());
@@ -64,32 +59,92 @@ public void TestBuilderOptions() {
6459
assertEquals("app=weatherApp", flagdOptions.getSelector());
6560
assertEquals("some-path", flagdOptions.getOfflineFlagSourcePath());
6661
assertEquals(openTelemetry, flagdOptions.getOpenTelemetry());
67-
assertEquals(Config.Resolver.IN_PROCESS, flagdOptions.getResolverType());
62+
assertEquals(Resolver.IN_PROCESS, flagdOptions.getResolverType());
6863
}
6964

7065

7166
@Test
72-
public void testValueProviderForEdgeCase_valid() {
67+
void testValueProviderForEdgeCase_valid() {
7368
Function<String, String> valueProvider = s -> "in-process";
74-
assertEquals(Config.Resolver.IN_PROCESS, Config.fromValueProvider(valueProvider));
69+
assertEquals(Resolver.IN_PROCESS, Config.fromValueProvider(valueProvider));
7570

7671
valueProvider = s -> "IN-PROCESS";
77-
assertEquals(Config.Resolver.IN_PROCESS, Config.fromValueProvider(valueProvider));
72+
assertEquals(Resolver.IN_PROCESS, Config.fromValueProvider(valueProvider));
7873

7974
valueProvider = s -> "rpc";
80-
assertEquals(Config.Resolver.RPC, Config.fromValueProvider(valueProvider));
75+
assertEquals(Resolver.RPC, Config.fromValueProvider(valueProvider));
8176

8277
valueProvider = s -> "RPC";
83-
assertEquals(Config.Resolver.RPC, Config.fromValueProvider(valueProvider));
78+
assertEquals(Resolver.RPC, Config.fromValueProvider(valueProvider));
8479
}
8580

8681
@Test
87-
public void testValueProviderForEdgeCase_invalid() {
82+
void testValueProviderForEdgeCase_invalid() {
8883
Function<String, String> dummy = s -> "some-other";
8984
assertEquals(Config.DEFAULT_RESOLVER_TYPE, Config.fromValueProvider(dummy));
9085

9186
dummy = s -> null;
9287
assertEquals(Config.DEFAULT_RESOLVER_TYPE, Config.fromValueProvider(dummy));
9388
}
9489

90+
@Test
91+
@Disabled("Currently there is no defined way on how to set environment variables for tests")
92+
void testInProcessProviderFromEnv_noPortConfigured_defaultsToCorrectPort() {
93+
FlagdOptions flagdOptions = FlagdOptions.builder().build();
94+
95+
assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS);
96+
assertThat(flagdOptions.getPort()).isEqualTo(Integer.parseInt(DEFAULT_IN_PROCESS_PORT));
97+
}
98+
99+
@Test
100+
void testInProcessProvider_noPortConfigured_defaultsToCorrectPort() {
101+
FlagdOptions flagdOptions = FlagdOptions.builder()
102+
.resolverType(Resolver.IN_PROCESS)
103+
.build();
104+
105+
assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS);
106+
assertThat(flagdOptions.getPort()).isEqualTo(Integer.parseInt(DEFAULT_IN_PROCESS_PORT));
107+
}
108+
109+
@Test
110+
@Disabled("Currently there is no defined way on how to set environment variables for tests")
111+
void testInProcessProviderFromEnv_portConfigured_usesConfiguredPort() {
112+
FlagdOptions flagdOptions = FlagdOptions.builder()
113+
.port(1000)
114+
.build();
115+
116+
assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS);
117+
assertThat(flagdOptions.getPort()).isEqualTo(1000);
118+
}
119+
120+
@Test
121+
@Disabled("Currently there is no defined way on how to set environment variables for tests")
122+
void testRpcProviderFromEnv_noPortConfigured_defaultsToCorrectPort() {
123+
FlagdOptions flagdOptions = FlagdOptions.builder().build();
124+
125+
assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.RPC);
126+
assertThat(flagdOptions.getPort()).isEqualTo(Integer.parseInt(DEFAULT_RPC_PORT));
127+
}
128+
129+
@Test
130+
void testRpcProvider_noPortConfigured_defaultsToCorrectPort() {
131+
FlagdOptions flagdOptions = FlagdOptions.builder()
132+
.resolverType(Resolver.RPC)
133+
.build();
134+
135+
assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.RPC);
136+
assertThat(flagdOptions.getPort()).isEqualTo(Integer.parseInt(DEFAULT_RPC_PORT));
137+
}
138+
139+
@Test
140+
@Disabled("Currently there is no defined way on how to set environment variables for tests")
141+
void testRpcProviderFromEnv_portConfigured_usesConfiguredPort() {
142+
FlagdOptions flagdOptions = FlagdOptions.builder()
143+
.port(1534)
144+
.build();
145+
146+
assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.RPC);
147+
assertThat(flagdOptions.getPort()).isEqualTo(1534);
148+
149+
}
95150
}

0 commit comments

Comments
 (0)