Skip to content

Commit e198fb8

Browse files
feat: support tracking
1 parent 25ad7d1 commit e198fb8

File tree

4 files changed

+124
-2
lines changed

4 files changed

+124
-2
lines changed

build.gradle

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,14 @@ nexusPublishing {
107107
dependencies {
108108
implementation group: 'com.launchdarkly', name: 'launchdarkly-java-server-sdk', version: '[7.1.0, 8.0.0)'
109109

110-
implementation 'dev.openfeature:sdk:[1.7.0,2.0.0)'
110+
implementation 'dev.openfeature:sdk:[1.14.0,2.0.0)'
111111

112112
// Use JUnit test framework
113113
testImplementation(platform('org.junit:junit-bom:5.10.0'))
114114
testImplementation('org.junit.jupiter:junit-jupiter')
115115
testImplementation "org.mockito:mockito-core:3.+"
116+
117+
testImplementation 'org.awaitility:awaitility:4.2.0'
116118
}
117119

118120
test {

src/main/java/com/launchdarkly/openfeature/serverprovider/Provider.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,32 @@ public void shutdown() {
222222
}
223223
}
224224

225+
@Override
226+
public void track(String eventName, EvaluationContext ctx, TrackingEventDetails details) {
227+
if(ctx == null) {
228+
logger.info("LaunchDarkly track methods require an EvaluationContext to work");
229+
return;
230+
}
231+
232+
if(details != null) {
233+
Double metricValue = null;
234+
if (details.getValue().isPresent()) {
235+
metricValue = (Double)details.getValue().get();
236+
}
237+
LDValue data = valueConverter.toLdValue(new Value(details));
238+
239+
if (metricValue != null) {
240+
client.trackMetric(eventName, evaluationContextConverter.toLdContext(ctx), data, metricValue);
241+
} else if (!data.isNull() && data.size() > 0) {
242+
client.trackData(eventName, evaluationContextConverter.toLdContext(ctx), data);
243+
} else {
244+
client.track(eventName, evaluationContextConverter.toLdContext(ctx));
245+
}
246+
} else {
247+
client.track(eventName, evaluationContextConverter.toLdContext(ctx));
248+
}
249+
}
250+
225251
/**
226252
* Get the LaunchDarkly client associated with this provider.
227253
* <p>

src/main/java/com/launchdarkly/openfeature/serverprovider/Version.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ abstract class Version {
44
private Version() {}
55

66
// This constant is updated automatically by our Gradle script during a release, if the project version has changed
7-
static final String SDK_VERSION = "0.2.0";
7+
static final String SDK_VERSION = "1.0.1";
88
}

src/test/java/com/launchdarkly/openfeature/serverprovider/ProviderTest.java

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import org.junit.jupiter.api.Test;
1010

1111
import static org.mockito.Mockito.*;
12+
13+
import org.awaitility.Awaitility;
14+
1215
import static org.junit.jupiter.api.Assertions.*;
1316

1417
public class ProviderTest {
@@ -35,6 +38,11 @@ public void itCanDoABooleanEvaluation() {
3538

3639
OpenFeatureAPI.getInstance().setProvider(ldProvider);
3740

41+
Awaitility.await().forever().until(() -> OpenFeatureAPI
42+
.getInstance()
43+
.getClient()
44+
.getBooleanValue("the-key", false, evaluationContext));
45+
3846
assertTrue(OpenFeatureAPI
3947
.getInstance()
4048
.getClient()
@@ -60,6 +68,11 @@ public void itCanDoAStringEvaluation() {
6068

6169
OpenFeatureAPI.getInstance().setProvider(ldProvider);
6270

71+
Awaitility.await().forever().until(() -> OpenFeatureAPI
72+
.getInstance()
73+
.getClient()
74+
.getStringValue("the-key", "default", evaluationContext).equals("evaluated"));
75+
6376
assertEquals("evaluated", OpenFeatureAPI
6477
.getInstance()
6578
.getClient()
@@ -83,6 +96,12 @@ public void itCanDoADoubleEvaluation() {
8396
.thenReturn(EvaluationDetail.fromValue(1.0, 42, EvaluationReason.targetMatch()));
8497

8598
OpenFeatureAPI.getInstance().setProvider(ldProvider);
99+
100+
Awaitility.await().forever().until(() -> OpenFeatureAPI
101+
.getInstance()
102+
.getClient()
103+
.getDoubleValue("the-key", 0.0, evaluationContext) != 0.0);
104+
86105
assertEquals(1.0, OpenFeatureAPI
87106
.getInstance()
88107
.getClient()
@@ -126,4 +145,79 @@ public void itCanDoAValueEvaluation() {
126145
assertEquals("84", detailed.getVariant());
127146
assertEquals("TARGETING_MATCH", detailed.getReason());
128147
}
148+
149+
@Test
150+
public void itCanTrackNoTrackingEventDetails() {
151+
EvaluationContext evaluationContext = new ImmutableContext("user-key");
152+
EvaluationContextConverter evaluationContextConverter = new EvaluationContextConverter(null);
153+
154+
OpenFeatureAPI.getInstance().setProvider(ldProvider);
155+
156+
OpenFeatureAPI
157+
.getInstance()
158+
.getClient().track("metric-key", evaluationContext);
159+
160+
verify(mockedLdClient).track(
161+
"metric-key",
162+
evaluationContextConverter.toLdContext(evaluationContext));
163+
}
164+
165+
@Test
166+
public void itCanTrackEmptyTrackingEventDetails() {
167+
EvaluationContext evaluationContext = new ImmutableContext("user-key");
168+
EvaluationContextConverter evaluationContextConverter = new EvaluationContextConverter(null);
169+
170+
TrackingEventDetails trackingEventDetails = new MutableTrackingEventDetails(null);
171+
172+
OpenFeatureAPI.getInstance().setProvider(ldProvider);
173+
174+
OpenFeatureAPI
175+
.getInstance()
176+
.getClient().track("metric-key", evaluationContext, trackingEventDetails);
177+
178+
verify(mockedLdClient).track(
179+
"metric-key",
180+
evaluationContextConverter.toLdContext(evaluationContext));
181+
}
182+
183+
@Test
184+
public void itCanTrackTrackingEventDetailsWithNoValue() {
185+
EvaluationContext evaluationContext = new ImmutableContext("user-key");
186+
EvaluationContextConverter evaluationContextConverter = new EvaluationContextConverter(null);
187+
ValueConverter valueConverter = new ValueConverter(null);
188+
189+
TrackingEventDetails trackingEventDetails = new MutableTrackingEventDetails(null).add("currency", "USD");
190+
191+
OpenFeatureAPI.getInstance().setProvider(ldProvider);
192+
193+
OpenFeatureAPI
194+
.getInstance()
195+
.getClient().track("metric-key", evaluationContext, trackingEventDetails);
196+
197+
verify(mockedLdClient).trackData(
198+
"metric-key",
199+
evaluationContextConverter.toLdContext(evaluationContext),
200+
valueConverter.toLdValue(new Value(trackingEventDetails)));
201+
}
202+
203+
@Test
204+
public void itCanTrackFullTrackingEventDetails() {
205+
EvaluationContext evaluationContext = new ImmutableContext("user-key");
206+
EvaluationContextConverter evaluationContextConverter = new EvaluationContextConverter(null);
207+
ValueConverter valueConverter = new ValueConverter(null);
208+
209+
TrackingEventDetails trackingEventDetails = new MutableTrackingEventDetails(99.77).add("currency", "USD");
210+
211+
OpenFeatureAPI.getInstance().setProvider(ldProvider);
212+
213+
OpenFeatureAPI
214+
.getInstance()
215+
.getClient().track("metric-key", evaluationContext, trackingEventDetails);
216+
217+
verify(mockedLdClient).trackMetric(
218+
"metric-key",
219+
evaluationContextConverter.toLdContext(evaluationContext),
220+
valueConverter.toLdValue(new Value(trackingEventDetails)),
221+
99.77);
222+
}
129223
}

0 commit comments

Comments
 (0)