View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.enforcer.rules.version;
20  
21  import java.util.stream.Stream;
22  
23  import org.apache.commons.lang3.SystemUtils;
24  import org.apache.maven.enforcer.rule.api.EnforcerLogger;
25  import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
26  import org.junit.jupiter.api.BeforeEach;
27  import org.junit.jupiter.api.Test;
28  import org.junit.jupiter.params.ParameterizedTest;
29  import org.junit.jupiter.params.provider.Arguments;
30  import org.junit.jupiter.params.provider.MethodSource;
31  
32  import static org.assertj.core.api.Assertions.assertThat;
33  import static org.assertj.core.api.Assertions.assertThatThrownBy;
34  import static org.mockito.Mockito.mock;
35  
36  /**
37   * The Class TestRequireJavaVersion.
38   *
39   * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
40   */
41  class TestRequireJavaVersion {
42  
43      private RequireJavaVersion rule;
44  
45      @BeforeEach
46      void setup() {
47          rule = new RequireJavaVersion();
48          rule.setLog(mock(EnforcerLogger.class));
49      }
50      /**
51       * Test fix jdk version.
52       */
53      @Test
54      void testFixJDKVersion() {
55          // test that we only take the first 3 versions for
56          // comparison
57          assertThat(RequireJavaVersion.normalizeJDKVersion("1.5.0_11")).isEqualTo("1.5.0-11");
58          assertThat(RequireJavaVersion.normalizeJDKVersion("1.5.1")).isEqualTo("1.5.1");
59          assertThat(RequireJavaVersion.normalizeJDKVersion("1.5.2-1.b11")).isEqualTo("1.5.2-1");
60          assertThat(RequireJavaVersion.normalizeJDKVersion("1.5.3_11")).isEqualTo("1.5.3-11");
61          assertThat(RequireJavaVersion.normalizeJDKVersion("1.5.4.5_11")).isEqualTo("1.5.4-5");
62          assertThat(RequireJavaVersion.normalizeJDKVersion("1.5.5.6_11.2")).isEqualTo("1.5.5-6");
63  
64          // test for non-standard versions
65          assertThat(RequireJavaVersion.normalizeJDKVersion("1-5-0-11")).isEqualTo("1.5.0-11");
66          assertThat(RequireJavaVersion.normalizeJDKVersion("1-_5-_0-_11")).isEqualTo("1.5.0-11");
67          assertThat(RequireJavaVersion.normalizeJDKVersion("1_5_0_11")).isEqualTo("1.5.0-11");
68          assertThat(RequireJavaVersion.normalizeJDKVersion("1.5.0-07")).isEqualTo("1.5.0-7");
69          assertThat(RequireJavaVersion.normalizeJDKVersion("1.5.0-b7")).isEqualTo("1.5.0-7");
70          assertThat(RequireJavaVersion.normalizeJDKVersion("1.5.0-;7")).isEqualTo("1.5.0-7");
71          assertThat(RequireJavaVersion.normalizeJDKVersion("1.6.0-dp")).isEqualTo("1.6.0");
72          assertThat(RequireJavaVersion.normalizeJDKVersion("1.6.0-dp2")).isEqualTo("1.6.0-2");
73          assertThat(RequireJavaVersion.normalizeJDKVersion("1.8.0_73")).isEqualTo("1.8.0-73");
74          assertThat(RequireJavaVersion.normalizeJDKVersion("9")).isEqualTo("9");
75  
76          assertThat(RequireJavaVersion.normalizeJDKVersion("17")).isEqualTo("17");
77      }
78  
79      /**
80       * Test rule.
81       *
82       * @throws EnforcerRuleException the enforcer rule exception
83       */
84      @Test
85      void settingsTheJavaVersionAsNormalizedVersionShouldNotFail() throws EnforcerRuleException {
86          String normalizedJDKVersion = RequireJavaVersion.normalizeJDKVersion(SystemUtils.JAVA_VERSION);
87  
88          rule.setVersion(normalizedJDKVersion);
89  
90          // test the singular version
91          rule.execute();
92          // intentionally no assertThat(...) because we don't expect and exception.
93      }
94  
95      @Test
96      void excludingTheCurrentJavaVersionViaRangeThisShouldFailWithException() {
97          String thisVersion = RequireJavaVersion.normalizeJDKVersion(SystemUtils.JAVA_VERSION);
98          String requiredVersion = "(" + thisVersion;
99          rule.setVersion(requiredVersion);
100 
101         assertThatThrownBy(() -> rule.execute())
102                 .isInstanceOf(EnforcerRuleException.class)
103                 .hasMessage("The requested JDK version %s is invalid.", requiredVersion);
104     }
105 
106     @Test
107     void shouldIncludeJavaHomeLocationInTheErrorMessage() {
108         String thisVersion = RequireJavaVersion.normalizeJDKVersion(SystemUtils.JAVA_VERSION);
109         String requiredVersion = "10000";
110         rule.setVersion(requiredVersion);
111 
112         assertThatThrownBy(() -> rule.execute())
113                 .isInstanceOf(EnforcerRuleException.class)
114                 .hasMessage(
115                         "Detected JDK version %s (JAVA_HOME=%s) is not in the allowed range %s.",
116                         thisVersion, SystemUtils.JAVA_HOME, "[" + requiredVersion + ",)");
117     }
118 
119     @Test
120     void shouldUseCustomErrorMessage() {
121         String requiredVersion = "10000";
122         String message = "My custom error message";
123         rule.setVersion(requiredVersion);
124         rule.setMessage(message);
125 
126         assertThatThrownBy(() -> rule.execute())
127                 .isInstanceOf(EnforcerRuleException.class)
128                 .hasMessage(message);
129     }
130 
131     /**
132      * Test id.
133      */
134     @Test
135     void testId() {
136         assertThat(rule.getCacheId()).isEqualTo("0");
137     }
138 
139     static Stream<Arguments> fixJava8ShortVersion() {
140         return Stream.of(
141                 Arguments.of("1.8", "1.8"),
142                 Arguments.of("8", "1.8"),
143                 Arguments.of(".8", ".8"),
144                 Arguments.of("8.", "8."),
145                 Arguments.of("8,)", "1.8,)"),
146                 Arguments.of("[8,)", "[1.8,)"),
147                 Arguments.of("(1.7,8]", "(1.7,1.8]"),
148                 Arguments.of("[1.8,)", "[1.8,)"),
149                 Arguments.of("(1.8,8]", "(1.8,1.8]"),
150                 Arguments.of("(8,8]", "(1.8,1.8]"),
151                 Arguments.of("(8,)", "(1.8,)"),
152                 Arguments.of("[8]", "[1.8]"),
153                 Arguments.of("(9,11],[8]", "(9,11],[1.8]"),
154                 Arguments.of("(11.0.18", "(11.0.18"),
155                 Arguments.of("(15.1.8", "(15.1.8"),
156                 Arguments.of("(15.1.2", "(15.1.2"),
157                 Arguments.of("18", "18"),
158                 Arguments.of("18.", "18."),
159                 Arguments.of(".18", ".18"),
160                 Arguments.of("38", "38"));
161     }
162 
163     @ParameterizedTest
164     @MethodSource
165     void fixJava8ShortVersion(String input, String expected) {
166         rule.setVersion(input);
167         assertThat(rule.getVersion()).isEqualTo(expected);
168     }
169 }