tracesrv/tracecompiler/test/src/ErrorLogsTestBase.java
changeset 56 aa2539c91954
equal deleted inserted replaced
54:a151135b0cf9 56:aa2539c91954
       
     1 /*
       
     2 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 import static org.junit.Assert.fail;
       
    20 
       
    21 import java.io.BufferedReader;
       
    22 import java.io.DataInputStream;
       
    23 import java.io.File;
       
    24 import java.io.FileInputStream;
       
    25 import java.io.FileOutputStream;
       
    26 import java.io.IOException;
       
    27 import java.io.InputStream;
       
    28 import java.io.InputStreamReader;
       
    29 import java.io.PrintStream;
       
    30 
       
    31 public class ErrorLogsTestBase {
       
    32 	
       
    33 	/****************************************************UTILITY FUNCTIONS FOR TESTS************************************************************/
       
    34 	
       
    35 	/**
       
    36 	 * This function gets an environment variable value given the name.
       
    37 	 * @param variablename The name of the variable for which the value is required.
       
    38 	 * @return The variable value.
       
    39 	 */
       
    40 	public String GetEnvironmentVariablePath(String variablename) {
       
    41 		String variablevalue = System.getenv(variablename);
       
    42 		if(variablevalue == null || (variablevalue.length()==0)){
       
    43 			fail();
       
    44 		}
       
    45 		
       
    46 		// need to check that the path ends in a backslash
       
    47 		if(!variablevalue.endsWith(File.separator)){ 
       
    48 			variablevalue += File.separator; 
       
    49 		}
       
    50 		return variablevalue;
       
    51 	}
       
    52 	
       
    53 	/**
       
    54 	 * This function invokes the desired compiler for a particular test case depending
       
    55 	 * on the string passed
       
    56 	 * @param compiler String specifying the compiler to run, and also specifying where
       
    57 	 * 		  		   the logs should be stored.
       
    58 	 */
       
    59 	public void InvokeCompiler(String compiler) {
       
    60 		System.out.println ("InvokeCompiler()");
       
    61 		//get epocroot location
       
    62 		String e32=GetEnvironmentVariablePath("EPOCROOT");
       
    63 		
       
    64 		String TraceErrorAppPath = e32 + "testdata" + File.separator + "TraceErrorApp" + File.separator;
       
    65 		try{
       
    66 			File compilerpath = new File (e32 + "epoc32" + File.separator + "tools" + File.separator + "tracecompiler" + File.separator);
       
    67 			
       
    68 			if (compiler.compareTo("_sbs")==0){//raptor
       
    69 				compilerpath = new File (e32 + "testdata" + File.separator + "TraceErrorApp" + File.separator +"group" + File.separator);
       
    70 			}
       
    71 			else if (compiler.compareTo("_mult_cpp")==0){//raptor compiling project with multiple source files
       
    72 				compilerpath = new File (e32 + "testdata" + File.separator + "MultipleCppTraceErrorApp" + File.separator + "group" + File.separator);
       
    73 			}
       
    74 			else if (compiler.compareTo("_mult_mmp")==0){//raptor compiling project with multiple source files
       
    75 				compilerpath = new File (e32 + "testdata" + File.separator + "MultipleMmpTraceErrorApps" + File.separator + "group" + File.separator);
       
    76 			}
       
    77 			else if (compiler.compareTo("_tc")!=0){
       
    78 				System.out.println("Error: Unrecognised test case. Use either _tc, _sbs, _mult_cpp or _mult_mmp");
       
    79 				fail();
       
    80 			}
       
    81 			
       
    82 			//set up the process builder object
       
    83 	 		ProcessBuilder pb; 
       
    84 	 		//commands to be used to invoke the compiler
       
    85 	 		if (compiler.compareTo("_tc")==0){//tracecompiler
       
    86 	 			// These EMMA flags are added, because of EMMA reporting in Hudson
       
    87 				// EMMA lfags are commented out, because it does not work in Hudson at the moment
       
    88 //	 			String emmaOutputFileFlag = "-Demma.coverage.out.file=" + e32 + "testdata" + File.separator + "reports" + File.separator + "emma" + File.separator + "coverage.emma";
       
    89 //	 			String emmaOutputMergeFlag = "-Demma.coverage.out.merge=true";
       
    90 	 			String emmaOutputFileFlag = "";
       
    91 	 			String emmaOutputMergeFlag = "";
       
    92 	 			pb = new ProcessBuilder("java", emmaOutputFileFlag, emmaOutputMergeFlag, "-classpath",".", "com.nokia.tracecompiler.TraceCompiler", "E8576D92", "TraceErrorApp",TraceErrorAppPath+"group"+File.separator+"TraceErrorApp.mmp",TraceErrorAppPath+"src"+File.separator+"TraceErrorApp.cpp");
       
    93 	 		}
       
    94 	 		else /*if (compiler.compareTo("_sbs")==0)*/{//for all other raptor cases
       
    95 	 			pb = new ProcessBuilder("sbs.bat","-c","armv5.tracecompiler");
       
    96 	 		}
       
    97 	 		
       
    98 			pb.directory(compilerpath);
       
    99 			pb.redirectErrorStream(true);
       
   100 			
       
   101 			//start the compiler
       
   102 			Process p = pb.start();
       
   103 			InputStream inp = p.getInputStream();
       
   104 	        int c = -1;
       
   105 	        
       
   106 	        
       
   107 	        String str = "";
       
   108 	        
       
   109 	        /*
       
   110 	        //read the output from the compiler into the input stream
       
   111 	        while ((c = inp.read()) != -1) {
       
   112 	            str= str +((char)c);
       
   113 	        }
       
   114 	        */
       
   115 	        
       
   116 	        StringBuilder sb = new StringBuilder();
       
   117 	        //read the output from the compiler into the input stream
       
   118 	        while ((c = inp.read()) != -1) {
       
   119 	        	sb.append(((char)c));
       
   120 	        }
       
   121 	        str = sb.toString();
       
   122 	        
       
   123 	        
       
   124 	    	//Declare output file to write logs to
       
   125 	    	FileOutputStream outstream; 
       
   126 			PrintStream ps; 
       
   127 			System.out.println ("creating output logs in buildlog"+compiler+".txt");
       
   128 			outstream = new FileOutputStream(e32+"epoc32"+File.separator+"build"+File.separator+"buildlog"+compiler+".txt");
       
   129 			ps = new PrintStream( outstream );
       
   130 			ps.println (str);
       
   131 			
       
   132 			//check return code if tracecompiler.. we don't check error code for raptor:
       
   133 			int ret = p.exitValue();
       
   134 			if ((ret==0)&&(compiler.compareTo("_tc")==0)){
       
   135 				System.out.println("FAIL: TraceCompiler does not exit with error");
       
   136 				fail();
       
   137 			}
       
   138 			inp.close();
       
   139 			outstream.close();
       
   140 		}
       
   141 		
       
   142     	catch (IOException e){//Catch IOException
       
   143     		System.err.println("Error: " + e.getMessage());
       
   144     		fail();
       
   145         }
       
   146 		
       
   147 	}
       
   148 	
       
   149 	/**
       
   150 	 * This function parses the log files (as specified by the passed string) for errors and warnings
       
   151 	 *  and stores them in a separate file (also specified by the same passed string)
       
   152 	 * 
       
   153 	 * @param pathext  String specifying the part of the name of the build log file to parse which is 
       
   154 	 * 				   also part of the name of the file where parsed logs are written to.	  		   
       
   155 	 */
       
   156 	public void ParseLogFile(String pathext) {
       
   157 		System.out.println ("ParseLogFile()");
       
   158 		//get epocroot location
       
   159 		String e32=GetEnvironmentVariablePath("EPOCROOT");
       
   160 		
       
   161 		
       
   162 	    try{
       
   163 	    	// Open the file
       
   164 	    	System.out.println ("opening buildlog"+pathext+".txt");
       
   165 	    	FileInputStream fstream = new FileInputStream(e32+"epoc32"+File.separator+"build"+File.separator+"buildlog"+pathext+".txt");
       
   166 
       
   167 	    	// Get the object of DataInputStream
       
   168 	    	//System.out.println ("creating input stream");
       
   169 	    	DataInputStream in = new DataInputStream(fstream);
       
   170 	        BufferedReader br = new BufferedReader(new InputStreamReader(in));
       
   171 	    	String strLine;
       
   172 	    	
       
   173 	    	//Declare output file to write parsed logs to
       
   174 	    	FileOutputStream out; 
       
   175 			PrintStream p; 
       
   176 			//System.out.println ("creating output stream");
       
   177 			out = new FileOutputStream(e32+"epoc32"+File.separator+"build"+File.separator+"parsedlogs"+pathext+".txt");
       
   178 			p = new PrintStream( out );
       
   179 	    	
       
   180 	    	//Read File Line By Line and write to parsedlogs.txt
       
   181 	    	System.out.println ("Writing to parsedlogs"+pathext+".txt");
       
   182 	    	while ((strLine = br.readLine()) != null&&(strLine.length()) >= 9)   {
       
   183 	    		//remove any leading white spaces because there are spaces when printed to standard output.
       
   184 	    		strLine=strLine.trim();
       
   185 		    	if((strLine.startsWith("error:")==true)||(strLine.startsWith("warning:")==true)){
       
   186 			    	// Write to a separate file
       
   187 			    	p.println (strLine);
       
   188 	    	}
       
   189       	
       
   190     	}
       
   191     	
       
   192     	//Close the input and output streams
       
   193     	in.close();
       
   194     	out.close();
       
   195     	}
       
   196     	
       
   197     	catch (IOException e){//Catch IOException
       
   198     		System.err.println("Error: " + e.getMessage());
       
   199     		fail();
       
   200     	}
       
   201 	
       
   202 	}
       
   203 	
       
   204 	/**
       
   205 	 * This function validates the parsed log file by comparing it to a reference file containg
       
   206 	 * the knows warnings and errors 
       
   207 	 * @param project String specifying the name of the project folder that was compiled.
       
   208 	 * @param pathext String specifying the part of the name of the parsed log file to validate.	   
       
   209 	 */
       
   210 	public void ValidateLogs(String project, String pathext) {
       
   211 		System.out.println ("ValidateLogs()");
       
   212 		//get epocroot location
       
   213 		String e32=GetEnvironmentVariablePath("EPOCROOT");
       
   214 		
       
   215 	try{
       
   216 		// Open the files
       
   217 		System.out.println ("opening referencelog.txt and parsedlogs"+pathext+".txt");
       
   218 		FileInputStream fstream1 = new FileInputStream(e32+"testdata"+File.separator+project+File.separator+"data"+File.separator+"referencelog.txt");
       
   219 		FileInputStream fstream2 = new FileInputStream(e32+"epoc32"+File.separator+"build"+File.separator+"parsedlogs"+pathext+".txt");
       
   220 	
       
   221 		// Get the objects of DataInputStream
       
   222 		//System.out.println ("creating input streams");
       
   223 		DataInputStream in1 = new DataInputStream(fstream1);
       
   224 		DataInputStream in2 = new DataInputStream(fstream2);
       
   225 		//System.out.println ("creating buffered readers");
       
   226 	    BufferedReader br1 = new BufferedReader(new InputStreamReader(in1));
       
   227 	    BufferedReader br2 = new BufferedReader(new InputStreamReader(in2));
       
   228 		String strLine1;
       
   229 		String strLine2;
       
   230 		int i=1;
       
   231 		
       
   232 		//compare the two files
       
   233 		while (((strLine1 = br1.readLine()) != null)&&(((strLine2 = br2.readLine()) != null)))   {
       
   234 			if (pathext.compareTo("_mult_mmp")!=0){//if this is not the multiple mmp test, then compare the whole error string
       
   235 				if(strLine1.compareTo(strLine2)==0){
       
   236 					System.out.println ("Validated line "+i+": "+strLine1);
       
   237 				}
       
   238 				else{
       
   239 					System.out.println ("Line "+i+" ("+strLine2+") is not correct.");
       
   240 					fail();
       
   241 				}
       
   242 			}
       
   243 			else{//else if this is the multiple mmp test, compare only the last 40 characters of the string because
       
   244 				//raptor does not have a specified order in which it compiles mmps using trace compiler so we can't validate exactly
       
   245 				if(strLine1.substring(strLine1.length()-40, strLine1.length()).compareTo(strLine2.substring(strLine1.length()-40, strLine2.length()))==0){
       
   246 					System.out.println ("Validated line "+i+": "+strLine1);
       
   247 				}
       
   248 				else{
       
   249 					System.out.println ("Line "+i+" ("+strLine2+") is not correct.");
       
   250 					fail();
       
   251 				}			
       
   252 			}
       
   253 		i++;
       
   254 		}
       
   255 		
       
   256 		if (i==1) {//never entered loop therefore there were no errors or warnings in the build logs
       
   257 			System.out.println("FAIL: Compiler did not output any correct errors to logs");
       
   258 			fail();
       
   259 		}
       
   260 		in1.close();
       
   261 		in2.close();
       
   262 	}
       
   263 	
       
   264 	catch (IOException e){//Catch IOException
       
   265 		System.err.println("Error: " + e.getMessage());
       
   266 		fail();
       
   267     }
       
   268 	}
       
   269 }