Skip to content

Commit ea00b20

Browse files
committed
add vm lens setup
Signed-off-by: christian.lutnik <[email protected]>
1 parent bf2f20e commit ea00b20

29 files changed

+511
-64
lines changed

pom.xml

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,14 @@
7777
<version>1.4.1</version>
7878
<scope>test</scope>
7979
</dependency>
80-
81-
<dependency>
82-
<groupId>org.mockito</groupId>
83-
<artifactId>mockito-core</artifactId>
84-
<version>${org.mockito.version}</version>
85-
<scope>test</scope>
86-
</dependency>
87-
80+
<!--
81+
<dependency>
82+
<groupId>org.mockito</groupId>
83+
<artifactId>mockito-core</artifactId>
84+
<version>${org.mockito.version}</version>
85+
<scope>test</scope>
86+
</dependency>
87+
-->
8888
<dependency>
8989
<groupId>org.assertj</groupId>
9090
<artifactId>assertj-core</artifactId>
@@ -167,6 +167,11 @@
167167
<version>1.37</version>
168168
<scope>test</scope>
169169
</dependency>
170+
<dependency>
171+
<groupId>com.vmlens</groupId>
172+
<artifactId>api</artifactId>
173+
<version>1.2.3</version>
174+
</dependency>
170175

171176
</dependencies>
172177

@@ -176,6 +181,7 @@
176181
<!-- Start mockito workaround -->
177182
<!-- https://github.com/mockito/mockito/issues/3121 -->
178183
<!-- These are transitive dependencies of mockito we are forcing -->
184+
<!--
179185
<dependency>
180186
<groupId>net.bytebuddy</groupId>
181187
<artifactId>byte-buddy</artifactId>
@@ -189,6 +195,7 @@
189195
<version>1.17.5</version>
190196
<scope>test</scope>
191197
</dependency>
198+
-->
192199
<!-- End mockito workaround-->
193200

194201
<dependency>
@@ -206,14 +213,6 @@
206213
<type>pom</type>
207214
<scope>import</scope>
208215
</dependency>
209-
210-
<dependency>
211-
<groupId>com.vmlens</groupId>
212-
<artifactId>api</artifactId>
213-
<version>1.2.2</version>
214-
<scope>test</scope>
215-
</dependency>
216-
217216
</dependencies>
218217
</dependencyManagement>
219218

@@ -308,7 +307,7 @@
308307
<plugin>
309308
<groupId>com.vmlens</groupId>
310309
<artifactId>vmlens-maven-plugin</artifactId>
311-
<version>1.2.2</version>
310+
<version>1.2.3</version>
312311
<executions>
313312
<execution>
314313
<id>test</id>

sdk.iml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module version="4">
3+
<component name="CheckStyle-IDEA-Module" serialisationVersion="2">
4+
<option name="activeLocationsIds" />
5+
</component>
6+
</module>

