1 import java.util.Vector;
2 import java.lang.reflect.Method;
3 import java.lang.reflect.InvocationTargetException;
5 public class TestController {
7 boolean report_class_ids_ = false;
8 Vector expectations_ = new Vector();
9 boolean failed_ = false;
17 public Expectation(String tag, String ld1, String ld2, String cls) {
24 public Expectation(String tag, String ld1, String cls) {
25 this(tag, ld1, null, cls);
28 public boolean matches(String tag, String ld1, String ld2, String cls) {
29 return tag_.equals(tag)
30 && loader1_.equals(ld1)
31 && ((loader2_ == ld2) || ((loader2_ != null) && (ld2 != null) && loader2_.equals(ld2)))
32 && class_.equals(cls);
35 public String toString() {
36 return tag_ + ": " + loader1_ + " " + loader2_ + " class=" + class_;
40 public void setReportClassIDs(boolean rep) {
41 report_class_ids_ = rep;
44 void expect(Expectation exp) {
45 expectations_.add(exp);
48 void expect(String tag, String loader, String classname) {
49 expect(new Expectation(tag, loader, classname));
52 void expect(String tag, String loader1, String loader2, String classname) {
53 expect(new Expectation(tag, loader1, loader2, classname));
56 public void expect(String tag, ClassLoader loader, String classname) {
57 expect(tag, loaderName(loader), classname);
60 public void expect(String tag, ClassLoader loader1, ClassLoader loader2, String classname) {
61 expect(tag, loaderName(loader1), loaderName(loader2), classname);
64 public void expectLoadFromSystem(ClassLoader loader, String classname) {
65 expect("requested", loader, classname);
66 expect("delegated", loader, ClassLoader.getSystemClassLoader(), classname);
67 expect("loaded", loader, "<" + classname + ">");
70 public void expectDelegation(ClassLoader loader1, ClassLoader loader2, String classname) {
71 expect("requested", loader1, classname);
72 expect("delegated", loader1, loader2, classname);
73 expect("requested", loader2, classname);
76 public void expectDelegationDefinition(ClassLoader loader1, ClassLoader loader2, String classname) {
77 expect("defined", loader2, "<" + classname + ">");
78 expect("loaded", loader1, "<" + classname + ">");
81 public void expectDelegationAndDefinition(ClassLoader loader1, ClassLoader loader2, String classname) {
82 expectDelegation(loader1, loader2, classname);
83 expectDelegationDefinition(loader1, loader2, classname);
86 public void expectDelegationAndFound(ClassLoader loader1, ClassLoader loader2, String classname) {
87 expectDelegation(loader1, loader2, classname);
88 expect("found", loader2, "<" + classname + ">");
89 expect("loaded", loader1, "<" + classname + ">");
92 void fail(String message) {
93 log("FAIL: " + message);
97 void ok(String message) {
98 log("ok: " + message);
101 void fail(String message, String tag, String ld1, String ld2, String cls) {
102 fail(message + ": " + tag + " " + ld1 + " " + ld2 + " class=" + cls);
105 void fail(String message, String tag, String ld1, String ld2, String cls, Expectation exp) {
106 fail(message + ": " + tag + " " + ld1 + " " + ld2 + " class=" + cls
107 + " (expected " + exp.toString() + ")");
110 void ok(String tag, String ld1, String ld2, String cls) {
111 ok(tag + " " + ld1 + " " + ld2 + " class=" + cls);
114 public void expectEnd() {
115 if (expectations_.size() != 0)
116 fail("missing reports");
118 ok("got all expected reports");
121 public void checkStringGetter(Class cls, String methodname, String expected) {
122 String id = invokeStringGetter(cls, methodname);
124 fail("could not get return value of " + methodname + "()");
125 else if (id.equals(expected))
126 ok("returned string matches: " + id);
128 fail("wrong string returned: " + id + ", expected: " + expected);
131 public void checkStringGetterMustFail(Class cls, String methodname) {
132 String id = invokeStringGetter(cls, methodname);
134 ok("method invocation failed as expected: " + methodname + "()");
136 fail("method invocation did not fail as expected: " + methodname + "()");
139 public void checkClassId(Class cls, String expected) {
140 String id = getClassId(cls);
142 fail("could not get class id");
143 else if (id.equals(expected))
144 ok("class id matches: " + id);
146 fail("wrong class id: " + id + ", expected: " + expected);
149 public synchronized void match(String tag, String ld1, String ld2, String cls) {
150 if (expectations_.size() == 0) {
151 fail("unexpected", tag, ld1, ld2, cls);
154 Expectation exp = (Expectation) expectations_.firstElement();
156 if (exp.matches(tag, ld1, ld2, cls)) {
157 expectations_.remove(0);
158 ok(tag, ld1, ld2, cls);
161 fail("unmatched", tag, ld1, ld2, cls, exp);
166 void report(String tag, String loader, String classname) {
167 match(tag, loader, null, classname);
170 void report(String tag, String loader1, String loader2, String classname) {
171 match(tag, loader1, loader2, classname);
174 void report(String tag, ClassLoader loader, String classname) {
175 report(tag, loaderName(loader), classname);
178 void report(String tag, ClassLoader loader, Class cls) {
179 report(tag, loaderName(loader), className(cls));
182 void report(String tag, ClassLoader loader1, ClassLoader loader2, String classname) {
183 report(tag, loaderName(loader1), loaderName(loader2), classname);
186 public void reportRequest(ClassLoader loader, String classname) {
187 report("requested", loader, classname);
190 public void reportUnexpectedClassRequested(ClassLoader loader, String classname) {
191 report("unexpected class requested", loader, classname);
194 public void reportDelegation(ClassLoader loader, ClassLoader delegate, String classname) {
195 report("delegated", loaderName(loader), loaderName(delegate), classname);
198 public void reportDefinition(ClassLoader loader, Class cls) {
199 report("defined", loaderName(loader), className(cls));
202 public void reportFoundLoaded(ClassLoader loader, Class cls) {
203 report("found", loaderName(loader), className(cls));
206 public void reportLoaded(ClassLoader loader, Class cls) {
207 report("loaded", loaderName(loader), className(cls));
210 public void reportClassNotFound(ClassLoader loader, String classname, ClassNotFoundException e) {
211 report("class not found", loaderName(loader), classname);
214 public void reportException(Class cls, Throwable ex) {
215 report("exception", ex.getClass().getName(), className(cls));
216 log("exception was: " + ex);
217 // ex.printStackTrace(System.out);
220 public Class loadClass(ClassLoader loader, String classname) {
222 Class cls = loader.loadClass(classname);
224 reportLoaded(loader, cls);
228 catch (ClassNotFoundException e) {
229 reportClassNotFound(loader, classname, e);
235 public void log(String str) {
236 System.out.println(str);
239 public String loaderName(ClassLoader loader) {
240 if (loader == ClassLoader.getSystemClassLoader())
241 return "<SystemClassLoader>";
243 return (loader == null) ? "<null>" : loader.toString();
246 public String invokeStringGetter(Class cls, String methodname) {
248 Method mid = cls.getMethod(methodname, null);
250 String id = (String) mid.invoke(null, null);
254 catch (NoSuchMethodException e) {
257 catch (InvocationTargetException e) {
258 reportException(cls, e.getCause());
261 catch (Exception e) {
262 reportException(cls, e);
267 public String getClassId(Class cls) {
268 return invokeStringGetter(cls, "id");
271 public String className(Class cls) {
272 if (report_class_ids_) {
273 String id = getClassId(cls);
275 return "<" + cls.getName() + ":" + id + ">";
278 return "<" + cls.getName() + ">";
283 System.exit(failed_ ? 1 : 0);