1 21 22 package org.apache.derbyTesting.unitTests.services; 23 24 import org.apache.derbyTesting.unitTests.harness.T_Fail; 25 import org.apache.derbyTesting.unitTests.harness.T_MultiThreadedIterations; 26 import org.apache.derby.iapi.services.context.ContextService; 27 import org.apache.derby.iapi.services.monitor.Monitor; 28 import org.apache.derby.iapi.error.StandardException; 29 import org.apache.derby.iapi.services.daemon.*; 30 31 import java.util.Random ; 32 import java.util.Vector ; 33 36 public class T_DaemonService extends T_MultiThreadedIterations 37 { 38 private static DaemonService testDaemon; 39 private static Random random; 40 41 44 private Vector serviceRecord; 46 public T_DaemonService() 47 { 48 super(); 49 serviceRecord = new Vector (9, 1); 50 random = new Random (); 51 } 52 53 54 57 58 protected String getModuleToTestProtocolName() { 59 return org.apache.derby.iapi.reference.Module.DaemonFactory; 60 } 61 62 66 protected void setupTest() throws T_Fail 67 { 68 69 DaemonFactory daemonFactory; 70 try { 71 daemonFactory = (DaemonFactory)Monitor.startSystemModule(org.apache.derby.iapi.reference.Module.DaemonFactory); 72 } catch (StandardException mse) { 73 throw T_Fail.exceptionFail(mse); 74 } 75 if (daemonFactory == null) 76 throw T_Fail.testFailMsg("cannot find daemon factory " + org.apache.derby.iapi.reference.Module.DaemonFactory); 77 78 try 79 { 80 testDaemon = daemonFactory.createNewDaemon("testDaemon"); 81 } 82 catch (StandardException se) 83 { 84 throw T_Fail.exceptionFail(se); 85 } 86 if (testDaemon == null) 87 throw T_Fail.testFailMsg("cannot create new Daemon Service"); 88 89 90 } 91 92 93 97 protected void joinSetupTest() throws T_Fail 98 { 99 if (testDaemon == null) 100 throw T_Fail.testFailMsg("test deamon not set"); 101 } 102 103 protected T_MultiThreadedIterations newTestObject() 104 { 105 return new T_DaemonService(); } 107 108 109 112 protected void runTestSet() throws T_Fail 113 { 114 serviceRecord.clear(); 118 119 try 120 { 121 122 T01(testDaemon); T02(testDaemon); T03(testDaemon); 126 t_checkStatus(testDaemon); } 128 catch (StandardException se) 129 { 130 throw T_Fail.exceptionFail(se); 131 } 132 133 } 134 135 138 139 140 private void T01(DaemonService daemon) throws T_Fail, StandardException 141 { 142 T_Serviceable s1 = new T_Serviceable(false); serviceRecord.addElement(s1); 145 int clientNumber1 = daemon.subscribe(s1, false); 146 s1.setClientNumber(clientNumber1); 147 148 T_Serviceable s2 = new T_Serviceable(true); serviceRecord.addElement(s2); 150 int clientNumber2 = daemon.subscribe(s2, true); 151 s2.setClientNumber(clientNumber2); 152 153 daemon.serviceNow(clientNumber2); 155 s2.t_wait(1); 157 randomSleep(); 158 159 s1.t_wait(1); 162 s2.t_check(1); 164 PASS("T01"); 165 166 randomSleep(); 167 } 168 169 170 private void T02(DaemonService daemon) throws T_Fail, StandardException 171 { 172 int requeue = 10; 173 174 T_Serviceable e1 = new T_Serviceable(1); serviceRecord.addElement(e1); 176 daemon.enqueue(e1, true); 177 178 T_Serviceable e2 = new T_Serviceable(requeue); serviceRecord.addElement(e2); 180 daemon.enqueue(e2, true); 181 182 T_Serviceable e3 = new T_Serviceable(1); serviceRecord.addElement(e3); 184 daemon.enqueue(e3, false); 185 186 T_Serviceable e4 = new T_Serviceable(requeue); serviceRecord.addElement(e4); 188 daemon.enqueue(e4, false); 189 190 randomSleep(); 191 192 e1.t_wait(1); e2.t_wait(1); 194 e3.t_wait(1); 195 e4.t_wait(1); 196 197 e2.t_wait(requeue); e4.t_wait(requeue); 200 e1.t_check(1); 202 e3.t_check(1); 203 204 PASS("T02"); 205 206 randomSleep(); 207 } 208 209 210 private void T03(DaemonService daemon) throws T_Fail, StandardException 211 { 212 T_Serviceable s1 = new T_Serviceable(false); serviceRecord.addElement(s1); 214 int sub1 = daemon.subscribe(s1, false); 215 216 T_Serviceable e1 = new T_Serviceable(1); 217 serviceRecord.addElement(e1); 218 daemon.enqueue(e1, false); daemon.enqueue(e1, false); 220 daemon.enqueue(e1, false); 221 daemon.enqueue(e1, false); 222 daemon.enqueue(e1, false); 223 224 T_Serviceable s2 = new T_Serviceable(false); serviceRecord.addElement(s2); 226 int sub2 = daemon.subscribe(s2, false); 227 int realsub2 = daemon.subscribe(s2, false); 228 s2.setClientNumber(realsub2); 229 230 daemon.unsubscribe(sub1); 231 daemon.unsubscribe(sub2); 233 int save; 234 synchronized(s1) 235 { 236 save = s1.timesServiced; 237 } 238 daemon.serviceNow(sub1); 240 randomSleep(); 241 242 e1.t_wait(5); 244 daemon.serviceNow(sub1); 246 s2.t_wait(3); 248 daemon.serviceNow(sub1); 250 synchronized(s1) 251 { 252 int diff = s1.timesServiced - save; 258 T_Fail.T_ASSERT((diff == 0 || diff == 1), 261 "unsubscribed continue to get serviced"); 262 263 s1.timesServiced = 0; 265 } 266 267 sub1 = daemon.subscribe(s1, false); s1.setClientNumber(sub1); 269 daemon.serviceNow(sub1); 270 s1.t_wait(1); 271 272 e1.t_check(5); 274 275 PASS("T03"); 276 randomSleep(); 277 278 } 279 280 private void t_checkStatus(DaemonService daemon) throws T_Fail 281 { 282 for (int i = 0; i < serviceRecord.size(); i++) 283 { 284 T_Serviceable check = (T_Serviceable)serviceRecord.elementAt(i); 285 if (check != null) 286 { 287 if (check.subscribed) 288 { 289 if (check.onDemandOnly) 290 check.t_check(1); 291 else 292 check.t_wait(10); 294 daemon.unsubscribe(check.getClientNumber()); 295 } 296 else { 298 check.t_wait(check.timesRequeue); 299 } 300 } 301 } 302 PASS("T_CheckStatus"); 303 } 304 305 private void randomSleep() 306 throws StandardException 307 { 308 if (getNumThreads() > 1) 310 { 311 int nap = random.nextInt()%100; 312 if (nap < 0) nap = -nap; 313 try 314 { 315 Thread.sleep(nap); 316 } 317 catch (InterruptedException ie) 318 { 319 throw StandardException.interrupt(ie); 320 } 321 } 322 } 323 324 } 325 | Popular Tags |