Skip to content

Commit

Permalink
eclipse-ee4j#24158 Test setting an attribute on an undefined node.
Browse files Browse the repository at this point in the history
A new node should be defined and attribute set on it.
Signed-off-by:Ondro Mihalyi <mihalyi@omnifish.ee>
  • Loading branch information
OndroMih committed Nov 19, 2022
1 parent 8667245 commit b376c36
Showing 1 changed file with 100 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,23 @@
import jakarta.inject.Inject;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;
import org.glassfish.grizzly.config.dom.Protocol;
import org.glassfish.grizzly.config.dom.Protocols;
import org.glassfish.grizzly.config.dom.Ssl;

import static org.hamcrest.MatcherAssert.assertThat;
import org.hamcrest.Matchers;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.arrayWithSize;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;

/**
* test the set command
Expand All @@ -64,7 +70,6 @@ public class ConfigAttributeSetTest {
private ServiceLocator locator;
@Inject
private MockGenerator mockGenerator;
private PropertyChangeEvent event;
private Subject adminSubject;

@BeforeEach
Expand All @@ -88,9 +93,15 @@ public void addMissingServices() {
+ "PROPERTY,"
+ "server.network-config.network-listeners.network-listener.http-listener-1.property.a,"
+ "b"
,
"an attribute on an undefined node,"
+ "CERT_NICKNAME,"
+ "configs.config.server-config.network-config.protocols.protocol.http-listener-1.ssl.cert-nickname,"
+ "s1as"

})
public void setListenerAttribute(String testDescription, ListenerAttributeType attributeType, String propertyName, String propertyValue) {
public void setListenerAttribute(String testDescription, ListenerAttributeType attributeType, String propertyName, String propertyValue)
throws InterruptedException, TimeoutException, ExecutionException {
CommandRunnerImpl runner = locator.getService(CommandRunnerImpl.class);
assertNotNull(runner);

Expand All @@ -105,12 +116,10 @@ public void setListenerAttribute(String testDescription, ListenerAttributeType a
}
assertNotNull(listener);

String oldAttributeValue = attributeType.getAttributeValue(listener);
String oldAttributeValue = attributeType.getAttributeValue(listener, locator);

// Let's register a listener
ObservableBean bean = (ObservableBean) ConfigSupport.getImpl(listener);
final PropertyChangeListener beanListener = new PropertyChangeListener(attributeType.getEventPropertyName());
bean.addListener(beanListener);
final PropertyChangeFuture beanEvents = attributeType.addEventListener(listener, locator);

try {
// parameters to the command
Expand All @@ -128,26 +137,27 @@ public void setListenerAttribute(String testDescription, ListenerAttributeType a
locator.<Transactions>getService(Transactions.class).waitForDrain();

// check the result.
String newAttributeValue = attributeType.getAttributeValue(listener);
String newAttributeValue = attributeType.getAttributeValue(listener, locator);
assertEquals(propertyValue, newAttributeValue);

// check we recevied the event
PropertyChangeEvent event = waitForTheEvent(beanEvents, attributeType);

assertNotNull(event);
assertAll(
() -> assertEquals(oldAttributeValue, event.getOldValue()),
() -> assertEquals(propertyValue, event.getNewValue()),
() -> assertEquals(attributeType.getEventPropertyName(), event.getPropertyName())
);
} finally {
bean.removeListener(beanListener);
attributeType.removeEventListener(beanEvents, listener, locator);
}

}

private enum ListenerAttributeType {
PORT {
@Override
String getAttributeValue(NetworkListener listener) {
String getAttributeValue(NetworkListener listener, ServiceLocator locator) {
return listener.getPort();
}

Expand All @@ -159,7 +169,7 @@ String getEventPropertyName() {
},
PROPERTY {
@Override
String getAttributeValue(NetworkListener listener) {
String getAttributeValue(NetworkListener listener, ServiceLocator locator) {
return listener.getPropertyValue("a");
}

Expand All @@ -168,29 +178,94 @@ String getEventPropertyName() {
return "value";
}

},
CERT_NICKNAME {
@Override
String getAttributeValue(NetworkListener listener, ServiceLocator locator) {
Ssl ssl = getProtocolNode(listener, locator).getSsl();
return ssl != null ? ssl.getCertNickname() : null;
}

@Override
String getEventPropertyName() {
return "cert-nickname";
}

@Override
PropertyChangeFuture addEventListener(NetworkListener listener, ServiceLocator locator) {
ObservableBean protocolBean = (ObservableBean) ConfigSupport.getImpl(getProtocolNode(listener, locator));
final PropertyChangeFuture protocolEvents = new PropertyChangeFuture();
final PropertyChangeFuture sslEvents = new PropertyChangeFuture();
sslEvents.previousFuture = protocolEvents;
protocolBean.addListener(protocolEvents);
protocolEvents.thenAccept(events -> {
assertThat(events,arrayWithSize(1));
PropertyChangeEvent event = events[0];
ObservableBean sslBean = (ObservableBean) (event.getNewValue());
sslBean.addListener(sslEvents);
}).exceptionally(e -> {
e.printStackTrace();
return null;
});
return sslEvents;
}

@Override
void removeEventListener(PropertyChangeFuture beanEvents, NetworkListener listener, ServiceLocator locator) {
final Protocol protocolNode = getProtocolNode(listener, locator);
ObservableBean protocolBean = (ObservableBean) ConfigSupport.getImpl(protocolNode);
protocolBean.removeListener(beanEvents.previousFuture);
ObservableBean sslBean = (ObservableBean) ConfigSupport.getImpl(protocolNode.getSsl());
sslBean.removeListener(beanEvents);
}

private Protocol getProtocolNode(NetworkListener listener, ServiceLocator locator) {
return locator.getService(Protocols.class).findProtocol(listener.getProtocol());
}

};

abstract String getAttributeValue(NetworkListener listener);
abstract String getAttributeValue(NetworkListener listener, ServiceLocator locator);

abstract String getEventPropertyName();
}

private class PropertyChangeListener implements ConfigListener {

private String propertyName;
boolean isForEvent(PropertyChangeEvent event) {
return this.getEventPropertyName().equals(event.getPropertyName());
}

PropertyChangeFuture addEventListener(NetworkListener listener, ServiceLocator locator) {
ObservableBean bean = (ObservableBean) ConfigSupport.getImpl(listener);
final PropertyChangeFuture beanEvents = new PropertyChangeFuture();
bean.addListener(beanEvents);
return beanEvents;
}

public PropertyChangeListener(String propertyName) {
this.propertyName = propertyName;
void removeEventListener(PropertyChangeFuture beanEvents, NetworkListener listener, ServiceLocator locator) {
ObservableBean bean = (ObservableBean) ConfigSupport.getImpl(listener);
bean.removeListener(beanEvents);
}
}

private static class PropertyChangeFuture extends CompletableFuture<PropertyChangeEvent[]> implements ConfigListener {

PropertyChangeFuture previousFuture = null;

@Override
public UnprocessedChangeEvents changed(PropertyChangeEvent[] propertyChangeEvents) {
List<PropertyChangeEvent> events = Arrays.stream(propertyChangeEvents)
.filter(event -> propertyName.equals(event.getPropertyName()))
.collect(Collectors.toList());
assertThat(events, hasSize(1));
event = events.get(0);
this.complete(propertyChangeEvents);
return null;
}
}

private PropertyChangeEvent waitForTheEvent(final PropertyChangeFuture beanEvents, ListenerAttributeType attributeType) throws ExecutionException, InterruptedException, TimeoutException {
// check we recevied the event
List<PropertyChangeEvent> events = Arrays.stream(
beanEvents.get(10, TimeUnit.SECONDS))
.filter(attributeType::isForEvent)
.collect(Collectors.toList());
assertThat(events, hasSize(1));
PropertyChangeEvent event = events.get(0);
return event;
}

}

0 comments on commit b376c36

Please sign in to comment.