View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.configuration2.builder.combined;
18  
19  import static org.junit.jupiter.api.Assertions.assertEquals;
20  import static org.junit.jupiter.api.Assertions.assertFalse;
21  import static org.junit.jupiter.api.Assertions.assertNull;
22  import static org.junit.jupiter.api.Assertions.assertThrows;
23  import static org.junit.jupiter.api.Assertions.assertTrue;
24  
25  import org.apache.commons.configuration2.BaseHierarchicalConfiguration;
26  import org.apache.commons.configuration2.HierarchicalConfiguration;
27  import org.apache.commons.configuration2.ex.ConfigurationRuntimeException;
28  import org.junit.jupiter.api.Test;
29  
30  /**
31   * Test class for {@code ConfigurationDeclaration}.
32   */
33  public class TestConfigurationDeclaration {
34      /**
35       * Creates a default test instance.
36       *
37       * @param conf the configuration to be used (may be <b>null</b> for a default one)
38       * @return the test object
39       */
40      private static ConfigurationDeclaration createDeclaration(final HierarchicalConfiguration<?> conf) {
41          final HierarchicalConfiguration<?> config = conf != null ? conf : new BaseHierarchicalConfiguration();
42          return new ConfigurationDeclaration(null, config);
43      }
44  
45      /**
46       * Tests if special reserved attributes are recognized by the isReservedNode() method. For compatibility reasons the
47       * attributes "at" and "optional" are also treated as reserved attributes, but only if there are no corresponding
48       * attributes with the "config-" prefix.
49       *
50       * @param name the attribute name
51       */
52      private void checkOldReservedAttribute(final String name) {
53          final String prefixName = "config-" + name;
54          final BaseHierarchicalConfiguration config = new BaseHierarchicalConfiguration();
55          config.addProperty(String.format("[@%s]", prefixName), Boolean.TRUE);
56          final ConfigurationDeclaration decl = createDeclaration(config);
57          assertTrue(decl.isReservedAttributeName(prefixName), prefixName + " attribute not recognized");
58          config.addProperty(String.format("[@%s]", name), Boolean.TRUE);
59          assertFalse(decl.isReservedAttributeName(name), name + " is reserved though config- exists");
60          assertTrue(decl.isReservedAttributeName(prefixName), "config- attribute not recognized when " + name + " exists");
61      }
62  
63      /**
64       * Tests access to certain reserved attributes of a ConfigurationDeclaration.
65       */
66      @Test
67      public void testConfigurationDeclarationGetAttributes() {
68          final HierarchicalConfiguration<?> config = new BaseHierarchicalConfiguration();
69          config.addProperty("xml.fileName", "test.xml");
70          ConfigurationDeclaration decl = createDeclaration(config.configurationAt("xml"));
71          assertNull(decl.getAt());
72          assertFalse(decl.isOptional());
73          config.addProperty("xml[@config-at]", "test1");
74          decl = createDeclaration(config.configurationAt("xml"));
75          assertEquals("test1", decl.getAt());
76          config.addProperty("xml[@at]", "test2");
77          decl = createDeclaration(config.configurationAt("xml"));
78          assertEquals("test1", decl.getAt());
79          config.clearProperty("xml[@config-at]");
80          decl = createDeclaration(config.configurationAt("xml"));
81          assertEquals("test2", decl.getAt());
82          config.addProperty("xml[@config-optional]", "true");
83          decl = createDeclaration(config.configurationAt("xml"));
84          assertTrue(decl.isOptional());
85          config.addProperty("xml[@optional]", "false");
86          decl = createDeclaration(config.configurationAt("xml"));
87          assertTrue(decl.isOptional());
88          config.clearProperty("xml[@config-optional]");
89          config.setProperty("xml[@optional]", Boolean.TRUE);
90          decl = createDeclaration(config.configurationAt("xml"));
91          assertTrue(decl.isOptional());
92      }
93  
94      /**
95       * Tests the isReservedNode() method of ConfigurationDeclaration.
96       */
97      @Test
98      public void testConfigurationDeclarationIsReserved() {
99          final ConfigurationDeclaration decl = createDeclaration(null);
100         assertTrue(decl.isReservedAttributeName("at"));
101         assertTrue(decl.isReservedAttributeName("optional"));
102         assertTrue(decl.isReservedAttributeName("config-class"));
103         assertFalse(decl.isReservedAttributeName("different"));
104     }
105 
106     /**
107      * Tests if the at attribute is correctly detected as reserved attribute.
108      */
109     @Test
110     public void testConfigurationDeclarationIsReservedAt() {
111         checkOldReservedAttribute("at");
112     }
113 
114     /**
115      * Tests if the optional attribute is correctly detected as reserved attribute.
116      */
117     @Test
118     public void testConfigurationDeclarationIsReservedOptional() {
119         checkOldReservedAttribute("optional");
120     }
121 
122     /**
123      * Tests whether an invalid value of an optional attribute is detected.
124      */
125     @Test
126     public void testConfigurationDeclarationOptionalAttributeInvalid() {
127         final HierarchicalConfiguration<?> factory = new BaseHierarchicalConfiguration();
128         factory.addProperty("xml.fileName", "test.xml");
129         factory.setProperty("xml[@optional]", "invalid value");
130         final ConfigurationDeclaration decl = createDeclaration(factory.configurationAt("xml"));
131         assertThrows(ConfigurationRuntimeException.class, decl::isOptional);
132     }
133 }