68 package nsk.jdi.ClassPrepareRequest.addSourceNameFilter.addSourceNameFilter002; |
68 package nsk.jdi.ClassPrepareRequest.addSourceNameFilter.addSourceNameFilter002; |
69 |
69 |
70 import java.io.*; |
70 import java.io.*; |
71 import java.util.ArrayList; |
71 import java.util.ArrayList; |
72 |
72 |
|
73 import com.sun.jdi.ThreadReference; |
73 import com.sun.jdi.event.*; |
74 import com.sun.jdi.event.*; |
74 import com.sun.jdi.request.*; |
75 import com.sun.jdi.request.*; |
75 import nsk.share.Consts; |
76 import nsk.share.Consts; |
76 import nsk.share.TestBug; |
77 import nsk.share.TestBug; |
77 import nsk.share.jdi.*; |
78 import nsk.share.jdi.*; |
78 import nsk.share.jdi.sde.*; |
79 import nsk.share.jdi.sde.*; |
79 import nsk.share.jpda.AbstractDebuggeeTest; |
80 import nsk.share.jpda.AbstractDebuggeeTest; |
80 |
81 |
81 public class addSourceNameFilter002 extends SDEDebugger { |
82 public class addSourceNameFilter002 extends SDEDebugger { |
|
83 |
|
84 private static final String DEBUGGEE_MAIN_THREAD = "main"; |
|
85 |
82 public static void main(String argv[]) { |
86 public static void main(String argv[]) { |
83 System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE); |
87 System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE); |
84 } |
88 } |
85 |
89 |
86 public static int run(String argv[], PrintStream out) { |
90 public static int run(String argv[], PrintStream out) { |
87 return new addSourceNameFilter002().runIt(argv, out); |
91 return new addSourceNameFilter002().runIt(argv, out); |
88 } |
92 } |
|
93 |
|
94 private static volatile int eventReceived; |
89 |
95 |
90 protected boolean canRunTest() { |
96 protected boolean canRunTest() { |
91 if (!vm.canUseSourceNameFilters()) { |
97 if (!vm.canUseSourceNameFilters()) { |
92 log.display("TEST CANCELLED due to: vm.canUseSourceNameFilters() = false"); |
98 log.display("TEST CANCELLED due to: vm.canUseSourceNameFilters() = false"); |
93 return false; |
99 return false; |
122 return AbstractJDIDebuggee.class.getName() + " -testClassPath " + testWorkDir; |
128 return AbstractJDIDebuggee.class.getName() + " -testClassPath " + testWorkDir; |
123 } |
129 } |
124 |
130 |
125 // listener counting ClassPrepareEvent |
131 // listener counting ClassPrepareEvent |
126 public class ClassPrepareEventListener extends EventHandler.EventListener { |
132 public class ClassPrepareEventListener extends EventHandler.EventListener { |
127 public int eventReceived; |
|
128 |
133 |
129 public boolean eventReceived(Event event) { |
134 public boolean eventReceived(Event event) { |
130 if (event instanceof ClassPrepareEvent) { |
135 if (event instanceof ClassPrepareEvent) { |
131 ClassPrepareEvent classPrepareEvent = (ClassPrepareEvent) event; |
136 ClassPrepareEvent classPrepareEvent = (ClassPrepareEvent) event; |
132 eventReceived++; |
137 ThreadReference thread = classPrepareEvent.thread(); |
133 |
138 if (thread != null && DEBUGGEE_MAIN_THREAD.equals(thread.name())) { |
134 log.display("Event received: " + event + " Class: " + classPrepareEvent.referenceType().name()); |
139 eventReceived++; |
|
140 } |
|
141 |
|
142 log.display("Event received: " + event + " Class: " + classPrepareEvent.referenceType().name() + |
|
143 " Thread:" + (thread != null ? thread.name() : "")); |
135 |
144 |
136 vm.resume(); |
145 vm.resume(); |
137 |
146 |
138 return true; |
147 return true; |
139 } |
148 } |
151 request = debuggee.getEventRequestManager().createClassPrepareRequest(); |
160 request = debuggee.getEventRequestManager().createClassPrepareRequest(); |
152 request.setSuspendPolicy(EventRequest.SUSPEND_ALL); |
161 request.setSuspendPolicy(EventRequest.SUSPEND_ALL); |
153 request.addSourceNameFilter(sourceName); |
162 request.addSourceNameFilter(sourceName); |
154 request.enable(); |
163 request.enable(); |
155 |
164 |
156 // this listener wait ClassPrepareEvent |
165 // Reset event counter |
157 ClassPrepareEventListener listener = new ClassPrepareEventListener(); |
166 eventReceived = 0; |
158 eventHandler.addListener(listener); |
|
159 |
|
160 log.display("Load class: " + className + ", use follows source filter: " + sourceName); |
|
161 |
|
162 // force debuggee load class |
167 // force debuggee load class |
163 pipe.println(AbstractDebuggeeTest.COMMAND_LOAD_CLASS + ":" + className); |
168 pipe.println(AbstractDebuggeeTest.COMMAND_LOAD_CLASS + ":" + className); |
164 |
169 |
165 if (!isDebuggeeReady()) |
170 if (!isDebuggeeReady()) |
166 return; |
171 return; |
167 |
172 |
168 request.disable(); |
173 request.disable(); |
169 |
174 |
170 eventHandler.removeListener(listener); |
|
171 |
|
172 // check is event was correct filtered or not |
175 // check is event was correct filtered or not |
173 if (expectEvent) { |
176 if (expectEvent) { |
174 if (listener.eventReceived == 0) { |
177 if (eventReceived == 0) { |
175 setSuccess(false); |
178 setSuccess(false); |
176 log.complain("Expected ClassPrepareEvent was not received"); |
179 log.complain("Expected ClassPrepareEvent was not received"); |
177 } |
180 } |
178 } else { |
181 } else { |
179 if (listener.eventReceived > 0) { |
182 if (eventReceived > 0) { |
180 setSuccess(false); |
183 setSuccess(false); |
181 log.complain("Unexpected ClassPrepareEvent was received"); |
184 log.complain("Unexpected ClassPrepareEvent was received"); |
182 } |
185 } |
183 } |
186 } |
184 } |
187 } |
215 preparePathcedClassFile(className, testStratumSourceNames); |
218 preparePathcedClassFile(className, testStratumSourceNames); |
216 |
219 |
217 eventHandler = new EventHandler(debuggee, log); |
220 eventHandler = new EventHandler(debuggee, log); |
218 eventHandler.startListening(); |
221 eventHandler.startListening(); |
219 |
222 |
|
223 // Add a listener to count ClassPrepare events. |
|
224 // The listener should be added after EventHandler.startListening() |
|
225 // is called to ensure it will be the first to process events. |
|
226 eventHandler.addListener(new ClassPrepareEventListener()); |
|
227 |
220 // set valid source name |
228 // set valid source name |
221 testSourceFilter(className, sourceName, true); |
229 testSourceFilter(className, sourceName, true); |
222 for (int i = 0; i < testStratumSourceNames.length; i++) { |
230 for (int i = 0; i < testStratumSourceNames.length; i++) { |
223 testSourceFilter(className, testStratumSourceNames[i], true); |
231 testSourceFilter(className, testStratumSourceNames[i], true); |
224 } |
232 } |