Skip to content

Commit

Permalink
feat: [flagd] Default port to 8015 if in-process resolver is used. (#810
Browse files Browse the repository at this point in the history
)

Signed-off-by: Daniel Zehetner <daniel.zehetner@dynatrace.com>
Co-authored-by: Alexandra Oberaigner <alexandra.oberaigner@dynatrace.com>
  • Loading branch information
zedadyna and alexandraoberaigner committed Jun 11, 2024
1 parent 5b9c70b commit 9b7dc9a
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
@Slf4j
public final class Config {
static final Resolver DEFAULT_RESOLVER_TYPE = Resolver.RPC;
static final String DEFAULT_PORT = "8013";
static final String DEFAULT_RPC_PORT = "8013";
static final String DEFAULT_IN_PROCESS_PORT = "8015";
static final String DEFAULT_TLS = "false";
static final String DEFAULT_HOST = "localhost";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_HOST;
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_MAX_CACHE_SIZE;
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_MAX_EVENT_STREAM_RETRIES;
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_PORT;
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_TLS;
import static dev.openfeature.contrib.providers.flagd.Config.HOST_ENV_VAR_NAME;
import static dev.openfeature.contrib.providers.flagd.Config.MAX_CACHE_SIZE_ENV_VAR_NAME;
Expand All @@ -39,8 +38,7 @@ public class FlagdOptions {
/**
* flagd resolving type.
*/
@Builder.Default
private Config.EvaluatorType resolverType = fromValueProvider(System::getenv);
private Config.EvaluatorType resolverType;

/**
* flagd connection host.
Expand All @@ -51,8 +49,7 @@ public class FlagdOptions {
/**
* flagd connection port.
*/
@Builder.Default
private int port = Integer.parseInt(fallBackToEnvOrDefault(PORT_ENV_VAR_NAME, DEFAULT_PORT));
private int port;

/**
* Use TLS connectivity.
Expand Down Expand Up @@ -126,6 +123,22 @@ public class FlagdOptions {
*/
private OpenTelemetry openTelemetry;


/**
* Builder overwrite in order to customize the "build" method.
*
* @return the flagd options builder
*/
public static FlagdOptionsBuilder builder() {
return new FlagdOptionsBuilder() {
@Override
public FlagdOptions build() {
prebuild();
return super.build();
}
};
}

/**
* Overload default lombok builder.
*/
Expand All @@ -140,5 +153,22 @@ public FlagdOptionsBuilder withGlobalTelemetry(final boolean b) {
}
return this;
}

void prebuild() {
if (resolverType == null) {
resolverType = fromValueProvider(System::getenv);
}

if (port == 0) {
port = Integer.parseInt(fallBackToEnvOrDefault(PORT_ENV_VAR_NAME, determineDefaultPortForResolver()));
}
}

private String determineDefaultPortForResolver() {
if (resolverType.equals(Config.Resolver.RPC)) {
return Config.DEFAULT_RPC_PORT;
}
return Config.DEFAULT_IN_PROCESS_PORT;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,29 +1,24 @@
package dev.openfeature.contrib.providers.flagd;

import io.opentelemetry.api.OpenTelemetry;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import java.util.function.Function;

import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_CACHE;
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_HOST;
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_MAX_CACHE_SIZE;
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_MAX_EVENT_STREAM_RETRIES;
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_PORT;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static dev.openfeature.contrib.providers.flagd.Config.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

public class FlagdOptionsTest {
class FlagdOptionsTest {

@Test
public void TestDefaults() {
void TestDefaults() {
final FlagdOptions builder = FlagdOptions.builder().build();

assertEquals(DEFAULT_HOST, builder.getHost());
assertEquals(DEFAULT_PORT, Integer.toString(builder.getPort()));
assertEquals(DEFAULT_RPC_PORT, Integer.toString(builder.getPort()));
assertFalse(builder.isTls());
assertNull(builder.getCertPath());
assertNull(builder.getSocketPath());
Expand All @@ -33,11 +28,11 @@ public void TestDefaults() {
assertNull(builder.getSelector());
assertNull(builder.getOpenTelemetry());
assertNull(builder.getOfflineFlagSourcePath());
assertEquals(Config.Resolver.RPC, builder.getResolverType());
assertEquals(Resolver.RPC, builder.getResolverType());
}

@Test
public void TestBuilderOptions() {
void TestBuilderOptions() {
OpenTelemetry openTelemetry = Mockito.mock(OpenTelemetry.class);

FlagdOptions flagdOptions = FlagdOptions.builder()
Expand All @@ -51,7 +46,7 @@ public void TestBuilderOptions() {
.selector("app=weatherApp")
.offlineFlagSourcePath("some-path")
.openTelemetry(openTelemetry)
.resolverType(Config.Resolver.IN_PROCESS)
.resolverType(Resolver.IN_PROCESS)
.build();

assertEquals("https://hosted-flagd", flagdOptions.getHost());
Expand All @@ -64,32 +59,92 @@ public void TestBuilderOptions() {
assertEquals("app=weatherApp", flagdOptions.getSelector());
assertEquals("some-path", flagdOptions.getOfflineFlagSourcePath());
assertEquals(openTelemetry, flagdOptions.getOpenTelemetry());
assertEquals(Config.Resolver.IN_PROCESS, flagdOptions.getResolverType());
assertEquals(Resolver.IN_PROCESS, flagdOptions.getResolverType());
}


@Test
public void testValueProviderForEdgeCase_valid() {
void testValueProviderForEdgeCase_valid() {
Function<String, String> valueProvider = s -> "in-process";
assertEquals(Config.Resolver.IN_PROCESS, Config.fromValueProvider(valueProvider));
assertEquals(Resolver.IN_PROCESS, Config.fromValueProvider(valueProvider));

valueProvider = s -> "IN-PROCESS";
assertEquals(Config.Resolver.IN_PROCESS, Config.fromValueProvider(valueProvider));
assertEquals(Resolver.IN_PROCESS, Config.fromValueProvider(valueProvider));

valueProvider = s -> "rpc";
assertEquals(Config.Resolver.RPC, Config.fromValueProvider(valueProvider));
assertEquals(Resolver.RPC, Config.fromValueProvider(valueProvider));

valueProvider = s -> "RPC";
assertEquals(Config.Resolver.RPC, Config.fromValueProvider(valueProvider));
assertEquals(Resolver.RPC, Config.fromValueProvider(valueProvider));
}

@Test
public void testValueProviderForEdgeCase_invalid() {
void testValueProviderForEdgeCase_invalid() {
Function<String, String> dummy = s -> "some-other";
assertEquals(Config.DEFAULT_RESOLVER_TYPE, Config.fromValueProvider(dummy));

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

@Test
@Disabled("Currently there is no defined way on how to set environment variables for tests")
void testInProcessProviderFromEnv_noPortConfigured_defaultsToCorrectPort() {
FlagdOptions flagdOptions = FlagdOptions.builder().build();

assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS);
assertThat(flagdOptions.getPort()).isEqualTo(Integer.parseInt(DEFAULT_IN_PROCESS_PORT));
}

@Test
void testInProcessProvider_noPortConfigured_defaultsToCorrectPort() {
FlagdOptions flagdOptions = FlagdOptions.builder()
.resolverType(Resolver.IN_PROCESS)
.build();

assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS);
assertThat(flagdOptions.getPort()).isEqualTo(Integer.parseInt(DEFAULT_IN_PROCESS_PORT));
}

@Test
@Disabled("Currently there is no defined way on how to set environment variables for tests")
void testInProcessProviderFromEnv_portConfigured_usesConfiguredPort() {
FlagdOptions flagdOptions = FlagdOptions.builder()
.port(1000)
.build();

assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS);
assertThat(flagdOptions.getPort()).isEqualTo(1000);
}

@Test
@Disabled("Currently there is no defined way on how to set environment variables for tests")
void testRpcProviderFromEnv_noPortConfigured_defaultsToCorrectPort() {
FlagdOptions flagdOptions = FlagdOptions.builder().build();

assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.RPC);
assertThat(flagdOptions.getPort()).isEqualTo(Integer.parseInt(DEFAULT_RPC_PORT));
}

@Test
void testRpcProvider_noPortConfigured_defaultsToCorrectPort() {
FlagdOptions flagdOptions = FlagdOptions.builder()
.resolverType(Resolver.RPC)
.build();

assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.RPC);
assertThat(flagdOptions.getPort()).isEqualTo(Integer.parseInt(DEFAULT_RPC_PORT));
}

@Test
@Disabled("Currently there is no defined way on how to set environment variables for tests")
void testRpcProviderFromEnv_portConfigured_usesConfiguredPort() {
FlagdOptions flagdOptions = FlagdOptions.builder()
.port(1534)
.build();

assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.RPC);
assertThat(flagdOptions.getPort()).isEqualTo(1534);

}
}

0 comments on commit 9b7dc9a

Please sign in to comment.