@Test public void testLocalFileProxy() { IRemoteFileProxy fileProxy = null; try { fileProxy = proxyManager.getFileProxy(localProject.getProject()); assertTrue("Should have returned a remote launcher", fileProxy instanceof LocalFileProxy); } catch (CoreException e) { fail("Should have returned a launcher: " + e.getCause()); } /* * Test getDirectorySeparator() */ String ds = fileProxy.getDirectorySeparator(); assertNotNull(ds); /* * Test getResource() */ IFileStore actualFileStore = fileProxy.getResource(localProject.getProject().getLocation().toOSString()); assertNotNull(actualFileStore); IFileStore expectedFileStore = null; try { expectedFileStore = EFS.getStore(localProject.getLocationURI()); } catch (CoreException e) { fail("Unabled to get FileStore to local project: " + e.getMessage()); } assertEquals("FileStore to local project folder diverge", expectedFileStore, actualFileStore); assertTrue(actualFileStore.fetchInfo().isDirectory()); actualFileStore = fileProxy.getResource("/filenotexits"); assertNotNull(actualFileStore); IFileInfo fileInfo = actualFileStore.fetchInfo(); assertNotNull(fileInfo); assertFalse(fileInfo.exists()); /* * Test getWorkingDir() */ URI workingDir = fileProxy.getWorkingDir(); assertNotNull(workingDir); assertEquals(localProject.getLocationURI(), workingDir); /* * Test toPath() */ assertEquals( localProject.getProject().getLocation().toOSString(), fileProxy.toPath(localProject.getLocationURI())); }
@Test public void testRemoteFileProxyOnSyncProject() { IRemoteFileProxy fileProxy = null; try { fileProxy = proxyManager.getFileProxy(syncProject.getProject()); assertTrue("Should have returned a remote launcher", fileProxy instanceof RDTFileProxy); } catch (CoreException e) { fail("Should have returned a launcher: " + e.getCause()); } String ds = fileProxy.getDirectorySeparator(); assertNotNull(ds); SyncConfig config = getSyncConfig(syncProject.getProject()); String projectLocation = config.getLocation(); assertNotNull(projectLocation); IRemoteConnection conn = null; String connScheme = null; try { conn = config.getRemoteConnection(); connScheme = conn.getConnectionType().getScheme(); } catch (MissingConnectionException e) { fail("Unabled to get remote connection: " + e.getMessage()); } /* * Test getResource() */ IFileStore fs = fileProxy.getResource(projectLocation); assertNotNull(fs); assertEquals( "Remote connection and FileStore schemes diverge", connScheme, fs.toURI().getScheme()); // assertTrue(fs.fetchInfo().isDirectory()); fs = fileProxy.getResource("/filenotexits"); assertNotNull(fs); IFileInfo fileInfo = fs.fetchInfo(); assertNotNull(fileInfo); assertFalse(fileInfo.exists()); /* * Test getWorkingDir() */ URI workingDir = fileProxy.getWorkingDir(); assertNotNull(workingDir); assertEquals("Remote connection and URI schemes diverge", connScheme, workingDir.getScheme()); /* * Test toPath() */ URI uri = null; try { uri = new URI(connScheme, conn.getName(), projectLocation, null, null); } catch (URISyntaxException e) { fail("Failed to build URI for the test: " + e.getMessage()); } assertEquals(projectLocation, fileProxy.toPath(uri)); /* * Test it opens connection */ assertNotNull(conn); conn.close(); assertFalse(conn.isOpen()); try { fileProxy = proxyManager.getFileProxy(syncProject.getProject()); assertNotNull(fileProxy); } catch (CoreException e) { fail("Failed to obtain file proxy when connection is closed: " + e.getMessage()); } fs = fileProxy.getResource("/tmp/somedir"); assertNotNull(fs); assertFalse(fs.fetchInfo().exists()); try { fs.mkdir(EFS.SHALLOW, new NullProgressMonitor()); } catch (CoreException e) { fail("should be able to create a directory when connection is closed: " + e.getMessage()); } assertTrue(fs.fetchInfo().exists()); try { fs.delete(EFS.NONE, new NullProgressMonitor()); } catch (CoreException e) { fail("Failed to delete file: " + e.getMessage()); } }
@Override public void launch( ILaunchConfiguration config, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { try { ConfigUtils configUtils = new ConfigUtils(config); project = configUtils.getProject(); // check if Perf exists in $PATH if (!PerfCore.checkPerfInPath(project)) { IStatus status = new Status( IStatus.ERROR, PerfPlugin.PLUGIN_ID, "Error: Perf was not found on PATH"); //$NON-NLS-1$ throw new CoreException(status); } URI binURI = new URI(configUtils.getExecutablePath()); binPath = Path.fromPortableString(binURI.toString()); workingDirPath = Path.fromPortableString( Path.fromPortableString(binURI.toString()).removeLastSegments(2).toPortableString()); PerfPlugin.getDefault().setWorkingDir(workingDirPath); if (config.getAttribute(PerfPlugin.ATTR_ShowStat, PerfPlugin.ATTR_ShowStat_default)) { showStat(config, launch); } else { URI exeURI = new URI(configUtils.getExecutablePath()); String configWorkingDir = configUtils.getWorkingDirectory() + IPath.SEPARATOR; RemoteConnection exeRC = new RemoteConnection(exeURI); String perfPathString = RuntimeProcessFactory.getFactory().whichCommand(PerfPlugin.PERF_COMMAND, project); boolean copyExecutable = configUtils.getCopyExecutable(); if (copyExecutable) { URI copyExeURI = new URI(configUtils.getCopyFromExecutablePath()); RemoteConnection copyExeRC = new RemoteConnection(copyExeURI); IRemoteFileProxy copyExeRFP = copyExeRC.getRmtFileProxy(); IFileStore copyExeFS = copyExeRFP.getResource(copyExeURI.getPath()); IRemoteFileProxy exeRFP = exeRC.getRmtFileProxy(); IFileStore exeFS = exeRFP.getResource(exeURI.getPath()); IFileInfo exeFI = exeFS.fetchInfo(); if (exeFI.isDirectory()) { // Assume the user wants to copy the file to the given directory, using // the same filename as the "copy from" executable. IPath copyExePath = Path.fromOSString(copyExeURI.getPath()); IPath newExePath = Path.fromOSString(exeURI.getPath()).append(copyExePath.lastSegment()); // update the exeURI with the new path. exeURI = new URI( exeURI.getScheme(), exeURI.getAuthority(), newExePath.toString(), exeURI.getQuery(), exeURI.getFragment()); exeFS = exeRFP.getResource(exeURI.getPath()); } copyExeFS.copy(exeFS, EFS.OVERWRITE | EFS.SHALLOW, new SubProgressMonitor(monitor, 1)); // Note: assume that we don't need to create a new exeRC since the // scheme and authority remain the same between the original exeURI and the new one. } IPath remoteBinFile = Path.fromOSString(exeURI.getPath()); IFileStore workingDir; URI workingDirURI = new URI(RemoteProxyManager.getInstance().getRemoteProjectLocation(project)); RemoteConnection workingDirRC = new RemoteConnection(workingDirURI); IRemoteFileProxy workingDirRFP = workingDirRC.getRmtFileProxy(); workingDir = workingDirRFP.getResource(workingDirURI.getPath()); // Build the commandline string to run perf recording the given project String arguments[] = getProgramArgumentsArray(config); // Program args from launch config. ArrayList<String> command = new ArrayList<>(4 + arguments.length); Version perfVersion = PerfCore.getPerfVersion(config); command.addAll( Arrays.asList( PerfCore.getRecordString( config, perfVersion))); // Get the base commandline string (with flags/options based on // config) command.add(remoteBinFile.toOSString()); // Add the path to the executable command.set(0, perfPathString); command.add(2, OUTPUT_STR + configWorkingDir + PerfPlugin.PERF_DEFAULT_DATA); // Compile string command.addAll(Arrays.asList(arguments)); // Spawn the process String[] commandArray = command.toArray(new String[command.size()]); Process pProxy = RuntimeProcessFactory.getFactory() .exec(commandArray, getEnvironment(config), workingDir, project); MessageConsole console = new MessageConsole("Perf Console", null); // $NON-NLS-1$ console.activate(); ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] {console}); MessageConsoleStream stream = console.newMessageStream(); if (pProxy != null) { try (BufferedReader error = new BufferedReader(new InputStreamReader(pProxy.getErrorStream()))) { String err = error.readLine(); while (err != null) { stream.println(err); err = error.readLine(); } } } /* This commented part is the basic method to run perf record without integrating into eclipse. String binCall = exePath.toOSString(); for(String arg : arguments) { binCall.concat(" " + arg); } PerfCore.Run(binCall);*/ pProxy.destroy(); PrintStream print = null; if (config.getAttribute(IDebugUIConstants.ATTR_CAPTURE_IN_CONSOLE, true)) { // Get the console to output to. // This may not be the best way to accomplish this but it shall do for now. ConsolePlugin plugin = ConsolePlugin.getDefault(); IConsoleManager conMan = plugin.getConsoleManager(); IConsole[] existing = conMan.getConsoles(); IOConsole binaryOutCons = null; // Find the console for (IConsole x : existing) { if (x.getName().contains(renderProcessLabel(commandArray[0]))) { binaryOutCons = (IOConsole) x; } } if ((binaryOutCons == null) && (existing.length != 0)) { // if can't be found get the most recent opened, this should probably // never happen. if (existing[existing.length - 1] instanceof IOConsole) binaryOutCons = (IOConsole) existing[existing.length - 1]; } // Get the printstream via the outputstream. // Get ouput stream OutputStream outputTo; if (binaryOutCons != null) { outputTo = binaryOutCons.newOutputStream(); // Get the printstream for that console print = new PrintStream(outputTo); } for (int i = 0; i < command.size(); i++) { print.print(command.get(i) + " "); // $NON-NLS-1$ } // Print Message print.println(); print.println("Analysing recorded perf.data, please wait..."); // $NON-NLS-1$ // Possibly should pass this (the console reference) on to PerfCore.Report if theres // anything we ever want to spit out to user. } PerfCore.report( config, getEnvironment(config), Path.fromOSString(configWorkingDir), monitor, null, print); URI perfDataURI = null; IRemoteFileProxy proxy = null; perfDataURI = new URI( RemoteProxyManager.getInstance().getRemoteProjectLocation(project) + PerfPlugin.PERF_DEFAULT_DATA); proxy = RemoteProxyManager.getInstance().getFileProxy(perfDataURI); IFileStore perfDataFileStore = proxy.getResource(perfDataURI.getPath()); IFileInfo info = perfDataFileStore.fetchInfo(); info.setAttribute(EFS.ATTRIBUTE_READ_ONLY, true); perfDataFileStore.putInfo(info, EFS.SET_ATTRIBUTES, null); PerfCore.refreshView(renderProcessLabel(exeURI.getPath())); if (config.getAttribute( PerfPlugin.ATTR_ShowSourceDisassembly, PerfPlugin.ATTR_ShowSourceDisassembly_default)) { showSourceDisassembly( Path.fromPortableString(workingDirURI.toString() + IPath.SEPARATOR)); } } } catch (IOException e) { e.printStackTrace(); abort(e.getLocalizedMessage(), null, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); } catch (RemoteConnectionException e) { e.printStackTrace(); abort(e.getLocalizedMessage(), null, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); } catch (URISyntaxException e) { e.printStackTrace(); abort(e.getLocalizedMessage(), null, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); } }