/**
 *  @test
 *  @bug 4390869
 *  @bug 4460328
 *  @summary Test the new SourceDebugExtension facility
 *
 *  @author Robert Field
 *
 *  @library ..
 *  @modules jdk.jdi
 *  @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE HelloWorld
 *  @run compile TemperatureTableTest.java
 *  @run compile -g TemperatureTableServlet.java
 *  @run driver TemperatureTableTest
 */
import com.sun.jdi.*;
import com.sun.jdi.event.*;
import com.sun.jdi.request.*;

import java.util.*;
import java.io.File;

public class TemperatureTableTest extends TestScaffold {
    ReferenceType targetClass;

    TemperatureTableTest (String args[]) {
        super(args);
    }

    public static void main(String[] args)      throws Exception {
        testSetUp();
        new TemperatureTableTest(args).startTests();
    }

    /********** test set-up **********/

    static void testSetUp() throws Exception {
        InstallSDE.install(new File(System.getProperty("test.classes", "."),
                                    "TemperatureTableServlet.class"),
                           new File(System.getProperty("test.src", "."),
                                    "TemperatureTable.sde"));
    }

    /********** test assist **********/

    void checkLocation(Location loc, String label,
                       String expectedSourceName,
                       String expectedSourcePath,
                       int expectedLinenumber) throws Exception {
        String sourceName = loc.sourceName();
        if (sourceName.equals(expectedSourceName)) {
            println(label + " sourceName: " + sourceName);
        } else {
            failure("FAIL: " + label +
                    " expected sourceName " + expectedSourceName +
                    " got - " + sourceName);
        }

        String sourcePath = loc.sourcePath();
        if (sourcePath.equals(expectedSourcePath)) {
            println(label + " sourcePath: " + sourcePath);
        } else {
            failure("FAIL: " + label +
                    " expected sourcePath " + expectedSourcePath +
                    " got - " + sourcePath);
        }

        int ln = loc.lineNumber();
        if (ln == expectedLinenumber) {
            println(label + " line number: " + ln);
        } else {
            failure("FAIL: " + label +
                    " expected line number " + expectedLinenumber +
                    " got - " + ln);
        }
    }

    void checkLocation(String stratum, Location loc, String label,
                       String expectedSourceName,
                       String expectedSourcePath,
                       int expectedLinenumber) throws Exception {
        String sourceName = loc.sourceName(stratum);
        if (sourceName.equals(expectedSourceName)) {
            println(label + "(" + stratum + ")" +
                    " sourceName: " + sourceName);
        } else {
            failure("FAIL: " + label + "(" + stratum + ")" +
                    " expected sourceName " + expectedSourceName +
                    " got " + sourceName);
        }

        String sourcePath = loc.sourcePath(stratum);
        if (sourcePath.equals(expectedSourcePath)) {
            println(label + "(" + stratum + ")" +
                    " sourcePath: " + sourcePath);
        } else {
            failure("FAIL: " + label + "(" + stratum + ")" +
                    " expected sourcePath " + expectedSourcePath +
                    " got " + sourcePath);
        }

        int ln = loc.lineNumber(stratum);
        if (ln == expectedLinenumber) {
            println(label + "(" + stratum + ")" +
                    " line number: " + ln);
        } else {
            failure("FAIL: " + label + "(" + stratum + ")" +
                    " expected line number " + expectedLinenumber +
                    " got " + ln);
        }
    }

    /********** test core **********/