src/main/java/dev/openfeature/sdk/Awaitable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class Awaitable {
1010
*/
1111
public static final Awaitable FINISHED = new Awaitable(true);
1212

13-
private boolean isDone = false;
13+
private volatile boolean isDone = false;
1414

1515
public Awaitable() {}
1616

src/main/java/dev/openfeature/sdk/OpenFeatureClient.java

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.openfeature.sdk;
22

3+
import com.vmlens.api.AllInterleavings;
34
import dev.openfeature.sdk.exceptions.ExceptionUtils;
45
import dev.openfeature.sdk.exceptions.FatalError;
56
import dev.openfeature.sdk.exceptions.GeneralError;
@@ -8,13 +9,16 @@
89
import dev.openfeature.sdk.internal.AutoCloseableLock;
910
import dev.openfeature.sdk.internal.AutoCloseableReentrantReadWriteLock;
1011
import dev.openfeature.sdk.internal.ObjectUtils;
12+
import dev.openfeature.sdk.providers.memory.Flag;
13+
import dev.openfeature.sdk.providers.memory.InMemoryProvider;
1114
import java.util.ArrayList;
1215
import java.util.Arrays;
1316
import java.util.Collections;
1417
import java.util.HashMap;
1518
import java.util.List;
1619
import java.util.Map;
1720
import java.util.Objects;
21+
import java.util.concurrent.atomic.AtomicInteger;
1822
import java.util.function.Consumer;
1923
import lombok.Getter;
2024
import lombok.extern.slf4j.Slf4j;
@@ -180,7 +184,7 @@ private <T> FlagEvaluationDetails<T> evaluateFlag(
180184
ProviderState state = stateManager.getState();
181185

182186
mergedHooks = ObjectUtils.merge(
183-
provider.getProviderHooks(), flagOptions.getHooks(), clientHooks, openfeatureApi.getHooks());
187+
provider.getProviderHooks(), flagOptions.getHooks(), getHooks(), openfeatureApi.getHooks());
184188

185189
EvaluationContext mergedCtx = hookSupport.beforeHooks(
186190
type,
@@ -521,4 +525,117 @@ public Client removeHandler(ProviderEvent event, Consumer<EventDetails> handler)
521525
openfeatureApi.removeHandler(domain, event, handler);
522526
return this;
523527
}
528+
529+
static int jaVar = 0;
530+
531+
/**
532+
* run.
533+
*
534+
* @param args the args
535+
* @throws InterruptedException something
536+
*/
537+
public static void main(String[] args) throws InterruptedException {
538+
539+
System.out.println("OpenFeatureClientTest.testUpdate");
540+
final OpenFeatureAPI api = new OpenFeatureAPI();
541+
542+
var flags = new HashMap<String, Flag<?>>();
543+
flags.put("a", Flag.builder().variant("a", "def").defaultVariant("a").build());
544+
flags.put("b", Flag.builder().variant("a", "as").defaultVariant("a").build());
545+
flags.put("c", Flag.builder().variant("a", "dfs").defaultVariant("a").build());
546+
flags.put("d", Flag.builder().variant("a", "asddd").defaultVariant("a").build());
547+
api.setProviderAndWait(new InMemoryProvider(flags));
548+
var i = 0;
549+
var c = new AtomicInteger();
550+
551+
System.out.println("before try");
552+
try (AllInterleavings allInterleavings = new AllInterleavings("Concurrent evaluations and hook additions")) {
553+
while (allInterleavings.hasNext()) {
554+
c.incrementAndGet();
555+
jaVar = 0;
556+
Thread first = new Thread() {
557+
@Override
558+
public void run() {
559+
jaVar++;
560+
}
561+
};
562+
first.start();
563+
jaVar++;
564+
first.join();
565+
if (jaVar != 2) {
566+
throw new RuntimeException("jaVar=" + jaVar);
567+
}
568+
/*
569+
var client = api.getClient();
570+
var firstReady = new Awaitable();
571+
var secondReady = new Awaitable();
572+
var startThreads = new Awaitable();
573+
Thread first = new Thread() {
574+
@Override
575+
public void run() {
576+
firstReady.wakeup();
577+
startThreads.await();
578+
client.getStringValue("a", "a");
579+
}
580+
};
581+
Thread hookAdder = new Thread() {
582+
@Override
583+
public void run() {
584+
secondReady.wakeup();
585+
startThreads.await();
586+
client.addHooks(new Hook() {});
587+
}
588+
};
589+
hookAdder.start();
590+
first.start();
591+
firstReady.await();
592+
secondReady.await();
593+
startThreads.wakeup();
594+
first.join();
595+
hookAdder.join();
596+
*/
597+
/*System.out.println("has interlereaving");
598+
i++;
599+
//var latch = new CountDownLatch(1);
600+
var client = api.getClient();
601+
var concurrentModException = new AtomicReference<ConcurrentModificationException>();
602+
Thread eval = new Thread(() -> {
603+
System.out.println("eval");
604+
try {
605+
latch.await();
606+
} catch (InterruptedException ignored) {
607+
}
608+
client.getStringValue("a", "a");
609+
client.getStringValue("b", "a");
610+
client.getStringValue("c", "a");
611+
client.getStringValue("d", "a");
612+
613+
});
614+
Thread hookAdder = new Thread(() -> {
615+
System.out.println("hook adder");
616+
try {
617+
latch.await();
618+
} catch (InterruptedException ignored) {
619+
}
620+
client.addHooks(new Hook() {});
621+
622+
});
623+
System.out.println("starting...");
624+
//eval.start();
625+
//hookAdder.start();
626+
System.out.println("started");
627+
Thread.sleep(200);
628+
client.getStringValue("d", "a");
629+
client.addHooks(new Hook() {});
630+
client.getStringValue("d", "a");
631+
//latch.countDown();
632+
eval.join();
633+
hookAdder.join();
634+
System.out.println(concurrentModException.get());*/
635+
}
636+
}
637+
System.out.println("i = " + i);
638+
System.out.println("jaVar = " + jaVar);
639+
System.out.println("c.get() = " + c.get());
640+
}
524641
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package dev.openfeature.sdk;
2+
3+
import com.vmlens.api.AllInterleavings;
4+
import dev.openfeature.sdk.providers.memory.Flag;
5+
import dev.openfeature.sdk.providers.memory.InMemoryProvider;
6+
import java.util.HashMap;
7+
import java.util.concurrent.atomic.AtomicInteger;
8+
9+
/**
10+
* Javadoc.
11+
*/
12+
public class VmLensTest {
13+
int jaVar = 0;
14+
15+
16+
public static void main(String[] args) throws InterruptedException {
17+
new VmLensTest().asomeMethod();
18+
}
19+
20+
private void asomeMethod() throws InterruptedException {
21+
var c = new AtomicInteger();
22+
final OpenFeatureAPI api = new OpenFeatureAPI();
23+
24+
var flags = new HashMap<String, Flag<?>>();
25+
flags.put("a", Flag.builder().variant("a", "def").defaultVariant("a").build());
26+
flags.put("b", Flag.builder().variant("a", "as").defaultVariant("a").build());
27+
flags.put("c", Flag.builder().variant("a", "dfs").defaultVariant("a").build());
28+
flags.put("d", Flag.builder().variant("a", "asddd").defaultVariant("a").build());
29+
api.setProviderAndWait(new InMemoryProvider(flags));
30+
try (AllInterleavings allInterleavings = new AllInterleavings("Concurrent evaluations and hook additions")) {
31+
while (allInterleavings.hasNext()) {
32+
c.incrementAndGet();
33+
var client = api.getClient();
34+
var firstReady = new Awaitable();
35+
Thread first = new Thread() {
36+
@Override
37+
public void run() {
38+
firstReady.wakeup();
39+
client.getStringValue("a", "a");
40+
// client.getStringValue("a", "a");
41+
}
42+
};
43+
44+
first.start();
45+
firstReady.await();
46+
47+
client.addHooks(new Hook() {});
48+
// client.addHooks(new Hook() {});
49+
50+
first.join();
51+
}
52+
}
53+
54+
System.out.println("c = " + c);
55+
System.out.println("jaVar = " + jaVar);
56+
57+
Thread.sleep(5000);
58+
//System.exit(0);
59+
}
60+
}

0 commit comments

Comments
 (0)