0

I am developing tests in Eclipse (Indigo) using java (1.6) and WebDriver (2.16).

I have a fairly simple test that runs fine, but does not actually 'end'. What I mean is that after all of the lines of code in the 'main' method have been executed, the Eclipse console still indicates that the code is running (red 'Terminate' button in the console is enabled).

This only started happening yesterday, after I extended the testing script with some new code. Thinking that was the problem, I commented all new code. Unfortunately, the problem persists.

How do I go about troubleshooting this?

Thanks for your input.

Edit

Below the relevant parts of a JStack thread dump. See here for the full dump

2012-01-07 10:56:40 Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.4-b02 mixed mode):

"Thread-7" daemon prio=6 tid=0x0000000008c08800 nid=0x12f4 runnable [0x000000000 921f000] java.lang.Thread.State: RUNNABLE at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read(Unknown Source) at org.apache.commons.exec.StreamPumper.run(StreamPumper.java:105) at java.lang.Thread.run(Unknown Source)

"Thread-6" daemon prio=6 tid=0x0000000008d7b800 nid=0xb98 runnable [0x0000000009 11f000] java.lang.Thread.State: RUNNABLE at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read(Unknown Source) at java.io.BufferedInputStream.fill(Unknown Source) at java.io.BufferedInputStream.read1(Unknown Source) at java.io.BufferedInputStream.read(Unknown Source) - locked <0x00000007d5a00888> (a java.io.BufferedInputStream) at java.io.FilterInputStream.read(Unknown Source) at org.apache.commons.exec.StreamPumper.run(StreamPumper.java:105) at java.lang.Thread.run(Unknown Source)

"Thread-5" prio=6 tid=0x000000000678b000 nid=0x10e4 runnable [0x000000000901f000 ] java.lang.Thread.State: RUNNABLE at java.lang.ProcessImpl.waitFor(Native Method) at org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecut or.java:347) at org.apache.commons.exec.DefaultExecutor.access$200(DefaultExecutor.ja va:46) at org.apache.commons.exec.DefaultExecutor$1.run(DefaultExecutor.java:18 8) "main" prio=6 tid=0x000000000062e000 nid=0x450 runnable [0x000000000261f000] java.lang.Thread.State: RUNNABLE at java.lang.Thread.exit(Unknown Source)

EDIT

Here's my Excel code (using java IO and Apache's POI classes)

public HashMap<String, String> getTestData()
{
    InputStream myxls = null;

    try {
        // Create a connection to the Excel file
        myxls = new FileInputStream(fileName);
        System.out.println("Excel Input was opened");
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        //e.printStackTrace();
    }

    // Define a workbook object
    HSSFWorkbook wb = null;

    try {
        // Instantiate the workbook object
        wb = new HSSFWorkbook(myxls);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // Create a worksheet object
    HSSFSheet sheet = wb.getSheet(sheetName);
    // Read the first row (it always contains the headers (variable names)
    HSSFRow headerRow = sheet.getRow(0);
    // Read the row requested
    HSSFRow row = sheet.getRow(dataRow);  

    //System.out.println("Creating a new HashMap from row " + dataRow + " in sheet " + sheetName);

    // Define a collection of value/value pairs
    HashMap<String,String> testData = new HashMap<String,String>();

    // Get count of columns != empty
    int columnCount = row.getPhysicalNumberOfCells();
    //System.out.println(Integer.toString(columnCount));

    String textHeader;
    String textData;

    // Loop through the columns
    for(int colcount=0; colcount < columnCount; colcount++)
    {
        // Read the column header and the cell value
        HSSFCell cell = row.getCell(colcount);
        HSSFCell headerCell = headerRow.getCell(colcount);

        switch (headerCell.getCellType ())
        {
            case HSSFCell.CELL_TYPE_NUMERIC :
            {
                // cell type numeric.
                textHeader = Double.toString(headerCell.getNumericCellValue());
                //System.out.println(textHeader);
                break;
            }
            case HSSFCell.CELL_TYPE_STRING :
            {
                // cell type string.
                HSSFRichTextString richTextString = headerCell.getRichStringCellValue();
                textHeader = richTextString.getString();
                break;
            }
            default :
            {
                // types other than String and Numeric.
                textHeader = "Type not supported";
                break;
            }

        }

        switch (cell.getCellType ())
        {
            case HSSFCell.CELL_TYPE_NUMERIC :
            {
                // cell type numeric.
                textData = Double.toString(cell.getNumericCellValue());
                break;
            }
            case HSSFCell.CELL_TYPE_STRING :
            {
                // cell type string.
                HSSFRichTextString richTextString = cell.getRichStringCellValue ();
                textData = richTextString.getString();
                break;
            }
            case HSSFCell.CELL_TYPE_BLANK :
            {
                // cell type string.
                textData = "";
                break;
            }
            default :
            {
                // types other than String and Numeric.
                textData = "Type not supported";
                break;
            }

        }


        // Add the value of each cell to the HashMap collection
        testData.put(textHeader,textData);
        //System.out.println(textHeader + " / " + textData);

    }

    try{
        // End the file object

        myxls.close();
        System.out.println("Excel Input was closed");
    }
    catch (IOException e){
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // Send the HashMap back to the calling code
    return testData;

}
reevesy
  • 3,452
  • 1
  • 26
  • 23
user973718
  • 225
  • 2
  • 5
  • 16
  • A complete rebuild would be my first step. – sje397 Jan 07 '12 at 16:05
  • Have your program started non daemon threads that are still running or created GUI components (frames etc)? – Roger Lindsjö Jan 07 '12 at 16:06
  • You could check in the thread view to see if any threads are actually still alive. If not then it could be a problem with eclipse. – Enno Shioji Jan 07 '12 at 16:08
  • To answer some of the questions: - no threads in my code - did a clean of the build - program has no GUI at all: it just acts on a browser for testing (through WebDriver) – user973718 Jan 07 '12 at 16:25
  • I checked the threads: after all code has executed, there is one thread and two daemon threads still active. How do I proceed now? Thanks. – user973718 Jan 07 '12 at 16:39

2 Answers2

2

For troubleshooting this you can take a thread dump, for example by using the jstack command (there is a whole SO question on this ). This allows you to see which threads are still running and which part of your code they are executing.

Edit

Based on the JStack output I would say you read some files on a separate Thread and the read method is still blocking, waiting for input as documented in the javadoc of FileInputStream#read.

Community
  • 1
  • 1
Robin
  • 36,233
  • 5
  • 47
  • 99
  • @user973718 I added the JStack output to your question, and updated my answer. However, without code it is hard to help you further – Robin Jan 07 '12 at 17:23
  • I do have some code that reads from Excel files. I double-checked the code to make sure the streams are released through the close method: they are. I'll check that code again. I also use the Logger; could it be responsible for these threads? – user973718 Jan 07 '12 at 17:29
  • It might be a good idea to add your 'Excel file reading code' to the question so we can actually see the code. The streams might be released, but according to the trace you are still reading from the file, as the thread is waiting in the `read` method – Robin Jan 07 '12 at 17:33
0

After debugging my code, I believe I have found the culprit:

The Selenium WebDriver classes come with several 'drivers', one for each supported browser type (IE, Firefox, Chrome). When I create a Firefox object, it tries to enable logging through log4j (which I have not configured since I don't use it). I believe log4j causes the hung threads.

user973718
  • 225
  • 2
  • 5
  • 16