OldThreadGroupTest.java revision 2333d6b20eed39cfac75edaf9643aaf543251537
12333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson/* 22333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one or more 32333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * contributor license agreements. See the NOTICE file distributed with 42333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * this work for additional information regarding copyright ownership. 52333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * The ASF licenses this file to You under the Apache License, Version 2.0 62333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * (the "License"); you may not use this file except in compliance with 72333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * the License. You may obtain a copy of the License at 82333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * 92333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 102333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * 112333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * Unless required by applicable law or agreed to in writing, software 122333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 132333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 142333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * See the License for the specific language governing permissions and 152333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * limitations under the License. 162333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson */ 172333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 182333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilsonpackage libcore.java.lang; 192333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 202333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilsonimport java.util.Vector; 212333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilsonimport junit.framework.TestCase; 222333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 232333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilsonpublic class OldThreadGroupTest extends TestCase implements Thread.UncaughtExceptionHandler { 242333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 252333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson class MyThread extends Thread { 262333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public volatile int heartBeat = 0; 272333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 282333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public MyThread(ThreadGroup group, String name) 292333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson throws SecurityException, IllegalThreadStateException { 302333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson super(group, name); 312333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 322333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 332333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson @Override 342333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void run() { 352333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson while (true) { 362333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson heartBeat++; 372333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson try { 382333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread.sleep(50); 392333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } catch (InterruptedException e) { 402333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson break; 412333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 422333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 432333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 442333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 452333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public boolean isActivelyRunning() { 462333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson long MAX_WAIT = 100; 472333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson return isActivelyRunning(MAX_WAIT); 482333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 492333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 502333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public boolean isActivelyRunning(long maxWait) { 512333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int beat = heartBeat; 522333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson long start = System.currentTimeMillis(); 532333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson do { 542333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread.yield(); 552333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int beat2 = heartBeat; 562333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson if (beat != beat2) { 572333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson return true; 582333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 592333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } while (System.currentTimeMillis() - start < maxWait); 602333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson return false; 612333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 622333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 632333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 642333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 652333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson private ThreadGroup initialThreadGroup = null; 662333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 672333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void test_activeGroupCount() { 682333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup tg = new ThreadGroup("group count"); 692333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals("Incorrect number of groups", 702333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 0, tg.activeGroupCount()); 712333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread t1 = new Thread(tg, new Runnable() { 722333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void run() { 732333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 742333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 752333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson }); 762333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals("Incorrect number of groups", 772333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 0, tg.activeGroupCount()); 782333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson t1.start(); 792333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals("Incorrect number of groups", 802333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 0, tg.activeGroupCount()); 812333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson new ThreadGroup(tg, "test group 1"); 822333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals("Incorrect number of groups", 832333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1, tg.activeGroupCount()); 842333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson new ThreadGroup(tg, "test group 2"); 852333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals("Incorrect number of groups", 862333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2, tg.activeGroupCount()); 872333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 882333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 892333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson @SuppressWarnings("deprecation") 902333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void test_allowThreadSuspensionZ() { 912333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup tg = new ThreadGroup("thread suspension"); 922333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertTrue("Thread suspention can not be changed", 932333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson tg.allowThreadSuspension(false)); 942333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertTrue("Thread suspention can not be changed", 952333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson tg.allowThreadSuspension(true)); 962333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 972333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 982333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson /* 992333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * Checks whether the current Thread is in the given list. 1002333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson */ 1012333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson private boolean inListOfThreads(Thread[] threads) { 1022333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson for (int i = 0; i < threads.length; i++) { 1032333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson if (Thread.currentThread() == threads[i]) { 1042333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson return true; 1052333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 1062333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 1072333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1082333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson return false; 1092333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 1102333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1112333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void test_enumerateLThreadArray() { 1122333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int numThreads = initialThreadGroup.activeCount(); 1132333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread[] listOfThreads = new Thread[numThreads]; 1142333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1152333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int countThread = initialThreadGroup.enumerate(listOfThreads); 1162333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(numThreads, countThread); 1172333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertTrue("Current thread must be in enumeration of threads", 1182333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson inListOfThreads(listOfThreads)); 1192333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 1202333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1212333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void test_enumerateLThreadArrayLZtest_enumerateLThreadArrayLZ() { 1222333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int numThreads = initialThreadGroup.activeCount(); 1232333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread[] listOfThreads = new Thread[numThreads]; 1242333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1252333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int countThread = initialThreadGroup.enumerate(listOfThreads, false); 1262333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(numThreads, countThread); 1272333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1282333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson countThread = initialThreadGroup.enumerate(listOfThreads, true); 1292333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(numThreads, countThread); 1302333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertTrue("Current thread must be in enumeration of threads", 1312333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson inListOfThreads(listOfThreads)); 1322333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1332333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup subGroup = new ThreadGroup(initialThreadGroup, "Test Group 1"); 1342333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int subThreadsCount = 3; 1352333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Vector<MyThread> subThreads = populateGroupsWithThreads(subGroup, 1362333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson subThreadsCount); 1372333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1382333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson countThread = initialThreadGroup.enumerate(listOfThreads, true); 1392333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(numThreads, countThread); 1402333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertTrue("Current thread must be in enumeration of threads", 1412333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson inListOfThreads(listOfThreads)); 1422333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1432333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson for(MyThread thr:subThreads) { 1442333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson thr.start(); 1452333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 1462333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson // lets give them some time to start 1472333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson try { 1482333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread.sleep(500); 1492333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } catch (InterruptedException ie) { 1502333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson fail("Should not be interrupted"); 1512333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 1522333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1532333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int numThreads2 = initialThreadGroup.activeCount(); 1542333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson listOfThreads = new Thread[numThreads2]; 1552333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1562333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(numThreads + subThreadsCount, numThreads2); 1572333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1582333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson countThread = initialThreadGroup.enumerate(listOfThreads, true); 1592333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(numThreads2, countThread); 1602333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertTrue("Current thread must be in enumeration of threads", 1612333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson inListOfThreads(listOfThreads)); 1622333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1632333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson for(MyThread thr:subThreads) { 1642333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson thr.interrupt(); 1652333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 1662333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson // lets give them some time to die 1672333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson try { 1682333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread.sleep(500); 1692333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } catch (InterruptedException ie) { 1702333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson fail("Should not be interrupted"); 1712333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 1722333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1732333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int numThreads3 = initialThreadGroup.activeCount(); 1742333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson listOfThreads = new Thread[numThreads3]; 1752333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1762333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(numThreads, numThreads3); 1772333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1782333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson countThread = initialThreadGroup.enumerate(listOfThreads, false); 1792333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(numThreads3, countThread); 1802333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertTrue("Current thread must be in enumeration of threads", 1812333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson inListOfThreads(listOfThreads)); 1822333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 1832333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1842333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void test_enumerateLThreadGroupArray() { 1852333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int numGroupThreads = initialThreadGroup.activeGroupCount(); 1862333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup[] listOfGroups = new ThreadGroup[numGroupThreads]; 1872333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1882333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int countGroupThread = initialThreadGroup.enumerate(listOfGroups); 1892333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(numGroupThreads, countGroupThread); 1902333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1912333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup[] listOfGroups1 = new ThreadGroup[numGroupThreads + 1]; 1922333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson countGroupThread = initialThreadGroup.enumerate(listOfGroups1); 1932333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(numGroupThreads, countGroupThread); 1942333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertNull(listOfGroups1[listOfGroups1.length - 1]); 1952333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 1962333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup[] listOfGroups2 = new ThreadGroup[numGroupThreads - 1]; 1972333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson countGroupThread = initialThreadGroup.enumerate(listOfGroups2); 1982333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(numGroupThreads - 1, countGroupThread); 1992333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2002333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup thrGroup1 = new ThreadGroup("Test Group 1"); 2012333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson countGroupThread = thrGroup1.enumerate(listOfGroups); 2022333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(0, countGroupThread); 2032333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 2042333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2052333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void test_enumerateLThreadGroupArrayLZ() { 2062333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup thrGroup = new ThreadGroup("Test Group 1"); 2072333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Vector<MyThread> subThreads = populateGroupsWithThreads(thrGroup, 3); 2082333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int numGroupThreads = thrGroup.activeGroupCount(); 2092333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup[] listOfGroups = new ThreadGroup[numGroupThreads]; 2102333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2112333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(0, thrGroup.enumerate(listOfGroups, true)); 2122333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(0, thrGroup.enumerate(listOfGroups, false)); 2132333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2142333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson for(MyThread thr:subThreads) { 2152333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson thr.start(); 2162333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 2172333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2182333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson numGroupThreads = thrGroup.activeGroupCount(); 2192333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson listOfGroups = new ThreadGroup[numGroupThreads]; 2202333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2212333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(0, thrGroup.enumerate(listOfGroups, true)); 2222333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(0, thrGroup.enumerate(listOfGroups, false)); 2232333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2242333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup subGroup1 = new ThreadGroup(thrGroup, "Test Group 2"); 2252333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Vector<MyThread> subThreads1 = populateGroupsWithThreads(subGroup1, 3); 2262333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson numGroupThreads = thrGroup.activeGroupCount(); 2272333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson listOfGroups = new ThreadGroup[numGroupThreads]; 2282333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2292333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(1, thrGroup.enumerate(listOfGroups, true)); 2302333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(1, thrGroup.enumerate(listOfGroups, false)); 2312333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2322333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson for(MyThread thr:subThreads1) { 2332333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson thr.start(); 2342333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 2352333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson numGroupThreads = thrGroup.activeGroupCount(); 2362333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson listOfGroups = new ThreadGroup[numGroupThreads]; 2372333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2382333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(1, thrGroup.enumerate(listOfGroups, true)); 2392333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(1, thrGroup.enumerate(listOfGroups, false)); 2402333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2412333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson for(MyThread thr:subThreads) { 2422333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson thr.interrupt(); 2432333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 2442333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2452333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup subGroup2 = new ThreadGroup(subGroup1, "Test Group 3"); 2462333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Vector<MyThread> subThreads2 = populateGroupsWithThreads(subGroup2, 3); 2472333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson numGroupThreads = thrGroup.activeGroupCount(); 2482333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson listOfGroups = new ThreadGroup[numGroupThreads]; 2492333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2502333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(2, thrGroup.enumerate(listOfGroups, true)); 2512333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(1, thrGroup.enumerate(listOfGroups, false)); 2522333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 2532333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2542333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson /** 2552333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * @tests java.lang.ThreadGroup#interrupt() 2562333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson */ 2572333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson private static boolean interrupted = false; 2582333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void test_interrupt() { 2592333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2602333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread.setDefaultUncaughtExceptionHandler(this); 2612333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup tg = new ThreadGroup("interrupt"); 2622333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread t1 = new Thread(tg, new Runnable() { 2632333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void run() { 2642333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson try { 2652333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread.sleep(5000); 2662333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } catch (InterruptedException e) { 2672333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson fail("ok"); 2682333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 2692333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 2702333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson }); 2712333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertFalse("Incorrect state of thread", interrupted); 2722333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson t1.start(); 2732333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertFalse("Incorrect state of thread", interrupted); 2742333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson t1.interrupt(); 2752333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson try { 2762333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson t1.join(); 2772333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } catch (InterruptedException e) { 2782333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 2792333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertTrue("Incorrect state of thread", interrupted); 2802333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson tg.destroy(); 2812333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 2822333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2832333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void test_isDestroyed() { 2842333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson final ThreadGroup originalCurrent = getInitialThreadGroup(); 2852333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson final ThreadGroup testRoot = new ThreadGroup(originalCurrent, 2862333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson "Test group"); 2872333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertFalse("Test group is not destroyed yet", 2882333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson testRoot.isDestroyed()); 2892333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson testRoot.destroy(); 2902333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertTrue("Test group already destroyed", 2912333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson testRoot.isDestroyed()); 2922333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 2932333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2942333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson @SuppressWarnings("deprecation") 2952333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void test_resume() { 2962333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup group = new ThreadGroup("Foo"); 2972333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 2982333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread thread = launchFiveSecondDummyThread(group); 2992333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3002333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson try { 3012333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread.sleep(1000); 3022333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } catch (InterruptedException e) { 3032333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson // Ignore 3042333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3052333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3062333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson // No-op in Android. Must neither have an effect nor throw an exception. 3072333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread.State state = thread.getState(); 3082333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson group.resume(); 3092333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson assertEquals(state, thread.getState()); 3102333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3112333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3122333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson private Thread launchFiveSecondDummyThread(ThreadGroup group) { 3132333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread thread = new Thread(group, "Bar") { 3142333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void run() { 3152333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson try { 3162333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread.sleep(5000); 3172333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } catch (InterruptedException e) { 3182333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson // Ignore 3192333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3202333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3212333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson }; 3222333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3232333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson thread.start(); 3242333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3252333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson return thread; 3262333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3272333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3282333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson /* 3292333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson * @see java.lang.Thread.UncaughtExceptionHandler#uncaughtException(java.lang.Thread, java.lang.Throwable) 3302333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson */ 3312333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson public void uncaughtException(Thread t, Throwable e) { 3322333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson interrupted = true; 3332333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread.setDefaultUncaughtExceptionHandler(null); 3342333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3352333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3362333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson @Override 3372333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson protected void setUp() { 3382333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson initialThreadGroup = Thread.currentThread().getThreadGroup(); 3392333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup rootThreadGroup = initialThreadGroup; 3402333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson while (rootThreadGroup.getParent() != null) { 3412333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson rootThreadGroup = rootThreadGroup.getParent(); 3422333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3432333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3442333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3452333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson @Override 3462333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson protected void tearDown() { 3472333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson try { 3482333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson // Give the threads a chance to die. 3492333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Thread.sleep(50); 3502333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } catch (InterruptedException e) { 3512333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3522333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3532333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3542333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson private ThreadGroup getInitialThreadGroup() { 3552333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson return initialThreadGroup; 3562333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3572333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3582333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson private ThreadGroup[] groups(ThreadGroup parent) { 3592333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson // No API to get the count of immediate children only ? 3602333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int count = parent.activeGroupCount(); 3612333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup[] all = new ThreadGroup[count]; 3622333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson parent.enumerate(all, false); 3632333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson // Now we may have nulls in the array, we must find the actual size 3642333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson int actualSize = 0; 3652333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson for (; actualSize < all.length; actualSize++) { 3662333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson if (all[actualSize] == null) { 3672333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson break; 3682333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3692333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3702333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup[] result; 3712333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson if (actualSize == all.length) { 3722333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson result = all; 3732333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } else { 3742333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson result = new ThreadGroup[actualSize]; 3752333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson System.arraycopy(all, 0, result, 0, actualSize); 3762333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3772333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3782333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson return result; 3792333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3802333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3812333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3822333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson private Vector<MyThread> populateGroupsWithThreads(final ThreadGroup aGroup, 3832333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson final int threadCount) { 3842333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson Vector<MyThread> result = new Vector<MyThread>(); 3852333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson populateGroupsWithThreads(aGroup, threadCount, result); 3862333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson return result; 3872333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3882333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 3892333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3902333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson private void populateGroupsWithThreads(final ThreadGroup aGroup, 3912333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson final int threadCount, final Vector<MyThread> allCreated) { 3922333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson for (int i = 0; i < threadCount; i++) { 3932333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson final int iClone = i; 3942333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson final String name = "(MyThread)N =" + iClone + "/" + threadCount 3952333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson + " ,Vector size at creation: " + allCreated.size(); 3962333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 3972333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson MyThread t = new MyThread(aGroup, name); 3982333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson allCreated.addElement(t); 3992333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 4002333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 4012333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson // Recursively for subgroups (if any) 4022333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson ThreadGroup[] children = groups(aGroup); 4032333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson for (ThreadGroup element : children) { 4042333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson populateGroupsWithThreads(element, threadCount, allCreated); 4052333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 4062333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson 4072333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson } 4082333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson} 409