Skip to content

Commit

Permalink
feat: getting configured but obsolete/non-valid options for extension (
Browse files Browse the repository at this point in the history
…#196)

Refs: #190
  • Loading branch information
grigoriev authored Oct 22, 2024
1 parent 249f72f commit 79e1f9c
Show file tree
Hide file tree
Showing 9 changed files with 293 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,8 @@ public int size() {
return properties.size();
}

public boolean isEmpty() {
return properties.isEmpty();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.Objects;
import java.util.Properties;

@Getter
public class ExtensionConfiguration implements IExtensionConfiguration {
Expand Down Expand Up @@ -38,7 +40,7 @@ protected ExtensionConfiguration() {
}

@Override
public final @NotNull ConfigurationProperties getProperties() {
public final @NotNull ConfigurationProperties getConfigurationProperties() {
List<String> supportedProperties = getSupportedProperties();
ConfigurationProperties configurationProperties = new ConfigurationProperties(supportedProperties.size());
ExtensionConfiguration extensionConfiguration = CurrentExtensionConfiguration.getInstance().getExtensionConfiguration();
Expand All @@ -61,4 +63,38 @@ protected ExtensionConfiguration() {
return List.of(DEBUG);
}

@Override
public @NotNull List<String> getObsoleteProperties() {
List<String> configuredExtensionProperties = getConfiguredExtensionProperties();
List<String> supportedProperties = getSupportedProperties();

return configuredExtensionProperties.stream()
.filter(key -> !supportedProperties.contains(key))
.toList();
}

@Override
public @NotNull ConfigurationProperties getObsoleteConfigurationProperties() {
List<String> obsoleteProperties = getObsoleteProperties();
ConfigurationProperties configurationProperties = new ConfigurationProperties(obsoleteProperties.size());

for (String obsoleteProperty : obsoleteProperties) {
@NotNull String key = getPropertyPrefix() + obsoleteProperty;
@NotNull String value = Objects.requireNonNull(SystemValueReader.getInstance().readString(key, ""));
configurationProperties.setProperty(key, new ConfigurationProperties.Value(value, null, null));
}

return configurationProperties;
}

public @NotNull List<String> getConfiguredExtensionProperties() {
Properties systemProperties = SystemProperties.getProperties();

return systemProperties.keySet().stream()
.map(o -> (String) o)
.filter(key -> key.startsWith(propertyPrefix))
.map(key -> key.substring(propertyPrefix.length()))
.toList();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@

public interface IExtensionConfiguration {

@NotNull ConfigurationProperties getProperties();
@NotNull ConfigurationProperties getConfigurationProperties();

@NotNull List<String> getSupportedProperties();

@NotNull List<String> getObsoleteProperties();

@NotNull ConfigurationProperties getObsoleteConfigurationProperties();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ch.sbb.polarion.extension.generic.properties;

import lombok.experimental.UtilityClass;

import java.util.Properties;

@UtilityClass
public class SystemProperties {
public static Properties getProperties() {
return System.getProperties();
}
}
34 changes: 31 additions & 3 deletions app/src/main/resources/META-INF/resources/common/jsp/about.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,13 @@
<%!
private static final String ABOUT_TABLE_ROW = "<tr><td>%s</td><td>%s</td></tr>";
private static final String CONFIGURATION_PROPERTIES_TABLE_ROW = "<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>";
private static final String OBSOLETE_CONFIGURATION_PROPERTIES_TABLE_ROW = "<tr><td>%s</td><td>%s</td></tr>";
private static final String CHECK_CONFIGURATION_TABLE_ROW = "<tr><td>%s</td><td>%s</td><td>%s</td></tr>";
Context context = ExtensionInfo.getInstance().getContext();
Version version = ExtensionInfo.getInstance().getVersion();
ConfigurationProperties extensionConfigurationProperties = CurrentExtensionConfiguration.getInstance().getExtensionConfiguration().getProperties();
ConfigurationProperties configurationProperties = CurrentExtensionConfiguration.getInstance().getExtensionConfiguration().getConfigurationProperties();
ConfigurationProperties obsoleteConfigurationProperties = CurrentExtensionConfiguration.getInstance().getExtensionConfiguration().getObsoleteConfigurationProperties();
%>

<head>
Expand Down Expand Up @@ -79,11 +81,11 @@
</thead>
<tbody>
<%
List<String> propertyKeys = new ArrayList<>(extensionConfigurationProperties.keySet());
List<String> propertyKeys = new ArrayList<>(configurationProperties.keySet());
Collections.sort(propertyKeys);
for (String key : propertyKeys) {
ConfigurationProperties.Value configurationPropertiesValue = extensionConfigurationProperties.getProperty(key);
ConfigurationProperties.Value configurationPropertiesValue = configurationProperties.getProperty(key);
@NotNull String value = configurationPropertiesValue.value();
@Nullable String defaultValue = configurationPropertiesValue.defaultValue();
@Nullable String description = configurationPropertiesValue.description();
Expand All @@ -94,6 +96,32 @@
</tbody>
</table>

<% if (!obsoleteConfigurationProperties.isEmpty()) { %>
<h3>Obsolete/non-valid configuration properties</h3>

<table>
<thead>
<tr>
<th>Configuration property</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<%
List<String> obsoletePropertyKeys = new ArrayList<>(obsoleteConfigurationProperties.keySet());
Collections.sort(obsoletePropertyKeys);
for (String obsoleteKey : obsoletePropertyKeys) {
ConfigurationProperties.Value obsoleteConfigurationPropertiesValue = obsoleteConfigurationProperties.getProperty(obsoleteKey);
@NotNull String value = obsoleteConfigurationPropertiesValue.value();
String row = OBSOLETE_CONFIGURATION_PROPERTIES_TABLE_ROW.formatted(obsoleteKey, value);
out.println(row);
}
%>
</tbody>
</table>
<% } %>

<% Collection<ConfigurationStatus> configurationStatuses = ConfigurationStatusProvider.getAllStatuses(request.getParameter("scope")); %>
<% if (!configurationStatuses.isEmpty()) { %>
<h3>Extension configuration status</h3>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package ch.sbb.polarion.extension.generic.context;

import ch.sbb.polarion.extension.generic.properties.ExtensionConfiguration;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static ch.sbb.polarion.extension.generic.context.CurrentContextExtension.TEST_EXTENSION;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentContextConfig {
String value() default "text-extension";
}
String value() default TEST_EXTENSION;
Class<?> extensionConfiguration() default ExtensionConfiguration.class;
}
Original file line number Diff line number Diff line change
@@ -1,35 +1,56 @@
package ch.sbb.polarion.extension.generic.context;

import ch.sbb.polarion.extension.generic.rest.model.Context;
import ch.sbb.polarion.extension.generic.properties.ExtensionConfiguration;
import ch.sbb.polarion.extension.generic.util.ContextUtils;
import ch.sbb.polarion.extension.generic.util.ManifestUtils;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.mockito.MockedStatic;
import org.mockito.Mockito;

import java.util.Set;
import java.util.jar.Attributes;

import static org.mockito.Mockito.mockStatic;

public class CurrentContextExtension implements BeforeEachCallback, AfterEachCallback {

public static final String TEST_EXTENSION = "test-extension";

private MockedStatic<ContextUtils> contextUtilsMockedStatic;
private MockedStatic<ManifestUtils> manifestUtilsMockedStatic;

@Override
public void beforeEach(ExtensionContext extensionContext) throws Exception {
contextUtilsMockedStatic = Mockito.mockStatic(ContextUtils.class);
contextUtilsMockedStatic = mockStatic(ContextUtils.class);

String contextName = "test-extension";
CurrentContextConfig currentContextConfig = extensionContext.getRequiredTestClass().getAnnotation(CurrentContextConfig.class);
if (currentContextConfig != null) {
contextName = currentContextConfig.value();
String contextName = TEST_EXTENSION;
CurrentContextConfig annotation = extensionContext.getRequiredTestClass().getAnnotation(CurrentContextConfig.class);
if (annotation != null) {
contextName = annotation.value();
Class<?> testExtensionConfigurationClass = annotation.extensionConfiguration();
contextUtilsMockedStatic.when(() -> ContextUtils.findSubTypes(ExtensionConfiguration.class)).thenReturn(Set.of(testExtensionConfigurationClass));
}

Context context = new Context(contextName);
contextUtilsMockedStatic.when(ContextUtils::getContext).thenReturn(context);
manifestUtilsMockedStatic = mockStatic(ManifestUtils.class);
Attributes attributes = new Attributes();
attributes.put(new Attributes.Name(ContextUtils.EXTENSION_CONTEXT), contextName);
attributes.put(new Attributes.Name(ContextUtils.DISCOVER_BASE_PACKAGE), ContextUtils.CH_SBB_POLARION_EXTENSION + contextName.replace("-", "_"));
attributes.put(new Attributes.Name(ContextUtils.CONFIGURATION_PROPERTIES_PREFIX), ContextUtils.CH_SBB_POLARION_EXTENSION + contextName.replace("-", "_") + ".");
manifestUtilsMockedStatic.when(ManifestUtils::getManifestAttributes).thenReturn(attributes);

contextUtilsMockedStatic.when(ContextUtils::getContext).thenCallRealMethod();
contextUtilsMockedStatic.when(ContextUtils::getConfigurationPropertiesPrefix).thenCallRealMethod();
}

@Override
public void afterEach(ExtensionContext extensionContext) throws Exception {
if (manifestUtilsMockedStatic != null) {
manifestUtilsMockedStatic.close();
}
if (contextUtilsMockedStatic != null) {
contextUtilsMockedStatic.close();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package ch.sbb.polarion.extension.generic.context;

import ch.sbb.polarion.extension.generic.properties.SystemProperties;
import com.polarion.core.config.impl.SystemValueReader;
import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.mockito.MockedStatic;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.Properties;

import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.*;

public class SystemPropertiesExtension implements BeforeEachCallback, AfterEachCallback {

private MockedStatic<SystemProperties> systemPropertiesMockedStatic;
private MockedStatic<SystemValueReader> systemValueReaderMockedStatic;

@Override
public void beforeEach(ExtensionContext context) throws Exception {
systemPropertiesMockedStatic = mockStatic(SystemProperties.class);
systemValueReaderMockedStatic = mockStatic(SystemValueReader.class);

Properties properties = getAnnotatedRuntimeProperties(context);
systemPropertiesMockedStatic.when(SystemProperties::getProperties).thenReturn(properties);

SystemValueReader systemValueReader = mock(SystemValueReader.class);
lenient().when(systemValueReader.readString(anyString(), anyString())).thenAnswer(invocation -> {
String key = invocation.getArgument(0);
return properties.getProperty(key);
});
systemValueReaderMockedStatic.when(SystemValueReader::getInstance).thenReturn(systemValueReader);
}

private @NotNull Properties getAnnotatedRuntimeProperties(ExtensionContext context) {
Properties properties = new Properties();

Method testMethod = context.getRequiredTestMethod();

if (testMethod.isAnnotationPresent(RuntimeProperties.class)) {
RuntimeProperties annotation = testMethod.getAnnotation(RuntimeProperties.class);
if (annotation != null) {
for (String property : annotation.value()) {
String[] keyValue = property.split("=");
if (keyValue.length == 2) {
properties.setProperty(keyValue[0], keyValue[1]);
}
}
}
}
return properties;
}

@Override
public void afterEach(ExtensionContext context) throws Exception {
if (systemPropertiesMockedStatic != null) {
systemPropertiesMockedStatic.close();
}
if (systemValueReaderMockedStatic != null) {
systemValueReaderMockedStatic.close();
}
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RuntimeProperties {
String[] value() default {};
}
}
Loading

0 comments on commit 79e1f9c

Please sign in to comment.