• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 package org.apache.bcel.verifier;
20 
21 import org.apache.bcel.Repository;
22 import org.apache.bcel.classfile.JavaClass;
23 
24 import junit.framework.TestCase;
25 
26 public abstract class AbstractVerifierTestCase extends TestCase {
27 
28     public static final String TEST_PACKAGE = AbstractVerifierTestCase.class.getPackage().getName() + ".tests.";
29 
30     /**
31      * Asserts that the verification of the given class is OK. If it isn't it throws an AssertionFailedError with the given message.
32      *
33      * @param classname simple classname of the class to verify
34      * @param message   message displayed if assertion fails
35      */
assertVerifyOK(final String classname, final String message)36     public void assertVerifyOK(final String classname, final String message) {
37         final String testClassname = TEST_PACKAGE + classname;
38         assertTrue(message, doAllPasses(testClassname));
39     }
40 
41     /**
42      * Asserts that the verification of the given class is rejected.
43      * If it isn't it throws an AssertionFailedError with the given message.
44      *
45      * @param classname simple classname of the class to verify
46      * @param message   message displayed if assertion fails
47      */
assertVerifyRejected(final String classname, final String message)48     public void assertVerifyRejected(final String classname, final String message) {
49         final String testClassname = TEST_PACKAGE + classname;
50         assertFalse(message, doAllPasses(testClassname));
51     }
52 
53     /**
54      * Executes all the verification on the given class.
55      *
56      * @param classname name of the class to verify
57      * @return false if the verification fails, true otherwise
58      */
doAllPasses(final String classname)59     public boolean doAllPasses(final String classname) {
60         int nbMethods = 0;
61 
62         try {
63             final JavaClass jc = Repository.lookupClass(classname);
64             nbMethods = jc.getMethods().length;
65         } catch (final ClassNotFoundException e) {
66             fail(e.getMessage());
67             return false;
68         }
69 
70         final Verifier verifier = VerifierFactory.getVerifier(classname);
71         VerificationResult result = verifier.doPass1();
72         if (result.getStatus() != VerificationResult.VERIFIED_OK) {
73             return false;
74         }
75 
76         result = verifier.doPass2();
77         if (result.getStatus() != VerificationResult.VERIFIED_OK) {
78             return false;
79         }
80 
81         for (int i = nbMethods; --i >= 0;) {
82             result = verifier.doPass3a(i);
83             if (result.getStatus() != VerificationResult.VERIFIED_OK) {
84                 return false;
85             }
86             result = verifier.doPass3b(i);
87             if (result.getStatus() != VerificationResult.VERIFIED_OK) {
88                 return false;
89             }
90         }
91 
92         return true;
93     }
94 
95 }
96