dbf0e87ee9c803285657874ac72c6d5d01fa86e8
[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 tagName = 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 (tagName != null && !tagName.isEmpty()) {
72             builder = builder.filters(TagFilter.includeTags(tagName));
73           }
74           return builder.build();
75         }
76         finally {
77           reader.close();
78         }
79       }
80       catch (IOException e) {
81         e.printStackTrace();
82         System.exit(1);
83       }
84     }
85     else {
86       boolean disableDisabledCondition = isDisabledConditionDisabled(suiteClassNames[0]);
87       if (disableDisabledCondition) {
88         builder = builder.configurationParameter("junit.jupiter.conditions.deactivate", "org.junit.*DisabledCondition");
89       }
90
91       return builder.selectors(createSelector(suiteClassNames[0])).build();
92     }
93
94     return null;
95   }
96
97   public static boolean isDisabledConditionDisabled(String name) {
98     int commaIdx = name.indexOf(",");
99     boolean disableDisabledCondition = true;
100     if (commaIdx < 0) {
101       try {
102         ClassLoader loader = JUnit5TestRunnerUtil.class.getClassLoader();
103         Class<?> aClass = Class.forName(name, false, loader);
104         Class<? extends Annotation> disabledAnnotation = (Class<? extends Annotation>)Class.forName(DISABLED_ANNO, false, loader);
105         disableDisabledCondition = AnnotationUtils.findAnnotation(aClass, disabledAnnotation).isPresent();
106       }
107       catch (ClassNotFoundException e) {
108         disableDisabledCondition = false;
109       }
110     }
111     return disableDisabledCondition;
112   }
113
114   /**
115    * Unique id is prepended with prefix: @see com.intellij.execution.junit.TestUniqueId#getUniqueIdPresentation()
116    * Method contains ','
117    */
118   protected static DiscoverySelector createSelector(String line) {
119     if (line.startsWith("\u001B")) {
120       String uniqueId = line.substring("\u001B".length());
121       return DiscoverySelectors.selectUniqueId(uniqueId);
122     }
123     else if (line.contains(",")) {
124       return DiscoverySelectors.selectMethod(line.replaceFirst(",", "#"));
125     }
126     else {
127       return DiscoverySelectors.selectClass(line);
128     }
129   }
130 }