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);
36 public void setReportClassIDs(boolean rep) {
37 report_class_ids_ = rep;
40 void expect(Expectation exp) {
41 expectations_.add(exp);
44 void expect(String tag, String loader, String classname) {
45 expect(new Expectation(tag, loader, classname));
48 void expect(String tag, String loader1, String loader2, String classname) {
49 expect(new Expectation(tag, loader1, loader2, classname));
52 public void expect(String tag, ClassLoader loader, String classname) {
53 expect(tag, loaderName(loader), classname);
56 public void expect(String tag, ClassLoader loader1, ClassLoader loader2, String classname) {
57 expect(tag, loaderName(loader1), loaderName(loader2), classname);
60 public void expectLoadFromSystem(ClassLoader loader, String classname) {
61 expect("requested", loader, classname);
62 expect("delegated", loader, ClassLoader.getSystemClassLoader(), classname);
63 expect("loaded", loader, "<" + classname + ">");
66 public void expectDelegationAndDefinition(ClassLoader loader1, ClassLoader loader2, String classname) {
67 expect("requested", loader1, classname);
68 expect("delegated", loader1, loader2, classname);
69 expect("requested", loader2, classname);
70 expect("defined", loader2, "<" + classname + ">");
71 expect("loaded", loader1, "<" + classname + ">");
74 public void expectDelegationAndFound(ClassLoader loader1, ClassLoader loader2, String classname) {
75 expect("requested", loader1, classname);
76 expect("delegated", loader1, loader2, classname);
77 expect("requested", loader2, classname);
78 expect("found", loader2, "<" + classname + ">");
79 expect("loaded", loader1, "<" + classname + ">");
82 void fail(String message) {
83 log("FAIL: " + message);
87 void ok(String message) {
88 log("ok: " + message);
91 void fail(String message, String tag, String ld1, String ld2, String cls) {
92 fail(message + ": " + tag + " " + ld1 + " " + ld2 + " class=" + cls);
95 void ok(String tag, String ld1, String ld2, String cls) {
96 ok(tag + " " + ld1 + " " + ld2 + " class=" + cls);
99 public void expectEnd() {
100 if (expectations_.size() != 0)
101 fail("missing reports");
103 ok("got all expected reports");
106 public void checkStringGetter(Class cls, String methodname, String expected) {
107 String id = invokeStringGetter(cls, methodname);
109 fail("could not get return value of " + methodname + "()");
110 else if (id.equals(expected))
111 ok("returned string matches: " + id);
113 fail("wrong string returned: " + id + ", expected: " + expected);
116 public void checkStringGetterMustFail(Class cls, String methodname) {
117 String id = invokeStringGetter(cls, methodname);
119 ok("method invocation failed as expected: " + methodname + "()");
121 fail("method invocation did not fail as expected: " + methodname + "()");
124 public void checkClassId(Class cls, String expected) {
125 String id = getClassId(cls);
127 fail("could not get class id");
128 else if (id.equals(expected))
129 ok("class id matches: " + id);
131 fail("wrong class id: " + id + ", expected: " + expected);
134 public synchronized void match(String tag, String ld1, String ld2, String cls) {
135 if (expectations_.size() == 0) {
136 fail("unexpected", tag, ld1, ld2, cls);
139 Expectation exp = (Expectation) expectations_.firstElement();
141 if (exp.matches(tag, ld1, ld2, cls)) {
142 expectations_.remove(0);
143 ok(tag, ld1, ld2, cls);
146 fail("unexpected", tag, ld1, ld2, cls);
151 void report(String tag, String loader, String classname) {
152 match(tag, loader, null, classname);
155 void report(String tag, String loader1, String loader2, String classname) {
156 match(tag, loader1, loader2, classname);
159 void report(String tag, ClassLoader loader, String classname) {
160 report(tag, loaderName(loader), classname);
163 void report(String tag, ClassLoader loader, Class cls) {
164 report(tag, loaderName(loader), className(cls));
167 void report(String tag, ClassLoader loader1, ClassLoader loader2, String classname) {
168 report(tag, loaderName(loader1), loaderName(loader2), classname);
171 public void reportRequest(ClassLoader loader, String classname) {
172 report("requested", loader, classname);
175 public void reportUnexpectedClassRequested(ClassLoader loader, String classname) {
176 report("unexpected class requested", loader, classname);
179 public void reportDelegation(ClassLoader loader, ClassLoader delegate, String classname) {
180 report("delegated", loaderName(loader), loaderName(delegate), classname);
183 public void reportDefinition(ClassLoader loader, Class cls) {
184 report("defined", loaderName(loader), className(cls));
187 public void reportFoundLoaded(ClassLoader loader, Class cls) {
188 report("found", loaderName(loader), className(cls));
191 public void reportLoaded(ClassLoader loader, Class cls) {
192 report("loaded", loaderName(loader), className(cls));
195 public void reportClassNotFound(ClassLoader loader, String classname, ClassNotFoundException e) {
196 report("class not found", loaderName(loader), classname);
199 public void reportException(Class cls, Throwable ex) {
200 report("exception", ex.getClass().getName(), className(cls));
201 log("exception was: " + ex);
202 // ex.printStackTrace(System.out);
205 public Class loadClass(ClassLoader loader, String classname) {
207 Class cls = loader.loadClass(classname);
209 reportLoaded(loader, cls);
213 catch (ClassNotFoundException e) {
214 reportClassNotFound(loader, classname, e);
220 public void log(String str) {
221 System.out.println(str);
224 public String loaderName(ClassLoader loader) {
225 if (loader == ClassLoader.getSystemClassLoader())
226 return "<SystemClassLoader>";
228 return (loader == null) ? "<null>" : loader.toString();
231 public String invokeStringGetter(Class cls, String methodname) {
233 Method mid = cls.getMethod(methodname, null);
235 String id = (String) mid.invoke(null, null);
239 catch (NoSuchMethodException e) {
242 catch (InvocationTargetException e) {
243 reportException(cls, e.getCause());
246 catch (Exception e) {
247 reportException(cls, e);
252 public String getClassId(Class cls) {
253 return invokeStringGetter(cls, "id");
256 public String className(Class cls) {
257 if (report_class_ids_) {
258 String id = getClassId(cls);
260 return "<" + cls.getName() + ":" + id + ">";
263 return "<" + cls.getName() + ">";
268 System.exit(failed_ ? 1 : 0);