Skip to content

Commit 8325366

Browse files
More fixes
1 parent 09700a9 commit 8325366

File tree

22 files changed

+135
-80
lines changed

22 files changed

+135
-80
lines changed

dd-java-agent/agent-featureflag/src/main/java/com/datadog/featureflag/FeatureFlagEvaluatorImpl.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
import com.datadog.featureflag.ufc.v1.ShardRange;
1111
import com.datadog.featureflag.ufc.v1.Split;
1212
import com.datadog.featureflag.ufc.v1.Variant;
13-
import datadog.trace.api.featureflag.FeatureFlagConfiguration;
13+
import datadog.trace.api.featureflag.FeatureFlagConfig;
14+
import datadog.trace.api.featureflag.FeatureFlagConfigListener;
1415
import datadog.trace.api.featureflag.FeatureFlagEvaluator;
1516
import java.nio.charset.StandardCharsets;
1617
import java.security.MessageDigest;
@@ -25,19 +26,17 @@
2526
import java.util.Objects;
2627
import java.util.TimeZone;
2728
import java.util.concurrent.atomic.AtomicReference;
28-
import java.util.function.Consumer;
2929
import java.util.regex.Pattern;
3030
import org.slf4j.Logger;
3131
import org.slf4j.LoggerFactory;
3232

