Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: [flagd] Default port to 8015 if in-process resolver is used. #810

Merged
merged 2 commits into from
Jun 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);
}

Kavindu-Dodan marked this conversation as resolved.
Show resolved Hide resolved
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.*;
zedadyna marked this conversation as resolved.
Show resolved Hide resolved
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")
Kavindu-Dodan marked this conversation as resolved.
Show resolved Hide resolved
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);

}
}