blob: 655b846ce6b9d58372f6743c49cc76b739d94fa2 [file] [log] [blame]
/* -*- Mode: java; tab-width: 8 -*-
* Copyright (C) 1997, 1998 Netscape Communications Corporation,
* All Rights Reserved.
*/
package com.netscape.javascript.qa.drivers;
import java.util.Vector;
import java.util.Date;
import java.io.*;
import java.applet.Applet;
/**
* Test environment for running the JavaScript language tests on the Macintosh.
* On the Macintosh, we have to use JBindery, a MRJ tool, to run the tests.
*
* <p>
*
* In order to get tests to run on the Mac, the shell must be built with
* MAC_TEST_HACK defined. When MAC_TEST_HACK is defined, the shell expects
* to find file called "testargs.txt" in the directory where the shell
* executable is. The shell expects testargs.txt to have one argument per line.
* Legal arguments in testargs.txt are the same as the command line arguments
* to the shell (although we only use the -f argument, which tells the shell
* to evaluate files).
*
* <p>
*
* The shell writes any output generated by the print statement to a file
* called "results.txt". The test environment parses the results.txt file
* in the same way that RefEnv parses the output stream of the JavaScript
* shell process.
*
* <p>
*/
public class MacRefEnv implements TestEnvironment {
TestFile file;
TestSuite suite;
RefDrv driver;
String directoryName;
TestLog testargs;
File results;
Process task;
/**
* Create a new MacRefEnv
*
*/
public MacRefEnv ( TestFile f, TestSuite s, RefDrv d ) {
this.file = f;
this.suite = s;
this.driver = d;
}
/**
* This implementation does nothing, since creating the JS shell
* automatically runs the test on the Mac.
*
*/
public Object executeTestFile() {
return null;
}
/**
* Instantiate a new JavaScript shell which has been built with
* MAC_TEST_HACK defined.
*/
public Object createContext() {
try {
// look for a file called flagfile.flg
File flag = new File ( "flagfile.flg" );
if ( flag.exists() ) {
flag.delete();
}
task = Runtime.getRuntime().exec(driver.EXECUTABLE);
// wait a maximum of five minutes
int i = 0;
while ( (! flag.exists()) && i++ <= 60 ) {
Thread.currentThread().sleep(5000);
}
} catch (IOException x) {
System.out.println("IOException in RunJS : " + x);
} catch (InterruptedException x) {
System.out.println("InterruptedException in RunJS : " + x);
}
return null;
}
public boolean setupMacFiles() {
boolean result1 = getDirectoryName();
deleteResultsFile();
boolean result3 = createTestargsFile();
boolean result4 = writeTestargsFile();
if ( result1 && result3 && result4 ) {
return true;
} else {
return false;
}
}
public synchronized void runTest() {
try {
if ( setupMacFiles() ) {
file.startTime = driver.getCurrentTime();
createContext();
file.endTime = driver.getCurrentTime();
}
/*
if (task.getExitValue() != 0) {
if ( file.name.endsWith( "-n.js" )) {
file.passed = true;
} else {
suite.passed = false;
file.passed = false;
}
}
*/
if ( ! parseResult() ) {
if ( file.name.endsWith( "-n.js" ) ) {
file.passed = true;
} else {
suite.passed = false;
file.passed = false;
}
// file.exception = new String(task.getError());
}
} catch ( Exception e ) {
suite.passed = false;
file.passed = false;
file.exception = "Unknown process exception.";
/*
file.exception = new String(task.getError())
+ " exit value: " + task.getExitValue()
+ "\nThrew Exception:" + e;
*/
}
}
public boolean parseResult() {
String line;
int i, j;
results = new File( "results.txt");
if (! results.exists()) {
return false;
}
// spit out all the lines we find in the result file
try {
FileReader fr = new FileReader(results);
LineNumberReader lnr = new LineNumberReader(fr);
do {
line = lnr.readLine();
driver.p( line );
if (line == null) {
driver.p("\tERROR: No lines to read");
return false;
}
} while (!line.equals(sizeTag));
if ((line = lnr.readLine()) == null) {
return false;
}
file.totalCases = Integer.valueOf(line).intValue();
if ((line = lnr.readLine()) == null) {
driver.p("\tERROR: No lines after " + sizeTag);
return false;
}
for ( i = 0; i < file.totalCases; i++) {
String values[] = new String[tags.length];
try {
for ( j = 0; j < tags.length; j++) {
values[j] = null;
if (!line.startsWith(tags[j])) {
driver.p("line didn't start with " + tags[j] +":"+line);
return false;
}
while (((line = lnr.readLine()) != null) &&
(!(line.startsWith(startTag))))
{
values[j] = (values[j] == null) ? line : (values[j] +
"\n" + line);
}
if (values[j] == null) values[j] = "";
}
if ((line == null) && (i < file.totalCases - 1)) {
driver.p("line == null and " + i + "<" +
(file.totalCases - 1));
return false;
}
} catch ( IOException e ) {
driver.p( "Exception reading process output: " + e );
file.exception = e.toString();
return false;
}
TestCase rt = shouldBeWithErrorCheck(values[0],values[1],values[4],values[2],
values[3],values[5]);
file.bugnumber = values[6];
file.caseVector.addElement( rt );
if ( rt.passed.equals("false") ) {
if ( file.name.endsWith( "-n.js" ) ) {
this.file.passed = true;
} else {
this.file.passed = false;
this.suite.passed = false;
}
}
}
try {
lnr.close();
fr.close();
} catch (IOException x) {
System.out.println("IOException in RunJS : " + x);
return false;
}
} catch (NumberFormatException nfe) {
System.out.println("\tERROR: No integer after " + sizeTag);
return false;
} catch ( IOException e ) {
System.out.println( "Exception reading process output:" + e.toString() );
file.exception = e.toString();
return false;
}
return true;
}
/**
* Get the executable's directory, which is where we will write testargs.txt
* and from where we will get results.txt.
*/
public boolean getDirectoryName() {
directoryName = ":";
return true;
}
/**
* Called by the driver to execute the test program.
*
*/
/**
* Check to see whether testargs.txt exists. If so, delete it.
*/
public boolean createTestargsFile() {
String testargsname = "testargs.txt";
File testargsfile = new File( testargsname );
if ( testargsfile.exists() ) {
testargsfile.delete();
}
testargs = new TestLog( "testargs.txt", "" );
return true;
}
public boolean deleteResultsFile() {
String resultsname = "results.txt";
File resultsfile = new File( resultsname );
if ( resultsfile.exists() ) {
resultsfile.delete();
}
return true;
}
/**
* Write testargs.txt to the directory where the executable is.
*/
public boolean writeTestargsFile() {
String helper = getMacFileString( ":"+ driver.HELPER_STRING );
String testfile = getMacFileString( ":"+file.filePath );
testargs.writeLine( "-f" );
testargs.writeLine( helper );
testargs.writeLine( "-f" );
testargs.writeLine( testfile );
testargs.closeLog();
return true;
}
public void close() {
return;
}
/**
* Replace slashes in a string with colons.
*
*/
public String getMacFileString( String path ) {
StringBuffer buffer = new StringBuffer();
int i;
for ( i = 0; i < path.length(); i++ ) {
if ( path.charAt(i) == '/' ) {
buffer.append(":");
} else {
buffer.append( path.charAt(i) );
}
}
return buffer.toString();
}
/**
* array of in output file to get attributes of a specific TestCase
*/
public static final String tags[];
/**
* tag to specify the number of TestCases
*/
public static final String sizeTag = "<#TEST CASES SIZE>";
/**
* beginning of a tag
*/
public static final String startTag = "<#TEST CASE";
/**
* end of a tag
*/
public static final String endTag = ">";
/**
* creating of String tags[]
*/
static {
String fields[] = { "PASSED", "NAME", "EXPECTED", "ACTUAL", "DESCRIPTION", "REASON",
"BUGNUMBER" };
tags = new String[fields.length];
for (int i = 0; i < fields.length; ++i) {
tags[i] = startTag + " " + fields[i] + endTag;
}
}
}