Skip to content

Commit

Permalink
flaky tests attempt, changing it to stop flagd all the time, without …
Browse files Browse the repository at this point in the history
…stopping the container

Signed-off-by: Simon Schrottner <[email protected]>
  • Loading branch information
aepfli committed Feb 6, 2025
1 parent 7fb193e commit f520a29
Show file tree
Hide file tree
Showing 12 changed files with 42 additions and 48 deletions.
2 changes: 1 addition & 1 deletion providers/flagd/spec
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ EvaluationContext getEnrichedContext() {
private void onProviderEvent(FlagdProviderEvent flagdProviderEvent) {

synchronized (eventsLock) {
log.info("FlagdProviderEvent: {}", flagdProviderEvent);
log.info("FlagdProviderEvent: {}", flagdProviderEvent.getEvent());
eventsLock.syncMetadata = flagdProviderEvent.getSyncMetadata();
if (flagdProviderEvent.getSyncMetadata() != null) {
eventsLock.enrichedContext = contextEnricher.apply(flagdProviderEvent.getSyncMetadata());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,11 @@ public static void monitorChannelState(
log.debug("onConnectionLost is null");
}
}
// Re-register the state monitor to watch for the next state transition.
monitorChannelState(currentState, channel, onConnectionReady, onConnectionLost);
if (currentState != ConnectivityState.SHUTDOWN) {
log.debug("shutting down grpc channel");
// Re-register the state monitor to watch for the next state transition.
monitorChannelState(currentState, channel, onConnectionReady, onConnectionLost);
}
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public void onCompleted() {}
* @param value the event stream response containing configuration change data
*/
private void handleConfigurationChangeEvent(EventStreamResponse value) {
log.debug("Received provider change event");
List<String> changedFlags = new ArrayList<>();

Map<String, Value> data = value.getData().getFieldsMap();
Expand All @@ -80,7 +81,7 @@ private void handleConfigurationChangeEvent(EventStreamResponse value) {
* Handles provider readiness events by clearing the cache (if enabled) and notifying listeners of readiness.
*/
private void handleProviderReadyEvent() {
log.info("Received provider ready event");
log.debug("Received provider ready event");
onReady.accept(new FlagdProviderEvent(ProviderEvent.PROVIDER_READY));
}
}
3 changes: 3 additions & 0 deletions providers/flagd/src/main/resources/simplelogger.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
org.org.slf4j.simpleLogger.defaultLogLevel=debug

io.grpc.level=trace
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@
import dev.openfeature.sdk.Reason;
import dev.openfeature.sdk.Structure;
import dev.openfeature.sdk.Value;
import io.cucumber.java.AfterAll;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
Expand All @@ -60,7 +59,8 @@
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Function;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockedConstruction;

Expand Down Expand Up @@ -90,15 +90,15 @@ class FlagdProviderTest {
.build();
private static final String STRING_VALUE = "hi!";

private static OpenFeatureAPI api;
private OpenFeatureAPI api;

@BeforeAll
public static void init() {
@BeforeEach
public void init() {
api = OpenFeatureAPI.getInstance();
}

@AfterAll
public static void cleanUp() {
@AfterEach
public void cleanUp() {
api.shutdown();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import dev.openfeature.contrib.providers.flagd.Config;
import org.apache.logging.log4j.core.config.Order;
import org.junit.jupiter.api.parallel.Isolated;
import org.junit.platform.suite.api.BeforeSuite;
import org.junit.platform.suite.api.ConfigurationParameter;
import org.junit.platform.suite.api.ExcludeTags;
Expand All @@ -30,6 +31,7 @@
@IncludeTags("in-process")
@ExcludeTags({"unixsocket", "targetURI"})
@Testcontainers
@Isolated
public class RunInProcessTest {

@BeforeSuite
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import dev.openfeature.contrib.providers.flagd.e2e.steps.FlagSteps;
import dev.openfeature.contrib.providers.flagd.e2e.steps.ProviderType;
import dev.openfeature.sdk.Client;
import dev.openfeature.sdk.FeatureProvider;
import dev.openfeature.sdk.FlagEvaluationDetails;
import dev.openfeature.sdk.MutableContext;
import java.util.LinkedList;
Expand All @@ -15,6 +16,7 @@
public class State {
public ProviderType providerType;
public Client client;
public FeatureProvider provider;
public List<Event> events = new LinkedList<>();
public Optional<Event> lastEvent;
public FlagSteps.Flag flag;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public EventSteps(State state) {
@Given("a {} event handler")
public void a_stale_event_handler(String eventType) {
state.client.on(mapEventType(eventType), eventDetails -> {
log.info("event tracked for {} at {} ms ", eventType, System.currentTimeMillis()%100_000);
log.info("event tracked for {} at {} ms ", eventType, System.currentTimeMillis() % 100_000);
state.events.add(new Event(eventType, eventDetails));
});
}
Expand Down Expand Up @@ -58,12 +58,13 @@ public void eventHandlerShouldBeExecuted(String eventType) {
@Then("the {} event handler should have been executed within {int}ms")
public void eventHandlerShouldBeExecutedWithin(String eventType, int ms) {
log.info("waiting for eventtype: {}", eventType);
await().atMost(ms, MILLISECONDS)
await().alias("waiting for eventtype " + eventType)
.atMost(ms, MILLISECONDS)
.pollInterval(10, MILLISECONDS)
.until(() -> state.events.stream().anyMatch(event -> event.type.equals(eventType)));
state.lastEvent = state.events.stream()
.filter(event -> event.type.equals(eventType))
.findFirst();
state.events.removeIf(event -> event.type.equals(eventType));
state.events.clear();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.junit.jupiter.api.parallel.Isolated;
import org.junit.platform.suite.api.BeforeSuite;
import org.testcontainers.containers.BindMode;
import org.testcontainers.shaded.org.apache.commons.io.FileUtils;

Expand All @@ -42,7 +41,6 @@ public ProviderSteps(State state) {
super(state);
}

/*
@BeforeAll
public static void beforeAll() throws IOException {
State.resolverType = Config.Resolver.RPC;
Expand All @@ -66,33 +64,13 @@ public void before() throws IOException {
}

@After
public void tearDown() {
OpenFeatureAPI.getInstance().shutdown();
}
*/

@BeforeAll
public static void beforeAll() {
State.resolverType = Config.Resolver.RPC;
}

@Before
public void before() throws IOException {
state.events.clear();
sharedTempDir = Files.createDirectories(
Paths.get("tmp/" + RandomStringUtils.randomAlphanumeric(8).toLowerCase() + "/"));
container = new FlagdContainer()
.withFileSystemBind(sharedTempDir.toAbsolutePath().toString(), "/tmp", BindMode.READ_WRITE);
if (!container.isRunning()) {
container.start();
public void tearDown() throws InterruptedException {
if (state.client != null) {
when().post("http://" + container.getLaunchpadUrl() + "/stop")
.then()
.statusCode(200);
}
}

@After
public void tearDown() throws IOException {
OpenFeatureAPI.getInstance().shutdown();
container.stop();
FileUtils.deleteDirectory(sharedTempDir.toFile());
}

@Given("a {} flagd provider")
Expand Down Expand Up @@ -167,16 +145,16 @@ public void setupProvider(String providerType) throws IOException, InterruptedEx
this.state.client = api.getClient(providerName);
}

@When("the connection is lost")
public void the_connection_is_lost() throws InterruptedException {
when().post("http://" + container.getLaunchpadUrl() + "/stop").then().statusCode(200);
}

@When("the connection is lost for {int}s")
public void the_connection_is_lost_for(int seconds) throws InterruptedException {
log.info("Timeout and wait for {} seconds starting at {} ms, should resume at {} ms", seconds,
System.currentTimeMillis() % 100_000, System.currentTimeMillis() % 100_000 + seconds * 1000L);

when().post("http://" + container.getLaunchpadUrl() + "/restart?seconds={seconds}", seconds)
.then()
.statusCode(200);
// we might be too fast in the execution
Thread.sleep(100);
}

@When("the flag was modified")
Expand Down
4 changes: 4 additions & 0 deletions providers/flagd/src/test/resources/simplelogger.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
org.org.slf4j.simpleLogger.defaultLogLevel=debug
org.slf4j.simpleLogger.showDateTime=

io.grpc.level=trace
2 changes: 1 addition & 1 deletion providers/flagd/test-harness

0 comments on commit f520a29

Please sign in to comment.