blob: 0e48be15b775a87f2b901100120f3057ff279b4c [file] [log] [blame]
/*
* Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021 Contributors to the Eclipse Foundation
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package com.sun.enterprise.config.modularity.tests;
import com.sun.enterprise.config.modularity.ConfigModularityUtils;
import com.sun.enterprise.config.modularity.customization.ConfigBeanDefaultValue;
import com.sun.enterprise.config.modularity.customization.ConfigCustomizationToken;
import com.sun.enterprise.config.modularity.customization.FileTypeDetails;
import com.sun.enterprise.config.modularity.customization.PortTypeDetails;
import com.sun.enterprise.config.serverbeans.Config;
import com.sun.enterprise.config.serverbeans.Domain;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.glassfish.api.admin.ServerEnvironment;
import org.glassfish.config.api.test.ConfigApiJunit5Extension;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.runlevel.RunLevelController;
import org.glassfish.tests.utils.junit.DomainXml;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
import org.junit.jupiter.api.extension.ExtendWith;
import org.jvnet.hk2.config.ConfigBeanProxy;
import org.jvnet.hk2.config.types.Property;
import jakarta.inject.Inject;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Testing Basic Functionality of Config Modularity API
*
* @author Masoud Kalali
*/
@ExtendWith(ConfigApiJunit5Extension.class)
@DomainXml(value = "Config-Modularity.xml")
public class BasicModularityTest {
@Inject
private ServiceLocator locator;
@Inject
private ConfigModularityUtils configModularityUtils;
@Test
public void fromClassNameToClassTest() throws Exception {
// This part passes as the configuration for the class is present in the domain.xml
Class clz = configModularityUtils.getClassForFullName(ConfigExtensionZero.class.getName());
assertNotNull(clz, "Cannot get config bean class using the class name");
assertEquals(ConfigExtensionZero.class.getName(), clz.getName(),
"The mapped class is not the same as the provided class name");
// this part fails as the configuration is not present in domain.xml which was is a
// regression somewhere
clz = configModularityUtils.getClassForFullName(ConfigExtensionTwo.class.getName());
assertNotNull(clz, "Cannot get config bean class using the class name");
assertEquals(ConfigExtensionTwo.class.getName(), clz.getName(),
"The mapped class is not the same as the provided class name");
}
@Test
public void locationTest() {
String location = "domain/configs/config[$CURRENT_INSTANCE_CONFIG_NAME]/config-extension-one/property[prop.foo]";
Class owningClass = configModularityUtils.getOwningClassForLocation(location);
assertNotNull(owningClass, "Cannot find owning class for: " + location);
assertEquals(Property.class.getName(), owningClass.getName(),
"Cannot find the right owning class for location");
}
@Test
public void owningObjectTest() {
String location = "domain/configs/config[$CURRENT_INSTANCE_CONFIG_NAME]/config-extension-one/property[prop.foo]";
ConfigBeanProxy obj = configModularityUtils.getOwningObject(location);
assertNotNull(obj, "Cannot find owning object for: " + location);
assertEquals("prop.foo.value.custom", ((Property) obj).getValue(),
"Getting Owning object for location is not right");
}
@Test
public void moduleConfigurationXmlParserTest() {
List<ConfigBeanDefaultValue> values = configModularityUtils
.getDefaultConfigurations(SimpleExtensionTypeOne.class, "admin-");
assertEquals(2, values.size(), "Incorrect number of config bean configuration read ");
ConfigCustomizationToken token = configModularityUtils
.getDefaultConfigurations(SimpleExtensionTypeOne.class, "embedded-").get(0).getCustomizationTokens().get(0);
assertEquals("CUSTOM_TOKEN", token.getName(), "Customization Token reading broken ");
assertEquals("token-default-value", token.getValue(), "Customization Token reading broken ");
}
@Test
public void serializeConfigBean() {
Config config = locator.<Config> getService(Config.class, ServerEnvironment.DEFAULT_INSTANCE_NAME);
ConfigBeanProxy prox = config.getExtensionByType(ConfigExtensionZero.class);
String content = configModularityUtils.serializeConfigBean(prox);
assertEquals("<config-extension-zero dummy=\"dummy-value\"></config-extension-zero>", content,
"Cannot serialize config beans properly");
}
@Test
public void serializeConfigBeanByType() {
String content = configModularityUtils.serializeConfigBeanByType(ConfigExtensionOne.class);
assertEquals("<config-extension-one custom-token=\"${CUSTOM_TOKEN}\">\n"
+ " <property name=\"prop.foo\" value=\"prop.foo.value.custom\"></property>\n" + "</config-extension-one>",
content, "Cannot serialize config beans from type");
}
@Test
public void testConfigExtensionPatternImpl() {
Config config = locator.<Config> getService(Config.class, ServerEnvironment.DEFAULT_INSTANCE_NAME);
SimpleConfigExtension simpleConfigExtension = config.getExtensionByType(SimpleConfigExtension.class);
SimpleExtensionTypeTwo typeTwo = simpleConfigExtension.getExtensionByType(SimpleExtensionTypeTwo.class);
assertNotNull(typeTwo, "cannot get extension using extensionmethod");
assertEquals("attribute.two", typeTwo.getAttributeTwo(), "Retrieved extension is not from the right type... ");
}
@Test
public void testLoadingAndApplyingModuleConfigurationFile() {
Config config = locator.<Config> getService(Config.class, ServerEnvironment.DEFAULT_INSTANCE_NAME);
ConfigExtensionTwo ext = config.getExtensionByType(ConfigExtensionTwo.class);
assertNotNull(ext);
assertEquals("user.customized.value", config.getSystemProperty("CUSTOM_TOKEN").getValue(),
"The system property is overridden while it should have not");
assertTrue(config.checkIfExtensionExists(ConfigExtensionTwo.class),
"Failed to add the extension from module configuration file: ");
}
@Test
public void testHasNoCustomization() {
Config config = locator.<Config> getService(Config.class, ServerEnvironment.DEFAULT_INSTANCE_NAME);
assertNull(config.getExtensionByType(ConfigExtensionThree.class),
"The @HasNocustomization annotation is broken");
}
@Test
public void getCurrentConfigurationForConfigBean() throws Exception {
ConfigBeanDefaultValue def = configModularityUtils
.getDefaultConfigurations(SimpleExtensionTypeOne.class, "embedded-").get(0);
SimpleExtensionTypeOne simple = configModularityUtils.getCurrentConfigBeanForDefaultValue(def);
assertNotNull(simple,
"Cannot get config bean of a module based on the default module configuration information");
}
@Test
public void testLoadingAdminFile() throws Exception {
List<ConfigBeanDefaultValue> values = configModularityUtils.getDefaultConfigurations(ConfigExtensionTwo.class,
"admin");
assertEquals(ConfigCustomizationToken.CustomizationType.FILE,
values.get(0).getCustomizationTokens().get(0).getCustomizationType(),
"Incorrect customization type loaded ");
assertEquals(FileTypeDetails.FileExistCondition.MUST_EXIST,
((FileTypeDetails) values.get(0).getCustomizationTokens().get(0).getTokenTypeDetails()).getExistCondition(),
"Incorrect customization details value ");
}
@Test
public void testLoadingEmbeddedFile() throws Exception {
List<ConfigBeanDefaultValue> values = configModularityUtils.getDefaultConfigurations(ConfigExtensionTwo.class,
"embedded");
assertEquals(ConfigCustomizationToken.CustomizationType.PORT,
values.get(0).getCustomizationTokens().get(0).getCustomizationType(),
"Incorrect customization type loaded ");
assertEquals("1000",
((PortTypeDetails) values.get(0).getCustomizationTokens().get(0).getTokenTypeDetails()).getBaseOffset(),
"Incorrect customization details value ");
assertEquals("[a-zA-Z0-9]+", values.get(0).getCustomizationTokens().get(0).getValidationExpression(),
"validation expression is returned incorrectly ");
}
@Test
public void testLoadingDefaultFile() throws Exception {
List<ConfigBeanDefaultValue> values = configModularityUtils.getDefaultConfigurations(ConfigExtensionTwo.class,
"non-existing-runtime-type");
assertEquals(".*[0-9]{10}.*", values.get(0).getCustomizationTokens().get(0).getValidationExpression(),
"validation expression is returned incorrectly ");
}
@Test
public void tesOnTheFlyConfigurationGenerationMethod() {
List<ConfigBeanDefaultValue> values = configModularityUtils.getDefaultConfigurations(SimpleExtensionThree.class,
"non-existing-runtime-type");
assertEquals("<xml-doc></xml-doc>", values.get(0).getXmlConfiguration(),
"On the fly config generation/reading is broken");
}
@Test
@Timeout(unit = TimeUnit.SECONDS, value = 120)
public void testRanking() {
Domain domain = locator.<Domain> getService(Domain.class);
RankedConfigBean rankedConfigBean = domain.getExtensionByType(RankedConfigBean.class);
assertEquals("simple-value-zero", rankedConfigBean.getSimpleAttribute(), "invalid current value");
RunLevelController controller = locator.getService(RunLevelController.class);
controller.proceedTo(4);
rankedConfigBean = domain.getExtensionByType(RankedConfigBean.class);
assertEquals("simple-value-one", rankedConfigBean.getSimpleAttribute(), "invalid current value");
}
}