/*******************************************************************************
 * Copyright (c) 2007, 2009 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.jdt.debug.tests.core;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;

import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.jdi.internal.jdwp.JdwpPacket;
import org.eclipse.jdi.internal.jdwp.JdwpReplyPacket;
import org.eclipse.jdi.internal.jdwp.JdwpString;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget;

/**
 * Tests raw JDWP commands sent to a target.
 *
 * @since 3.3
 */
public class JDWPTests extends AbstractDebugTest {

	/**
	 * Constructor
	 * @param name
	 */
	public JDWPTests(String name) {
		super(name);
	}

	/**
	 * Sends a request to the VirtualMachine Command Set (byte 1) to ask for
	 * the VM Capabilities (byte 12)
	 * @throws Exception
	 */
	public void testCapabilities() throws Exception {
		String typeName = "Breakpoints";
		ILineBreakpoint bp = createLineBreakpoint(52, typeName);

		IJavaThread thread = null;
		try {
			thread= launchToLineBreakpoint(typeName, bp);
			IDebugTarget target = thread.getDebugTarget();
			assertTrue("Wrong target", target instanceof JDIDebugTarget);
			IJavaDebugTarget jdiTarget = (IJavaDebugTarget) target;
			// VM capabilities
			byte[] reply = jdiTarget.sendCommand((byte)1, (byte)12, null);
			JdwpReplyPacket packet = (JdwpReplyPacket) JdwpPacket.build(reply);

			assertEquals("Unexpected error code in reply packet", 0, packet.errorCode());
			DataInputStream replyData = packet.dataInStream();
			// should be 7 booleans in reply
			for (int i = 0; i < 7; i++) {
				replyData.readBoolean();
			}
			assertEquals("Should be no available bytes", 0, replyData.available());
		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * Sends a request to the VirtualMachine Command Set (byte 1) to ask
	 * for ClassesBySignature (byte 2)
	 * @throws Exception
	 */
	public void testClassesBySingature() throws Exception {
		String typeName = "Breakpoints";
		ILineBreakpoint bp = createLineBreakpoint(52, typeName);

		IJavaThread thread = null;
		try {
			thread= launchToLineBreakpoint(typeName, bp);
			IDebugTarget target = thread.getDebugTarget();
			assertTrue("Wrong target", target instanceof JDIDebugTarget);
			IJavaDebugTarget jdiTarget = (IJavaDebugTarget) target;
			// VM capabilities
			ByteArrayOutputStream outBytes = new ByteArrayOutputStream();
			DataOutputStream outData = new DataOutputStream(outBytes);
			JdwpString.write("LBreakpoints;", outData);
			byte[] reply = jdiTarget.sendCommand((byte)1, (byte)2, outBytes.toByteArray());
			JdwpReplyPacket packet = (JdwpReplyPacket) JdwpPacket.build(reply);
			assertEquals("Unexpected error code in reply packet", 0, packet.errorCode());
			DataInputStream replyData = packet.dataInStream();
			// should be 1 type in reply
			assertEquals("Wrong number of types", 1, replyData.readInt());
		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

}
