1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.luni.tests.java.lang;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.lang.Thread.UncaughtExceptionHandler;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.Permission;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Map;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class ThreadTest extends junit.framework.TestCase {
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	static class SimpleThread implements Runnable {
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		int delay;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public void run() {
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			try {
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				synchronized (this) {
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					this.notify();
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					this.wait(delay);
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				}
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			} catch (InterruptedException e) {
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				return;
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public SimpleThread(int d) {
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			if (d >= 0)
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				delay = d;
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	static class YieldThread implements Runnable {
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		volatile int delay;
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public void run() {
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			int x = 0;
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			while (true) {
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				++x;
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public YieldThread(int d) {
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			if (d >= 0)
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				delay = d;
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	static class ResSupThread implements Runnable {
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread parent;
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		volatile int checkVal = -1;
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public void run() {
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			try {
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				synchronized (this) {
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					this.notify();
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				}
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				while (true) {
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					checkVal++;
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					zz();
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					Thread.sleep(100);
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				}
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			} catch (InterruptedException e) {
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				return;
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			} catch (BogusException e) {
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				try {
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					// Give parent a chance to sleep
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					Thread.sleep(500);
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				} catch (InterruptedException x) {
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				}
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				parent.interrupt();
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				while (!Thread.currentThread().isInterrupted()) {
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					// Don't hog the CPU
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					try {
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes						Thread.sleep(50);
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					} catch (InterruptedException x) {
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes						// This is what we've been waiting for...don't throw it
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes						// away!
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes						break;
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					}
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				}
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public void zz() throws BogusException {
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public ResSupThread(Thread t) {
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			parent = t;
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public synchronized int getCheckVal() {
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			return checkVal;
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	static class BogusException extends Throwable {
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final long serialVersionUID = 1L;
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public BogusException(String s) {
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			super(s);
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	Thread st, ct, spinner;
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#Thread(java.lang.Runnable)
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_ConstructorLjava_lang_Runnable() {
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Test for method java.lang.Thread(java.lang.Runnable)
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ct = new Thread(new SimpleThread(10));
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ct.start();
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#Thread(java.lang.Runnable, java.lang.String)
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_ConstructorLjava_lang_RunnableLjava_lang_String() {
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.Thread(java.lang.Runnable,
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// java.lang.String)
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread st1 = new Thread(new SimpleThread(1), "SimpleThread1");
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals("Constructed thread with incorrect thread name", "SimpleThread1", st1
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				.getName());
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st1.start();
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#Thread(java.lang.String)
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_ConstructorLjava_lang_String() {
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.Thread(java.lang.String)
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread t = new Thread("Testing");
150fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes		assertEquals("Created tread with incorrect name",
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"Testing", t.getName());
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		t.start();
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#Thread(java.lang.ThreadGroup, java.lang.Runnable)
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_ConstructorLjava_lang_ThreadGroupLjava_lang_Runnable() {
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.Thread(java.lang.ThreadGroup,
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// java.lang.Runnable)
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ThreadGroup tg = new ThreadGroup("Test Group1");
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st = new Thread(tg, new SimpleThread(1), "SimpleThread2");
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Returned incorrect thread group", st.getThreadGroup() == tg);
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.start();
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st.join();
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		tg.destroy();
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#Thread(java.lang.ThreadGroup, java.lang.Runnable,
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 *        java.lang.String)
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_String() {
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.Thread(java.lang.ThreadGroup,
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// java.lang.Runnable, java.lang.String)
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ThreadGroup tg = new ThreadGroup("Test Group2");
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st = new Thread(tg, new SimpleThread(1), "SimpleThread3");
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Constructed incorrect thread", (st.getThreadGroup() == tg)
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				&& st.getName().equals("SimpleThread3"));
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.start();
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st.join();
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		tg.destroy();
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Runnable r = new Runnable() {
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			public void run() {
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		};
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ThreadGroup foo = null;
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			new Thread(foo = new ThreadGroup("foo"), r, null);
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			// Should not get here
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("Null cannot be accepted as Thread name");
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (NullPointerException npe) {
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue("Null cannot be accepted as Thread name", true);
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			foo.destroy();
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#Thread(java.lang.ThreadGroup, java.lang.String)
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_ConstructorLjava_lang_ThreadGroupLjava_lang_String() {
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.Thread(java.lang.ThreadGroup,
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// java.lang.String)
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st = new Thread(new SimpleThread(1), "SimpleThread4");
214fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes		assertEquals("Returned incorrect thread name",
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"SimpleThread4", st.getName());
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.start();
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#activeCount()
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_activeCount() {
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method int java.lang.Thread.activeCount()
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread t = new Thread(new SimpleThread(10));
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		int active = 0;
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		synchronized (t) {
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			t.start();
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			active = Thread.activeCount();
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Incorrect activeCount for current group: " + active, active > 1);
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			t.join();
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#checkAccess()
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_checkAccess() {
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.Thread.checkAccess()
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ThreadGroup tg = new ThreadGroup("Test Group3");
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st = new Thread(tg, new SimpleThread(1), "SimpleThread5");
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st.checkAccess();
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue("CheckAccess passed", true);
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (SecurityException e) {
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("CheckAccess failed : " + e.getMessage());
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.start();
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st.join();
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		tg.destroy();
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.lang.Thread#countStackFrames()
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings("deprecation")
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_countStackFrames() {
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /*
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Thread.countStackFrames() is unpredictable, so we just test that it
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * doesn't throw an exception.
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread.currentThread().countStackFrames();
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#currentThread()
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_currentThread() {
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	    assertNotNull(Thread.currentThread());
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#destroy()
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	@SuppressWarnings("deprecation")
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_destroy() {
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	    try {
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	        new Thread().destroy();
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // FIXME uncomment when IBM VME is updated
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //fail("NoSuchMethodError was not thrown");
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NoSuchMethodError e) {
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#enumerate(java.lang.Thread[])
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_enumerate$Ljava_lang_Thread() {
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Test for method int java.lang.Thread.enumerate(java.lang.Thread [])
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // The test has been updated according to HARMONY-1974 JIRA issue.
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    	class MyThread extends Thread {
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            MyThread(ThreadGroup tg, String name) {
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                super(tg, name);
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
301fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            boolean failed = false;
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String failMessage = null;
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public void run() {
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            	SimpleThread st1 = null;
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            	SimpleThread st2 = null;
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            	ThreadGroup mytg = null;
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            	Thread firstOne = null;
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            	Thread secondOne = null;
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    int arrayLength = 10;
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread[] tarray = new Thread[arrayLength];
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    st1 = new SimpleThread(-1);
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    st2 = new SimpleThread(-1);
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    mytg = new ThreadGroup("jp");
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    firstOne = new Thread(mytg, st1, "firstOne2");
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    secondOne = new Thread(mytg, st2, "secondOne1");
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    int count = Thread.enumerate(tarray);
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    assertEquals("Incorrect value returned1",
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            1, count);
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    synchronized (st1) {
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        firstOne.start();
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        try {
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            st1.wait();
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        } catch (InterruptedException e) {
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        }
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    count = Thread.enumerate(tarray);
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    assertEquals("Incorrect value returned2",
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            2, count);
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    synchronized (st2) {
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        secondOne.start();
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        try {
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            st2.wait();
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        } catch (InterruptedException e) {
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        }
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    count = Thread.enumerate(tarray);
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    assertEquals("Incorrect value returned3",
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            3, count);
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } catch (junit.framework.AssertionFailedError e) {
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    failed = true;
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    failMessage = e.getMessage();
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } finally {
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    synchronized (st1) {
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        firstOne.interrupt();
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    synchronized (st2) {
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        secondOne.interrupt();
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        firstOne.join();
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        secondOne.join();
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    } catch (InterruptedException e) {
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    mytg.destroy();
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
361fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ThreadGroup tg = new ThreadGroup("tg");
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyThread t = new MyThread(tg, "top");
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        t.start();
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            t.join();
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InterruptedException e) {
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected interrupt");
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            tg.destroy();
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(t.failMessage, t.failed);
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#getContextClassLoader()
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_getContextClassLoader() {
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.ClassLoader
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// java.lang.Thread.getContextClassLoader()
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread t = new Thread();
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Incorrect class loader returned",
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				t.getContextClassLoader() == Thread.currentThread()
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes						.getContextClassLoader());
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		t.start();
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#getName()
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_getName() {
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.String java.lang.Thread.getName()
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st = new Thread(new SimpleThread(1), "SimpleThread6");
395fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes		assertEquals("Returned incorrect thread name",
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"SimpleThread6", st.getName());
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.start();
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#getPriority()
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_getPriority() {
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method int java.lang.Thread.getPriority()
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st = new Thread(new SimpleThread(1));
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.setPriority(Thread.MAX_PRIORITY);
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Returned incorrect thread priority",
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				st.getPriority() == Thread.MAX_PRIORITY);
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.start();
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#getThreadGroup()
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_getThreadGroup() {
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.ThreadGroup
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// java.lang.Thread.getThreadGroup()
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ThreadGroup tg = new ThreadGroup("Test Group4");
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st = new Thread(tg, new SimpleThread(1), "SimpleThread8");
420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Returned incorrect thread group", st.getThreadGroup() == tg);
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.start();
422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st.join();
424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertNull("group should be null", st.getThreadGroup());
427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertNotNull("toString() should not be null", st.toString());
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		tg.destroy();
429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
430561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		final Object lock = new Object();
431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread t = new Thread() {
432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			@Override
433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public void run() {
434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				synchronized (lock) {
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					lock.notifyAll();
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				}
437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		};
439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		synchronized (lock) {
440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			t.start();
441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			try {
442561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				lock.wait();
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			} catch (InterruptedException e) {
444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		int running = 0;
447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		while (t.isAlive())
448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			running++;
449561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ThreadGroup group = t.getThreadGroup();
450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertNull("ThreadGroup is not null", group);
451561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#interrupt()
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_interrupt() {
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.Thread.interrupt()
458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		final Object lock = new Object();
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		class ChildThread1 extends Thread {
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			Thread parent;
461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			boolean sync;
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
464561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			@Override
465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public void run() {
466561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				if (sync) {
467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					synchronized (lock) {
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes						lock.notify();
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes						try {
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes							lock.wait();
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes						} catch (InterruptedException e) {
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes						}
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					}
474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				}
475561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				parent.interrupt();
476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			public ChildThread1(Thread p, String name, boolean sync) {
479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				super(name);
480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				parent = p;
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				this.sync = sync;
482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		boolean interrupted = false;
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ct = new ChildThread1(Thread.currentThread(), "Interrupt Test1",
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					false);
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			synchronized (lock) {
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ct.start();
490561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				lock.wait();
491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			interrupted = true;
494561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Failed to Interrupt thread1", interrupted);
496561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		interrupted = false;
498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
499561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ct = new ChildThread1(Thread.currentThread(), "Interrupt Test2",
500561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					true);
501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			synchronized (lock) {
502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ct.start();
503561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				lock.wait();
504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				lock.notify();
505561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			Thread.sleep(20000);
507561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
508561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			interrupted = true;
509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Failed to Interrupt thread2", interrupted);
511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
515561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#interrupted()
516561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_interrupted() {
518561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Interrupted returned true for non-interrupted thread", Thread
519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .interrupted());
520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread.currentThread().interrupt();
521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Interrupted returned true for non-interrupted thread", Thread.interrupted());
522561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Failed to clear interrupted flag", Thread.interrupted());
523561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
524561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
525561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
526561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#isAlive()
527561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
528561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_isAlive() {
529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method boolean java.lang.Thread.isAlive()
530561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		SimpleThread simple;
531561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st = new Thread(simple = new SimpleThread(500));
532561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertFalse("A thread that wasn't started is alive.", st.isAlive());
533561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		synchronized (simple) {
534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st.start();
535561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			try {
536561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				simple.wait();
537561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			} catch (InterruptedException e) {
538561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
539561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
540561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Started thread returned false", st.isAlive());
541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st.join();
543561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("Thread did not die");
545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
546561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Stopped thread returned true", !st.isAlive());
547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
550561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#isDaemon()
551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
552561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_isDaemon() {
553561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method boolean java.lang.Thread.isDaemon()
554561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st = new Thread(new SimpleThread(1), "SimpleThread10");
555561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Non-Daemon thread returned true", !st.isDaemon());
556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.setDaemon(true);
557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Daemon thread returned false", st.isDaemon());
558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.start();
559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#isInterrupted()
563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_isInterrupted() {
565561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method boolean java.lang.Thread.isInterrupted()
566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		class SpinThread implements Runnable {
567561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			public volatile boolean done = false;
568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
569561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			public void run() {
570561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				while (!Thread.currentThread().isInterrupted())
571561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					;
572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				while (!done)
573561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					;
574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
576561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
577561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		SpinThread spin = new SpinThread();
578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		spinner = new Thread(spin);
579561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		spinner.start();
580561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread.yield();
581561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
582561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue("Non-Interrupted thread returned true", !spinner
583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					.isInterrupted());
584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			spinner.interrupt();
585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue("Interrupted thread returned false", spinner
586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					.isInterrupted());
587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			spin.done = true;
588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} finally {
589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			spinner.interrupt();
590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			spin.done = true;
591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
593561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
594561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#join()
596561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
597561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_join() {
598561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.Thread.join()
599561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		SimpleThread simple;
600561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st = new Thread(simple = new SimpleThread(100));
602561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			// cause isAlive() to be compiled by the JIT, as it must be called
603561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			// within 100ms below.
604561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue("Thread is alive", !st.isAlive());
605561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			synchronized (simple) {
606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				st.start();
607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				simple.wait();
608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st.join();
610561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("Join failed ");
612561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Joined thread is still alive", !st.isAlive());
614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		boolean result = true;
615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread th = new Thread("test");
616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			th.join();
618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			result = false;
620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Hung joining a non-started thread", result);
622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		th.start();
623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#join(long)
627561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
628561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_joinJ() {
629561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.Thread.join(long)
630561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		SimpleThread simple;
631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
632561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st = new Thread(simple = new SimpleThread(1000), "SimpleThread12");
633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			// cause isAlive() to be compiled by the JIT, as it must be called
634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			// within 100ms below.
635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue("Thread is alive", !st.isAlive());
636561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			synchronized (simple) {
637561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				st.start();
638561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				simple.wait();
639561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
640561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st.join(10);
641561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
642561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("Join failed ");
643561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
644561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Join failed to timeout", st.isAlive());
645561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
646561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.interrupt();
647561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
648561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st = new Thread(simple = new SimpleThread(100), "SimpleThread13");
649561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			synchronized (simple) {
650561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				st.start();
651561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				simple.wait();
652561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
653561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st.join(1000);
654561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
655561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("Join failed : " + e.getMessage());
656561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			return;
657561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
658561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Joined thread is still alive", !st.isAlive());
659561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
660561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		final Object lock = new Object();
661561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		final Thread main = Thread.currentThread();
662561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread killer = new Thread(new Runnable() {
663561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			public void run() {
664561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				try {
665561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					synchronized (lock) {
666561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes						lock.notify();
667561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					}
668561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					Thread.sleep(100);
669561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				} catch (InterruptedException e) {
670561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					return;
671561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				}
672561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				main.interrupt();
673561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
674561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		});
675561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		boolean result = true;
676561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread th = new Thread("test");
677561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
678561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			synchronized (lock) {
679561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				killer.start();
680561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				lock.wait();
681561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
682561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			th.join(200);
683561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
684561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			result = false;
685561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
686561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		killer.interrupt();
687561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Hung joining a non-started thread", result);
688561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		th.start();
689561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
690561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
691561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
692561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#join(long, int)
693561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
694561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_joinJI() throws Exception {
695561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.Thread.join(long, int)
696561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		SimpleThread simple;
697561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                st = new Thread(simple = new SimpleThread(1000), "Squawk1");
698561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertTrue("Thread is alive", !st.isAlive());
699561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                synchronized (simple) {
700561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        st.start();
701561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        simple.wait();
702561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
703fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
704561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                long firstRead = System.currentTimeMillis();
705561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                st.join(100, 999999);
706561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                long secondRead = System.currentTimeMillis();
707561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertTrue("Did not join by appropriate time: " + secondRead + "-"
708561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                + firstRead + "=" + (secondRead - firstRead), secondRead
709561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                - firstRead <= 300);
710561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertTrue("Joined thread is not alive", st.isAlive());
711fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes                st.interrupt();
712561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
713561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		final Object lock = new Object();
714561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		final Thread main = Thread.currentThread();
715561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread killer = new Thread(new Runnable() {
716561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			public void run() {
717561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				try {
718561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					synchronized (lock) {
719561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes						lock.notify();
720561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					}
721561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					Thread.sleep(100);
722561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				} catch (InterruptedException e) {
723561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					return;
724561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				}
725561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				main.interrupt();
726561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
727561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		});
728561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		boolean result = true;
729561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread th = new Thread("test");
730561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
731561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			synchronized (lock) {
732561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				killer.start();
733561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				lock.wait();
734561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
735561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			th.join(200, 20);
736561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
737561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			result = false;
738561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
739561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		killer.interrupt();
740561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Hung joining a non-started thread", result);
741561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		th.start();
742561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
743561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
744561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
745561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#run()
746561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
747561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_run() {
748561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.Thread.run()
749561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		class RunThread implements Runnable {
750561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			boolean didThreadRun = false;
751561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
752561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			public void run() {
753561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				didThreadRun = true;
754561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
755561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
756561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		RunThread rt = new RunThread();
757561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Thread t = new Thread(rt);
758561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
759561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			t.start();
760561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			int count = 0;
761561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			while (!rt.didThreadRun && count < 20) {
762561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				Thread.sleep(100);
763561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				count++;
764561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
765561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue("Thread did not run", rt.didThreadRun);
766561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			t.join();
767561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
768561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue("Joined thread was interrupted", true);
769561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
770561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Joined thread is still alive", !t.isAlive());
771561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
772561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
773561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
774561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#setDaemon(boolean)
775561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
776561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_setDaemonZ() {
777561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.Thread.setDaemon(boolean)
778561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st = new Thread(new SimpleThread(1), "SimpleThread14");
779561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.setDaemon(true);
780561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Failed to set thread as daemon thread", st.isDaemon());
781561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.start();
782561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
783561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
784561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
785561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#setName(java.lang.String)
786561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
787561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_setNameLjava_lang_String() {
788561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.Thread.setName(java.lang.String)
789561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st = new Thread(new SimpleThread(1), "SimpleThread15");
790561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.setName("Bogus Name");
791fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes		assertEquals("Failed to set thread name",
792561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"Bogus Name", st.getName());
793561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
794561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st.setName(null);
795561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("Null should not be accepted as a valid name");
796561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (NullPointerException e) {
797561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			// success
798561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue("Null should not be accepted as a valid name", true);
799561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
800561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.start();
801561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
802561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
803561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
804561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#setPriority(int)
805561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
806561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_setPriorityI() {
807561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.Thread.setPriority(int)
808561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st = new Thread(new SimpleThread(1));
809561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.setPriority(Thread.MAX_PRIORITY);
810561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Failed to set priority",
811561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				st.getPriority() == Thread.MAX_PRIORITY);
812561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.start();
813561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
814561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
815561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
816561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#sleep(long)
817561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
818561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_sleepJ() {
819561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.Thread.sleep(long)
820561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
821561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// TODO : Test needs enhancing.
822561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		long stime = 0, ftime = 0;
823561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
824561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			stime = System.currentTimeMillis();
825561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			Thread.sleep(1000);
826561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ftime = System.currentTimeMillis();
827561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
828561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("Unexpected interrupt received");
829561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
830561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Failed to sleep long enough", (ftime - stime) >= 800);
831561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
832561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
833561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
834561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#sleep(long, int)
835561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
836561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_sleepJI() {
837561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.Thread.sleep(long, int)
838561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
839561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// TODO : Test needs revisiting.
840561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		long stime = 0, ftime = 0;
841561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
842561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			stime = System.currentTimeMillis();
843561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			Thread.sleep(1000, 999999);
844561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ftime = System.currentTimeMillis();
845561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
846561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("Unexpected interrupt received");
847561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
848561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		long result = ftime - stime;
849561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Failed to sleep long enough: " + result, result >= 900
850561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				&& result <= 1100);
851561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
852561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
853561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
854561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#start()
855561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
856561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_start() {
857561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.Thread.start()
858561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
859561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ResSupThread t = new ResSupThread(Thread.currentThread());
860561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			synchronized (t) {
861561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ct = new Thread(t, "Interrupt Test4");
862561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ct.start();
863561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				t.wait();
864561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
865561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue("Thread is not running1", ct.isAlive());
866561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			// Let the child thread get going.
867561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			int orgval = t.getCheckVal();
868561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			Thread.sleep(150);
869561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue("Thread is not running2", orgval != t.getCheckVal());
870561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ct.interrupt();
871561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
872561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("Unexpected interrupt occurred");
873561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
874561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
875561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
876561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
877561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.Thread#toString()
878561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
879561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_toString() {
880561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.String java.lang.Thread.toString()
881561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ThreadGroup tg = new ThreadGroup("Test Group5");
882561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st = new Thread(tg, new SimpleThread(1), "SimpleThread17");
883561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		final String stString = st.toString();
884561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		final String expected = "Thread[SimpleThread17,5,Test Group5]";
885561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Returned incorrect string: " + stString + "\t(expecting :"
886561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				+ expected + ")", stString.equals(expected));
887561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		st.start();
888561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
889561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st.join();
890561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (InterruptedException e) {
891561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
892561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		tg.destroy();
893561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
894fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
895561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
896561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.lang.Thread#getAllStackTraces()
897561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
898561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getAllStackTraces() {
899561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Map<Thread, StackTraceElement[]> stMap = Thread.getAllStackTraces();
900561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(stMap);
901561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //TODO add security-based tests
902561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
903fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
904561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
905561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.lang.Thread#getDefaultUncaughtExceptionHandler
906561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.lang.Thread#setDefaultUncaughtExceptionHandler
907561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
908561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_get_setDefaultUncaughtExceptionHandler() {
909561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        class Handler implements UncaughtExceptionHandler {
910561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public void uncaughtException(Thread thread, Throwable ex) {
911561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
912561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
913fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
914561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        final Handler handler = new Handler();
915561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread.setDefaultUncaughtExceptionHandler(handler);
916561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(handler, Thread.getDefaultUncaughtExceptionHandler());
917fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
918561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread.setDefaultUncaughtExceptionHandler(null);
919561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(Thread.getDefaultUncaughtExceptionHandler());
920561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //TODO add security-based tests
921561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
922fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
923561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
924561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.lang.Thread#getStackTrace()
925561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
926561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getStackTrace() {
927561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
928fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
929561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(stackTrace);
930561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
931561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        stack_trace_loop: {
932561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int i = 0; i < stackTrace.length; i++) {
933561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                StackTraceElement e = stackTrace[i];
934561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (getClass().getName().equals(e.getClassName())) {
935561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if ("test_getStackTrace".equals(e.getMethodName())) {
936561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        break stack_trace_loop;
937561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
938561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
939561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
940561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("class and method not found in stack trace");
941561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
942fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
943561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //TODO add security-based tests
944561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
945fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
946561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
947561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.lang.Thread#getState()
948561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
949561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getState() {
950561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread.State state = Thread.currentThread().getState();
951561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(state);
952561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(Thread.State.RUNNABLE, state);
953561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //TODO add additional state tests
954561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
955fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
956561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
957561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.lang.Thread#getUncaughtExceptionHandler
958561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.lang.Thread#setUncaughtExceptionHandler
959561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
960561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_get_setUncaughtExceptionHandler() {
961561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        class Handler implements UncaughtExceptionHandler {
962561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public void uncaughtException(Thread thread, Throwable ex) {
963561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
964561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
965fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
966561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        final Handler handler = new Handler();
967561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread.currentThread().setUncaughtExceptionHandler(handler);
968561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(handler, Thread.currentThread().getUncaughtExceptionHandler());
969fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
970561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread.currentThread().setUncaughtExceptionHandler(null);
971561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
972561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //TODO add security-based tests
973561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
974fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
975561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
976561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.lang.Thread#getId()
977561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
978561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getId() {
979561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("current thread's ID is not positive", Thread.currentThread().getId() > 0);
980fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes
981561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //check all the current threads for positive IDs
982561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Map<Thread, StackTraceElement[]> stMap = Thread.getAllStackTraces();
983561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (Thread thread : stMap.keySet()) {
984561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertTrue("thread's ID is not positive: " + thread.getName(), thread.getId() > 0);
985561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
986561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
987561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
988561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
989561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	@Override
990561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void tearDown() {
991561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
992561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			if (st != null)
993561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				st.interrupt();
994561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (Exception e) {
995561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
996561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
997561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			if (spinner != null)
998561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				spinner.interrupt();
999561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (Exception e) {
1000561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1001561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
1002561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			if (ct != null)
1003561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ct.interrupt();
1004561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (Exception e) {
1005561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1006561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1007561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
1008561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			spinner = null;
1009561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			st = null;
1010561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ct = null;
1011561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.runFinalization();
1012561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (Exception e) {
1013561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1014561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
1015561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
1016