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