1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *
15 *  See the License for the specific language governing permissions and
16 *  limitations under the License.
17 */
18
19/**
20 * @author Anatoly F. Bondarenko
21 */
22
23/**
24 * Created on 24.02.2005
25 */
26package org.apache.harmony.jpda.tests.jdwp.ReferenceType;
27
28import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
29import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
30import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
31import org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase;
32import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
33
34
35/**
36 * JDWP Unit test for ReferenceType.Interfaces command.
37 */
38public class InterfacesTest extends JDWPSyncTestCase {
39
40    static final int testStatusPassed = 0;
41    static final int testStatusFailed = -1;
42    static final String thisCommandName = "ReferenceType.Interfaces command";
43    static final String debuggeeSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/InterfacesDebuggee;";
44
45    @Override
46    protected String getDebuggeeClassName() {
47        return "org.apache.harmony.jpda.tests.jdwp.ReferenceType.InterfacesDebuggee";
48    }
49
50    /**
51     * This testcase exercises ReferenceType.Interfaces command.
52     * <BR>The test starts InterfacesDebuggee class, requests referenceTypeId
53     * for this class by VirtualMachine.ClassesBySignature command, then
54     * performs ReferenceType.Interfaces command and checks that returned
55     * list of interfaces corresponds to expected list.
56     */
57    public void testInterfaces001() {
58        String thisTestName = "testInterfaces001";
59        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START...");
60        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
61
62        String checkedClassSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/CheckedClass_Interfaces001;";
63        long refTypeID = getClassIDBySignature(checkedClassSignature);
64
65        logWriter.println("=> Debuggee class = " + getDebuggeeClassName());
66        logWriter.println("=> Checked class = org.apache.harmony.jpda.tests.jdwp.ReferenceType.CheckedClass_Interfaces001");
67        logWriter.println("=> referenceTypeID for Checked class = " + refTypeID);
68        logWriter.println("=> CHECK: send " + thisCommandName + " for Checked class and check reply...");
69
70        CommandPacket checkedCommand = new CommandPacket(
71            JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
72            JDWPCommands.ReferenceTypeCommandSet.InterfacesCommand);
73        checkedCommand.setNextValueAsReferenceTypeID(refTypeID);
74        ReplyPacket checkedReply =
75            debuggeeWrapper.vmMirror.performCommand(checkedCommand);
76        checkedCommand = null;
77        checkReplyPacket(checkedReply, thisCommandName);
78
79        int returnedInterfacesNumber = checkedReply.getNextValueAsInt();
80        logWriter.println("=> Returned interfaces number = " + returnedInterfacesNumber);
81
82        String interfacesSignatures[] = {
83                "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/Interface_1_Interfaces001;",
84                "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/Interface_2_Interfaces001;",
85        };
86
87        boolean interfacesFound[] = {
88                false,
89                false,
90        };
91
92        int expectedInterfacesNumber = interfacesSignatures.length;
93
94        logWriter.println("=> CHECK for all expected interfaces...");
95        for (int i=0; i < returnedInterfacesNumber; i++) {
96            logWriter.println("\n=> Check for returned interface[" + i + "] ...");
97            long returnedInterfaceID = checkedReply.getNextValueAsReferenceTypeID();
98            logWriter.println("=> RefTypeID of interface = " + returnedInterfaceID);
99            logWriter.println("=> Get signature for interface...");
100
101            CommandPacket signatureCommand = new CommandPacket(
102                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
103                JDWPCommands.ReferenceTypeCommandSet.SignatureCommand);
104            signatureCommand.setNextValueAsReferenceTypeID(returnedInterfaceID);
105            ReplyPacket signatureReply =
106                debuggeeWrapper.vmMirror.performCommand(signatureCommand);
107            signatureCommand = null;
108            checkReplyPacket(signatureReply, "ReferenceType::Signature command");
109
110            String returnedSignature = signatureReply.getNextValueAsString();
111            logWriter.println("=> Signature of interface = " + returnedSignature);
112            signatureReply = null;
113            logWriter.println("=> Signature of interface = " + returnedSignature);
114
115            int k = 0;
116            for (; k < expectedInterfacesNumber; k++) {
117                if ( ! interfacesSignatures[k].equals(returnedSignature)) {
118                    continue;
119                }
120                if ( interfacesFound[k] ) {
121                    logWriter.println("\n## FAILURE: This interface is found repeatedly in the list");
122                    fail("This interface is found repeatedly in the list");
123                    break;
124                }
125                interfacesFound[k] = true;
126                break;
127            }
128            if ( k == expectedInterfacesNumber ) {
129                // returned interface is not found out in the list of expected interfaces
130                logWriter.println("\n## FAILURE: It is unexpected interface");
131                fail("It is unexpected interface");
132            }
133        }
134        for (int k=0; k < expectedInterfacesNumber; k++) {
135            if ( ! interfacesFound[k] ) {
136                logWriter.println
137                ("\n## FAILURE: Expected interface is NOT found in the returned list:");
138                logWriter.println("=> Signature of interface = " +
139                        interfacesSignatures[k]);
140                fail("Expected interface is NOT found in the returned list: " +
141                        interfacesSignatures[k]);
142            }
143        }
144
145        assertAllDataRead(checkedReply);
146
147        logWriter.println
148        ("\n=> CHECK PASSED: All expected interfaces are found out");
149
150        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
151        logWriter.println("\n==> " + thisTestName + " for " + thisCommandName + ": OK.");
152    }
153}
154