33-
public class FeatureFlagEvaluatorImpl
34-
implements FeatureFlagEvaluator, Consumer<FeatureFlagConfiguration> {
33+
public class FeatureFlagEvaluatorImpl implements FeatureFlagEvaluator, FeatureFlagConfigListener {
3534

3635
private static final Logger LOGGER = LoggerFactory.getLogger(FeatureFlagEvaluatorImpl.class);
3736
private final AtomicReference<ServerConfiguration> configuration = new AtomicReference<>();
3837

3938
@Override
40-
public void accept(final FeatureFlagConfiguration serverConfiguration) {
39+
public void onConfigurationChanged(final FeatureFlagConfig serverConfiguration) {
4140
configuration.getAndSet((ServerConfiguration) serverConfiguration);
4241
}
4342

@@ -344,10 +343,14 @@ private <T> T mapValue(final Class<T> target, final Object value) {
344343
return (T) Boolean.valueOf(value.toString());
345344
}
346345
if (target == Integer.class) {
347-
return (T) ((Integer) Double.valueOf(value.toString()).intValue());
346+
final Number number =
347+
value instanceof Number ? ((Number) value) : Double.valueOf(value.toString());
348+
return (T) ((Integer) number.intValue());
348349
}
349350
if (target == Double.class) {
350-
return (T) Double.valueOf(value.toString());
351+
final Number number =
352+
value instanceof Number ? ((Number) value) : Double.valueOf(value.toString());
353+
return (T) ((Double) number.doubleValue());
351354
}
352355
return (T) value;
353356
}

dd-java-agent/agent-featureflag/src/main/java/com/datadog/featureflag/FeatureFlagRemoteConfigServiceImpl.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.datadog.featureflag;
22

3-
import static datadog.trace.api.featureflag.FeatureFlag.getConfigListeners;
4-
53
import com.datadog.featureflag.ufc.v1.ServerConfiguration;
64
import com.squareup.moshi.JsonAdapter;
75
import com.squareup.moshi.Moshi;
@@ -11,6 +9,7 @@
119
import datadog.remoteconfig.ConfigurationPoller;
1210
import datadog.remoteconfig.PollingRateHinter;
1311
import datadog.remoteconfig.Product;
12+
import datadog.trace.api.featureflag.FeatureFlag;
1413
import java.io.ByteArrayInputStream;
1514
import java.io.IOException;
1615
import javax.annotation.Nullable;
@@ -45,7 +44,7 @@ public void accept(
4544
final String configKey,
4645
@Nullable final ServerConfiguration configuration,
4746
final PollingRateHinter pollingRateHinter) {
48-
getConfigListeners().forEach(consumer -> consumer.accept(configuration));
47+
FeatureFlag.dispatch(configuration);
4948
}
5049

5150
private static class UniversalFlagConfigDeserializer

dd-java-agent/agent-featureflag/src/main/java/com/datadog/featureflag/FeatureFlagSystem.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import org.slf4j.Logger;
99
import org.slf4j.LoggerFactory;
1010

11-
public class FeatureFlagSystem {
11+
public class FeatureFlagSystem extends FeatureFlag {
1212

1313
private static final Logger LOGGER = LoggerFactory.getLogger(FeatureFlagSystem.class);
1414
private static final int EXPOSURE_WRITER_CAPACITY = 100_000;
@@ -35,8 +35,8 @@ public static void start(final SharedCommunicationObjects sco) {
3535
sco.agentUrl,
3636
config);
3737
final FeatureFlagEvaluatorImpl evaluator = new FeatureFlagEvaluatorImpl();
38-
FeatureFlag.addConfigListener(evaluator);
39-
FeatureFlag.init(new ExposureWriterEvaluatorAdapter(EXPOSURE_WRITER, evaluator));
38+
FeatureFlag.addListener(evaluator);
39+
FeatureFlag.setEvaluator(new ExposureWriterEvaluatorAdapter(EXPOSURE_WRITER, evaluator));
4040

4141
CONFIG_SERVICE = new FeatureFlagRemoteConfigServiceImpl(poller);
4242
CONFIG_SERVICE.init();

dd-java-agent/agent-featureflag/src/main/java/com/datadog/featureflag/ufc/v1/ServerConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.datadog.featureflag.ufc.v1;
22

3-
import datadog.trace.api.featureflag.FeatureFlagConfiguration;
3+
import datadog.trace.api.featureflag.FeatureFlagConfig;
44
import java.util.Map;
55

6-
public class ServerConfiguration implements FeatureFlagConfiguration {
6+
public class ServerConfiguration implements FeatureFlagConfig {
77
public final String createdAt;
88
public final String format;
99
public final Environment environment;

dd-java-agent/agent-featureflag/src/test/groovy/com/datadog/featureflag/ExposureWriterTests.groovy

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class ExposureWriterTests extends AbstractJsonTestSuiteBasedTests {
4242
setup:
4343
def writer = Mock(ExposureWriter)
4444
def evaluator = new FeatureFlagEvaluatorImpl()
45-
evaluator.accept(configuration)
45+
evaluator.onConfigurationChanged(configuration)
4646
evaluator = new ExposureWriterEvaluatorAdapter(writer, evaluator)
4747
final context = buildContext(evaluation)
4848

@@ -65,7 +65,7 @@ class ExposureWriterTests extends AbstractJsonTestSuiteBasedTests {
6565
def writer = Mock(ExposureWriter)
6666
final cacheCapacity = 5
6767
def evaluator = new FeatureFlagEvaluatorImpl()
68-
evaluator.accept(configuration)
68+
evaluator.onConfigurationChanged(configuration)
6969
evaluator = new ExposureWriterEvaluatorAdapter(cacheCapacity, writer, evaluator)
7070

7171
when: 'populating the cache'
@@ -95,7 +95,7 @@ class ExposureWriterTests extends AbstractJsonTestSuiteBasedTests {
9595
def writer = new ExposureWriterImpl(100_000, 100L, TimeUnit.MILLISECONDS, HttpUrl.get(server.address), Config.get())
9696
writer.init()
9797
def evaluator = new FeatureFlagEvaluatorImpl()
98-
evaluator.accept(configuration)
98+
evaluator.onConfigurationChanged(configuration)
9999
evaluator = new ExposureWriterEvaluatorAdapter(writer, evaluator)
100100
def evaluations = testCases.findAll {
101101
it.result?.flagMetadata?.doLog == true

dd-java-agent/agent-featureflag/src/test/groovy/com/datadog/featureflag/FeatureFlagEvaluatorTests.groovy

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class FeatureFlagEvaluatorTests extends AbstractJsonTestSuiteBasedTests {
2424
void 'test no context'() {
2525
setup:
2626
final evaluator = new FeatureFlagEvaluatorImpl()
27-
evaluator.accept(configuration)
27+
evaluator.onConfigurationChanged(configuration)
2828
final testCase = testCases.first()
2929

3030
when:
@@ -39,7 +39,7 @@ class FeatureFlagEvaluatorTests extends AbstractJsonTestSuiteBasedTests {
3939
void 'test feature flag evaluation'() {
4040
setup:
4141
final evaluator = new FeatureFlagEvaluatorImpl()
42-
evaluator.accept(configuration)
42+
evaluator.onConfigurationChanged(configuration)
4343
final context = buildContext(evaluation)
4444

4545
when:
@@ -52,10 +52,10 @@ class FeatureFlagEvaluatorTests extends AbstractJsonTestSuiteBasedTests {
5252
evaluation << testCases
5353
}
5454

55-
void 'test feature flag dates format'() {
55+
void 'test feature flag date parsing'() {
5656
setup:
5757
final evaluator = new FeatureFlagEvaluatorImpl()
58-
evaluator.accept(parseConfiguration('data/flags-dates-v1.json'))
58+
evaluator.onConfigurationChanged(parseConfiguration('data/flags-dates-v1.json'))
5959
final evaluation = new TestUtils.EvaluationTest(
6060
flag: 'start-and-end-date-test',
6161
variationType: 'STRING',

dd-java-agent/agent-featureflag/src/test/groovy/com/datadog/featureflag/FeatureFlagRemoteConfigServiceTest.groovy

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,25 @@ import datadog.remoteconfig.ConfigurationPoller
88
import datadog.remoteconfig.PollingRateHinter
99
import datadog.remoteconfig.Product
1010
import datadog.trace.api.featureflag.FeatureFlag
11+
import datadog.trace.api.featureflag.FeatureFlagConfigListener
1112
import datadog.trace.test.util.DDSpecification
12-
import java.util.function.Consumer
1313

1414
class FeatureFlagRemoteConfigServiceTest extends DDSpecification {
1515

16-
private Consumer<ServerConfiguration> consumer
16+
private FeatureFlagConfigListener listener
1717

1818
void setup() {
19-
consumer = Mock(Consumer<ServerConfiguration>)
19+
listener = Mock(FeatureFlagConfigListener)
2020
}
2121

2222
void cleanup() {
23-
FeatureFlag.removeConfigListener {consumer}
23+
FeatureFlag.removeListener(listener)
2424
}
2525

2626
void 'test new config received'() {
2727
setup:
2828
final poller = Mock(ConfigurationPoller)
29-
FeatureFlag.addConfigListener(consumer)
29+
FeatureFlag.addListener(listener)
3030
final service = new FeatureFlagRemoteConfigServiceImpl(poller)
3131
final config = fetchConfiguration( 'data/flags-v1.json').bytes
3232
ConfigurationDeserializer<ServerConfiguration> deserializer = null
@@ -43,7 +43,7 @@ class FeatureFlagRemoteConfigServiceTest extends DDSpecification {
4343
service.accept('test', deserializer.deserialize(config), Mock(PollingRateHinter))
4444

4545
then:
46-
1 * consumer.accept({
46+
1 * listener.onConfigurationChanged({
4747
ServerConfiguration ufc ->
4848
ufc.createdAt == '2024-04-17T19:40:53.716Z'
4949
&& ufc.format == 'SERVER'
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import org.springframework.boot.gradle.tasks.bundling.BootJar
2+
3+
plugins {
4+
id 'java'
5+
id 'org.springframework.boot' version '2.7.15'
6+
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
7+
}
8+
9+
ext {
10+
minJavaVersionForTests = JavaVersion.VERSION_11
11+
}
12+
13+
apply from: "$rootDir/gradle/java.gradle"
14+
apply from: "$rootDir/gradle/spring-boot-plugin.gradle"
15+
description = 'Open Feature provider Smoke Tests.'
16+
17+
tasks.named("compileJava", JavaCompile) {
18+
configureCompiler(it, 11, JavaVersion.VERSION_11)
19+
}
20+
21+
dependencies {
22+
implementation project(':dd-trace-openfeature')
23+
implementation 'org.springframework.boot:spring-boot-starter-web'
24+
testImplementation project(':dd-smoke-tests')
25+
}
26+
27+
tasks.withType(Test).configureEach {
28+
dependsOn "bootJar"
29+
def bootJarTask = tasks.named('bootJar', BootJar)
30+
jvmArgumentProviders.add(new CommandLineArgumentProvider() {
31+
@Override
32+
Iterable<String> asArguments() {
33+
return bootJarTask.map { ["-Ddatadog.smoketest.springboot.shadowJar.path=${it.archiveFile.get()}"] }.get()
34+
}
35+
})
36+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package datadog.smoketest.springboot;
2+
3+
import java.lang.management.ManagementFactory;
4+
import org.springframework.boot.SpringApplication;
5+
import org.springframework.boot.autoconfigure.SpringBootApplication;
6+
7+
@SpringBootApplication
8+
public class SpringbootApplication {
9+
10+
public static void main(final String[] args) {
11+
SpringApplication.run(SpringbootApplication.class, args);
12+
System.out.println("Started in " + ManagementFactory.getRuntimeMXBean().getUptime() + "ms");
13+
}
14+
}
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,15 @@ public class OpenFeatureController {
2929

3030
private final Client client;
3131

32-
static {
33-
OpenFeatureAPI.getInstance().setProvider(new datadog.trace.api.openfeature.Provider());
34-
}
35-
3632
public OpenFeatureController() {
37-
this.client = OpenFeatureAPI.getInstance().getClient();
33+
OpenFeatureAPI api = OpenFeatureAPI.getInstance();
34+
api.setProviderAndWait(new datadog.trace.api.openfeature.Provider());
35+
this.client = api.getClient();
3836
}
3937

4038
@GetMapping("/provider-metadata")
4139
public Map<String, Object> getProviderMetadata() {
4240
FeatureProvider provider = OpenFeatureAPI.getInstance().getProvider();
43-
4441
Map<String, Object> response = new HashMap<>();
4542
response.put("providerClass", provider.getClass());
4643
response.put("metadata", provider.getMetadata().getName());

0 commit comments

Comments
 (0)