Skip to content

Commit 9b7dc9a

Browse files
feat: [flagd] Default port to 8015 if in-process resolver is used. (#810)
Signed-off-by: Daniel Zehetner <[email protected]> Co-authored-by: Alexandra Oberaigner <[email protected]>
1 parent 5b9c70b commit 9b7dc9a

File tree

3 files changed

+114
-28
lines changed

3 files changed

+114
-28
lines changed

Diff for: providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/Config.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
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+
static final String DEFAULT_IN_PROCESS_PORT = "8015";
1516
static final String DEFAULT_TLS = "false";
1617
static final String DEFAULT_HOST = "localhost";
1718

Diff for: providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java

+35-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_HOST;
1515
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_MAX_CACHE_SIZE;
1616
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_MAX_EVENT_STREAM_RETRIES;
17-
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_PORT;
1817
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_TLS;
1918
import static dev.openfeature.contrib.providers.flagd.Config.HOST_ENV_VAR_NAME;
2019
import static dev.openfeature.contrib.providers.flagd.Config.MAX_CACHE_SIZE_ENV_VAR_NAME;
@@ -39,8 +38,7 @@ public class FlagdOptions {
3938
/**
4039
* flagd resolving type.
4140
*/
42-
@Builder.Default
43-
private Config.EvaluatorType resolverType = fromValueProvider(System::getenv);
41+
private Config.EvaluatorType resolverType;
4442

4543
/**
4644
* flagd connection host.
@@ -51,8 +49,7 @@ public class FlagdOptions {
5149
/**
5250
* flagd connection port.
5351
*/
54-
@Builder.Default
55-
private int port = Integer.parseInt(fallBackToEnvOrDefault(PORT_ENV_VAR_NAME, DEFAULT_PORT));
52+
private int port;
5653

5754
/**
5855
* Use TLS connectivity.
@@ -126,6 +123,22 @@ public class FlagdOptions {
126123
*/
127124
private OpenTelemetry openTelemetry;
128125

126+
127+
/**
128+
* Builder overwrite in order to customize the "build" method.
129+
*
130+
* @return the flagd options builder
131+
*/
132+
public static FlagdOptionsBuilder builder() {
133+
return new FlagdOptionsBuilder() {
134+
@Override
135+
public FlagdOptions build() {
136+
prebuild();
137+
return super.build();
138+
}
139+
};
140+
}
141+
129142
/**
130143
* Overload default lombok builder.
131144
*/
@@ -140,5 +153,22 @@ public FlagdOptionsBuilder withGlobalTelemetry(final boolean b) {
140153
}
141154
return this;
142155
}
156+
157+
void prebuild() {
158+
if (resolverType == null) {
159+
resolverType = fromValueProvider(System::getenv);
160+
}
161+
162+
if (port == 0) {
163+
port = Integer.parseInt(fallBackToEnvOrDefault(PORT_ENV_VAR_NAME, determineDefaultPortForResolver()));
164+
}
165+
}
166+
167+
private String determineDefaultPortForResolver() {
168+
if (resolverType.equals(Config.Resolver.RPC)) {
169+
return Config.DEFAULT_RPC_PORT;
170+
}
171+
return Config.DEFAULT_IN_PROCESS_PORT;
172+
}
143173
}
144174
}
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)