    protected void runTests() throws Exception {
        /*
         * Get to the top of main()
         * to determine targetClass
         */
        BreakpointEvent bpe = startToMain("TemperatureTableServlet");
        targetClass = bpe.location().declaringType();

        if (!vm().canGetSourceDebugExtension()) {
            failure("FAIL: canGetSourceDebugExtension() is false");
        } else {
            println("canGetSourceDebugExtension() is true");
        }

        checkLocation(bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("JSP", bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("bogus", bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation(null, bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("Java", bpe.location(), "main BP",
                      "TemperatureTableServlet.java",
                      "TemperatureTableServlet.java", 11);

        // ref type source name
        String sourceName = targetClass.sourceName();
        if (sourceName.equals("TemperatureTable.jsp")) {
            println("ref type sourceName: " + sourceName);
        } else {
            failure("FAIL: unexpected ref type sourceName - " + sourceName);
        }

        List allLines = targetClass.allLineLocations();
        for (Iterator it = allLines.iterator(); it.hasNext(); ) {
            Location loc = (Location)it.next();
            println("Location: " + loc);
        }

        List locs = targetClass.locationsOfLine(7);
        if (locs.size() != 1) {
            failure("FAIL: expect on elocation, got " + locs.size());
        }
        Location loc7 = (Location)locs.get(0);

        checkLocation(loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("JSP", loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("bogus", loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation(null, loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("Java", loc7, "line7",
                      "TemperatureTableServlet.java",
                      "TemperatureTableServlet.java", 28);

        List availSt = targetClass.availableStrata();
        List avail = new ArrayList(availSt);
        if (avail.size() == 2 &&
            avail.remove("JSP") &&
            avail.remove("Java") &&
            avail.size() == 0) {
            println("availableStrata: " + availSt);
        } else {
            failure("FAIL: unexpected availableStrata - " + availSt);
        }

        String def = targetClass.defaultStratum();
        if (def.equals("JSP")) {
            println("defaultStratum: " + def);
        } else {
            failure("FAIL: unexpected defaultStratum - " + def);
        }

        // Test HelloWorld
        BreakpointEvent bpHello = resumeTo("HelloWorld", "main",
                                       "([Ljava/lang/String;)V");
        Location hello = bpHello.location();

        checkLocation(hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("JSP", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("bogus", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation(null, hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("Java", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        /******** test VM default *************/

        vm().setDefaultStratum("Java");
        println("VM default set to Java");

        checkLocation(bpe.location(), "main BP",
                      "TemperatureTableServlet.java",
                      "TemperatureTableServlet.java", 11);

        checkLocation("JSP", bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("bogus", bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation(null, bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("Java", bpe.location(), "main BP",
                      "TemperatureTableServlet.java",
                      "TemperatureTableServlet.java", 11);

        checkLocation(loc7, "line7",
                      "TemperatureTableServlet.java",
                      "TemperatureTableServlet.java", 28);

        checkLocation("JSP", loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("bogus", loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation(null, loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("Java", loc7, "line7",
                      "TemperatureTableServlet.java",
                      "TemperatureTableServlet.java", 28);

        checkLocation(hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("JSP", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("bogus", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation(null, hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("Java", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        vm().setDefaultStratum(null);
        println("VM default set to null");

        checkLocation(bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("JSP", bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("bogus", bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation(null, bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("Java", bpe.location(), "main BP",
                      "TemperatureTableServlet.java",
                      "TemperatureTableServlet.java", 11);

        checkLocation(loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("JSP", loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("bogus", loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation(null, loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("Java", loc7, "line7",
                      "TemperatureTableServlet.java",
                      "TemperatureTableServlet.java", 28);

        checkLocation(hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("JSP", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("bogus", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation(null, hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("Java", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);


        vm().setDefaultStratum("bogus");
        println("VM default set to bogus");

        checkLocation(bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("JSP", bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("bogus", bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation(null, bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("Java", bpe.location(), "main BP",
                      "TemperatureTableServlet.java",
                      "TemperatureTableServlet.java", 11);

        checkLocation(loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("JSP", loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("bogus", loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation(null, loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("Java", loc7, "line7",
                      "TemperatureTableServlet.java",
                      "TemperatureTableServlet.java", 28);


        checkLocation(hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("JSP", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("bogus", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation(null, hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("Java", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        vm().setDefaultStratum("JSP");
        println("VM default set to JSP");

        checkLocation(bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("JSP", bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("bogus", bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation(null, bpe.location(), "main BP",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 1);

        checkLocation("Java", bpe.location(), "main BP",
                      "TemperatureTableServlet.java",
                      "TemperatureTableServlet.java", 11);

        checkLocation(loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("JSP", loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("bogus", loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation(null, loc7, "line7",
                      "TemperatureTable.jsp",
                      "tst" + File.separatorChar + "TemperatureTable.jsp", 7);

        checkLocation("Java", loc7, "line7",
                      "TemperatureTableServlet.java",
                      "TemperatureTableServlet.java", 28);

        checkLocation(hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("JSP", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("bogus", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation(null, hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        checkLocation("Java", hello, "hello BP",
                      "HelloWorld.java",
                      "HelloWorld.java", 3);

        /*
         * resume the target listening for events
         */
        listenUntilVMDisconnect();

        /*
         * deal with results of test
         * if anything has called failure("foo") testFailed will be true
         */
        if (!testFailed) {
            println("TemperatureTableTest: passed");
        } else {
            throw new Exception("TemperatureTableTest: failed");
        }
    }
}
