junit 5 tags support (IDEA-163481)
[idea/community.git] / plugins / junit5_rt / src / com / intellij / junit5 / JUnit5TestRunnerUtil.java
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.junit5;
17
18 import org.junit.platform.commons.util.AnnotationUtils;
19 import org.junit.platform.engine.DiscoverySelector;
20 import org.junit.platform.engine.discovery.ClassNameFilter;
21 import org.junit.platform.engine.discovery.DiscoverySelectors;
22 import org.junit.platform.launcher.LauncherDiscoveryRequest;
23 import org.junit.platform.launcher.TagFilter;
24 import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
25
26 import java.io.BufferedReader;
27 import java.io.FileReader;
28 import java.io.IOException;
29 import java.lang.annotation.Annotation;
30 import java.util.ArrayList;
31 import java.util.List;
32
33 public class JUnit5TestRunnerUtil {
34
35   public static final String DISABLED_ANNO = "org.junit.jupiter.api.Disabled";
36
37   public static LauncherDiscoveryRequest buildRequest(String[] suiteClassNames, String[] packageNameRef) {
38     if (suiteClassNames.length == 0) {
39       return null;
40     }
41
42     LauncherDiscoveryRequestBuilder builder = LauncherDiscoveryRequestBuilder.request();
43
44
45     if (suiteClassNames.length == 1 && suiteClassNames[0].charAt(0) == '@') {
46       // all tests in the package specified
47       try {
48         BufferedReader reader = new BufferedReader(new FileReader(suiteClassNames[0].substring(1)));
49         try {
50           final String packageName = reader.readLine();
51           if (packageName == null) return null;
52
53           String tags = reader.readLine();
54           String filters = reader.readLine();
55           String line;
56
57           List<DiscoverySelector> selectors = new ArrayList<>();
58           while ((line = reader.readLine()) != null) {
59             selectors.add(createSelector(line));
60           }
61           packageNameRef[0] = packageName.length() == 0 ? "<default package>" : packageName;
62           if (selectors.isEmpty()) {
63             builder = builder.selectors(DiscoverySelectors.selectPackage(packageName));
64             if (filters != null && !filters.isEmpty()) {
65               builder = builder.filters(ClassNameFilter.includeClassNamePatterns(filters.split("\\|\\|")));
66             }
67           }
68           else {
69             builder = builder.selectors(selectors);
70           }
71           if (tags != null && !tags.isEmpty()) {
72             builder = builder
73               .filters(TagFilter.includeTags(tags.split(" ")))
74               .filters(ClassNameFilter.excludeClassNamePatterns("com\\.intellij\\.rt.*"));
75           }
76           return builder.build();
77         }
78         finally {
79           reader.close();
80         }
81       }
82       catch (IOException e) {
83         e.printStackTrace();
84         System.exit(1);
85       }
86     }
87     else {
88       boolean disableDisabledCondition = isDisabledConditionDisabled(suiteClassNames[0]);
89       if (disableDisabledCondition) {
90         builder = builder.configurationParameter("junit.jupiter.conditions.deactivate", "org.junit.*DisabledCondition");
91       }
92
93       return builder.selectors(createSelector(suiteClassNames[0])).build();
94     }
95
96     return null;
97   }
98
99   public static boolean isDisabledConditionDisabled(String name) {
100     int commaIdx = name.indexOf(",");
101     boolean disableDisabledCondition = true;
102     if (commaIdx < 0) {
103       try {
104         ClassLoader loader = JUnit5TestRunnerUtil.class.getClassLoader();
105         Class<?> aClass = Class.forName(name, false, loader);
106         Class<? extends Annotation> disabledAnnotation = (Class<? extends Annotation>)Class.forName(DISABLED_ANNO, false, loader);
107         disableDisabledCondition = AnnotationUtils.findAnnotation(aClass, disabledAnnotation).isPresent();
108       }
109       catch (ClassNotFoundException e) {
110         disableDisabledCondition = false;
111       }
112     }
113     return disableDisabledCondition;
114   }
115
116   /**
117    * Unique id is prepended with prefix: @see com.intellij.execution.junit.TestUniqueId#getUniqueIdPresentation()
118    * Method contains ','
119    */
120   protected static DiscoverySelector createSelector(String line) {
121     if (line.startsWith("\u001B")) {
122       String uniqueId = line.substring("\u001B".length());
123       return DiscoverySelectors.selectUniqueId(uniqueId);
124     }
125     else if (line.contains(",")) {
126       return DiscoverySelectors.selectMethod(line.replaceFirst(",", "#"));
127     }
128     else {
129       return DiscoverySelectors.selectClass(line);
130     }
131   }
132 }