001: // Copyright 2004, 2005 The Apache Software Foundation
002: //
003: // Licensed under the Apache License, Version 2.0 (the "License");
004: // you may not use this file except in compliance with the License.
005: // You may obtain a copy of the License at
006: //
007: // http://www.apache.org/licenses/LICENSE-2.0
008: //
009: // Unless required by applicable law or agreed to in writing, software
010: // distributed under the License is distributed on an "AS IS" BASIS,
011: // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012: // See the License for the specific language governing permissions and
013: // limitations under the License.
014:
015: package hivemind.test.services;
016:
017: import java.io.IOException;
018: import java.io.ObjectInput;
019: import java.io.ObjectInputStream;
020: import java.lang.reflect.Method;
021: import java.sql.SQLException;
022:
023: import org.apache.hivemind.service.MethodSignature;
024: import org.apache.hivemind.test.HiveMindTestCase;
025:
026: /**
027: * Tests for the {@link org.apache.hivemind.service.impl.MethodSignature} class.
028: *
029: * @author Howard Lewis Ship
030: */
031: public class TestMethodSignature extends HiveMindTestCase {
032: private MethodSignature find(Class sourceClass, String methodName) {
033: Method[] methods = sourceClass.getMethods();
034:
035: for (int i = 0; i < methods.length; i++) {
036: Method m = methods[i];
037:
038: if (m.getName().equals(methodName))
039: return new MethodSignature(m);
040: }
041:
042: unreachable();
043: return null;
044: }
045:
046: public void testEqualsAndHashCode() {
047: MethodSignature m1 = find(Object.class, "hashCode");
048: MethodSignature m2 = find(Boolean.class, "hashCode");
049:
050: assertEquals(m1.hashCode(), m2.hashCode());
051: assertTrue(m1.equals(m2));
052:
053: m1 = find(String.class, "charAt");
054: m2 = find(StringBuffer.class, "charAt");
055:
056: assertEquals(m1.hashCode(), m2.hashCode());
057: assertTrue(m1.equals(m2));
058:
059: m1 = find(ObjectInput.class, "close");
060: m2 = find(ObjectInputStream.class, "close");
061:
062: assertEquals(m1.hashCode(), m2.hashCode());
063: assertTrue(m1.equals(m2));
064: }
065:
066: public void testEqualsAndHashCodeWithNulls() {
067: MethodSignature m1 = new MethodSignature(void.class, "foo",
068: null, null);
069: MethodSignature m2 = new MethodSignature(void.class, "foo",
070: new Class[0], new Class[0]);
071:
072: assertEquals(m1, m2);
073: assertEquals(m2, m1);
074:
075: assertEquals(m1.hashCode(), m2.hashCode());
076: }
077:
078: /** @since 1.1 */
079:
080: public void testEqualsNameMismatch() {
081: MethodSignature m1 = new MethodSignature(void.class, "foo",
082: null, null);
083: MethodSignature m2 = new MethodSignature(void.class, "bar",
084: null, null);
085:
086: assertEquals(false, m1.equals(m2));
087: }
088:
089: /** @since 1.1 */
090: public void testParametersMismatch() {
091: MethodSignature m1 = new MethodSignature(void.class, "foo",
092: new Class[] { String.class }, null);
093: MethodSignature m2 = new MethodSignature(void.class, "foo",
094: new Class[] { Boolean.class }, null);
095:
096: assertEquals(false, m1.equals(m2));
097: }
098:
099: /** @since 1.1 */
100:
101: public void testEqualsNull() {
102: MethodSignature m1 = new MethodSignature(void.class, "foo",
103: null, null);
104:
105: assertEquals(false, m1.equals(null));
106: }
107:
108: /** @since 1.1 */
109:
110: public void testEqualsNonMethodSignature() {
111: MethodSignature m1 = new MethodSignature(void.class, "foo",
112: null, null);
113:
114: assertEquals(false, m1.equals("Method Signature"));
115: }
116:
117: public void testToString() {
118: MethodSignature m = find(String.class, "getChars");
119:
120: assertEquals("void getChars(int, int, char[], int)", m
121: .toString());
122:
123: m = find(Class.class, "newInstance");
124:
125: assertEquals(
126: "java.lang.Object newInstance() throws java.lang.InstantiationException, java.lang.IllegalAccessException",
127: m.toString());
128: }
129:
130: /** @since 1.1 */
131: public void testGetUniqueId() {
132: MethodSignature m = find(String.class, "getChars");
133:
134: assertEquals("getChars(int,int,char[],int)", m.getUniqueId());
135:
136: m = find(Class.class, "newInstance");
137:
138: assertEquals("newInstance()", m.getUniqueId());
139: }
140:
141: /** @since 1.1 */
142:
143: public void testOverridingSigTypeMismatch() {
144: MethodSignature m1 = new MethodSignature(void.class, "foo",
145: null, null);
146: MethodSignature m2 = new MethodSignature(int.class, "foo",
147: null, null);
148:
149: assertEquals(false, m1.isOverridingSignatureOf(m2));
150: }
151:
152: /** @since 1.1 */
153:
154: public void testOverridingSigNameMismatch() {
155: MethodSignature m1 = new MethodSignature(void.class, "foo",
156: null, null);
157: MethodSignature m2 = new MethodSignature(void.class, "bar",
158: null, null);
159:
160: assertEquals(false, m1.isOverridingSignatureOf(m2));
161: }
162:
163: /** @since 1.1 */
164:
165: public void testOverridingSigParametersMismatch() {
166: MethodSignature m1 = new MethodSignature(void.class, "foo",
167: null, null);
168: MethodSignature m2 = new MethodSignature(void.class, "foo",
169: new Class[] { String.class }, null);
170:
171: assertEquals(false, m1.isOverridingSignatureOf(m2));
172: }
173:
174: /** @since 1.1 */
175:
176: public void testOverridingSig() {
177: MethodSignature m1 = new MethodSignature(void.class, "close",
178: null, new Class[] { Exception.class });
179: MethodSignature m2 = new MethodSignature(void.class, "close",
180: null, new Class[] { RuntimeException.class });
181:
182: assertEquals(true, m1.isOverridingSignatureOf(m2));
183: assertEquals(false, m2.isOverridingSignatureOf(m1));
184: }
185:
186: /**
187: * Tests a shorcut used when one signature has zero exceptions.
188: *
189: * @since 1.1
190: */
191: public void testOverridingSigShortcut() {
192: MethodSignature m1 = new MethodSignature(void.class, "close",
193: null, null);
194: MethodSignature m2 = new MethodSignature(void.class, "close",
195: null, new Class[] { RuntimeException.class });
196:
197: assertEquals(false, m1.isOverridingSignatureOf(m2));
198: assertEquals(true, m2.isOverridingSignatureOf(m1));
199: }
200:
201: /**
202: * Fill in code coverage for multiple matchd signatures.
203: *
204: * @since 1.1
205: */
206: public void testMultipleExceptionsToMatch() {
207: MethodSignature m1 = new MethodSignature(void.class, "close",
208: null, new Class[] { SQLException.class,
209: NumberFormatException.class });
210: MethodSignature m2 = new MethodSignature(void.class, "close",
211: null, new Class[] { SQLException.class,
212: IOException.class });
213:
214: assertEquals(false, m1.isOverridingSignatureOf(m2));
215: assertEquals(false, m2.isOverridingSignatureOf(m1));
216: }
217: }
|