15f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/*
25f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more
35f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * contributor license agreements.  See the NOTICE file distributed with
45f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * this work for additional information regarding copyright ownership.
55f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0
65f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * (the "License"); you may not use this file except in compliance with
75f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * the License.  You may obtain a copy of the License at
85f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
95f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  Unless required by applicable law or agreed to in writing, software
125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  See the License for the specific language governing permissions and
165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  limitations under the License.
175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @author Vitaly A. Provodin
215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Created on 01.02.2005
255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespackage org.apache.harmony.jpda.tests.jdwp.share;
275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.TestErrorException;
295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.share.JPDALogWriter;
305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.share.JPDATestOptions;
315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport junit.framework.TestCase;
335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Basic class for all JDWP unit tests based on <code>JUnit</code> framework.
365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <p>
375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * This class extends JUnit interface <code>TestCase</code> and implements
385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <code>setUp()</code> and <code>tearDown()</code> being common for all
395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * JDWP tests.
405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <p>
415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * It also introduces <code>internalSetUp()</code> and
425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <code>internalTearDown()</code> that can be implemented to supply safe
435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * start up and shut down of debuggee.
445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic abstract class JDWPRawTestCase extends TestCase {
465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /** Where to print log messages. */
485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected JPDALogWriter logWriter;
495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /** Test run options. */
515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected JPDATestOptions settings;
525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This method should be overridden in derived classes to return full name
555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * for debuggee class.
565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return full debuggee class name
585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected abstract String getDebuggeeClassName();
605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
6232e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz     * Returns the signature of the debuggee class. This is computed based on
6332e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz     * {@link #getDebuggeeClassName}.
6432e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz     *
6532e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz     * @return full debuggee class signature.
6632e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz     */
6732e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz    protected String getDebuggeeClassSignature() {
6832e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz        String debuggeeClassName = getDebuggeeClassName();
693e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz        return getClassSignature(debuggeeClassName);
703e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz    }
713e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz
723e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz    /**
733e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     * Returns the signature matching the given class name
743e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     * @param className
753e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     *          a fully qualified class name
763e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     * @return the class signature
773e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     */
783e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz    protected static String getClassSignature(String className) {
7932e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz        StringBuilder builder = new StringBuilder();
8032e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz        builder.append('L');
813e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz        builder.append(className.replace('.', '/'));
8232e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz        builder.append(';');
8332e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz        return builder.toString();
8432e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz    }
8532e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz
8632e3e8da6c42b15c1011f67930b460260704739aSebastien Hertz    /**
873e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     * Returns the signature of the given class.
883e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     * @param c
893e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     *          a class
903e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     * @return the class signature
913e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     */
923e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz    protected static String getClassSignature(Class<?> c) {
933e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz        String className = c.getName();
943e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz        return getClassSignature(className);
953e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz    }
963e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz
973e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz    /**
985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This method will be invoked before starting each test.
995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws Exception
1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *             if any error occurs
1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void internalSetUp() throws Exception {
1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This method will be invoked after each test completed or any error
1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * occurred.
1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void internalTearDown() {
1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Overrides inherited JUnit method to provide initialization and invocation
1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * of internalSetUp() and internalTearDown() methods.
1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void setUp() throws Exception {
1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        super.setUp();
1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        settings = createTestOptions();
1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        settings.setDebuggeeClassName(getDebuggeeClassName());
1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter = new JPDALogWriter(System.out, null, settings.isVerbose());
1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n=====================================>>>");
1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Run: " + getClass().getName() + "." + getName());
1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("----------------------------------------");
1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        try {
1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            internalSetUp();
1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("----------------------------------------");
1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } catch (Throwable e) {
1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.printError(e);
1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("----------------------------------------");
1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            internalTearDown();
1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(e);
1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Creates wrapper object for accessing test options;
1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected JPDATestOptions createTestOptions() {
1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return new JPDATestOptions();
1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Overrides inherited JUnit method to provide cleanup and invocation of
1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * internalTearDown() method.
1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void tearDown() throws Exception {
1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("----------------------------------------");
1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        internalTearDown();
1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("<<<=====================================\n");
1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        super.tearDown();
1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1583e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz
1593e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz    /**
1603e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     * Helper method to print a message prefixed by the current test name.
1613e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     * @param msg the message to print
1623e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz     */
1633e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz    protected void printTestLog(String msg) {
1643e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz        String testName = getName();
1653e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz        logWriter.println(">> " + testName + ": " + msg);
1663e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz    }
1675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes}
168