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 */
17ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamathpackage org.apache.harmony.tests.java.lang;
18cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
19cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathpublic class ObjectTest extends junit.framework.TestCase {
20cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
21cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
22cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Test objects.
23cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
24cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    Object obj1 = new Object();
25cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
26cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    Object obj2 = new Object();
27cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
28cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
29cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Generic state indicator.
30cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
31cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    int status = 0;
32cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
33cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    int ready = 0;
34cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
35cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
36cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Object#Object()
37cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
38cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_Constructor() {
39cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.Object()
40cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNotNull("Constructor failed !!!", new Object());
41cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
42cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
43cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
44cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Object#equals(java.lang.Object)
45cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
46cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_equalsLjava_lang_Object() {
47cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method boolean java.lang.Object.equals(java.lang.Object)
48cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Same object should be equal", obj1.equals(obj1));
49cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Different objects should not be equal", !obj1.equals(obj2));
50cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
51cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
52cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
53cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Object#getClass()
54cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
55cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getClass() throws Exception {
56cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.Class java.lang.Object.getClass()
57cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        String classNames[] = { "java.lang.Object", "java.lang.Throwable",
58cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                "java.lang.StringBuffer" };
59cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Class<?> classToTest = null;
60cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Object instanceToTest = null;
61cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
62cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        status = 0;
63cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < classNames.length; ++i) {
64cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            classToTest = Class.forName(classNames[i]);
65cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            instanceToTest = classToTest.newInstance();
66cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("Instance didn't match creator class.",
67cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    instanceToTest.getClass() == classToTest);
68cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("Instance didn't match class with matching name.",
69cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    instanceToTest.getClass() == Class
70cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            .forName(classNames[i]));
71cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
72cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
73cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
74cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
75cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Object#hashCode()
76cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
77cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_hashCode() {
78cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method int java.lang.Object.hashCode()
79cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Same object should have same hash.",
80cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                obj1.hashCode() == obj1.hashCode());
81cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Same object should have same hash.",
82cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                obj2.hashCode() == obj2.hashCode());
83cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
84cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
85cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
86cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Object#notify()
87cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
88cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_notify() {
89cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Object.notify()
90cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
91cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Inner class to run test thread.
92cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        class TestThread implements Runnable {
93cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void run() {
94cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                synchronized (obj1) {
95cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    try {
96cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        ready += 1;
97cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        obj1.wait();// Wait for ever.
98cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        status += 1;
99cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    } catch (InterruptedException ex) {
100cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        status = -1000;
101cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
102cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
103cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
104cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
105cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ;
106cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
107cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Start of test code.
108cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
109cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Warning:
110cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // This code relies on each thread getting serviced within
111cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // 200 mSec of when it is notified. Although this
112cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // seems reasonable, it could lead to false-failures.
113cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
114cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ready = 0;
115cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        status = 0;
116cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final int readyWaitSecs = 3;
117cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
118cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final int threadCount = 20;
119cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < threadCount; ++i) {
120cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            new Thread(new TestThread()).start();
121cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
122cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        synchronized (obj1) {
123cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
124cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
125cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // Wait up to readyWaitSeconds for all threads to be waiting on
126cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // monitor
127cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                for (int i = 0; i < readyWaitSecs; i++) {
128cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    obj1.wait(1000, 0);
129cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    if (ready == threadCount) {
130cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        break;
131cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
132cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
133cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
134cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // Check pre-conditions of testing notifyAll
135cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                assertTrue("Not all launched threads are waiting. (ready = "
136cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        + ready + ")", ready == threadCount);
137cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                assertTrue("Thread woke too early. (status = " + status + ")",
138cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        status == 0);
139cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
140cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                for (int i = 1; i <= threadCount; ++i) {
141cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    obj1.notify();
142cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    obj1.wait(200, 0);
143cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    assertTrue("Out of sync. (expected " + i + " but got "
144cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            + status + ")", status == i);
145cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
146cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
147cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (InterruptedException ex) {
148cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                fail(
149cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        "Unexpectedly got an InterruptedException. (status = "
150cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                + status + ")");
151cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
152cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
153cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
154cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
155cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
156cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Object#notifyAll()
157cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
158cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_notifyAll() {
159cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Object.notifyAll()
160cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
161cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Inner class to run test thread.
162cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        class TestThread implements Runnable {
163cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void run() {
164cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                synchronized (obj1) {
165cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    try {
166cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        ready += 1;
167cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        obj1.wait();// Wait for ever.
168cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        status += 1;
169cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    } catch (InterruptedException ex) {
170cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        status = -1000;
171cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
172cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
173cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
174cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
175cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ;
176cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
177cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Start of test code.
178cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
179cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Warning:
180cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // This code relies on all threads getting serviced within
181cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // 5 seconds of when they are notified. Although this
182cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // seems reasonable, it could lead to false-failures.
183cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
184cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        status = 0;
185cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ready = 0;
186cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final int readyWaitSecs = 3;
187cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final int threadCount = 20;
188cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < threadCount; ++i) {
189cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            new Thread(new TestThread()).start();
190cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
191cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
192cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        synchronized (obj1) {
193cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
194cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
195cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
196cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // Wait up to readyWaitSeconds for all threads to be waiting on
197cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // monitor
198cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                for (int i = 0; i < readyWaitSecs; i++) {
199cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    obj1.wait(1000, 0);
200cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    if (ready == threadCount) {
201cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        break;
202cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
203cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
204cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
205cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // Check pre-conditions of testing notifyAll
206cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                assertTrue("Not all launched threads are waiting. (ready = "
207cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        + ready + ")", ready == threadCount);
208cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                assertTrue("At least one thread woke too early. (status = "
209cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        + status + ")", status == 0);
210cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
211cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                obj1.notifyAll();
212cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
213cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                obj1.wait(5000, 0);
214cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
215cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                assertTrue(
216cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        "At least one thread did not get notified. (status = "
217cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                + status + ")", status == threadCount);
218cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
219cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (InterruptedException ex) {
220cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                fail(
221cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        "Unexpectedly got an InterruptedException. (status = "
222cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                + status + ")");
223cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
224cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
225cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
226cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
227cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
228cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
229cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Object#toString()
230cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
231cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_toString() {
232cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.lang.String java.lang.Object.toString()
233cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNotNull("Object toString returned null.", obj1.toString());
234cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
235cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
236cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
237cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Object#wait()
238cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
239cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_wait() {
240cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Object.wait()
241cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
242cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Inner class to run test thread.
243cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        class TestThread implements Runnable {
244cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void run() {
245cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                synchronized (obj1) {
246cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    try {
247cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        obj1.wait();// Wait for ever.
248cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        status = 1;
249cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    } catch (InterruptedException ex) {
250cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        status = -1;
251cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
252cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
253cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
254cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
255cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ;
256cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
257cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Start of test code.
258cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
259cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Warning:
260cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // This code relies on threads getting serviced within
261cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // 1 second of when they are notified. Although this
262cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // seems reasonable, it could lead to false-failures.
263cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
264cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        status = 0;
265cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        new Thread(new TestThread()).start();
266cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        synchronized (obj1) {
267cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
268cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                obj1.wait(1000, 0);
269cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                assertTrue("Thread woke too early. (status = " + status + ")",
270cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        status == 0);
271cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                obj1.notifyAll();
272cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                obj1.wait(1000, 0);
273cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                assertTrue("Thread did not get notified. (status = " + status
274cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        + ")", status == 1);
275cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (InterruptedException ex) {
276cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                fail(
277cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        "Unexpectedly got an InterruptedException. (status = "
278cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                + status + ")");
279cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
280cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
281cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
282cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
283cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
284cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Object#wait(long)
285cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
286cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_waitJ() {
287cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Object.wait(long)
288cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
289cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Start of test code.
290cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
291cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final int loopCount = 20;
292cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final int allowableError = 100; // millesconds
293cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final int delay = 200; // milliseconds
294cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        synchronized (obj1) {
295cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
296cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                int count = 0;
297cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                long[][] toLong = new long[3][3];
298cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                for (int i = 0; i < loopCount; ++i) {
299cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    long before = System.currentTimeMillis();
300cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    obj1.wait(delay, 0);
301cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    long after = System.currentTimeMillis();
302cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    long error = (after - before - delay);
303cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    if (error < 0)
304cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        error = -error;
305cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    if (i > 0 && error > allowableError) {
306cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        // Allow jit to warm up before testing
307cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        if (count < toLong.length) {
308cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            toLong[count][0] = i;
309cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            toLong[count][1] = before;
310cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            toLong[count][2] = after;
311cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            count++;
312cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        }
313cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        if (error > (1000 + delay) || count == toLong.length) {
314cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            StringBuffer sb = new StringBuffer();
315cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            for (int j = 0; j < count; j++) {
316cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                sb
317cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                        .append("wakeup time too inaccurate, iteration ");
318cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                sb.append(toLong[j][0]);
319cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                sb.append(", before: ");
320cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                sb.append(toLong[j][1]);
321cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                sb.append(" after: ");
322cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                sb.append(toLong[j][2]);
323cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                sb.append(" diff: ");
324cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                sb.append(toLong[j][2] - toLong[j][1]);
325cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                sb.append("\n");
326cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            }
327cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            fail(sb.toString());
328cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        }
329cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
330cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
331cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (InterruptedException ex) {
332cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                fail(
333cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        "Unexpectedly got an InterruptedException. (status = "
334cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                + status + ")");
335cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
336cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
337cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
338cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
339cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
340cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.lang.Object#wait(long, int)
341cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
342cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_waitJI() {
343cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method void java.lang.Object.wait(long, int)
344cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
345cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Inner class to run test thread.
346cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        class TestThread implements Runnable {
347cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public void run() {
348cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                synchronized (obj1) {
349cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    try {
350cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        obj1.wait(0, 1); // Don't wait very long.
351cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        status = 1;
352cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        obj1.wait(0, 0); // Wait for ever.
353cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        status = 2;
354cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    } catch (InterruptedException ex) {
355cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        status = -1;
356cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
357cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
358cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
359cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
360cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ;
361cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
362cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Start of test code.
363cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
364cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Warning:
365cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // This code relies on threads getting serviced within
366cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // 1 second of when they are notified. Although this
367cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // seems reasonable, it could lead to false-failures.
368cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
369cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        status = 0;
370cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        new Thread(new TestThread()).start();
371cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        synchronized (obj1) {
372cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
373cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                obj1.wait(1000, 0);
374cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                assertTrue("Thread did not wake after 1 ms. (status = "
375cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        + status + ")", status == 1);
376cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                obj1.notifyAll();
377cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                obj1.wait(1000, 0);
378cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                assertTrue("Thread did not get notified. (status = " + status
379cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        + ")", status == 2);
380cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (InterruptedException ex) {
381cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                fail(
382cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        "Unexpectedly got an InterruptedException. (status = "
383cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                + status + ")");
384cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
385cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
386cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
387cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
388cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
389