| /* |
| * 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 gui.projects; |
| |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.URL; |
| import java.util.Arrays; |
| import java.util.List; |
| import junit.framework.Test; |
| import org.netbeans.api.java.classpath.ClassPath; |
| import org.netbeans.api.java.classpath.ClassPath.Entry; |
| import org.netbeans.api.java.project.JavaProjectConstants; |
| import org.netbeans.api.java.queries.SourceForBinaryQuery; |
| import org.netbeans.api.java.source.SourceUtils; |
| import org.netbeans.api.project.Project; |
| import org.netbeans.api.project.ProjectManager; |
| import org.netbeans.api.project.ProjectUtils; |
| import org.netbeans.api.project.SourceGroup; |
| import org.netbeans.api.project.Sources; |
| import org.netbeans.jellytools.JellyTestCase; |
| import org.netbeans.jellytools.NbDialogOperator; |
| import org.netbeans.jellytools.NewJavaProjectNameLocationStepOperator; |
| import org.netbeans.jellytools.NewProjectWizardOperator; |
| import org.netbeans.jellytools.ProjectsTabOperator; |
| import org.netbeans.jellytools.actions.ActionNoBlock; |
| import org.netbeans.jellytools.nodes.Node; |
| import org.netbeans.jemmy.operators.JButtonOperator; |
| import org.netbeans.jemmy.operators.JCheckBoxOperator; |
| import org.netbeans.jemmy.operators.JFileChooserOperator; |
| import org.netbeans.jemmy.operators.JRadioButtonOperator; |
| import org.netbeans.jemmy.operators.JTabbedPaneOperator; |
| import org.netbeans.jemmy.operators.JTextFieldOperator; |
| import org.netbeans.jemmy.operators.JTreeOperator; |
| import org.netbeans.junit.NbModuleSuite; |
| import org.openide.ErrorManager; |
| import org.openide.filesystems.FileObject; |
| import org.openide.filesystems.FileStateInvalidException; |
| import org.openide.filesystems.FileUtil; |
| import org.openide.filesystems.JarFileSystem; |
| import org.openide.util.Exceptions; |
| |
| /** |
| * Test project and project dependencies on JAR or library |
| * |
| * @author Tomas Musil |
| */ |
| public class ProjectsBasicsTest extends JellyTestCase { |
| |
| public static String sampleName = "sample1"; |
| public static String sampleNameSharable = "sharable1"; |
| public static String location = System.getProperty("netbeans.user"); |
| public static String jarName = "TestJar.jar"; |
| public static String libJarName = "LibraryJar.jar"; |
| public static String libJarSourcesName = "src.zip"; |
| public static String libraryName = "MyLibrary"; |
| |
| /** Need to be defined because of JUnit */ |
| public ProjectsBasicsTest(String name) { |
| super(name); |
| } |
| |
| public static Test suite() { |
| return NbModuleSuite.create(ProjectsBasicsTest.class, ".*", ".*"); |
| } |
| |
| public @Override void setUp() { |
| System.out.println("######## "+getName()+" #######"); |
| } |
| |
| |
| /** Create J2SE project */ |
| public void testCreateJ2SEproject(){ |
| createProject(sampleName, Labels.standard, Labels.javaApp, false); |
| } |
| |
| /** Add JAR dependency to J2SE project and check classpath */ |
| public void testAddDependencyOnJar(){ |
| File jarFile = new File(getDataDir(), jarName); |
| assert jarFile.exists(); |
| addJarDependency(sampleName, jarName, false); |
| assert isJarOnClasspath(jarFile, sampleName); |
| |
| } |
| |
| /** Create sharable J2SE project */ |
| public void testCreateSharableJ2SEproject(){ |
| createProject(sampleNameSharable, Labels.standard, Labels.javaApp, true); |
| assert isProjectSharable(sampleNameSharable); |
| } |
| |
| /** Add JAR dependency to sharable J2SE project and check classpath */ |
| public void testAddJarDependencyForSharable(){ |
| File jarFile = new File(getDataDir(), jarName); |
| assert jarFile.exists(); |
| assert !sharableProjectContains(sampleNameSharable, jarName); |
| assert !isJarOnClasspath(jarFile, sampleNameSharable); |
| addJarDependency(sampleNameSharable, jarName, true); |
| assert sharableProjectContains(sampleNameSharable, jarName); |
| assert isJarOnClasspath(jarFile, sampleNameSharable); |
| } |
| |
| /** Create J2SE library with JAR and sources */ |
| public void testCreateLibrary(){ |
| new ActionNoBlock(Labels.tools+"|"+Labels.libraries,null).perform(); |
| NbDialogOperator lmo = new NbDialogOperator(Labels.libMgrDlgLbl); |
| new JButtonOperator(lmo, Labels.addNewLibraryBtnLbl).push(); |
| NbDialogOperator nlDlg = new NbDialogOperator(Labels.newLibraryDlgLbl); |
| nlDlg.ok(); |
| assert new JTextFieldOperator(lmo).getText().equals(libraryName); |
| new JButtonOperator(lmo,Labels.addToCpBtnLbl).push(); |
| selectInFileChooserFromDatadir(libJarName); |
| JTabbedPaneOperator jtpo = new JTabbedPaneOperator(lmo); |
| jtpo.setSelectedIndex(1); |
| try { |
| Thread.sleep(1000); |
| } catch (InterruptedException ex) { |
| Exceptions.printStackTrace(ex); |
| } |
| assert jtpo.getSelectedIndex() == 1; |
| new JButtonOperator(lmo,Labels.addSrcBtnLbl).push(); |
| selectInFileChooserFromDatadir(libJarSourcesName); |
| lmo.ok(); |
| } |
| |
| |
| /** Add library dependency to J2SE project and check classpath and sources */ |
| public void testAddLibraryDependency(){ |
| File libraryJarFile = new File(getDataDir(),libJarName); |
| assert !isJarOnClasspath(libraryJarFile, sampleName); |
| addLibraryDependency(sampleName, libraryName); |
| assert isJarOnClasspath(libraryJarFile, sampleName); |
| assert isSourceForJarAvailable(libraryJarFile, sampleName); |
| } |
| |
| |
| //---- Private methods ------------ |
| |
| private void selectInFileChooserFromDatadir(String fileName){ |
| JFileChooserOperator fco1 = new JFileChooserOperator(); |
| fco1.setCurrentDirectory(getDataDir()); |
| fco1.selectFile(fileName); |
| fco1.approve(); |
| |
| } |
| |
| private boolean isProjectSharable(String prjName){ |
| return sharableProjectContains(prjName, "nblibraries.properties"); //NOI18N |
| } |
| |
| private boolean sharableProjectContains(String prjName, String child){ |
| boolean res = false; |
| File prj = new File(location, prjName); |
| File lib = new File(prj,"lib"); //NOI18N |
| if (lib.isDirectory()){ |
| List ch = Arrays.asList(lib.list()); |
| res = ch.contains(child); |
| } |
| return res; |
| |
| } |
| |
| |
| private void addJarDependency(String project, String jarName, boolean toSharableLib){ |
| ProjectsTabOperator pto = ProjectsTabOperator.invoke(); |
| Node libNode = new Node(pto.tree(),project+"|"+Labels.librariesNode); //NOI18N |
| assert libNode.isPresent(); |
| libNode.performPopupActionNoBlock("Add JAR/Folder..."); |
| JFileChooserOperator fco = new JFileChooserOperator(); |
| fco.setCurrentDirectory(getDataDir()); |
| fco.selectFile(jarName); |
| if (toSharableLib){ |
| JRadioButtonOperator rb = new JRadioButtonOperator(fco, Labels.copyToShLibRadioLbl); |
| rb.push(); |
| } |
| fco.approve(); |
| waitScanFinished(); |
| assert libNode.isChildPresent(jarName); |
| libNode.expand(); |
| } |
| |
| private void addLibraryDependency(String project, String libName){ |
| ProjectsTabOperator pto = ProjectsTabOperator.invoke(); |
| Node libNode = new Node(pto.tree(),project+"|"+Labels.librariesNode); //NOI18N |
| assert libNode.isPresent(); |
| int countNodes = libNode.getChildren().length; |
| libNode.performPopupActionNoBlock(Labels.addLibraryActionLbl); |
| NbDialogOperator libo = new NbDialogOperator(Labels.addLibraryDlg); |
| JTreeOperator jto = new JTreeOperator(libo); |
| Node n = new Node(jto, Labels.globalLibraries + "|"+libName); |
| n.select(); |
| new JButtonOperator(libo, Labels.addLibraryBtn).push(); |
| if (!libNode.isExpanded()) libNode.expand(); |
| assert countNodes + 1 == libNode.getChildren().length; |
| } |
| |
| |
| |
| |
| private void createProject(String name, String category, String project, boolean sharable){ |
| NewProjectWizardOperator npwo = NewProjectWizardOperator.invoke(); |
| npwo.selectCategory(category); |
| npwo.selectProject(project); |
| npwo.next(); |
| NewJavaProjectNameLocationStepOperator npnlso = new NewJavaProjectNameLocationStepOperator(); |
| npnlso.txtProjectLocation().setText(location); // NOI18N |
| npnlso.txtProjectName().setText(name); |
| if(sharable) new JCheckBoxOperator(npnlso).push(); |
| npnlso.finish(); |
| waitScanFinished(); |
| } |
| |
| private boolean isSourceForJarAvailable(File jarFile, String projectName){ |
| boolean result = false; |
| try { |
| ClassPath cp = getCpForProjectSrcRoot(projectName); |
| List<Entry> le = cp.entries(); |
| Entry e = null; |
| for (Entry entry : le) { |
| if (entry.getURL().toString().contains(jarFile.getName())) { |
| e = entry; |
| } |
| } |
| assert e != null; |
| URL url = e.getURL(); |
| FileObject[] src = SourceForBinaryQuery.findSourceRoots(url).getRoots(); |
| result = src.length == 1 && src[0].getFileSystem() instanceof JarFileSystem && src[0].getName().equals("src"); |
| } catch (FileStateInvalidException ex) { |
| Exceptions.printStackTrace(ex); |
| } |
| return result; |
| } |
| |
| private boolean isJarOnClasspath(File jarfile, String projectName){ |
| ClassPath cp = getCpForProjectSrcRoot(projectName); |
| return cp.toString().contains(jarfile.getName()); |
| } |
| |
| private ClassPath getCpForProjectSrcRoot(String projectName){ |
| ProjectManager pm = ProjectManager.getDefault(); |
| ClassPath cp = null; |
| try { |
| File fPrj = new File(location, projectName); |
| assert fPrj.exists(); |
| FileObject foPrj = FileUtil.toFileObject(fPrj); |
| assert foPrj!=null && pm.isProject(foPrj); |
| Project p = pm.findProject(foPrj); |
| Sources s = ProjectUtils.getSources(p); |
| SourceGroup[] sgArr = s.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); |
| assert sgArr.length>0; |
| //take sources |
| SourceGroup sg = sgArr[0]; |
| cp = ClassPath.getClassPath(sg.getRootFolder(), ClassPath.COMPILE); |
| } catch (IOException ex) { |
| Exceptions.printStackTrace(ex); |
| } |
| return cp; |
| |
| |
| } |
| |
| } |