blob: fc04d62de2a5e2b9ff9da3db0fc603c32dd5a71f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.java.openjdk.jtreg;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.api.project.FileOwnerQuery;
import org.netbeans.api.project.Project;
import org.netbeans.junit.NbTestCase;
import org.netbeans.modules.java.hints.test.Utilities.TestLookup;
import org.netbeans.modules.java.openjdk.common.BuildUtils;
import org.netbeans.modules.java.openjdk.jtreg.ActionProviderImpl.StackTraceLine;
import org.netbeans.spi.project.ProjectFactory;
import org.netbeans.spi.project.ProjectState;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.Lookup;
import org.openide.util.Pair;
import org.openide.util.lookup.Lookups;
import org.openide.util.lookup.ServiceProvider;
/**
*
* @author lahvac
*/
public class ActionProviderImplTest extends NbTestCase {
public ActionProviderImplTest(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
super.setUp();
clearWorkDir();
((TestLookup) Lookup.getDefault()).setLookupsImpl(Lookups.metaInfServices(ClassPathProviderImplTest.class.getClassLoader()));
}
public void testModulatizedFullJDKTraditionalLangtools() throws Exception {
doTestModulatizedFullJDK("langtools/build/classes");
}
public void testModulatizedFullJDKModularizedLangtools() throws Exception {
doTestModulatizedFullJDK("langtools/build/jdk.compiler/classes");
}
private void doTestModulatizedFullJDK(String langtoolsClassesDir) throws Exception {
createFile("modules.xml");
FileObject javaBaseSource = createDir("jdk/src/java.base/share/classes");
FileObject javaBaseTestFile = createFile("jdk/test/Test.java");
createDir("jdk/src/java.base/linux/classes");
createDir("jdk/src/java.desktop/share/classes");
createDir("build/conf/jdk/modules/java.base");
createDir("build/conf/jdk/modules/java.desktop");
FileObject javaCompilerSource = createDir("langtools/src/java.compiler/share/classes");
createDir(langtoolsClassesDir);
FileObject langtoolsTestFile = createFile("langtools/test/Test.java");
createDir("").setAttribute(BuildUtils.NB_JDK_PROJECT_BUILD, FileUtil.toFile(createDir("build/conf")));
FileOwnerQuery.markExternalOwner(javaBaseTestFile.getParent(), FileOwnerQuery.getOwner(javaBaseSource), FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT);
FileOwnerQuery.markExternalOwner(langtoolsTestFile.getParent(), FileOwnerQuery.getOwner(javaCompilerSource), FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT);
Set<String> expectedAllSources = new HashSet<>(Arrays.asList("langtools/src/java.compiler/share/classes",
"jdk/src/java.base/linux/classes",
"jdk/src/java.base/share/classes",
"jdk/src/java.desktop/share/classes"));
assertEquals(expectedAllSources,
relative(FileUtil.toFileObject(getWorkDir()),
Arrays.asList(ActionProviderImpl.allSources(javaBaseTestFile).getRoots())));
assertEquals(expectedAllSources,
relative(FileUtil.toFileObject(getWorkDir()),
Arrays.asList(ActionProviderImpl.allSources(langtoolsTestFile).getRoots())));
String builtClassesJDKDirs = ActionProviderImpl.builtClassesDirsForBootClassPath(javaBaseTestFile);
builtClassesJDKDirs = builtClassesJDKDirs.replace(getWorkDir().getAbsolutePath(), "");
assertEquals(new HashSet<>(Arrays.asList("/build/conf/jdk/modules/java.desktop",
"/build/conf/jdk/modules/java.base")),
new HashSet<>(Arrays.asList(builtClassesJDKDirs.split(Pattern.quote(File.pathSeparator)))));
String builtClassesLangtoolsDirs = ActionProviderImpl.builtClassesDirsForBootClassPath(langtoolsTestFile);
builtClassesLangtoolsDirs = builtClassesLangtoolsDirs.replace(getWorkDir().getAbsolutePath(), "");
assertEquals("/" + langtoolsClassesDir, builtClassesLangtoolsDirs);
String jtregOutputDirs = Utilities.jtregOutputDir(langtoolsTestFile).getAbsolutePath();
jtregOutputDirs = jtregOutputDirs.replace(getWorkDir().getAbsolutePath(), "");
assertEquals("/langtools/build/nb-jtreg", jtregOutputDirs);
}
public void testStandaloneLangtoolsTraditionalLangtools() throws Exception {
doTestStandaloneLangtools("langtools/build/classes");
}
public void testStandaloneLangtoolsModularizedLangtools() throws Exception {
doTestStandaloneLangtools("langtools/build/jdk.compiler/classes");
}
private void doTestStandaloneLangtools(String langtoolsClassesDir) throws Exception {
createDir("langtools/src/java.compiler/share/classes");
createDir(langtoolsClassesDir);
FileObject langtoolsProject = createDir("langtools/make/netbeans/langtools");
FileObject testFile = createFile("langtools/test/Test.java");
FileOwnerQuery.markExternalOwner(testFile.getParent(), FileOwnerQuery.getOwner(langtoolsProject), FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT);
ClassPath allSources = ActionProviderImpl.allSources(testFile);
assertEquals(new HashSet<>(Arrays.asList("langtools/src/java.compiler/share/classes")),
relative(FileUtil.toFileObject(getWorkDir()), Arrays.asList(allSources.getRoots())));
String builtClassesDirs = ActionProviderImpl.builtClassesDirsForBootClassPath(testFile);
builtClassesDirs = builtClassesDirs.replace(getWorkDir().getAbsolutePath(), "");
assertEquals("/" + langtoolsClassesDir, builtClassesDirs);
String jtregOutputDirs = Utilities.jtregOutputDir(testFile).getAbsolutePath();
jtregOutputDirs = jtregOutputDirs.replace(getWorkDir().getAbsolutePath(), "");
assertEquals("/langtools/build/nb-jtreg", jtregOutputDirs);
}
public void testImages1() throws Exception {
createFile("modules.xml");
createDir("jdk/src/java.base/share/classes");
createDir("build/conf/images/j2sdk-image");
createDir("langtools/src/java.compiler/share/classes");
FileObject testFile = createFile("langtools/test/Test.java");
createDir("").setAttribute(BuildUtils.NB_JDK_PROJECT_BUILD, FileUtil.toFile(createDir("build/conf")));
FileOwnerQuery.markExternalOwner(testFile.getParent(), FileOwnerQuery.getOwner(createDir("langtools/src/java.compiler")), FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT);
File target = BuildUtils.findTargetJavaHome(testFile);
assertEquals("/build/conf/images/j2sdk-image", target.getAbsolutePath().substring(getWorkDir().getAbsolutePath().length()));
}
public void testImages2() throws Exception {
createFile("modules.xml");
createDir("jdk/src/java.base/share/classes");
createDir("build/conf/jdk");
createDir("build/conf/images/jdk");
createDir("langtools/src/java.compiler/share/classes");
FileObject testFile = createFile("langtools/test/Test.java");
createDir("").setAttribute(BuildUtils.NB_JDK_PROJECT_BUILD, FileUtil.toFile(createDir("build/conf")));
FileOwnerQuery.markExternalOwner(testFile.getParent(), FileOwnerQuery.getOwner(createDir("langtools/src/java.compiler")), FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT);
File target = BuildUtils.findTargetJavaHome(testFile);
assertEquals("/build/conf/jdk", target.getAbsolutePath().substring(getWorkDir().getAbsolutePath().length()));
}
public void testStackTracePattern() {
List<Pair<String, StackTraceLine>> cases = new ArrayList<>();
cases.add(Pair.of(" at com.sun.tools.javac.code.Scope$ScopeImpl.remove(Scope.java:406)",
new StackTraceLine("com/sun/tools/javac/code/Scope.java", 406)));
cases.add(Pair.of(" at com.sun.tools.javac.code.Scope$ScopeImpl.<init>(Scope.java:402)",
new StackTraceLine("com/sun/tools/javac/code/Scope.java", 402)));
cases.add(Pair.of(" at java.base/java.lang.reflect.Method.invoke(Method.java:537)",
new StackTraceLine("java/lang/reflect/Method.java", 537)));
cases.add(Pair.of(" at org.netbeans.core.netigso//org.netbeans.core.netigso.Netigso.prepare(Netigso.java:167)",
new StackTraceLine("org/netbeans/core/netigso/Netigso.java", 167)));
cases.add(Pair.of(" at org.netbeans.core.netigso/any/org.netbeans.core.netigso.Netigso.prepare(Netigso.java:167)",
new StackTraceLine("org/netbeans/core/netigso/Netigso.java", 167)));
for (Pair<String, StackTraceLine> c : cases) {
StackTraceLine parsed = ActionProviderImpl.matches(c.first());
assertFalse(c.first() + ":" + String.valueOf(parsed), parsed == null ^ c.second() == null);
if (parsed != null) {
assertEquals(c.second().expectedFileName, parsed.expectedFileName);
assertEquals(c.second().lineNumber, parsed.lineNumber);
}
}
}
private FileObject createDir(String dir) throws IOException {
FileObject wd = FileUtil.toFileObject(getWorkDir());
return FileUtil.createFolder(wd, dir);
}
private FileObject createFile(String file) throws IOException {
FileObject wd = FileUtil.toFileObject(getWorkDir());
return FileUtil.createData(wd, file);
}
private Set<String> relative(FileObject root, List<FileObject> files) {
Set<String> result = new HashSet<>();
for (FileObject f : files) {
result.add(FileUtil.getRelativePath(root, f));
}
return result;
}
private static final class ProjectImpl implements Project {
private final FileObject dir;
public ProjectImpl(FileObject dir) {
this.dir = dir;
}
@Override
public FileObject getProjectDirectory() {
return dir;
}
@Override
public Lookup getLookup() {
return Lookup.EMPTY;
}
}
@ServiceProvider(service=ProjectFactory.class)
public static final class ProjectFactoryImpl implements ProjectFactory {
@Override
public boolean isProject(FileObject projectDirectory) {
try {
return loadProject(projectDirectory, null) != null;
} catch (IOException ex) {
return false;
}
}
@Override
public Project loadProject(FileObject projectDirectory, ProjectState state) throws IOException {
if (BuildUtils.getFileObject(projectDirectory, "../../../modules.xml") != null) {
return new ProjectImpl(projectDirectory);
}
if (projectDirectory.getNameExt().equals("langtools") &&
projectDirectory.getParent().getNameExt().equals("netbeans") &&
projectDirectory.getParent().getParent().getNameExt().equals("make")) {
return new ProjectImpl(projectDirectory);
}
return null;
}
@Override
public void saveProject(Project project) throws IOException, ClassCastException {
}
}
}