1cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath/*
2cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  Licensed to the Apache Software Foundation (ASF) under one or more
3cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  contributor license agreements.  See the NOTICE file distributed with
4cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  this work for additional information regarding copyright ownership.
5cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  The ASF licenses this file to You under the Apache License, Version 2.0
6cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  (the "License"); you may not use this file except in compliance with
7cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  the License.  You may obtain a copy of the License at
8cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
9cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *     http://www.apache.org/licenses/LICENSE-2.0
10cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
11cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  Unless required by applicable law or agreed to in writing, software
12cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  distributed under the License is distributed on an "AS IS" BASIS,
13cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  See the License for the specific language governing permissions and
15cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  limitations under the License.
16cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath */
17cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
18ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamathpackage org.apache.harmony.tests.java.lang;
19cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
20cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.lang.Thread.UncaughtExceptionHandler;
21cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.Map;
22cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
23cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathpublic class ThreadTest extends junit.framework.TestCase {
24cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
25cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    static class SimpleThread implements Runnable {
26cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int delay;
27cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
28cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public void run() {
29cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
30cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                synchronized (this) {
31cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    this.notify();
32cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    this.wait(delay);
33cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
34cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (InterruptedException e) {
35cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                return;
36cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
37cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
38cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
39cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
40cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public SimpleThread(int d) {
41cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (d >= 0)
42cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                delay = d;
43cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
44cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
45cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
46cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    static class YieldThread implements Runnable {
47cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        volatile int delay;
48cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
49cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public void run() {
50cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int x = 0;
51cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            while (true) {
52cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                ++x;
53cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
54cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
55cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
56cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public YieldThread(int d) {
57cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (d >= 0)
58cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                delay = d;
59cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
60cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
61cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
62cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    static class ResSupThread implements Runnable {
63cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread parent;
64cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
65cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        volatile int checkVal = -1;
66cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
67cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public void run() {
68cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
69cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                synchronized (this) {
70cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    this.notify();
71cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
72cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                while (true) {
73cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    checkVal++;
74cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    zz();
75cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    Thread.sleep(100);
76cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
77cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (InterruptedException e) {
78cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                return;
79cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (BogusException e) {
80cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                try {
81cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    // Give parent a chance to sleep
82cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    Thread.sleep(500);
83cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                } catch (InterruptedException x) {
84cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
85cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                parent.interrupt();
86cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                while (!Thread.currentThread().isInterrupted()) {
87cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    // Don't hog the CPU
88cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    try {
89cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        Thread.sleep(50);
90cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    } catch (InterruptedException x) {
91cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        // This is what we've been waiting for...don't throw it
92cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        // away!
93cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        break;
94cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
95cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
96cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
97cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
98cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
99cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public void zz() throws BogusException {
100cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
101cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
102cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public ResSupThread(Thread t) {
103cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            parent = t;
104cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
105cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
106cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public synchronized int getCheckVal() {
107cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return checkVal;
108cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
109cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
110cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
111cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    static class BogusException extends Throwable {
112cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
113cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private static final long serialVersionUID = 1L;
114cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
115cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public BogusException(String s) {
116cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            super(s);
117cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
118cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
119cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
120cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    Thread st, ct, spinner;
121cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
122cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
123cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#Thread(java.lang.Runnable)
124cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
125cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorLjava_lang_Runnable() {
126cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.Thread(java.lang.Runnable)
127cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ct = new Thread(new SimpleThread(10));
128cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ct.start();
129cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
130cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
131cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
132cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#Thread(java.lang.Runnable, java.lang.String)
133cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
134cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorLjava_lang_RunnableLjava_lang_String() {
135cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.Thread(java.lang.Runnable,
136cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // java.lang.String)
137cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread st1 = new Thread(new SimpleThread(1), "SimpleThread1");
138cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("Constructed thread with incorrect thread name", "SimpleThread1", st1
139cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getName());
140cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st1.start();
141cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
142cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
143cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
144cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#Thread(java.lang.String)
145cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
146cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorLjava_lang_String() {
147cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.Thread(java.lang.String)
148cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread t = new Thread("Testing");
149cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("Created tread with incorrect name",
150cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                "Testing", t.getName());
151cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        t.start();
152cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
153cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
154cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
155cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#Thread(java.lang.ThreadGroup, java.lang.Runnable)
156cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
157cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorLjava_lang_ThreadGroupLjava_lang_Runnable() {
158cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.Thread(java.lang.ThreadGroup,
159cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // java.lang.Runnable)
160cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ThreadGroup tg = new ThreadGroup("Test Group1");
161cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(tg, new SimpleThread(1), "SimpleThread2");
162cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Returned incorrect thread group", st.getThreadGroup() == tg);
163cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.start();
164cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
165cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.join();
166cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
167cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
168cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        tg.destroy();
169cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
170cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
171cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
172cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#Thread(java.lang.ThreadGroup, java.lang.Runnable,
173cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *java.lang.String)
174cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
175cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_String() {
176cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.Thread(java.lang.ThreadGroup,
177cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // java.lang.Runnable, java.lang.String)
178cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ThreadGroup tg = new ThreadGroup("Test Group2");
179cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(tg, new SimpleThread(1), "SimpleThread3");
180cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Constructed incorrect thread", (st.getThreadGroup() == tg)
181cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                && st.getName().equals("SimpleThread3"));
182cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.start();
183cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
184cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.join();
185cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
186cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
187cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        tg.destroy();
188cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
189cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Runnable r = new Runnable() {
190cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void run() {
191cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
192cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        };
193cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
194cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ThreadGroup foo = null;
195cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
196cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            new Thread(foo = new ThreadGroup("foo"), r, null);
197cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Should not get here
198cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Null cannot be accepted as Thread name");
199cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (NullPointerException npe) {
200cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("Null cannot be accepted as Thread name", true);
201cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            foo.destroy();
202cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
203cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
204cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
205cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
206cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
207cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#Thread(java.lang.ThreadGroup, java.lang.String)
208cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
209cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorLjava_lang_ThreadGroupLjava_lang_String() {
210cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.Thread(java.lang.ThreadGroup,
211cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // java.lang.String)
212cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(new SimpleThread(1), "SimpleThread4");
213cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("Returned incorrect thread name",
214cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                "SimpleThread4", st.getName());
215cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.start();
216cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
217cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
218cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
219cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#activeCount()
220cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
221cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_activeCount() {
222cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method int java.lang.Thread.activeCount()
223cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread t = new Thread(new SimpleThread(10));
224cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int active = 0;
225cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        synchronized (t) {
226cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            t.start();
227cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            active = Thread.activeCount();
228cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
229cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Incorrect activeCount for current group: " + active, active > 1);
230cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
231cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            t.join();
232cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
233cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
234cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
235cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
236cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
237cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#checkAccess()
238cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
239cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_checkAccess() {
240cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Thread.checkAccess()
241cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ThreadGroup tg = new ThreadGroup("Test Group3");
242cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
243cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st = new Thread(tg, new SimpleThread(1), "SimpleThread5");
244cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.checkAccess();
245cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("CheckAccess passed", true);
246cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (SecurityException e) {
247cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("CheckAccess failed : " + e.getMessage());
248cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
249cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.start();
250cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
251cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.join();
252cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
253cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
254cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        tg.destroy();
255cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
256cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
257cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
258cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#countStackFrames()
259cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
260cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    @SuppressWarnings("deprecation")
261cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_countStackFrames() {
262cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        /*
263cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath         * Thread.countStackFrames() is unpredictable, so we just test that it
264cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath         * doesn't throw an exception.
265cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath         */
266cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread.currentThread().countStackFrames();
267cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
268cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
269cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
270cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#currentThread()
271cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
272cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_currentThread() {
273cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNotNull(Thread.currentThread());
274cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
275cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
276665c45e473c041dc2b1e8d85fbaf7008daa69c06Narayan Kamath    public void test_destroy_throwsUnsupportedOperationException() {
277cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
278cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            new Thread().destroy();
279665c45e473c041dc2b1e8d85fbaf7008daa69c06Narayan Kamath            fail();
280665c45e473c041dc2b1e8d85fbaf7008daa69c06Narayan Kamath        } catch (UnsupportedOperationException expected) {
281cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
282cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
283cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
284cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
285cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#enumerate(java.lang.Thread[])
286cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
287cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_enumerate$Ljava_lang_Thread() {
288cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method int java.lang.Thread.enumerate(java.lang.Thread [])
289cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // The test has been updated according to HARMONY-1974 JIRA issue.
290cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
291cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        class MyThread extends Thread {
292cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            MyThread(ThreadGroup tg, String name) {
293cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                super(tg, name);
294cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
295cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
296cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            boolean failed = false;
297cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            String failMessage = null;
298cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
299cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void run() {
300cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                SimpleThread st1 = null;
301cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                SimpleThread st2 = null;
302cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                ThreadGroup mytg = null;
303cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                Thread firstOne = null;
304cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                Thread secondOne = null;
305cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                try {
306cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    int arrayLength = 10;
307cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    Thread[] tarray = new Thread[arrayLength];
308cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    st1 = new SimpleThread(-1);
309cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    st2 = new SimpleThread(-1);
310cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    mytg = new ThreadGroup("jp");
311cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    firstOne = new Thread(mytg, st1, "firstOne2");
312cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    secondOne = new Thread(mytg, st2, "secondOne1");
313cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    int count = Thread.enumerate(tarray);
314cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    assertEquals("Incorrect value returned1",
315cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            1, count);
316cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    synchronized (st1) {
317cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        firstOne.start();
318cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        try {
319cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            st1.wait();
320cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        } catch (InterruptedException e) {
321cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        }
322cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
323cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    count = Thread.enumerate(tarray);
324cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    assertEquals("Incorrect value returned2",
325cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            2, count);
326cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    synchronized (st2) {
327cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        secondOne.start();
328cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        try {
329cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            st2.wait();
330cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        } catch (InterruptedException e) {
331cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        }
332cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
333cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    count = Thread.enumerate(tarray);
334cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    assertEquals("Incorrect value returned3",
335cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            3, count);
336cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                } catch (junit.framework.AssertionFailedError e) {
337cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    failed = true;
338cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    failMessage = e.getMessage();
339cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                } finally {
340cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    synchronized (st1) {
341cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        firstOne.interrupt();
342cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
343cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    synchronized (st2) {
344cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        secondOne.interrupt();
345cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
346cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    try {
347cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        firstOne.join();
348cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        secondOne.join();
349cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    } catch (InterruptedException e) {
350cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
351cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    mytg.destroy();
352cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
353cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
354cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
355cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ;
356cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
357cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ThreadGroup tg = new ThreadGroup("tg");
358cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        MyThread t = new MyThread(tg, "top");
359cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        t.start();
360cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
361cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            t.join();
362cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
363cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Unexpected interrupt");
364cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
365cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            tg.destroy();
366cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
367cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(t.failMessage, t.failed);
368cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
369cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
370cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
371cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#getContextClassLoader()
372cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
373cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getContextClassLoader() {
374cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.ClassLoader
375cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // java.lang.Thread.getContextClassLoader()
376cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread t = new Thread();
377cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Incorrect class loader returned",
378cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                t.getContextClassLoader() == Thread.currentThread()
379cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        .getContextClassLoader());
380cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        t.start();
381cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
382cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
383cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
384cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
385cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#getName()
386cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
387cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getName() {
388cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.String java.lang.Thread.getName()
389cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(new SimpleThread(1), "SimpleThread6");
390cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("Returned incorrect thread name",
391cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                "SimpleThread6", st.getName());
392cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.start();
393cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
394cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
395cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
396cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#getPriority()
397cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
398cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getPriority() {
399cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method int java.lang.Thread.getPriority()
400cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(new SimpleThread(1));
401cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.setPriority(Thread.MAX_PRIORITY);
402cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Returned incorrect thread priority",
403cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                st.getPriority() == Thread.MAX_PRIORITY);
404cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.start();
405cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
406cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
407cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
408cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#getThreadGroup()
409cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
410cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getThreadGroup() {
411cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.ThreadGroup
412cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // java.lang.Thread.getThreadGroup()
413cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ThreadGroup tg = new ThreadGroup("Test Group4");
414cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(tg, new SimpleThread(1), "SimpleThread8");
415cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Returned incorrect thread group", st.getThreadGroup() == tg);
416cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.start();
417cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
418cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.join();
419cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
420cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
421cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNull("group should be null", st.getThreadGroup());
422cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNotNull("toString() should not be null", st.toString());
423cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        tg.destroy();
424cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
425cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final Object lock = new Object();
426cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread t = new Thread() {
427cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            @Override
428cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void run() {
429cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                synchronized (lock) {
430cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    lock.notifyAll();
431cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
432cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
433cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        };
434cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        synchronized (lock) {
435cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            t.start();
436cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
437cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                lock.wait();
438cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (InterruptedException e) {
439cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
440cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
441cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int running = 0;
442cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        while (t.isAlive())
443cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            running++;
444cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ThreadGroup group = t.getThreadGroup();
445cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNull("ThreadGroup is not null", group);
446cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
447cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
448cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
449cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#interrupt()
450cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
451cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_interrupt() {
452cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Thread.interrupt()
453cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final Object lock = new Object();
454cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        class ChildThread1 extends Thread {
455cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            Thread parent;
456cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
457cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            boolean sync;
458cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
459cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            @Override
460cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void run() {
461cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                if (sync) {
462cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    synchronized (lock) {
463cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        lock.notify();
464cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        try {
465cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            lock.wait();
466cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        } catch (InterruptedException e) {
467cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        }
468cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
469cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
470cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                parent.interrupt();
471cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
472cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
473cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public ChildThread1(Thread p, String name, boolean sync) {
474cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                super(name);
475cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                parent = p;
476cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                this.sync = sync;
477cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
478cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
479cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        boolean interrupted = false;
480cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
481cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ct = new ChildThread1(Thread.currentThread(), "Interrupt Test1",
482cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    false);
483cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            synchronized (lock) {
484cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                ct.start();
485cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                lock.wait();
486cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
487cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
488cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            interrupted = true;
489cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
490cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Failed to Interrupt thread1", interrupted);
491cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
492cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        interrupted = false;
493cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
494cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ct = new ChildThread1(Thread.currentThread(), "Interrupt Test2",
495cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    true);
496cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            synchronized (lock) {
497cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                ct.start();
498cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                lock.wait();
499cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                lock.notify();
500cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
501cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            Thread.sleep(20000);
502cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
503cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            interrupted = true;
504cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
505cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Failed to Interrupt thread2", interrupted);
506cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
507cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
508cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
509cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
510cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#interrupted()
511cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
512cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_interrupted() {
513cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse("Interrupted returned true for non-interrupted thread", Thread
514cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .interrupted());
515cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread.currentThread().interrupt();
516cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Interrupted returned true for non-interrupted thread", Thread.interrupted());
517cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse("Failed to clear interrupted flag", Thread.interrupted());
518cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
519cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
520cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
521cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#isAlive()
522cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
523cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_isAlive() {
524cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method boolean java.lang.Thread.isAlive()
525cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        SimpleThread simple;
526cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(simple = new SimpleThread(500));
527cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse("A thread that wasn't started is alive.", st.isAlive());
528cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        synchronized (simple) {
529cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.start();
530cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
531cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                simple.wait();
532cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (InterruptedException e) {
533cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
534cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
535cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Started thread returned false", st.isAlive());
536cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
537cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.join();
538cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
539cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Thread did not die");
540cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
541cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Stopped thread returned true", !st.isAlive());
542cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
543cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
544cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
545cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#isDaemon()
546cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
547cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_isDaemon() {
548cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method boolean java.lang.Thread.isDaemon()
549cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(new SimpleThread(1), "SimpleThread10");
550cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Non-Daemon thread returned true", !st.isDaemon());
551cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.setDaemon(true);
552cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Daemon thread returned false", st.isDaemon());
553cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.start();
554cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
555cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
556cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
557cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#isInterrupted()
558cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
559cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_isInterrupted() {
560cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method boolean java.lang.Thread.isInterrupted()
561cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        class SpinThread implements Runnable {
562cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public volatile boolean done = false;
563cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
564cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void run() {
565cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                while (!Thread.currentThread().isInterrupted())
566cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    ;
567cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                while (!done)
568cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    ;
569cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
570cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
571cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
572cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        SpinThread spin = new SpinThread();
573cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        spinner = new Thread(spin);
574cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        spinner.start();
575cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread.yield();
576cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
577cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("Non-Interrupted thread returned true", !spinner
578cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    .isInterrupted());
579cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            spinner.interrupt();
580cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("Interrupted thread returned false", spinner
581cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    .isInterrupted());
582cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            spin.done = true;
583cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
584cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            spinner.interrupt();
585cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            spin.done = true;
586cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
587cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
588cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
589cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
590cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#join()
591cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
592cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_join() {
593cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Thread.join()
594cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        SimpleThread simple;
595cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
596cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st = new Thread(simple = new SimpleThread(100));
597cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // cause isAlive() to be compiled by the JIT, as it must be called
598cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // within 100ms below.
599cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("Thread is alive", !st.isAlive());
600cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            synchronized (simple) {
601cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                st.start();
602cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                simple.wait();
603cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
604cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.join();
605cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
606cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Join failed ");
607cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
608cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Joined thread is still alive", !st.isAlive());
609cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        boolean result = true;
610cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread th = new Thread("test");
611cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
612cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            th.join();
613cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
614cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            result = false;
615cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
616cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Hung joining a non-started thread", result);
617cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        th.start();
618cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
619cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
620cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
621cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#join(long)
622cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
623cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_joinJ() {
624cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Thread.join(long)
625cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        SimpleThread simple;
626cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
627cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st = new Thread(simple = new SimpleThread(1000), "SimpleThread12");
628cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // cause isAlive() to be compiled by the JIT, as it must be called
629cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // within 100ms below.
630cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("Thread is alive", !st.isAlive());
631cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            synchronized (simple) {
632cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                st.start();
633cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                simple.wait();
634cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
635cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.join(10);
636cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
637cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Join failed ");
638cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
639cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Join failed to timeout", st.isAlive());
640cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
641cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.interrupt();
642cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
643cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st = new Thread(simple = new SimpleThread(100), "SimpleThread13");
644cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            synchronized (simple) {
645cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                st.start();
646cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                simple.wait();
647cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
648cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.join(1000);
649cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
650cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Join failed : " + e.getMessage());
651cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return;
652cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
653cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Joined thread is still alive", !st.isAlive());
654cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
655cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final Object lock = new Object();
656cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final Thread main = Thread.currentThread();
657cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread killer = new Thread(new Runnable() {
658cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void run() {
659cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                try {
660cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    synchronized (lock) {
661cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        lock.notify();
662cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
663cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    Thread.sleep(100);
664cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                } catch (InterruptedException e) {
665cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    return;
666cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
667cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                main.interrupt();
668cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
669cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        });
670cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        boolean result = true;
671cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread th = new Thread("test");
672cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
673cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            synchronized (lock) {
674cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                killer.start();
675cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                lock.wait();
676cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
677cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            th.join(200);
678cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
679cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            result = false;
680cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
681cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        killer.interrupt();
682cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Hung joining a non-started thread", result);
683cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        th.start();
684cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
685cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
686cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
687cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#join(long, int)
688cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
689cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_joinJI() throws Exception {
690cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Thread.join(long, int)
691cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        SimpleThread simple;
692cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(simple = new SimpleThread(1000), "Squawk1");
693cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Thread is alive", !st.isAlive());
694cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        synchronized (simple) {
695cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.start();
696cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            simple.wait();
697cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
698cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
699cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        long firstRead = System.currentTimeMillis();
700cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.join(100, 999999);
701cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        long secondRead = System.currentTimeMillis();
702cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Did not join by appropriate time: " + secondRead + "-"
703cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                + firstRead + "=" + (secondRead - firstRead), secondRead
704cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                - firstRead <= 300);
705cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Joined thread is not alive", st.isAlive());
706cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.interrupt();
707cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
708cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final Object lock = new Object();
709cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final Thread main = Thread.currentThread();
710cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread killer = new Thread(new Runnable() {
711cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void run() {
712cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                try {
713cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    synchronized (lock) {
714cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        lock.notify();
715cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
716cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    Thread.sleep(100);
717cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                } catch (InterruptedException e) {
718cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    return;
719cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
720cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                main.interrupt();
721cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
722cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        });
723cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        boolean result = true;
724cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread th = new Thread("test");
725cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
726cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            synchronized (lock) {
727cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                killer.start();
728cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                lock.wait();
729cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
730cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            th.join(200, 20);
731cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
732cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            result = false;
733cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
734cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        killer.interrupt();
735cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Hung joining a non-started thread", result);
736cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        th.start();
737cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
738cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
739cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
740cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#run()
741cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
742cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_run() {
743cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Thread.run()
744cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        class RunThread implements Runnable {
745cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            boolean didThreadRun = false;
746cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
747cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void run() {
748cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                didThreadRun = true;
749cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
750cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
751cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        RunThread rt = new RunThread();
752cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread t = new Thread(rt);
753cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
754cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            t.start();
755cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int count = 0;
756cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            while (!rt.didThreadRun && count < 20) {
757cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                Thread.sleep(100);
758cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                count++;
759cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
760cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("Thread did not run", rt.didThreadRun);
761cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            t.join();
762cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
763cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("Joined thread was interrupted", true);
764cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
765cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Joined thread is still alive", !t.isAlive());
766cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
767cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
768cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
769cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#setDaemon(boolean)
770cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
771cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_setDaemonZ() {
772cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Thread.setDaemon(boolean)
773cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(new SimpleThread(1), "SimpleThread14");
774cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.setDaemon(true);
775cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Failed to set thread as daemon thread", st.isDaemon());
776cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.start();
777cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
778cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
779cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
780cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#setName(java.lang.String)
781cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
782cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_setNameLjava_lang_String() {
783cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Thread.setName(java.lang.String)
784cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(new SimpleThread(1), "SimpleThread15");
785cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.setName("Bogus Name");
786cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("Failed to set thread name",
787cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                "Bogus Name", st.getName());
788cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
789cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.setName(null);
790cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Null should not be accepted as a valid name");
791cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (NullPointerException e) {
792cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // success
793cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("Null should not be accepted as a valid name", true);
794cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
795cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.start();
796cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
797cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
798cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
799cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#setPriority(int)
800cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
801cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_setPriorityI() {
802cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Thread.setPriority(int)
803cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(new SimpleThread(1));
804cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.setPriority(Thread.MAX_PRIORITY);
805cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Failed to set priority",
806cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                st.getPriority() == Thread.MAX_PRIORITY);
807cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.start();
808cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
809cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
810cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
811cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#sleep(long)
812cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
813cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_sleepJ() {
814cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Thread.sleep(long)
815cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
816cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // TODO : Test needs enhancing.
817cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        long stime = 0, ftime = 0;
818cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
819cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            stime = System.currentTimeMillis();
820cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            Thread.sleep(1000);
821cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ftime = System.currentTimeMillis();
822cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
823cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Unexpected interrupt received");
824cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
825cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Failed to sleep long enough", (ftime - stime) >= 800);
826cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
827cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
828cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
829cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#sleep(long, int)
830cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
831cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_sleepJI() {
832cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Thread.sleep(long, int)
833cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
834cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // TODO : Test needs revisiting.
835cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        long stime = 0, ftime = 0;
836cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
837cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            stime = System.currentTimeMillis();
838cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            Thread.sleep(1000, 999999);
839cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ftime = System.currentTimeMillis();
840cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
841cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Unexpected interrupt received");
842cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
843cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        long result = ftime - stime;
844cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Failed to sleep long enough: " + result, result >= 900
845cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                && result <= 1100);
846cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
847cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
848cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
849cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#start()
850cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
851cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_start() {
852cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Thread.start()
853cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
854cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ResSupThread t = new ResSupThread(Thread.currentThread());
855cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            synchronized (t) {
856cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                ct = new Thread(t, "Interrupt Test4");
857cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                ct.start();
858cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                t.wait();
859cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
860cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("Thread is not running1", ct.isAlive());
861cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Let the child thread get going.
862cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int orgval = t.getCheckVal();
863cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            Thread.sleep(150);
864cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("Thread is not running2", orgval != t.getCheckVal());
865cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ct.interrupt();
866cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
867cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Unexpected interrupt occurred");
868cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
869cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
870cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
871cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
872cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#toString()
873cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
874cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_toString() {
875cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.String java.lang.Thread.toString()
876cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ThreadGroup tg = new ThreadGroup("Test Group5");
877cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st = new Thread(tg, new SimpleThread(1), "SimpleThread17");
878cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final String stString = st.toString();
879cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final String expected = "Thread[SimpleThread17,5,Test Group5]";
880cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Returned incorrect string: " + stString + "\t(expecting :"
881cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                + expected + ")", stString.equals(expected));
882cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        st.start();
883cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
884cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st.join();
885cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
886cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
887cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        tg.destroy();
888cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
889cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
890cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
891cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#getAllStackTraces()
892cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
893cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getAllStackTraces() {
894cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Map<Thread, StackTraceElement[]> stMap = Thread.getAllStackTraces();
895cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNotNull(stMap);
896cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        //TODO add security-based tests
897cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
898cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
899cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
900cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#getDefaultUncaughtExceptionHandler
901cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#setDefaultUncaughtExceptionHandler
902cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
903cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_get_setDefaultUncaughtExceptionHandler() {
904cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        class Handler implements UncaughtExceptionHandler {
905cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void uncaughtException(Thread thread, Throwable ex) {
906cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
907cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
908cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
909cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final Handler handler = new Handler();
910cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread.setDefaultUncaughtExceptionHandler(handler);
911cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertSame(handler, Thread.getDefaultUncaughtExceptionHandler());
912cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
913cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread.setDefaultUncaughtExceptionHandler(null);
914cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNull(Thread.getDefaultUncaughtExceptionHandler());
915cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        //TODO add security-based tests
916cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
917cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
918cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
919cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#getStackTrace()
920cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
921cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getStackTrace() {
922cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
923cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
924cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNotNull(stackTrace);
925cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
926cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        stack_trace_loop:
927cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        {
928cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            for (int i = 0; i < stackTrace.length; i++) {
929cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                StackTraceElement e = stackTrace[i];
930cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                if (getClass().getName().equals(e.getClassName())) {
931cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    if ("test_getStackTrace".equals(e.getMethodName())) {
932cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        break stack_trace_loop;
933cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
934cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
935cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
936cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("class and method not found in stack trace");
937cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
938cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
939cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        //TODO add security-based tests
940cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
941cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
942cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
943cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#getState()
944cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
945cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getState() {
946cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread.State state = Thread.currentThread().getState();
947cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNotNull(state);
948cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(Thread.State.RUNNABLE, state);
949cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        //TODO add additional state tests
950cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
951cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
952cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
953cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#getUncaughtExceptionHandler
954cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#setUncaughtExceptionHandler
955cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
956cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_get_setUncaughtExceptionHandler() {
957cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        class Handler implements UncaughtExceptionHandler {
958cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void uncaughtException(Thread thread, Throwable ex) {
959cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
960cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
961cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
962cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final Handler handler = new Handler();
963cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread.currentThread().setUncaughtExceptionHandler(handler);
964cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertSame(handler, Thread.currentThread().getUncaughtExceptionHandler());
965cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
966cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Thread.currentThread().setUncaughtExceptionHandler(null);
967cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
968cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        //TODO add security-based tests
969cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
970cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
971cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
972cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Thread#getId()
973cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
974cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getId() {
975cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("current thread's ID is not positive", Thread.currentThread().getId() > 0);
976cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
977cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        //check all the current threads for positive IDs
978cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Map<Thread, StackTraceElement[]> stMap = Thread.getAllStackTraces();
979cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (Thread thread : stMap.keySet()) {
980cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("thread's ID is not positive: " + thread.getName(), thread.getId() > 0);
981cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
982cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
983cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
984cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
985cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    @Override
986cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    protected void tearDown() {
987cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
988cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (st != null)
989cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                st.interrupt();
990cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (Exception e) {
991cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
992cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
993cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (spinner != null)
994cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                spinner.interrupt();
995cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (Exception e) {
996cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
997cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
998cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (ct != null)
999cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                ct.interrupt();
1000cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (Exception e) {
1001cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
1002cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
1003cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
1004cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            spinner = null;
1005cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            st = null;
1006cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ct = null;
1007cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            System.runFinalization();
1008cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (Exception e) {
1009cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
1010cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
1011cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
1012