blob: f6011789083371e719beee97e4e990bfe751c0b3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.debug.jdi.tests.program;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Date;
import org.eclipse.debug.jdi.tests.ClassTypeTest;
/**
* Main class for target VM tests.
* This class is intended to be run by the target VM.
* It will use other classes in this package, and it will create and terminate
* threads as a regular program would do.
*
* WARNING, WARNING:
* Tests in org.eclipse.debug.jdi.tests assume the content of this class,
* as well as its behavior. So if this class or one of the types in this
* package is changed, the corresponding tests must also be changed.
*/
public class MainClass extends Date implements Runnable, Printable {
private static byte[] byteArray = new byte[0];
private static byte[][] byteDoubleArray = new byte[0][0];
private static short[] shortArray = new short[0];
private static short[][] shortDoubleArray = new short[0][0];
private static int[] intArray = new int[0];
private static int[][] intDoubleArray = new int[0][0];
private static long[] longArray = new long[0];
private static long[][] longDoubleArray = new long[0][0];
private static double[] doubleArray = new double[0];
private static double[][] doubleDoubleArray = new double[0][0];
private static float[] floatArray = new float[0];
private static float[][] floatDoubleArray = new float[0][0];
private static char[] charArray = new char[0];
private static char[][] charDoubleArray = new char[0][0];
private static boolean[] booleanArray = new boolean[0];
private static boolean[][] booleanDoubleArray = new boolean[0][0];
private String string = "";
private String[] stringArray = new String[0];
private String[][] stringDoubleArray = new String[0][0];
/**
* An integer value
*/
public static int fInt = 0;
/**
* The instance of the <code>MainClass</code>
*/
public static MainClass fObject = new MainClass();
/**
* A string initialized to 'hello world'
*/
public static String fString = "Hello World";
/**
* A <code>Thread</code> object
*/
public static Thread fThread;
/**
* A <code>Thread</code> object representing the main thread
*/
public static Thread fMainThread;
/**
*/
public static String[] fArray = new String[] { "foo", "bar", "hop" };
/**
* A pre-initialized array of doubles
*/
public static double[] fDoubleArray = new double[] { 1, 2.2, 3.33 };
/**
* The name of an event type
*/
public static String fEventType = "";
/**
* A boolean value initialized to <code>false</code>
*/
public boolean fBool = false;
private char fChar = 'a';
private String fString2 = "Hello";
protected final String fString3 = "HEY";
/**
* Constructor
*/
public MainClass() {}
/**
* Constructor
* Used to test ClassType.newInstance
* @see ClassTypeTest
* @param i
* @param o1
* @param o2
*/
public MainClass(int i, Object o1, Object o2) {
}
/**
* For invocation tests
* @param x the integer
* @param o
* @return a string object representing the specified interger value
*/
private static String invoke1(int x, Object o) {
if (o == null) {
return (new Integer(x)).toString();
} else {
return "";
}
}
/**
* For invocation tests
*/
private static void invoke2() {
throw new IndexOutOfBoundsException();
}
/**
* For invocation tests
* @param str
* @param o
* @return an the integer value of the specified string
*/
private int invoke3(String str, Object o) {
return Integer.parseInt(str);
}
/**
* For invocation tests
* @return nothing, only throws an exception
* @throws java.io.EOFException
*/
private long invoke4() throws java.io.EOFException {
throw new java.io.EOFException();
}
/**
* For variables test
* @param l
*/
private void variablesTest(long l) {}
/**
* Runs the test program
* @param args
*/
public static void main(java.lang.String[] args) {
// Start the test program
ThreadGroup group = new ThreadGroup("Test ThreadGroup");
fThread = new Thread(group, fObject, "Test Thread");
fThread.start();
fMainThread = Thread.currentThread();
// Prevent this thread from dying
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
/**
* @see org.eclipse.debug.jdi.tests.program.Printable#print(java.io.OutputStream)
*/
@Override
public void print(OutputStream out) {
String string = fInt++ +". " + fString;
PrintWriter writer = new PrintWriter(out);
writer.println(string);
writer.flush();
}
/**
* Prints out a specified integer. This method is used in the force early return tests to ensure we
* can specify a different, type compatible return value
* @param out a stream to print out to
* @param num the number we want to print and return
* @return the specified number parameter, just pass it through
* @since 3.3
*/
public int printNumber(OutputStream out, int num) {
String blah = "foo"+foo();
PrintWriter writer = new PrintWriter(out);
writer.println("The specified number is: "+num);
writer.flush();
return num;
}
/**
* Returns 20
*
* @return 20
*/
public int getInt() {
int x = Math.max(20, 10);
return x;
}
/**
* Returns true.
*
* @return true
*/
public boolean getBoolean() {
boolean bool = Boolean.valueOf("true").booleanValue();
return bool;
}
/**
* Returns 123L.
*
* @return 123
*/
public long getLong() {
long l = Long.valueOf("123").longValue();
return l;
}
/**
* dump out a string
* @return a String
* @since 3.3
*/
public String foo() {
System.out.println("foobar");
return "man";
}
/**
* make a sync'd method so we can stop in it to gather monitor information
* @since 3.3
*/
synchronized public void sync() {
System.out.println("sync'd to the moon");
}
/**
* suspend on the first line of the method to get the argument values from the stackframe.
* used in testing the new 1.6VM capability to get argument values when no debugging info is available.
* @param str a string
* @param num a number
* @param obj an object
* @since 3.3
*/
public void argValues(String str, int num, Object obj) {
System.out.println("get the arg values");
}
/**
* Prints to System.out and throws an exception to indicate readiness
*/
synchronized public void printAndSignal() {
print(System.out);
// Signal readiness by throwing an exception
try {
throw new NegativeArraySizeException();
} catch (NegativeArraySizeException exc) {
}
}
/**
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
try {
Thread t = Thread.currentThread();
MainClass o = new OtherClass();
// The front-end tests use the class load event to determine that the program has started
if (CONSTANT == 2) {
System.out.println("CONSTANT=2");
}
while (true) {
printAndSignal();
triggerEvent();
useLocalVars(t, o);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
} finally {
System.out.println("Running finally block in MainClass.run()");
}
}
/**
* Trigger an access watchpoint event for the front-end.
*/
private void triggerAccessWatchpointEvent() {
if (fBool) {
System.out.println("fBool is true");
}
}
/**
* Trigger a breakpoint event for the front-end.
*/
private void triggerBreakpointEvent() {
System.out.println("Breakpoint");
}
/**
* Trigger a class prepare event for the front-end.
*/
private void triggerClassPrepareEvent() {
new TestClass();
}
/**
* Trigger a class prepare event for the front-end.
*/
private void triggerClassPrepareEvent1() {
new TestClass1();
}
/**
* Trigger a class prepare event for the front-end.
*/
private void triggerClassPrepareEvent2() {
new TestClass2();
}
/**
* Trigger a class prepare event for the front-end.
*/
private void triggerClassPrepareEvent3() {
new TestClass3();
}
/**
* Trigger a class prepare event for the front-end.
*/
private void triggerClassPrepareEvent4() {
new TestClass4();
}
/**
* Trigger a class prepare event for the front-end.
*/
private void triggerClassPrepareEvent5() {
new TestClass5();
}
/**
* Trigger a class prepare event for the front-end.
*/
private void triggerClassPrepareEvent6() {
new TestClass6();
}
/**
* Trigger a class prepare event for the front-end.
*/
private void triggerClassPrepareEvent7() {
new TestClass7();
new TestClazz8();
}
/**
* Trigger a class prepare event for the front-end.
*/
private void triggerClassPrepareEvent8() {
new TestClazz9();
new TestClazz10();
}
/**
* Trigger an event for the front-end.
*/
private void triggerEvent() {
/* Ensure we do it only once */
String eventType = fEventType;
fEventType = "";
/* Trigger event according to the field fEventType */
if (eventType.equals("")) {
return;
} else if(eventType.equals("refclassload")) {
new RefClass();
}
else if(eventType.equals("fooreturn")) {
foo();
}
else if(eventType.equals("argvalues")) {
argValues("teststr", 5, new Double(1.33));
}
else if(eventType.equals("forcereturn2")) {
printNumber(System.out, 1);
}
else if(eventType.equals("forcereturn")) {
print(System.out);
}
else if(eventType.equals("monitorinfo")) {
sync();
}
else if(eventType.equals("refclass1load")) {
new RefClass1();
}
else if(eventType.equals("refclass2load")) {
new RefClass2();
}
else if(eventType.equals("refclass3load")) {
new RefClass3();
}
else if(eventType.equals("refclass4load")) {
new RefClass4();
} else if (eventType.equals("getInt")) {
getInt();
} else if (eventType.equals("getBoolean")) {
getBoolean();
} else if (eventType.equals("getLong")) {
getLong();
} else if (eventType.equals("AccessWatchpointEvent")) {
triggerAccessWatchpointEvent();
} else if (eventType.equals("StaticAccessWatchpointEvent")) {
triggerStaticAccessWatchpointEvent();
} else if (eventType.equals("BreakpointEvent")) {
triggerBreakpointEvent();
} else if (eventType.equals("ClassPrepareEvent")) {
triggerClassPrepareEvent();
} else if (eventType.equals("ClassPrepareEvent1")) {
triggerClassPrepareEvent1();
} else if (eventType.equals("ClassPrepareEvent2")) {
triggerClassPrepareEvent2();
} else if (eventType.equals("ClassPrepareEvent3")) {
triggerClassPrepareEvent3();
} else if (eventType.equals("ClassPrepareEvent4")) {
triggerClassPrepareEvent4();
} else if (eventType.equals("ClassPrepareEvent5")) {
triggerClassPrepareEvent5();
} else if (eventType.equals("ClassPrepareEvent6")) {
triggerClassPrepareEvent6();
} else if (eventType.equals("ClassPrepareEvent7")) {
triggerClassPrepareEvent7();
} else if (eventType.equals("ClassPrepareEvent8")) {
triggerClassPrepareEvent8();
} else if (eventType.equals("ExceptionEvent")) {
triggerExceptionEvent();
} else if (eventType.equals("ModificationWatchpointEvent")) {
triggerModificationWatchpointEvent();
} else if (eventType.equals("StaticModificationWatchpointEvent")) {
triggerStaticModificationWatchpointEvent();
} else if (eventType.equals("ThreadStartEvent")) {
triggerThreadStartEvent();
} else if (eventType.equals("ThreadDeathEvent")) {
triggerThreadDeathEvent();
} else {
System.out.println("Unknown event type: " + eventType);
}
}
/**
* Trigger an exception event for the front-end.
*/
private void triggerExceptionEvent() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
throw new Error();
}
}, "Test Exception Event");
t.start();
}
/**
* Trigger a modification watchpoint event for the front-end.
*/
private void triggerModificationWatchpointEvent() {
fBool = true;
}
/**
* Trigger an access watchpoint event to a static field
* for the front-end.
*/
private void triggerStaticAccessWatchpointEvent() {
if (fObject == null) {
System.out.println("fObject is null");
}
}
/**
* Trigger a modification watchpoint event of a static field
* for the front-end.
*/
private void triggerStaticModificationWatchpointEvent() {
fString = "Hello Universe";
}
/**
* Trigger a thread end event for the front-end.
*/
private void triggerThreadDeathEvent() {
new Thread("Test Thread Death Event").start();
}
/**
* Trigger a thread start event for the front-end.
*/
private void triggerThreadStartEvent() {
new Thread("Test Thread Start Event").start();
}
private void useLocalVars(Thread t, MainClass o) {
if (t == null) {
System.out.println("t is null");
}
if (o == null) {
System.out.println("o is null");
}
}
}