19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage android.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.MediumTest;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.TestCase;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MessageQueueTest extends TestCase {
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static class BaseTestHandler extends TestHandlerThread {
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Handler mHandler;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLastMessage;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCount;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BaseTestHandler() {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void go() {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler = new Handler() {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void handleMessage(Message msg) {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    BaseTestHandler.this.handleMessage(msg);
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
44a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            if (!msg.isInUse()) {
45a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                failure(new RuntimeException(
46a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        "msg.isInuse is false, should always be true, #" + msg.what));
47a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            }
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCount <= mLastMessage) {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (msg.what != mCount) {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    failure(new RuntimeException(
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Expected message #" + mCount
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + ", received #" + msg.what));
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (mCount == mLastMessage) {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    success();
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount++;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                failure(new RuntimeException(
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Message received after done, #" + msg.what));
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testMessageOrder() throws Exception {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TestHandlerThread tester = new BaseTestHandler() {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void go() {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                super.go();
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long now = SystemClock.uptimeMillis() + 200;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastMessage = 4;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount = 0;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandler.sendMessageAtTime(mHandler.obtainMessage(2), now + 1);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandler.sendMessageAtTime(mHandler.obtainMessage(3), now + 2);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandler.sendMessageAtTime(mHandler.obtainMessage(4), now + 2);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandler.sendMessageAtTime(mHandler.obtainMessage(0), now + 0);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandler.sendMessageAtTime(mHandler.obtainMessage(1), now + 0);
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tester.doTest(1000);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testAtFrontOfQueue() throws Exception {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TestHandlerThread tester = new BaseTestHandler() {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void go() {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                super.go();
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long now = SystemClock.uptimeMillis() + 200;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastMessage = 3;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount = 0;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandler.sendMessageAtTime(mHandler.obtainMessage(3), now);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(2));
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(0));
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void handleMessage(Message msg) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                super.handleMessage(msg);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (msg.what == 0) {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(1));
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tester.doTest(1000);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
106ddb2bfeb6e5a383306159672fe81333bf8520776Jaikumar Ganesh
107a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville    private static class TestFieldIntegrityHandler extends TestHandlerThread {
108a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville        Handler mHandler;
109a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville        int mLastMessage;
110a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville        int mCount;
111a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville
112a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville        public TestFieldIntegrityHandler() {
113a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville        }
114a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville
115a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville        public void go() {
116a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            mHandler = new Handler() {
117a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                public void handleMessage(Message msg) {
118a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    TestFieldIntegrityHandler.this.handleMessage(msg);
119a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                }
120a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            };
121a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville        }
122a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville
123a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville        public void handleMessage(Message msg) {
124a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            if (!msg.isInUse()) {
125a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                failure(new RuntimeException(
126a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        "msg.isInuse is false, should always be true, #" + msg.what));
127a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            }
128a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            if (mCount <= mLastMessage) {
129a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                if (msg.what != mCount) {
130a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    failure(new RuntimeException(
131a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                            "Expected message #" + mCount
132a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                    + ", received #" + msg.what));
133a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                } else if (mCount == mLastMessage) {
134a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    success();
135a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                }
136a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                mCount++;
137a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            } else {
138a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                failure(new RuntimeException(
139a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        "Message received after done, #" + msg.what));
140a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            }
141a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville        }
142a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville    }
143a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville
144a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville    @MediumTest
145a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville    public void testFieldIntegrity() throws Exception {
146a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville
147a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville        TestHandlerThread tester = new TestFieldIntegrityHandler() {
148a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            Bundle mBundle;
149a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville
150a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            public void go() {
151a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                super.go();
152a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                mLastMessage = 1;
153a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                mCount = 0;
154a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                mHandler.sendMessage(mHandler.obtainMessage(0));
155a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            }
156a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville
157a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            public void handleMessage(Message msg) {
158a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                super.handleMessage(msg);
159a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                if (msg.what == 0) {
160a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    msg.flags = -1;
161a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    msg.what = 1;
162a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    msg.arg1 = 456;
163a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    msg.arg2 = 789;
164a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    msg.obj = this;
165a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    msg.replyTo = null;
166a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    mBundle = new Bundle();
167a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    msg.data = mBundle;
168a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    msg.data.putString("key", "value");
169a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville
170a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    Message newMsg = mHandler.obtainMessage();
171a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    newMsg.copyFrom(msg);
172a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (newMsg.isInUse() != false) {
173a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(
174a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "newMsg.isInUse is true should be false after copyFrom"));
175a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
176a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (newMsg.flags != 0) {
177a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
178a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        "newMsg.flags is %d should be 0 after copyFrom", newMsg.flags)));
179a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
180a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (newMsg.what != 1) {
181a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
182a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "newMsg.what is %d should be %d after copyFrom", newMsg.what, 1)));
183a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
184a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (newMsg.arg1 != 456) {
185a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
186a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "newMsg.arg1 is %d should be %d after copyFrom", msg.arg1, 456)));
187a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
188a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (newMsg.arg2 != 789) {
189a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
190a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "newMsg.arg2 is %d should be %d after copyFrom", msg.arg2, 789)));
191a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
192a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (newMsg.obj != this) {
193a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(
194a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "newMsg.obj should be 'this' after copyFrom"));
195a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
196a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (newMsg.replyTo != null) {
197a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(
198a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "newMsg.replyTo should be null after copyFrom"));
199a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
200a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (newMsg.data == mBundle) {
201a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(
202a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "newMsg.data should NOT be mBundle after copyFrom"));
203a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
204a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (!newMsg.data.getString("key").equals(mBundle.getString("key"))) {
205a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
206a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "newMsg.data.getString(\"key\") is %s and does not equal" +
207a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                " mBundle.getString(\"key\") which is %s after copyFrom",
208a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                newMsg.data.getString("key"),  mBundle.getString("key"))));
209a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
210a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (newMsg.when != 0) {
211a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
212a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "newMsg.when is %d should be 0 after copyFrom", newMsg.when)));
213a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
214a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (newMsg.target != mHandler) {
215a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(
216a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "newMsg.target is NOT mHandler after copyFrom"));
217a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
218a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (newMsg.callback != null) {
219a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(
220a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "newMsg.callback is NOT null after copyFrom"));
221a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
222a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville
223a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    mHandler.sendMessage(newMsg);
224a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                } else if (msg.what == 1) {
225a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (msg.isInUse() != true) {
226a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
227a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "msg.isInUse is false should be true after when processing %d",
228a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                msg.what)));
229a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
230a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (msg.arg1 != 456) {
231a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
232a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "msg.arg1 is %d should be %d when processing # %d",
233a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                msg.arg1, 456, msg.what)));
234a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
235a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (msg.arg2 != 789) {
236a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
237a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "msg.arg2 is %d should be %d when processing # %d",
238a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                msg.arg2, 789, msg.what)));
239a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
240a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (msg.obj != this) {
241a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
242a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "msg.obj should be 'this' when processing # %d", msg.what)));
243a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
244a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (msg.replyTo != null) {
245a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
246a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "msg.replyTo should be null when processing # %d", msg.what)));
247a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
248a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (!msg.data.getString("key").equals(mBundle.getString("key"))) {
249a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
250a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "msg.data.getString(\"key\") is %s and does not equal" +
251a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                " mBundle.getString(\"key\") which is %s when processing # %d",
252a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                msg.data.getString("key"),  mBundle.getString("key"), msg.what)));
253a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
254a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (msg.when != 0) {
255a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
256a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "msg.when is %d should be 0 when processing # %d",
257a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                msg.when, msg.what)));
258a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
259a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (msg.target != null) {
260a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
261a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "msg.target is NOT null when processing # %d", msg.what)));
262a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
263a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    if (msg.callback != null) {
264a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                        failure(new RuntimeException(String.format(
265a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                                "msg.callback is NOT null when processing # %d", msg.what)));
266a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    }
267a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                } else {
268a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                    failure(new RuntimeException(String.format(
269a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                            "Unexpected msg.what is %d" + msg.what)));
270a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville                }
271a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville            }
272a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville        };
273a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville
274a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville        tester.doTest(1000);
275a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville    }
276a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville}
277