diff options
author | Rüdiger Timm <rt@openoffice.org> | 2005-03-30 08:03:39 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2005-03-30 08:03:39 +0000 |
commit | c2e7ae0b1f9cfca9b90255e2145982ac6a51c969 (patch) | |
tree | e12a93773288853629a90e848db1df4b17e29510 /vcl/qa/complex | |
parent | 01979462d9fa2413b469a27c75a042fbea37d07f (diff) |
INTEGRATION: CWS vcl38 (1.1.6); FILE ADDED
2005/03/22 15:41:24 sg 1.1.6.1: #i44325#NEW: initial version
Diffstat (limited to 'vcl/qa/complex')
-rw-r--r-- | vcl/qa/complex/memCheck/CheckMemoryUsage.java | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/vcl/qa/complex/memCheck/CheckMemoryUsage.java b/vcl/qa/complex/memCheck/CheckMemoryUsage.java new file mode 100644 index 000000000000..bd8d467e8e0f --- /dev/null +++ b/vcl/qa/complex/memCheck/CheckMemoryUsage.java @@ -0,0 +1,374 @@ +/************************************************************************* + * + * $RCSfile: CheckMemoryUsage.java,v $ + * + * $Revision: 1.2 $ + * + * last change: $Date: 2005-03-30 09:03:39 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +package complex.memCheck; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.frame.XStorable; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.util.XCloseable; +import complexlib.ComplexTestCase; +import helper.ProcessHandler; +import java.io.File; +import java.io.FilePermission; +import java.io.FileWriter; +import java.io.FilenameFilter; +import java.io.PrintWriter; +import java.util.Enumeration; +import java.util.StringTokenizer; +import java.util.Vector; +import util.DesktopTools; +import util.WriterTools; +import util.utils; + +/** + * Documents are opened and exported with StarOffice. The memory usage of + * StarOffice is monitored and if the usage exceeds the allowed kilobytes, + * the test is failed. Used for monitoring the StarOffice process is the + * command line tool 'pmap', available on Solaris or Linux. This test will not + * run on Windows.<br>Test procedure: every given document type is searched in + * the source directory + * Needed paramters: + * <ul> + * <li>"TestDocumentPath" - the path where test documents are located.</li> + * <li>"AllowMemoryIncrease" (optional) - the allowed memory increase measured in kByte per exported document. The default is 10 kByte.</li> + * <li>"ExportDocCount" (optional) - the amount of exports for each document that is loaded. Is defaulted to 25. + * <li>"FileExportFilter" (optional) - a relation between loaded document type and used export filter. Is defaulted to + * writer, calc and impress. This parameter can be set with a number to give more than one relation. Example:<br> + * "FileExportFilter1=sxw,writer_pdf_Export"<br> + * "FileExportFilter2=sxc,calc_pdf_Export"<br> + * "FileExportFilter3=sxi,impress_pdf_Export"<br></li> + * All parameters are used for iteration over the test document path. + * </ul> + */ +public class CheckMemoryUsage extends ComplexTestCase { + private final String sWriterDoc = "sxw,writer_pdf_Export"; + private final String sCalcDoc = "sxc,calc_pdf_Export"; + private final String sImpressDoc = "sxi,impress_pdf_Export"; + private String sProcessId = "ps -ef | grep $USER | grep soffice | grep -v grep"; + private String sMemoryMonitor = "pmap <processID> | grep total"; + private String sChmod = "chmod 777 "; + private String sProcessIdCommand = null; + private String sOfficeMemoryCommand = null; + private String sTempDir = null; + private String sFS = null; + private String sMemoryMap1 = null; + private String sMemoryMap2 = null; + private String bash = "#!/bin/bash"; + private String sDocumentPath = ""; + private String[][] sDocTypeExportFilter; + private String[][] sDocuments; + private int iAllowMemoryIncrease = 10; + private int iExportDocCount = 25; + + /** + * Get all test methods + * @return The test methods. + */ + public String[] getTestMethodNames() { + return new String[] {"loadAndSaveDocuments"}; + } + + /** + * Collect all documnets to load and all filters used for export. + */ + public void before() { + // test does definitely not run on Windows. + if (param.get("OperatingSystem").equals("wntmsci")) { + log.println("Test can only reasonably be executed with a tool that " + + "displays the memory usage of StarOffice."); + failed("Test does not run on Windows, only on Solaris or Linux."); + } + + // how many times is every document exported. + int count = param.getInt("ExportDocCount"); + if (count != 0) + iExportDocCount = count; + + // get the temp dir for creating the command scripts. + sTempDir = System.getProperty("java.io.tmpdir"); + sProcessIdCommand = sTempDir + "getPS"; + sOfficeMemoryCommand = sTempDir + "getPmap"; + + // get the file extension, export filter connection + Enumeration keys = param.keys(); + Vector v = new Vector(); + while(keys.hasMoreElements()) { + String key = (String)keys.nextElement(); + if (key.startsWith("FileExportFilter")) { + v.add(param.get(key)); + } + } + // if no param given, set defaults. + if (v.size() == 0){ + v.add(sWriterDoc); + v.add(sCalcDoc); + v.add(sImpressDoc); + } + // store a file extension + sDocTypeExportFilter = new String[v.size()][2]; + for (int i=0; i<v.size(); i++) { + // 2do: error routine for wrong given params + StringTokenizer t = new StringTokenizer((String)v.get(i), ","); + sDocTypeExportFilter[i][0] = t.nextToken(); + sDocTypeExportFilter[i][1] = t.nextToken(); + } + + // get files to load and export + sDocumentPath = (String)param.get("TestDocumentPath"); + File f = new File(sDocumentPath); + sDocumentPath = f.getAbsolutePath(); + String sFS = System.getProperty("file.separator"); + sDocuments = new String[sDocTypeExportFilter.length][]; + for (int j=0; j<sDocTypeExportFilter.length; j++) { + FileFilter filter = new FileFilter(sDocTypeExportFilter[j][0]); + String[] doc = f.list(filter); + sDocuments[j] = new String[doc.length]; + for (int i=0; i<doc.length; i++) { + if (sDocumentPath.endsWith(sFS)) + sDocuments[j][i] = sDocumentPath + doc[i]; + else + sDocuments[j][i] = sDocumentPath + sFS + doc[i]; + sDocuments[j][i] = utils.getFullURL(sDocuments[j][i]); + } + } + } + + /** + * delete all created files on disk + */ + public void after() { + // delete the constructed files. + for (int i=0; i<iExportDocCount; i++) { + File f = new File(sTempDir + "DocExport" + i + ".pdf"); + f.delete(); + } + File f = new File(sProcessIdCommand); + f.delete(); + f = new File(sOfficeMemoryCommand); + f.delete(); + } + + /** + * Thet etst function: load documents and save them using the given filters + * for each given document type. + */ + public void loadAndSaveDocuments() { + int storageBefore = getOfficeMemoryUsage(); + + XMultiServiceFactory xMSF = (XMultiServiceFactory)param.getMSF(); + + // iterate over all document types + for (int k=0; k<sDocTypeExportFilter.length; k++) { + // iterate over all documents of this type + for (int i=0; i<sDocuments[k].length; i++) { + System.out.println("Document: "+ sDocuments[k][i]); + XComponent xComponent = DesktopTools.loadDoc(xMSF, sDocuments[k][i], null); + XStorable xStorable = (XStorable)UnoRuntime.queryInterface(XStorable.class, xComponent); + if (xStorable != null) { + // export each document iExportDocCount times + for (int j=0; j<iExportDocCount; j++) { + String url = utils.getFullURL(sTempDir + "DocExport" + j + ".pdf"); + try { + PropertyValue[] props = new PropertyValue[1]; + props[0] = new PropertyValue(); + props[0].Name = "FilterName"; + // use export filter for this doc type + props[0].Value = sDocTypeExportFilter[k][1]; + xStorable.storeToURL(url, props); + } + catch(com.sun.star.io.IOException e) { + failed("Could not store to '" + url + "'", true); + } + } + // close the doc + XCloseable xCloseable = (XCloseable)UnoRuntime.queryInterface(XCloseable.class, xStorable); + try { + xCloseable.close(true); + } + catch(com.sun.star.util.CloseVetoException e) { + e.printStackTrace((java.io.PrintWriter)log); + failed("Cannot close document: test is futile, Office will surely use more space."); + } + } + else { + log.println("Cannot query for XStorable interface on document '" + sDocuments[i] + "'"); + log.println(" -> Skipping storage."); + } + } + } + // short wait for the office to 'calm down' and free some memory + shortWait(5000); + // wait util memory is not freed anymore. + int storageAfter = getOfficeMemoryUsage(); + int mem = 0; + int count = 0; + while (storageAfter != mem && count < 10) { + count++; + mem = storageAfter; + storageAfter = getOfficeMemoryUsage(); + shortWait(1000); + } + assure("The Office consumes now " + (storageAfter - storageBefore) + + "K more memory than at the start of the test; allowed were " + + iAllowMemoryIncrease * iExportDocCount + "K.", + storageAfter - storageBefore < iAllowMemoryIncrease * iExportDocCount); + + } + + /** + * Get the process ID from the Office + * @return the Id as String + */ + private String getOfficeProcessID() { + writeExecutableFile(sProcessIdCommand, sProcessId); + ProcessHandler processID = new ProcessHandler(sProcessIdCommand); + processID.executeSynchronously(); + String text = processID.getOutputText(); + if (text == null || text.equals("") || text.indexOf(' ') == -1) + failed("Could not determine Office process ID. Check " + sProcessIdCommand); + StringTokenizer aToken = new StringTokenizer(text); + // this is not nice, but ps gives the same output on every machine + aToken.nextToken(); + String id = aToken.nextToken(); + return id; + } + + /** + * Get the memory usage of the Office in KByte. + * @return The memory used by the Office. + */ + private int getOfficeMemoryUsage() { + String command = sMemoryMonitor.replaceAll("<processID>", getOfficeProcessID()); + writeExecutableFile(sOfficeMemoryCommand, command); + ProcessHandler processID = new ProcessHandler(sOfficeMemoryCommand); + processID.executeSynchronously(); + String text = processID.getOutputText(); + if (text == null || text.equals("") || text.indexOf(' ') == -1) { + failed("Could not determine Office memory usage. Check " + sOfficeMemoryCommand); + } + StringTokenizer aToken = new StringTokenizer(text); + // this works, because the output of pmap is quite standardized. + aToken.nextToken(); + String mem = aToken.nextToken(); + mem = mem.substring(0, mem.indexOf('K')); + Integer memory = new Integer(mem); + return memory.intValue(); + } + + /** + * Write a script file and set its rights to rwxrwxrwx. + * @param fileName The name of the created file + * @param line The commandline that has to be written inside of the file. + */ + private void writeExecutableFile(String fileName, String line) { + try { + PrintWriter fWriter = new PrintWriter(new FileWriter(fileName)); + fWriter.println(bash); + fWriter.println(line); + fWriter.close(); + // change rights to rwxrwxrwx + ProcessHandler processID = new ProcessHandler(sChmod + fileName); + processID.executeSynchronously(); + } + catch(java.io.IOException e) { + } + } + + /** + * Let this thread sleep for some time + * @param milliSeconds time to wait in milliseconds. + */ + private void shortWait(int milliSeconds) { + try { + Thread.sleep(milliSeconds); + } + catch(java.lang.InterruptedException e) { // ignore + } + } + + /** + * Own file filter, will just return ok for all files that end with a given + * suffix + */ + private class FileFilter implements FilenameFilter { + private String suffix = null; + /** + * C'tor. + * @param suffix The suffix each filename should end with. + */ + public FileFilter(String suffix) { + this.suffix = suffix; + } + /** + * Returns true, if the name of the file has the suffix given to the + * c'tor. + * @param name The filename that is tested. + * @param file Not used. + * @return True, if name ends with suffix. + */ + public boolean accept(File file, String name) { + return name.endsWith(suffix); + } + }; + +} |